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;

Reply via email to