--- src/sys/netinet/if_ether.c 2005/12/19 00:07:02 1.29 +++ src/sys/netinet/if_ether.c 2005/12/21 16:40:25 1.30 @@ -638,14 +638,42 @@ in_arpinput(struct mbuf *m) * of the receive interface. (This will change slightly * when we have clusters of interfaces). */ - LIST_FOREACH(ia, INADDR_HASH(itaddr.s_addr), ia_hash) + LIST_FOREACH(ia, INADDR_HASH(itaddr.s_addr), ia_hash) { + /* + * Old style bridging OBSOLETE + */ if ((BRIDGE_TEST || (ia->ia_ifp == ifp)) && - itaddr.s_addr == ia->ia_addr.sin_addr.s_addr) + itaddr.s_addr == ia->ia_addr.sin_addr.s_addr) { goto match; - LIST_FOREACH(ia, INADDR_HASH(isaddr.s_addr), ia_hash) + } + + /* + * New style bridging + */ + if (ifp->if_bridge && ia->ia_ifp && + ifp->if_bridge == ia->ia_ifp->if_bridge && + itaddr.s_addr == ia->ia_addr.sin_addr.s_addr) { + goto match; + } + } + LIST_FOREACH(ia, INADDR_HASH(isaddr.s_addr), ia_hash) { + /* + * Old style bridging OBSOLETE + */ if ((BRIDGE_TEST || (ia->ia_ifp == ifp)) && - isaddr.s_addr == ia->ia_addr.sin_addr.s_addr) + isaddr.s_addr == ia->ia_addr.sin_addr.s_addr) { + goto match; + } + + /* + * New style bridging + */ + if (ifp->if_bridge && ia->ia_ifp && + ifp->if_bridge == ia->ia_ifp->if_bridge && + isaddr.s_addr == ia->ia_addr.sin_addr.s_addr) { goto match; + } + } /* * No match, use the first inet address on the receive interface * as a dummy address for the rest of the function.