Module Name:    src
Committed By:   martin
Date:           Sat Aug 24 16:42:26 UTC 2024

Modified Files:
        src/distrib/sets/lists/tests [netbsd-10]: mi
        src/etc/mtree [netbsd-10]: NetBSD.dist.tests
        src/sbin/ifconfig [netbsd-10]: ifconfig.8 ifconfig.c
        src/sys/rump/net/lib/libshmif [netbsd-10]: if_shmem.c
        src/tests/net [netbsd-10]: Makefile
Added Files:
        src/tests/net/if_shmif [netbsd-10]: Makefile t_shmif.sh

Log Message:
Pull up following revision(s) (requested by ozaki-r in ticket #811):

        tests/net/if_shmif/t_shmif.sh: revision 1.1
        sbin/ifconfig/ifconfig.c: revision 1.251
        sbin/ifconfig/ifconfig.8: revision 1.130
        sys/rump/net/lib/libshmif/if_shmem.c: revision 1.85
        sys/rump/net/lib/libshmif/if_shmem.c: revision 1.86
        sys/rump/net/lib/libshmif/if_shmem.c: revision 1.87
        etc/mtree/NetBSD.dist.tests: revision 1.206
        distrib/sets/lists/tests/mi: revision 1.1333
        tests/net/if_shmif/Makefile: revision 1.1
        tests/net/Makefile: revision 1.42

shmif: change behaviors about link states

- Change the link state to UP on ifconfig linkstr
  - This behavior emulates physical devices
- Change the link state to UNKNOWN on ifconfig -linkstr just in case
- Reject sending/receiving packets if the link state is DOWN
  - Permit to send/receive packets on UNKNOWN, which is required
    to unbreak some ATF tests written in C

shmif: support media

It enables to link-down shmif by ifconfig media none and link-up
again by media auto.

ifconfig: show link state on -v

We could guess it through "media" or "status" output, however, we
sometimes want to know it directly for debugging or testing.

It is shown only if the -v option is specified.
tests: add tests for shmif

The test file is placed under tests/net, not tests/rump/rumpnet,
to leverage utility functions provided for tests in there.
shmem(4): Fix typo in comment: AFT -> ATF.

Also fix grammar (if I understood correctly what this meant: rump
servers written in C, rather than set up via shell scripts around
rump_server invoking ifconfig).

No functional change intended.


To generate a diff of this commit:
cvs rdiff -u -r1.1238.2.8 -r1.1238.2.9 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.197.2.2 -r1.197.2.3 src/etc/mtree/NetBSD.dist.tests
cvs rdiff -u -r1.124.2.1 -r1.124.2.2 src/sbin/ifconfig/ifconfig.8
cvs rdiff -u -r1.249 -r1.249.2.1 src/sbin/ifconfig/ifconfig.c
cvs rdiff -u -r1.84 -r1.84.4.1 src/sys/rump/net/lib/libshmif/if_shmem.c
cvs rdiff -u -r1.41 -r1.41.2.1 src/tests/net/Makefile
cvs rdiff -u -r0 -r1.1.2.2 src/tests/net/if_shmif/Makefile \
    src/tests/net/if_shmif/t_shmif.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/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1238.2.8 src/distrib/sets/lists/tests/mi:1.1238.2.9
--- src/distrib/sets/lists/tests/mi:1.1238.2.8	Fri Aug 23 18:28:09 2024
+++ src/distrib/sets/lists/tests/mi	Sat Aug 24 16:42:26 2024
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1238.2.8 2024/08/23 18:28:09 martin Exp $
+# $NetBSD: mi,v 1.1238.2.9 2024/08/24 16:42:26 martin Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -4282,6 +4282,10 @@
 ./usr/tests/net/if_pppoe/Kyuafile			tests-net-tests		atf,rump,kyua
 ./usr/tests/net/if_pppoe/t_pppoe			tests-net-tests		atf,rump
 ./usr/tests/net/if_pppoe/t_pppoe_unnumbered		tests-net-tests		atf,rump
+./usr/tests/net/if_shmif				tests-net-tests		compattestfile,atf
+./usr/tests/net/if_shmif/Atffile			tests-net-tests		atf,rump
+./usr/tests/net/if_shmif/Kyuafile			tests-net-tests		atf,rump,kyua
+./usr/tests/net/if_shmif/t_shmif			tests-net-tests		atf,rump
 ./usr/tests/net/if_tap					tests-net-tests		compattestfile,atf
 ./usr/tests/net/if_tap/Atffile				tests-net-tests		atf,rump
 ./usr/tests/net/if_tap/Kyuafile				tests-net-tests		atf,rump,kyua

Index: src/etc/mtree/NetBSD.dist.tests
diff -u src/etc/mtree/NetBSD.dist.tests:1.197.2.2 src/etc/mtree/NetBSD.dist.tests:1.197.2.3
--- src/etc/mtree/NetBSD.dist.tests:1.197.2.2	Fri Aug 23 18:28:09 2024
+++ src/etc/mtree/NetBSD.dist.tests	Sat Aug 24 16:42:26 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: NetBSD.dist.tests,v 1.197.2.2 2024/08/23 18:28:09 martin Exp $
+#	$NetBSD: NetBSD.dist.tests,v 1.197.2.3 2024/08/24 16:42:26 martin Exp $
 
 ./usr/libdata/debug/usr/tests
 ./usr/libdata/debug/usr/tests/atf
@@ -376,6 +376,7 @@
 ./usr/tests/net/if_lagg
 ./usr/tests/net/if_loop
 ./usr/tests/net/if_pppoe
+./usr/tests/net/if_shmif
 ./usr/tests/net/if_tap
 ./usr/tests/net/if_tun
 ./usr/tests/net/if_vether

Index: src/sbin/ifconfig/ifconfig.8
diff -u src/sbin/ifconfig/ifconfig.8:1.124.2.1 src/sbin/ifconfig/ifconfig.8:1.124.2.2
--- src/sbin/ifconfig/ifconfig.8:1.124.2.1	Thu Apr 18 16:26:47 2024
+++ src/sbin/ifconfig/ifconfig.8	Sat Aug 24 16:42:26 2024
@@ -1,4 +1,4 @@
-.\"	$NetBSD: ifconfig.8,v 1.124.2.1 2024/04/18 16:26:47 martin Exp $
+.\"	$NetBSD: ifconfig.8,v 1.124.2.2 2024/08/24 16:42:26 martin Exp $
 .\"
 .\" Copyright (c) 1983, 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"     @(#)ifconfig.8	8.4 (Berkeley) 6/1/94
 .\"
-.Dd April 8, 2024
+.Dd August 20, 2024
 .Dt IFCONFIG 8
 .Os
 .Sh NAME
@@ -870,8 +870,8 @@ mutually exclusive with all other flags 
 .Pp
 The
 .Fl v
-flag prints statistics on packets sent and received on the given
-interface.
+flag prints additional information like statistics on packets sent and received
+on the interface and the link state of the interface.
 If
 .Fl h
 is used in conjunction with

Index: src/sbin/ifconfig/ifconfig.c
diff -u src/sbin/ifconfig/ifconfig.c:1.249 src/sbin/ifconfig/ifconfig.c:1.249.2.1
--- src/sbin/ifconfig/ifconfig.c:1.249	Fri Nov 25 08:41:05 2022
+++ src/sbin/ifconfig/ifconfig.c	Sat Aug 24 16:42:26 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ifconfig.c,v 1.249 2022/11/25 08:41:05 knakahara Exp $	*/
+/*	$NetBSD: ifconfig.c,v 1.249.2.1 2024/08/24 16:42:26 martin Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2000 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1983, 1993\
  The Regents of the University of California.  All rights reserved.");
-__RCSID("$NetBSD: ifconfig.c,v 1.249 2022/11/25 08:41:05 knakahara Exp $");
+__RCSID("$NetBSD: ifconfig.c,v 1.249.2.1 2024/08/24 16:42:26 martin Exp $");
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -111,6 +111,8 @@ static long wflag_secs, Wflag_secs;
 static char gflags[10 + 26 * 2 + 1] = "AabCdhlNsuvW:w:z";
 bool gflagset[10 + 26 * 2];
 
+static int link_state(prop_dictionary_t);
+static const char *link_state_str(int);
 static int carrier(prop_dictionary_t);
 static int clone_command(prop_dictionary_t, prop_dictionary_t);
 static void do_setifpreference(prop_dictionary_t);
@@ -884,7 +886,7 @@ printall(const char *ifname, prop_dictio
 		if (uflag && (ifa->ifa_flags & IFF_UP) == 0)
 			continue;
 
-		if (sflag && carrier(env) == LINK_STATE_DOWN)
+		if (sflag && link_state(env) == LINK_STATE_DOWN)
 			continue;
 		idx++;
 		/*
@@ -1199,17 +1201,43 @@ setifmtu(prop_dictionary_t env, prop_dic
 }
 
 static int
-carrier(prop_dictionary_t env)
+link_state(prop_dictionary_t env)
 {
 	struct ifdatareq ifdr = { .ifdr_data.ifi_link_state = 0 };
 
 	if (direct_ioctl(env, SIOCGIFDATA, &ifdr) == -1)
-		return EXIT_FAILURE;
+		return -1;
+
+	return ifdr.ifdr_data.ifi_link_state;
+}
+
+static const char *
+link_state_str(int state)
+{
 
-	if (ifdr.ifdr_data.ifi_link_state == LINK_STATE_DOWN)
+	switch (state) {
+	case LINK_STATE_UNKNOWN:
+		return "unknown";
+	case LINK_STATE_DOWN:
+		return "down";
+	case LINK_STATE_UP:
+		return "up";
+	default: /* Assume -1 */
+		return "error";
+	}
+}
+
+static int
+carrier(prop_dictionary_t env)
+{
+	switch (link_state(env)) {
+	case -1:
+	case LINK_STATE_DOWN:
 		return EXIT_FAILURE;
-	else /* Assume UP if UNKNOWN */
+	default:
+		/* Assume UP if UNKNOWN */
 		return EXIT_SUCCESS;
+	}
 }
 
 static void
