Module Name:    src
Committed By:   martin
Date:           Fri Feb 24 13:10:53 UTC 2023

Modified Files:
        src/sys/net [netbsd-10]: bpf.c

Log Message:
Pull up following revision(s) (requested by gutteridge in ticket #103):

        sys/net/bpf.c: revision 1.251

bpf.c: support loopback writes when BIOCSHDRCMPLT is set

Following changes in r. 1.249 "bpf: support sending packets on loopback
interfaces", also allow for this to succeed when the "header complete"
flag is set, which is the practice of some tools, e.g., tcpreplay and
Scapy. With this change, both of those example tools now work, e.g.,
Scapy passes "L3bpfSocket - send and sniff on loopback" in its test
suite.

There are several ways of addressing this issue; this commit is
intended to be the most conservative and consistent with the previous
changes. (E.g., FreeBSD instead has special handling of this condition
in its if_loop.c.)


To generate a diff of this commit:
cvs rdiff -u -r1.249 -r1.249.2.1 src/sys/net/bpf.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/bpf.c
diff -u src/sys/net/bpf.c:1.249 src/sys/net/bpf.c:1.249.2.1
--- src/sys/net/bpf.c:1.249	Wed Nov 30 06:02:37 2022
+++ src/sys/net/bpf.c	Fri Feb 24 13:10:53 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: bpf.c,v 1.249 2022/11/30 06:02:37 ozaki-r Exp $	*/
+/*	$NetBSD: bpf.c,v 1.249.2.1 2023/02/24 13:10:53 martin Exp $	*/
 
 /*
  * Copyright (c) 1990, 1991, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.249 2022/11/30 06:02:37 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.249.2.1 2023/02/24 13:10:53 martin Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_bpf.h"
@@ -876,7 +876,12 @@ bpf_write(struct file *fp, off_t *offp, 
 		goto out;
 	}
 
-	if (d->bd_hdrcmplt)
+	/*
+	 * If writing to a loopback interface, the address family has
+	 * already been specially computed in bpf_movein(), so don't
+	 * clobber it, or the loopback will reject it in looutput().
+	 */
+	if (d->bd_hdrcmplt && ifp->if_type != IFT_LOOP)
 		dst.ss_family = pseudo_AF_HDRCMPLT;
 
 	if (d->bd_feedback) {

Reply via email to