Diff below makes it clear that RTAX_IFP points to the interface's
sockaddr_dl, which is always the first element of the per-ifp list
of address.
Just use the pointer present in "struct ifnet" instead of relying
on the fact that the link-layer address is the first element of the
list.
ok?
Index: net/route.c
===================================================================
RCS file: /home/ncvs/src/sys/net/route.c,v
retrieving revision 1.153
diff -u -p -r1.153 route.c
--- net/route.c 12 Feb 2014 12:50:13 -0000 1.153
+++ net/route.c 10 Mar 2014 16:39:59 -0000
@@ -409,8 +409,7 @@ rt_sendmsg(struct rtentry *rt, int cmd,
info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
info.rti_info[RTAX_NETMASK] = rt_mask(rt);
if (rt->rt_ifp != NULL) {
- info.rti_info[RTAX_IFP] =
- TAILQ_FIRST(&rt->rt_ifp->if_addrlist)->ifa_addr;
+ info.rti_info[RTAX_IFP] =(struct sockaddr *)rt->rt_ifp->if_sadl;
info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
}
Index: net/rtsock.c
===================================================================
RCS file: /home/ncvs/src/sys/net/rtsock.c,v
retrieving revision 1.139
diff -u -p -r1.139 rtsock.c
--- net/rtsock.c 13 Feb 2014 22:01:50 -0000 1.139
+++ net/rtsock.c 10 Mar 2014 16:39:59 -0000
@@ -706,7 +706,7 @@ report:
if (rtm->rtm_addrs & (RTA_IFP | RTA_IFA) &&
(ifp = rt->rt_ifp) != NULL) {
info.rti_info[RTAX_IFP] =
- TAILQ_FIRST(&ifp->if_addrlist)->ifa_addr;
+ (struct sockaddr *)ifp->if_sadl;
info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
if (ifp->if_flags & IFF_POINTOPOINT)
info.rti_info[RTAX_BRD] =
@@ -1168,7 +1168,7 @@ rt_newaddrmsg(int cmd, struct ifaddr *if
info.rti_info[RTAX_IFA] = sa = ifa->ifa_addr;
info.rti_info[RTAX_IFP] =
- TAILQ_FIRST(&ifp->if_addrlist)->ifa_addr;
+ (struct sockaddr *)ifp->if_sadl;
info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask;
info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr;
if ((m = rt_msg1(ncmd, &info)) == NULL)
@@ -1256,7 +1256,7 @@ sysctl_dumpentry(struct radix_node *rn,
info.rti_info[RTAX_NETMASK] = rt_mask(rt);
if (rt->rt_ifp) {
info.rti_info[RTAX_IFP] =
- TAILQ_FIRST(&rt->rt_ifp->if_addrlist)->ifa_addr;
+ (struct sockaddr *)rt->rt_ifp->if_sadl;
info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
if (rt->rt_ifp->if_flags & IFF_POINTOPOINT)
info.rti_info[RTAX_BRD] = rt->rt_ifa->ifa_dstaddr;
@@ -1309,10 +1309,8 @@ sysctl_iflist(int af, struct walkarg *w)
TAILQ_FOREACH(ifp, &ifnet, if_list) {
if (w->w_arg && w->w_arg != ifp->if_index)
continue;
- ifa = TAILQ_FIRST(&ifp->if_addrlist);
- if (!ifa)
- continue;
- info.rti_info[RTAX_IFP] = ifa->ifa_addr;
+ /* Copy the link-layer address first */
+ info.rti_info[RTAX_IFP] = (struct sockaddr *)ifp->if_sadl;
len = rt_msg2(RTM_IFINFO, RTM_VERSION, &info, 0, w);
if (w->w_where && w->w_tmem && w->w_needed <= 0) {
struct if_msghdr *ifm;
@@ -1329,7 +1327,9 @@ sysctl_iflist(int af, struct walkarg *w)
w->w_where += len;
}
info.rti_info[RTAX_IFP] = NULL;
- while ((ifa = TAILQ_NEXT(ifa, ifa_list)) != NULL) {
+ TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
+ if (ifa->ifa_addr->sa_family == AF_LINK)
+ continue;
if (af && af != ifa->ifa_addr->sa_family)
continue;
info.rti_info[RTAX_IFA] = ifa->ifa_addr;