Diff below makes use of IFP_TO_IA() instead of rolling our own copy.

For now there's no functional change, but I'd like to get this in so
that once our multicast code can stop relying on global lists, we only
need to modify the macro.

ok?

Index: netinet/in_pcb.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in_pcb.c,v
retrieving revision 1.139
diff -u -p -r1.139 in_pcb.c
--- netinet/in_pcb.c    1 Jun 2013 13:25:40 -0000       1.139
+++ netinet/in_pcb.c    5 Sep 2013 08:52:10 -0000
@@ -794,13 +794,10 @@ in_selectsrc(struct sockaddr_in *sin, st
        if (IN_MULTICAST(sin->sin_addr.s_addr) && mopts != NULL) {
                struct ifnet *ifp;
 
-               if (mopts->imo_multicast_ifp != NULL) {
-                       ifp = mopts->imo_multicast_ifp;
-                       TAILQ_FOREACH(ia, &in_ifaddr, ia_list)
-                               if (ia->ia_ifp == ifp &&
-                                   rtable_l2(rtableid) == ifp->if_rdomain)
-                                       break;
-                       if (ia == 0) {
+               ifp = mopts->imo_multicast_ifp;
+               if (ifp != NULL && ifp->if_rdomain == rtable_l2(rtableid)) {
+                       IFP_TO_IA(ifp, ia);
+                       if (ia == NULL) {
                                *errorp = EADDRNOTAVAIL;
                                return NULL;
                        }

Reply via email to