@@ -1333,6 +1361,9 @@ status(prop_dictionary_t env, prop_dicti
 		free(p);
 	}
 
+	if (vflag)
+		printf("\tlinkstate: %s\n", link_state_str(link_state(env)));
+
 	media_status(env, oenv);
 
 	if (!vflag && !zflag)

Index: src/sys/rump/net/lib/libshmif/if_shmem.c
diff -u src/sys/rump/net/lib/libshmif/if_shmem.c:1.84 src/sys/rump/net/lib/libshmif/if_shmem.c:1.84.4.1
--- src/sys/rump/net/lib/libshmif/if_shmem.c:1.84	Sat Apr  9 23:45:02 2022
+++ src/sys/rump/net/lib/libshmif/if_shmem.c	Sat Aug 24 16:42:26 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_shmem.c,v 1.84 2022/04/09 23:45:02 riastradh Exp $	*/
+/*	$NetBSD: if_shmem.c,v 1.84.4.1 2024/08/24 16:42:26 martin Exp $	*/
 
 /*
  * Copyright (c) 2009, 2010 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.84 2022/04/09 23:45:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.84.4.1 2024/08/24 16:42:26 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_ether.h>
+#include <net/if_media.h>
 #include <net/ether_sw_offload.h>
 
 #include <netinet/in.h>
@@ -59,6 +60,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v
 static int shmif_clone(struct if_clone *, int);
 static int shmif_unclone(struct ifnet *);
 
+static int shmif_mediachange(struct ifnet *);
+static void shmif_mediastatus(struct ifnet *, struct ifmediareq *);
+
 struct if_clone shmif_cloner =
     IF_CLONE_INITIALIZER("shmif", shmif_clone, shmif_unclone);
 
@@ -84,6 +88,7 @@ static void	shmif_stop(struct ifnet *, i
 
 struct shmif_sc {
 	struct ethercom sc_ec;
+	struct ifmedia sc_im;
 	struct shmif_mem *sc_busmem;
 	int sc_memfd;
 	int sc_kq;
@@ -176,6 +181,11 @@ allocif(int unit, struct shmif_sc **scp)
 
 	ifp = &sc->sc_ec.ec_if;
 
+	ifmedia_init(&sc->sc_im, 0, shmif_mediachange, shmif_mediastatus);
+	ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_AUTO, 0, NULL);
+	ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_NONE, 0, NULL);
+	ifmedia_set(&sc->sc_im, IFM_ETHER|IFM_AUTO);
+
 	snprintf(ifp->if_xname, sizeof(ifp->if_xname), "shmif%d", unit);
 	ifp->if_softc = sc;
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
@@ -446,6 +456,28 @@ shmif_init(struct ifnet *ifp)
 }
 
 static int
+shmif_mediachange(struct ifnet *ifp)
+{
+	struct shmif_sc *sc = ifp->if_softc;
+
+	if (IFM_SUBTYPE(sc->sc_im.ifm_cur->ifm_media) == IFM_NONE &&
+	    ifp->if_link_state != LINK_STATE_DOWN) {
+		if_link_state_change(ifp, LINK_STATE_DOWN);
+	} else if (IFM_SUBTYPE(sc->sc_im.ifm_cur->ifm_media) == IFM_AUTO &&
+	    ifp->if_link_state != LINK_STATE_UP) {
+		if_link_state_change(ifp, LINK_STATE_UP);
+	}
+	return 0;
+}
+
+static void
+shmif_mediastatus(struct ifnet *ifp, struct ifmediareq *imr)
+{
+	struct shmif_sc *sc = ifp->if_softc;
+	imr->ifm_active = sc->sc_im.ifm_cur->ifm_media;
+}
+
+static int
 shmif_ioctl(struct ifnet *ifp, u_long cmd, void *data)
 {
 	struct shmif_sc *sc = ifp->if_softc;
@@ -486,6 +518,8 @@ shmif_ioctl(struct ifnet *ifp, u_long cm
 		ifd = data;
 		if (ifd->ifd_cmd == IFLINKSTR_UNSET) {
 			finibackend(sc);
+			/* Back to the default just in case */
+			ifp->if_link_state = LINK_STATE_UNKNOWN;
 			rv = 0;
 			break;
 		} else if (ifd->ifd_cmd != 0) {
@@ -525,7 +559,17 @@ shmif_ioctl(struct ifnet *ifp, u_long cm
 		sc->sc_backfile = path;
 		sc->sc_backfilelen = ifd->ifd_len;
 
+		if_link_state_change(ifp, LINK_STATE_UP);
+		break;
+
+#ifdef OSIOCSIFMEDIA
+	case OSIOCSIFMEDIA:
+#endif
+	case SIOCSIFMEDIA:
+	case SIOCGIFMEDIA:
+		rv = ifmedia_ioctl(ifp, data, &sc->sc_im, cmd);
 		break;
+
 	default:
 		rv = ether_ioctl(ifp, cmd, data);
 		if (rv == ENETRESET)
@@ -601,6 +645,14 @@ shmif_snd(struct ifnet *ifp, struct mbuf
 
 	bpf_mtap(ifp, m0, BPF_D_OUT);
 
+	/*
+	 * Compare with DOWN to allow UNKNOWN (the default value),
+	 * which is required by some ATF tests using rump servers
+	 * written in C.
+	 */
+	if (ifp->if_link_state == LINK_STATE_DOWN)
+		goto dontsend;
+
 	shmif_lockbus(busmem);
 	KASSERT(busmem->shm_magic == SHMIF_MAGIC);
 	busmem->shm_last = shmif_nextpktoff(busmem, busmem->shm_last);
@@ -621,6 +673,7 @@ shmif_snd(struct ifnet *ifp, struct mbuf
 	}
 	shmif_unlockbus(busmem);
 
+dontsend:
 	m_freem(m0);
 	if_statinc(ifp, if_opackets);
 
@@ -790,7 +843,14 @@ shmif_rcv(void *arg)
 		 * Test if we want to pass the packet upwards
 		 */
 		eth = mtod(m, struct ether_header *);
-		if (sp.sp_sender == sc->sc_uid) {
+		/*
+		 * Compare with DOWN to allow UNKNOWN (the default value),
+		 * which is required by some ATF tests using rump servers
+		 * written in C.
+		 */
+		if (ifp->if_link_state == LINK_STATE_DOWN) {
+			passup = false;
+		} else if (sp.sp_sender == sc->sc_uid) {
 			passup = false;
 		} else if (memcmp(eth->ether_dhost, CLLADDR(ifp->if_sadl),
 		    ETHER_ADDR_LEN) == 0) {

Index: src/tests/net/Makefile
diff -u src/tests/net/Makefile:1.41 src/tests/net/Makefile:1.41.2.1
--- src/tests/net/Makefile:1.41	Thu Nov 17 08:45:35 2022
+++ src/tests/net/Makefile	Sat Aug 24 16:42:26 2024
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.41 2022/11/17 08:45:35 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.41.2.1 2024/08/24 16:42:26 martin Exp $
 
 .include <bsd.own.mk>
 
@@ -7,7 +7,7 @@ TESTSDIR=	${TESTSBASE}/net
 TESTS_SUBDIRS=		fdpass in_cksum net sys
 .if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
 TESTS_SUBDIRS+=		altq arp bpf bpfilter can carp icmp if if_bridge if_gif
-TESTS_SUBDIRS+=		if_ipsec if_l2tp if_lagg if_loop if_pppoe if_tap
+TESTS_SUBDIRS+=		if_ipsec if_l2tp if_lagg if_loop if_pppoe if_shmif if_tap
 TESTS_SUBDIRS+=		if_tun if_vether if_vlan if_wg inpcb ipsec mcast mpls
 TESTS_SUBDIRS+=		ndp npf route tcp
 .if (${MKSLJIT} != "no")

Added files:

Index: src/tests/net/if_shmif/Makefile
diff -u /dev/null src/tests/net/if_shmif/Makefile:1.1.2.2
--- /dev/null	Sat Aug 24 16:42:27 2024
+++ src/tests/net/if_shmif/Makefile	Sat Aug 24 16:42:25 2024
@@ -0,0 +1,13 @@
+# $NetBSD: Makefile,v 1.1.2.2 2024/08/24 16:42:25 martin Exp $
+#
+
+.include <bsd.own.mk>
+
+TESTSDIR=	${TESTSBASE}/net/if_shmif
+
+.for name in shmif
+TESTS_SH+=		t_${name}
+TESTS_SH_SRC_t_${name}=	../net_common.sh t_${name}.sh
+.endfor
+
+.include <bsd.test.mk>
Index: src/tests/net/if_shmif/t_shmif.sh
diff -u /dev/null src/tests/net/if_shmif/t_shmif.sh:1.1.2.2
--- /dev/null	Sat Aug 24 16:42:27 2024
+++ src/tests/net/if_shmif/t_shmif.sh	Sat Aug 24 16:42:25 2024
@@ -0,0 +1,138 @@
+# $NetBSD: t_shmif.sh,v 1.1.2.2 2024/08/24 16:42:25 martin Exp $
+#
+# Copyright (c) 2024 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.
+#
+
+RUMP_SERVER1=unix://./r1
+RUMP_SERVER2=unix://./r2
+
+TIMEOUT=3
+
+atf_test_case shmif_linkstate cleanup
+shmif_linkstate_head()
+{
+	atf_set "descr" "tests of ifconfig media on shmif"
+	atf_set "require.progs" "rump_server"
+}
+
+shmif_linkstate_body()
+{
+	local auto="Ethernet autoselect"
+	local none="Ethernet none"
+
+	rump_server_start $RUMP_SERVER1
+	rump_server_add_iface $RUMP_SERVER1 shmif0 bus1
+
+	export RUMP_SERVER=$RUMP_SERVER1
+	# After ifconfig linkstr, the state becomes UP
+	atf_check -o match:'linkstate: up' \
+	          -o match:"media: $auto" \
+	          -o not-match:"<UP" rump.ifconfig -v shmif0
+	atf_check rump.ifconfig shmif0 up
+	atf_check -o match:'linkstate: up' \
+	          -o match:"media: $auto" \
+	          -o match:"<UP" rump.ifconfig -v shmif0
+	# ifconfig media none makes the state DOWN
+	atf_check rump.ifconfig shmif0 media none
+	atf_check -o match:'linkstate: down' \
+	          -o match:"media: $none" \
+	          -o match:"<UP" rump.ifconfig -v shmif0
+	# ifconfig media auto makes the state UP
+	atf_check rump.ifconfig shmif0 media auto
+	atf_check -o match:'linkstate: up' \
+	          -o match:"media: $auto" \
+	          -o match:"<UP" rump.ifconfig -v shmif0
+	atf_check rump.ifconfig shmif0 down
+	atf_check -o match:'linkstate: up' \
+	          -o match:"media: $auto" \
+	          -o not-match:"<UP" rump.ifconfig -v shmif0
+	# After ifconfig -linkstr, the state becomes UNKNOWN
+	atf_check rump.ifconfig shmif0 -linkstr
+	atf_check -o match:'linkstate: unknown' \
+	          -o match:"media: $auto" \
+	          -o not-match:"<UP" rump.ifconfig -v shmif0
+
+	rump_server_destroy_ifaces
+}
+
+shmif_linkstate_cleanup()
+{
+
+	$DEBUG && dump
+	cleanup
+}
+
+atf_test_case shmif_linkstate_down cleanup
+shmif_linkstate_down_head()
+{
+	atf_set "descr" "tests of behaviors of down shmif"
+	atf_set "require.progs" "rump_server"
+}
+
+shmif_linkstate_down_body()
+{
+
+	rump_server_start $RUMP_SERVER1
+	rump_server_start $RUMP_SERVER2
+	rump_server_add_iface $RUMP_SERVER1 shmif0 bus1
+	rump_server_add_iface $RUMP_SERVER2 shmif0 bus1
+
+	export RUMP_SERVER=$RUMP_SERVER1
+	atf_check rump.sysctl -q -w net.inet.ip.dad_count=0
+	atf_check rump.ifconfig shmif0 10.0.0.1/24 up
+	export RUMP_SERVER=$RUMP_SERVER2
+	atf_check rump.sysctl -q -w net.inet.ip.dad_count=0
+	atf_check rump.ifconfig shmif0 10.0.0.2/24 up
+
+	export RUMP_SERVER=$RUMP_SERVER1
+	atf_check -o ignore rump.ping -c 1 -w $TIMEOUT 10.0.0.2
+
+	atf_check rump.ifconfig shmif0 media none
+	atf_check -o match:'linkstate: down' rump.ifconfig -v shmif0
+
+	# shmif doesn't send any packets on link down
+	atf_check -s not-exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT 10.0.0.2
+
+	atf_check rump.ifconfig shmif0 media auto
+	atf_check -o match:'linkstate: up' rump.ifconfig -v shmif0
+
+	atf_check -o ignore rump.ping -c 1 -w $TIMEOUT 10.0.0.2
+
+	rump_server_destroy_ifaces
+}
+
+shmif_linkstate_down_cleanup()
+{
+
+	$DEBUG && dump
+	cleanup
+}
+
+atf_init_test_cases()
+{
+
+	atf_add_test_case shmif_linkstate
+	atf_add_test_case shmif_linkstate_down
+}

Reply via email to