diff options
author | rwatson <rwatson@FreeBSD.org> | 2000-03-09 19:28:19 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2000-03-09 19:28:19 +0000 |
commit | 1548205c415630246fab637cc06a3f9503dc5640 (patch) | |
tree | 8ace77720326d777a7a38247a7940eeeca9f8a59 /sys | |
parent | 464af2ea2776fe726056be70827a7ad6a892b476 (diff) | |
download | FreeBSD-src-1548205c415630246fab637cc06a3f9503dc5640.zip FreeBSD-src-1548205c415630246fab637cc06a3f9503dc5640.tar.gz |
Introduce ethernet bridge support for if_dc
Approved by: jkh
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/dc/if_dc.c | 29 | ||||
-rw-r--r-- | sys/pci/if_dc.c | 29 |
2 files changed, 50 insertions, 8 deletions
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c index 4e1c98b..c634c3a 100644 --- a/sys/dev/dc/if_dc.c +++ b/sys/dev/dc/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) && 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) && |