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; }