Lines 1-132
Link Here
|
1 |
--- zebra/kernel_socket.c 2007/05/10 02:38:52 1.43 |
|
|
2 |
+++ zebra/kernel_socket.c 2007/05/17 15:00:41 1.44 |
3 |
@@ -494,6 +494,8 @@ |
4 |
short *ifnlen) |
5 |
{ |
6 |
caddr_t pnt, end; |
7 |
+ union sockunion dst; |
8 |
+ union sockunion gateway; |
9 |
|
10 |
pnt = (caddr_t)(ifm + 1); |
11 |
end = ((caddr_t)ifm) + ifm->ifam_msglen; |
12 |
@@ -502,10 +504,12 @@ |
13 |
memset (mask, 0, sizeof (union sockunion)); |
14 |
memset (addr, 0, sizeof (union sockunion)); |
15 |
memset (brd, 0, sizeof (union sockunion)); |
16 |
+ memset (&dst, 0, sizeof (union sockunion)); |
17 |
+ memset (&gateway, 0, sizeof (union sockunion)); |
18 |
|
19 |
/* We fetch each socket variable into sockunion. */ |
20 |
- RTA_ADDR_GET (NULL, RTA_DST, ifm->ifam_addrs, pnt); |
21 |
- RTA_ADDR_GET (NULL, RTA_GATEWAY, ifm->ifam_addrs, pnt); |
22 |
+ RTA_ADDR_GET (&dst, RTA_DST, ifm->ifam_addrs, pnt); |
23 |
+ RTA_ADDR_GET (&gateway, RTA_GATEWAY, ifm->ifam_addrs, pnt); |
24 |
RTA_ATTR_GET (mask, RTA_NETMASK, ifm->ifam_addrs, pnt); |
25 |
RTA_ADDR_GET (NULL, RTA_GENMASK, ifm->ifam_addrs, pnt); |
26 |
RTA_NAME_GET (ifname, RTA_IFP, ifm->ifam_addrs, pnt, *ifnlen); |
27 |
@@ -519,31 +523,43 @@ |
28 |
{ |
29 |
case AF_INET: |
30 |
{ |
31 |
- char buf[2][INET_ADDRSTRLEN]; |
32 |
+ char buf[4][INET_ADDRSTRLEN]; |
33 |
zlog_debug ("%s: ifindex %d, ifname %s, ifam_addrs 0x%x, " |
34 |
- "addr %s/%d broad %s", |
35 |
- __func__, ifm->ifam_index, |
36 |
+ "ifam_flags 0x%x, addr %s/%d broad %s dst %s " |
37 |
+ "gateway %s", |
38 |
+ __func__, ifm->ifam_index, |
39 |
(ifnlen ? ifname : "(nil)"), ifm->ifam_addrs, |
40 |
+ ifm->ifam_flags, |
41 |
inet_ntop(AF_INET,&addr->sin.sin_addr, |
42 |
buf[0],sizeof(buf[0])), |
43 |
ip_masklen(mask->sin.sin_addr), |
44 |
inet_ntop(AF_INET,&brd->sin.sin_addr, |
45 |
- buf[1],sizeof(buf[1]))); |
46 |
+ buf[1],sizeof(buf[1])), |
47 |
+ inet_ntop(AF_INET,&dst.sin.sin_addr, |
48 |
+ buf[2],sizeof(buf[2])), |
49 |
+ inet_ntop(AF_INET,&gateway.sin.sin_addr, |
50 |
+ buf[3],sizeof(buf[3]))); |
51 |
} |
52 |
break; |
53 |
#ifdef HAVE_IPV6 |
54 |
case AF_INET6: |
55 |
{ |
56 |
- char buf[2][INET6_ADDRSTRLEN]; |
57 |
+ char buf[4][INET6_ADDRSTRLEN]; |
58 |
zlog_debug ("%s: ifindex %d, ifname %s, ifam_addrs 0x%x, " |
59 |
- "addr %s/%d broad %s", |
60 |
+ "ifam_flags 0x%x, addr %s/%d broad %s dst %s " |
61 |
+ "gateway %s", |
62 |
__func__, ifm->ifam_index, |
63 |
(ifnlen ? ifname : "(nil)"), ifm->ifam_addrs, |
64 |
+ ifm->ifam_flags, |
65 |
inet_ntop(AF_INET6,&addr->sin6.sin6_addr, |
66 |
buf[0],sizeof(buf[0])), |
67 |
ip6_masklen(mask->sin6.sin6_addr), |
68 |
inet_ntop(AF_INET6,&brd->sin6.sin6_addr, |
69 |
- buf[1],sizeof(buf[1]))); |
70 |
+ buf[1],sizeof(buf[1])), |
71 |
+ inet_ntop(AF_INET6,&dst.sin6.sin6_addr, |
72 |
+ buf[2],sizeof(buf[2])), |
73 |
+ inet_ntop(AF_INET6,&gateway.sin6.sin6_addr, |
74 |
+ buf[3],sizeof(buf[3]))); |
75 |
} |
76 |
break; |
77 |
#endif /* HAVE_IPV6 */ |
78 |
@@ -554,7 +570,7 @@ |
79 |
break; |
80 |
} |
81 |
} |
82 |
- |
83 |
+ |
84 |
/* Assert read up end point matches to end point */ |
85 |
if (pnt != end) |
86 |
zlog_warn ("ifam_read() does't read all socket data"); |
87 |
@@ -569,6 +585,7 @@ |
88 |
char ifname[INTERFACE_NAMSIZ]; |
89 |
short ifnlen = 0; |
90 |
char isalias = 0; |
91 |
+ int flags = 0; |
92 |
|
93 |
ifname[0] = ifname[INTERFACE_NAMSIZ - 1] = '\0'; |
94 |
|
95 |
@@ -585,6 +602,12 @@ |
96 |
if (ifnlen && strncmp (ifp->name, ifname, INTERFACE_NAMSIZ)) |
97 |
isalias = 1; |
98 |
|
99 |
+ /* N.B. The info in ifa_msghdr does not tell us whether the RTA_BRD |
100 |
+ field contains a broadcast address or a peer address, so we are forced to |
101 |
+ rely upon the interface type. */ |
102 |
+ if (if_is_pointopoint(ifp)) |
103 |
+ SET_FLAG(flags, ZEBRA_IFA_PEER); |
104 |
+ |
105 |
#if 0 |
106 |
/* it might seem cute to grab the interface metric here, however |
107 |
* we're processing an address update message, and so some systems |
108 |
@@ -599,12 +622,12 @@ |
109 |
{ |
110 |
case AF_INET: |
111 |
if (ifam->ifam_type == RTM_NEWADDR) |
112 |
- connected_add_ipv4 (ifp, 0, &addr.sin.sin_addr, |
113 |
+ connected_add_ipv4 (ifp, flags, &addr.sin.sin_addr, |
114 |
ip_masklen (mask.sin.sin_addr), |
115 |
&brd.sin.sin_addr, |
116 |
(isalias ? ifname : NULL)); |
117 |
else |
118 |
- connected_delete_ipv4 (ifp, 0, &addr.sin.sin_addr, |
119 |
+ connected_delete_ipv4 (ifp, flags, &addr.sin.sin_addr, |
120 |
ip_masklen (mask.sin.sin_addr), |
121 |
&brd.sin.sin_addr); |
122 |
break; |
123 |
@@ -616,8 +639,7 @@ |
124 |
SET_IN6_LINKLOCAL_IFINDEX (addr.sin6.sin6_addr, 0); |
125 |
|
126 |
if (ifam->ifam_type == RTM_NEWADDR) |
127 |
- connected_add_ipv6 (ifp, 0, |
128 |
- &addr.sin6.sin6_addr, |
129 |
+ connected_add_ipv6 (ifp, flags, &addr.sin6.sin6_addr, |
130 |
ip6_masklen (mask.sin6.sin6_addr), |
131 |
&brd.sin6.sin6_addr, |
132 |
(isalias ? ifname : NULL)); |