From f29f19c7578e275f2a6e9880e7a0fa29ad17b8e9 Mon Sep 17 00:00:00 2001 From: luigi Date: Wed, 17 Mar 1999 16:44:53 +0000 Subject: MF22... add bridging support to the device drivers. Without this bridging cannot work on -current/releng3! --- sys/pci/if_de.c | 23 ++++++++++++++++++++- sys/pci/if_fxp.c | 61 +++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 65 insertions(+), 19 deletions(-) (limited to 'sys/pci') diff --git a/sys/pci/if_de.c b/sys/pci/if_de.c index facad11..d9c52f7 100644 --- a/sys/pci/if_de.c +++ b/sys/pci/if_de.c @@ -1,5 +1,5 @@ /* $NetBSD: if_de.c,v 1.82 1999/02/28 17:08:51 explorer Exp $ */ -/* $Id: if_de.c,v 1.100 1999/03/13 09:21:27 peter Exp $ */ +/* $Id: if_de.c,v 1.101 1999/03/14 08:32:52 peter Exp $ */ /*- * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com) @@ -124,6 +124,10 @@ #include #define DEVAR_INCLUDE "pci/if_devar.h" #endif +#include "opt_bdg.h" +#ifdef BRIDGE +#include +#endif #endif /* __FreeBSD__ */ #if defined(__bsdi__) @@ -3544,6 +3548,23 @@ tulip_rx_intr( } #endif sc->tulip_flags |= TULIP_RXACT; + +#ifdef BRIDGE /* see code in if_ed.c */ + ms->m_pkthdr.rcvif = ifp; /* XXX */ + ms->m_pkthdr.len = total_len; /* XXX */ + if (do_bridge) { + struct ifnet *bdg_ifp ; + bdg_ifp = bridge_in(ms); + if (bdg_ifp == BDG_DROP) + goto next ; /* and drop */ + if (bdg_ifp != BDG_LOCAL) + bdg_forward(&ms, bdg_ifp); + if (bdg_ifp != BDG_LOCAL && bdg_ifp != BDG_BCAST && + bdg_ifp != BDG_MCAST) + goto next ; /* and drop */ + /* all others accepted locally */ + } else +#endif if ((sc->tulip_flags & (TULIP_PROMISC|TULIP_HASHONLY)) && (eh.ether_dhost[0] & 1) == 0 && !TULIP_ADDREQUAL(eh.ether_dhost, sc->tulip_enaddr)) diff --git a/sys/pci/if_fxp.c b/sys/pci/if_fxp.c index 79032ac..6568929 100644 --- a/sys/pci/if_fxp.c +++ b/sys/pci/if_fxp.c @@ -27,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: if_fxp.c,v 1.63 1999/02/11 21:47:09 julian Exp $ + * $Id: if_fxp.c,v 1.64 1999/02/12 17:56:23 julian Exp $ */ /* @@ -103,6 +103,12 @@ #endif /* __NetBSD__ */ +#include "opt_bdg.h" +#ifdef BRIDGE +#include +#include +#endif + /* * NOTE! On the Alpha, we have an alignment constraint. The * card DMAs the packet immediately following the RFA. However, @@ -1010,31 +1016,50 @@ rcvloop: } m->m_pkthdr.rcvif = ifp; m->m_pkthdr.len = m->m_len = - total_len - - sizeof(struct ether_header); + total_len ; eh = mtod(m, struct ether_header *); #if NBPFILTER > 0 - if (ifp->if_bpf) { + if (ifp->if_bpf) bpf_tap(FXP_BPFTAP_ARG(ifp), mtod(m, caddr_t), total_len); - /* - * Only pass this packet up - * if it is for us. - */ - if ((ifp->if_flags & - IFF_PROMISC) && - (rfa->rfa_status & - FXP_RFA_STATUS_IAMATCH) && - (eh->ether_dhost[0] & 1) - == 0) { - m_freem(m); - goto rcvloop; - } - } #endif /* NBPFILTER > 0 */ +#ifdef BRIDGE + if (do_bridge) { + struct ifnet *bdg_ifp ; + bdg_ifp = bridge_in(m); + if (bdg_ifp == BDG_DROP) + goto dropit ; + if (bdg_ifp != BDG_LOCAL) + bdg_forward(&m, bdg_ifp); + if (bdg_ifp != BDG_LOCAL && + bdg_ifp != BDG_BCAST && + bdg_ifp != BDG_MCAST) + goto dropit ; + goto getit ; + } +#endif + /* + * Only pass this packet up + * if it is for us. + */ + if ((ifp->if_flags & + IFF_PROMISC) && + (rfa->rfa_status & + FXP_RFA_STATUS_IAMATCH) && + (eh->ether_dhost[0] & 1) + == 0) { +dropit: + if (m) + m_freem(m); + goto rcvloop; + } +getit: m->m_data += sizeof(struct ether_header); + m->m_len -= + sizeof(struct ether_header); + m->m_pkthdr.len = m->m_len ; ether_input(ifp, eh, m); } goto rcvloop; -- cgit v1.1