Module Name:    src
Committed By:   yamaguchi
Date:           Fri Jul  9 05:54:11 UTC 2021

Modified Files:
        src/distrib/sets/lists/debug: mi
        src/distrib/sets/lists/tests: mi
        src/tests/net: net_common.sh
        src/tests/net/if_vlan: Makefile t_vlan.sh
Added Files:
        src/tests/net/if_vlan: bpfopen.c

Log Message:
added tests for IFF_PROMISC of vlan(4)


To generate a diff of this commit:
cvs rdiff -u -r1.354 -r1.355 src/distrib/sets/lists/debug/mi
cvs rdiff -u -r1.1079 -r1.1080 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.41 -r1.42 src/tests/net/net_common.sh
cvs rdiff -u -r1.2 -r1.3 src/tests/net/if_vlan/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/net/if_vlan/bpfopen.c
cvs rdiff -u -r1.19 -r1.20 src/tests/net/if_vlan/t_vlan.sh

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

Modified files:

Index: src/distrib/sets/lists/debug/mi
diff -u src/distrib/sets/lists/debug/mi:1.354 src/distrib/sets/lists/debug/mi:1.355
--- src/distrib/sets/lists/debug/mi:1.354	Thu Jul  8 09:16:24 2021
+++ src/distrib/sets/lists/debug/mi	Fri Jul  9 05:54:11 2021
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.354 2021/07/08 09:16:24 christos Exp $
+# $NetBSD: mi,v 1.355 2021/07/09 05:54:11 yamaguchi Exp $
 ./etc/mtree/set.debug                           comp-sys-root
 ./usr/lib					comp-sys-usr		compatdir
 ./usr/lib/i18n/libBIG5_g.a			comp-c-debuglib		debuglib,compatfile
@@ -2396,6 +2396,7 @@
 ./usr/libdata/debug/usr/tests/net/if/t_compat.debug		tests-net-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/net/if_loop/t_pr.debug		tests-net-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/net/if_tap/rump_open_tap.debug	tests-net-debug		debug,atf,rump
+./usr/libdata/debug/usr/tests/net/if_vlan/bpfopen.debug		tests-net-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/net/if_vlan/siocXmulti.debug	tests-net-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/net/in_cksum/in_cksum.debug	tests-net-debug		debug,atf,compattestfile
 ./usr/libdata/debug/usr/tests/net/ipsec/natt_terminator.debug	tests-net-debug		debug,atf,rump

Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1079 src/distrib/sets/lists/tests/mi:1.1080
--- src/distrib/sets/lists/tests/mi:1.1079	Thu Jul  8 09:16:24 2021
+++ src/distrib/sets/lists/tests/mi	Fri Jul  9 05:54:11 2021
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1079 2021/07/08 09:16:24 christos Exp $
+# $NetBSD: mi,v 1.1080 2021/07/09 05:54:11 yamaguchi Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -4142,6 +4142,7 @@
 ./usr/tests/net/if_vlan					tests-net-tests		compattestfile,atf
 ./usr/tests/net/if_vlan/Atffile				tests-net-tests		atf,rump
 ./usr/tests/net/if_vlan/Kyuafile			tests-net-tests		atf,rump,kyua
+./usr/tests/net/if_vlan/bpfopen				tests-net-tests		atf,rump
 ./usr/tests/net/if_vlan/siocXmulti			tests-net-tests		atf,rump
 ./usr/tests/net/if_vlan/t_vlan				tests-net-tests		atf,rump
 ./usr/tests/net/if_wg					tests-net-tests		compattestfile,atf

Index: src/tests/net/net_common.sh
diff -u src/tests/net/net_common.sh:1.41 src/tests/net/net_common.sh:1.42
--- src/tests/net/net_common.sh:1.41	Wed Apr  1 00:49:04 2020
+++ src/tests/net/net_common.sh	Fri Jul  9 05:54:11 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: net_common.sh,v 1.41 2020/04/01 00:49:04 christos Exp $
+#	$NetBSD: net_common.sh,v 1.42 2021/07/09 05:54:11 yamaguchi Exp $
 #
 # Copyright (c) 2016 Internet Initiative Japan Inc.
 # All rights reserved.
@@ -180,6 +180,7 @@ CRYPTO_LIBS="$BASIC_LIBS -lrumpdev -lrum
     -lrumpkern_z -lrumpkern_crypto"
 NPF_LIBS="$BASIC_LIBS -lrumpdev -lrumpvfs -lrumpdev_bpf -lrumpnet_npf"
 CRYPTO_NPF_LIBS="$CRYPTO_LIBS -lrumpvfs -lrumpdev_bpf -lrumpnet_npf"
+BPF_LIBS="$BASIC_LIBS -lrumpdev -lrumpvfs -lrumpdev_bpf"
 
 # We cannot keep variables between test phases, so need to store in files
 _rump_server_socks=./.__socks
@@ -315,6 +316,24 @@ rump_server_crypto_npf_start()
 	return 0
 }
 
