Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 27 Apr 2008 08:41:12 GMT
From:      Dmitry <hanabana@mail.ru>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/123138: bpf incorrectly determines outgoing routed packets as incoming when BIOCSDIRECTION is used
Message-ID:  <200804270841.m3R8fCP4046392@www.freebsd.org>
Resent-Message-ID: <200804270850.m3R8o03m093039@freefall.freebsd.org>

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

>Number:         123138
>Category:       kern
>Synopsis:       bpf incorrectly determines outgoing routed packets as incoming when BIOCSDIRECTION is used
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Apr 27 08:50:00 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Dmitry
>Release:        7.0-STABLE
>Organization:
home
>Environment:
FreeBSD gw 7.0-STABLE FreeBSD 7.0-STABLE #0: Sun Apr 27 11:29:26 MSD 2008 root@kb:/var/tmp/obj/usr/src/sys/KG  i386
>Description:
BPF_CHECK_DIRECTION macros considers packet as outgoing when it has no receive interface field (rcvif) set. This correct for single homed server but is not enough for router. Packet came from one interface and going out another has rcvif field set even when it passed natd daemon.
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

--- src/sys/net/bpf.c.orig	2008-04-23 11:41:21.000000000 +0400
+++ src/sys/net/bpf.c	2008-04-27 11:18:20.000000000 +0400
@@ -1330,9 +1330,9 @@
 	}
 }
 
-#define	BPF_CHECK_DIRECTION(d, i)				\
-	    (((d)->bd_direction == BPF_D_IN && (i) == NULL) ||	\
-	    ((d)->bd_direction == BPF_D_OUT && (i) != NULL))
+#define	BPF_CHECK_DIRECTION(d, i, bpi)				\
+	    (((d)->bd_direction == BPF_D_IN && (i) != (bpi)) ||	\
+	    ((d)->bd_direction == BPF_D_OUT && (i) == (bpi)))
 
 /*
  * Incoming linkage from device drivers, when packet is in an mbuf chain.
@@ -1357,7 +1357,7 @@
 
 	BPFIF_LOCK(bp);
 	LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
-		if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif))
+		if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
 			continue;
 		BPFD_LOCK(d);
 		++d->bd_rcount;
@@ -1421,7 +1421,7 @@
 
 	BPFIF_LOCK(bp);
 	LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
-		if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif))
+		if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
 			continue;
 		BPFD_LOCK(d);
 		++d->bd_rcount;


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



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