Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Dec 1999 16:21:18 +0300 (MSK)
From:      vak@cronyx.ru
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   kern/15206: patch to add bridging to if_vr.c
Message-ID:  <199912011321.QAA00490@hanoi.cronyx.ru>

next in thread | raw e-mail | index | archive | help

>Number:         15206
>Category:       kern
>Synopsis:       Ethernet driver if_vr.c (VIA Technologies)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Dec  1 05:40:03 PST 1999
>Closed-Date:
>Last-Modified:
>Originator:     Serge V.Vakulenko
>Release:        FreeBSD 3.3-RELEASE i386
>Organization:
Cronyx Engineering Ltd.
>Environment:

FreeBSD router with two D-Link DFE-530 Ethernet adapters installed.

>Description:

Bridging does not work properly.
The bridge functionality is missing in the driver.

>How-To-Repeat:

Enable BRIDGE option in the kernel and enable
sysctl -w net.link.ether.bridge=1
in /etc/rc.local. Try ping across the bridge.

>Fix:
	
--- if_vr33.c	Wed Dec  1 16:08:38 1999
+++ if_vr.c	Wed Dec  1 16:00:23 1999
@@ -79,6 +79,11 @@
 #include <net/bpf.h>
 #endif
 
+#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 */
@@ -1318,22 +1323,43 @@
 		m->m_pkthdr.len = m->m_len = total_len;
 #if NBPFILTER > 0
 		/*
-		 * Handle BPF listeners. Let the BPF user see the packet, but
-		 * 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.
+		 * Handle BPF listeners. Let the BPF user see the packet.
 		 */
-		if (ifp->if_bpf) {
+		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) &&
-					(eh->ether_dhost[0] & 1) == 0)) {
+#endif
+#ifdef BRIDGE /* see code in if_ed.c */
+		if (do_bridge) {
+			struct ifnet *bdg_ifp ;
+			bdg_ifp = bridge_in(m);
+			if (bdg_ifp == BDG_DROP) {
 				m_freem(m);
 				continue;
 			}
+			if (bdg_ifp != BDG_LOCAL)
+				bdg_forward(&m, bdg_ifp);
+			if (bdg_ifp != BDG_LOCAL && bdg_ifp != BDG_BCAST &&
+                            bdg_ifp != BDG_MCAST) {
+				/* not local and not multicast, just drop it */
+				if (m)
+					m_freem(m);
+				continue;
+			}
+			/* all others accepted locally */
 		}
 #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_flags & IFF_PROMISC &&
+			(bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr,
+					ETHER_ADDR_LEN) &&
+				(eh->ether_dhost[0] & 1) == 0)) {
+			m_freem(m);
+			continue;
+		}
 		/* Remove header from mbuf and pass it on. */
 		m_adj(m, sizeof(struct ether_header));
 		ether_input(ifp, eh, m);

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199912011321.QAA00490>