+rump_server_bpf_start()
+{
+	local sock=$1
+	local lib=
+	local libs="$BPF_LIBS"
+
+	shift 1
+
+	for lib
+	do
+		libs="$libs -lrumpnet_$lib"
+	done
+
+	_rump_server_start_common $sock $libs
+
+	return 0
+}
+
 rump_server_add_iface()
 {
 	local sock=$1

Index: src/tests/net/if_vlan/Makefile
diff -u src/tests/net/if_vlan/Makefile:1.2 src/tests/net/if_vlan/Makefile:1.3
--- src/tests/net/if_vlan/Makefile:1.2	Thu Jun 14 08:22:52 2018
+++ src/tests/net/if_vlan/Makefile	Fri Jul  9 05:54:11 2021
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2018/06/14 08:22:52 yamaguchi Exp $
+# $NetBSD: Makefile,v 1.3 2021/07/09 05:54:11 yamaguchi Exp $
 #
 
 .include <bsd.own.mk>
@@ -14,4 +14,8 @@ PROGS=			siocXmulti
 MAN.siocXmulti=		#empty
 BINDIR.siocXmulti=	${TESTSDIR}
 
+PROGS+=			bpfopen
+MAN.bpfopen=	#empty
+BINDIR.bpfopen=	${TESTSDIR}
+
 .include <bsd.test.mk>

Index: src/tests/net/if_vlan/t_vlan.sh
diff -u src/tests/net/if_vlan/t_vlan.sh:1.19 src/tests/net/if_vlan/t_vlan.sh:1.20
--- src/tests/net/if_vlan/t_vlan.sh:1.19	Tue Jul  6 01:18:22 2021
+++ src/tests/net/if_vlan/t_vlan.sh	Fri Jul  9 05:54:11 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: t_vlan.sh,v 1.19 2021/07/06 01:18:22 yamaguchi Exp $
+#	$NetBSD: t_vlan.sh,v 1.20 2021/07/09 05:54:11 yamaguchi Exp $
 #
 # Copyright (c) 2016 Internet Initiative Japan Inc.
 # All rights reserved.
@@ -897,6 +897,104 @@ vlan_multicast6_cleanup()
 	cleanup
 }
 
