From 1548205c415630246fab637cc06a3f9503dc5640 Mon Sep 17 00:00:00 2001 From: rwatson Date: Thu, 9 Mar 2000 19:28:19 +0000 Subject: Introduce ethernet bridge support for if_dc Approved by: jkh --- sys/pci/if_dc.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'sys/pci') diff --git a/sys/pci/if_dc.c b/sys/pci/if_dc.c index 4e1c98b..c634c3a 100644 --- a/sys/pci/if_dc.c +++ b/sys/pci/if_dc.c @@ -122,6 +122,11 @@ #include +#include "opt_bdg.h" +#ifdef BRIDGE +#include +#endif + #include /* for vtophys */ #include /* for vtophys */ #include /* for DELAY */ @@ -2099,14 +2104,30 @@ static void dc_rxeof(sc) ifp->if_ipackets++; eh = mtod(m, struct ether_header *); - /* - * Handle BPF listeners. Let the BPF user see the packet, but - * don't pass it up to the ether_input() layer unless it's + /* Handle BPF listeners. Let the BPF user see the packet */ + if (ifp->if_bpf) + bpf_mtap(ifp, m); + +#ifdef BRIDGE + if (do_bridge) { + struct ifnet *bdg_ifp ; + bdg_ifp = bridge_in(m); + if (bdg_ifp != BDG_LOCAL && bdg_ifp != BDG_DROP) + bdg_forward(&m, bdg_ifp); + if (((bdg_ifp != BDG_LOCAL) && (bdg_ifp != BDG_BCAST) && (bdg_ifp != BDG_MCAST)) || bdg_ifp == BDG_DROP) { + m_freem(m); + continue; + } + } + + eh = mtod(m, struct ether_header *); +#endif + + /* Don't pass it up to the ether_input() layer unless it's * a broadcast packet, multicast packet, matches our ethernet * address or the interface is in promiscuous mode. */ if (ifp->if_bpf) { - bpf_mtap(ifp, m); if (ifp->if_flags & IFF_PROMISC && (bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN) && -- cgit v1.1