summaryrefslogtreecommitdiffstats
path: root/sys/pci
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2000-03-09 19:28:19 +0000
committerrwatson <rwatson@FreeBSD.org>2000-03-09 19:28:19 +0000
commit1548205c415630246fab637cc06a3f9503dc5640 (patch)
tree8ace77720326d777a7a38247a7940eeeca9f8a59 /sys/pci
parent464af2ea2776fe726056be70827a7ad6a892b476 (diff)
downloadFreeBSD-src-1548205c415630246fab637cc06a3f9503dc5640.zip
FreeBSD-src-1548205c415630246fab637cc06a3f9503dc5640.tar.gz
Introduce ethernet bridge support for if_dc
Approved by: jkh
Diffstat (limited to 'sys/pci')
-rw-r--r--sys/pci/if_dc.c29
1 files changed, 25 insertions, 4 deletions
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 <net/bpf.h>
+#include "opt_bdg.h"
+#ifdef BRIDGE
+#include <net/bridge.h>
+#endif
+
#include <vm/vm.h> /* for vtophys */
#include <vm/pmap.h> /* for vtophys */
#include <machine/clock.h> /* 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) &&
OpenPOWER on IntegriCloud