+atf_test_case vlan_promisc cleanup
+vlan_promisc_head()
+{
+
+	atf_set "descr" "tests of IFF_PROMISC of vlan"
+	atf_set "require.progs" "rump_server"
+}
+
+vlan_promisc_body()
+{
+	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
+	local atf_brconfig="atf_check -s exit:0 $HIJACKING /sbin/brconfig"
+	local atf_arp="atf_check -s exit:0 rump.arp"
+	local bpfopen="$HIJACKING $(atf_get_srcdir)/bpfopen"
+	local macaddr=""
+
+	rump_server_bpf_start $SOCK_LOCAL vlan bridge
+	rump_server_start $SOCK_REMOTE vlan
+
+	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
+	rump_server_add_iface $SOCK_LOCAL shmif1
+	rump_server_add_iface $SOCK_LOCAL vlan0
+	rump_server_add_iface $SOCK_LOCAL vlan1
+	rump_server_add_iface $SOCK_LOCAL bridge0
+
+	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
+	rump_server_add_iface $SOCK_REMOTE vlan0
+
+	macaddr=$(get_macaddr $SOCK_LOCAL shmif1)
+
+	export RUMP_SERVER=$SOCK_REMOTE
+	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
+	$atf_ifconfig shmif0 up
+	$atf_ifconfig vlan0 inet $IP_REMOTE0/24
+	$atf_ifconfig vlan0 up
+	$atf_ifconfig -w 10
+	$atf_arp -s $IP_LOCAL0 $macaddr
+
+	export RUMP_SERVER=$SOCK_LOCAL
+	$atf_ifconfig bridge0 mtu 1496
+	#
+	# When vlan IF is PROMISC, the parent is also PROMISC
+	#
+	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
+	$atf_ifconfig shmif0 up
+	$atf_ifconfig vlan0 up
+
+	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
+	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig shmif0
+
+	$atf_brconfig bridge0 add vlan0
+	$atf_ifconfig bridge0 up
+	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig vlan0
+	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig shmif0
+
+	$atf_ifconfig bridge0 down
+	$atf_brconfig bridge0 delete vlan0
+	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
+	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig shmif0
+	$atf_ifconfig vlan0 -vlanif
+
+	#
+	# drop unicast packets that is not for the host
+	#
+	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
+	$atf_ifconfig -w 10
+
+	$bpfopen -r shmif0 &
+	pid=$!
+
+	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
+	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig shmif0
+	atf_check -s exit:0 -o ignore rump.ifconfig -z vlan0
+	atf_check -s exit:0 -o not-match:'input:.*errors' \
+	    rump.ifconfig -v vlan0
+
+	export RUMP_SERVER=$SOCK_REMOTE
+	atf_check -s not-exit:0 -o ignore -e ignore \
+	    rump.ping -c 3 -i 0.2 $IP_LOCAL0
+
+	export RUMP_SERVER=$SOCK_LOCAL
+	atf_check -s exit:0 -o match:'input:.*errors' \
+	    rump.ifconfig -v vlan0
+
+	kill -TERM $pid
+	sleep 2
+
+	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
+	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig shmif0
+}
+
+vlan_promisc_cleanup()
+{
+
+	$DEBUG && dump
+	cleanup
+}
+
 atf_init_test_cases()
 {
 
@@ -907,6 +1005,7 @@ atf_init_test_cases()
 	atf_add_test_case vlan_configs
 	atf_add_test_case vlan_bridge
 	atf_add_test_case vlan_multicast
+	atf_add_test_case vlan_promisc
 
 	atf_add_test_case vlan_create_destroy6
 	atf_add_test_case vlan_basic6

Added files:

Index: src/tests/net/if_vlan/bpfopen.c
diff -u /dev/null src/tests/net/if_vlan/bpfopen.c:1.1
--- /dev/null	Fri Jul  9 05:54:11 2021
+++ src/tests/net/if_vlan/bpfopen.c	Fri Jul  9 05:54:11 2021
@@ -0,0 +1,153 @@
+/*	$NetBSD: bpfopen.c,v 1.1 2021/07/09 05:54:11 yamaguchi Exp $	*/
+
+/*
+ * Copyright (c) 2021 Internet Initiative Japan Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: bpfopen.c,v 1.1 2021/07/09 05:54:11 yamaguchi Exp $");
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+
+#include <net/if.h>
+#include <net/bpf.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <unistd.h>
+
+enum {
+	ARG_PROG = 0,
+	ARG_HOST,
+	ARG_IFNAME,
+	ARG_NUM
+};
+
+enum {
+	PFD_BPF = 0,
+	PFD_NUM
+};
+
+static void	sighandler(int);
+
+static sig_atomic_t quit;
+
+static void
+usage(void)
+{
+
+	fprintf(stderr, "%s {-r|-h} <ifname>\n"
+	    "\t-r: rump_server\n"
+	    "\t-h: host\n",
+	    getprogname());
+	exit(1);
+}
+
+int
+main(int argc, char *argv[])
+{
+	struct ifreq ifr;
+	struct pollfd pfd[PFD_NUM];
+	const char *bpf_path;
+	int n, bpfd, nfds;
+	size_t bufsiz;
+	char *buf;
+
+	if (argc != ARG_NUM)
+		usage();
+
+	if (strcmp(argv[ARG_HOST], "-h") == 0) {
+		bpf_path = "/dev/bpf";
+	} else if (strcmp(argv[ARG_HOST], "-r") == 0){
+		bpf_path = "/rump/dev/bpf";
+	} else {
+		errx(1, "-r or -h");
+	}
+
+	bpfd = open(bpf_path, O_RDONLY);
+	if (bpfd < 0)
+		err(1, "open %s", bpf_path);
+
+	memset(&ifr, 0, sizeof(ifr));
+	strlcpy(ifr.ifr_name, argv[ARG_IFNAME],
+	    sizeof(ifr.ifr_name));
+	if (ioctl(bpfd, BIOCSETIF, &ifr) != 0)
+		err(1, "BIOCSETIF");
+	if (ioctl(bpfd, BIOCPROMISC, NULL) != 0)
+		err(1, "BIOCPROMISC");
+	if (ioctl(bpfd, BIOCGBLEN, &bufsiz) != 0)
+		err(1, "BIOCGBLEN");
+	bufsiz = MIN(bufsiz, BPF_DFLTBUFSIZE * 4);
+
+	buf = malloc(bufsiz);
+	if (buf == NULL)
+		err(1, "malloc");
+
+	quit = 0;
+	signal(SIGTERM, sighandler);
+	signal(SIGQUIT, sighandler);
+	signal(SIGINT, sighandler);
+	signal(SIGHUP, sighandler);
+
+	fprintf(stderr, "bpf open %s\n", ifr.ifr_name);
+	while (quit == 0) {
+		pfd[PFD_BPF].fd = bpfd;
+		pfd[PFD_BPF].events = POLLIN;
+
+		nfds = poll(pfd, PFD_NUM, 1 * 1000);
+		if (nfds == -1 && errno != EINTR) {
+			warn("poll");
+			quit = 1;
+		}
+
+		if (nfds > 0 && (pfd[PFD_BPF].revents & POLLIN)) {
+			/* read & drop */
+			memset(buf, 0, sizeof(bufsiz));
+			n = read(pfd[PFD_BPF].fd, buf, bufsiz);
+			if (n < 0)
+				quit = 1;
+		}
+	}
+
+	close(bpfd);
+	free(buf);
+	fprintf(stderr, "closed\n");
+
+	return 0;
+}
+
+static void
+sighandler(int signo)
+{
+
+	quit = 1;
+}

Reply via email to