Page MenuHomeFreeBSD

D31276.diff
No OneTemporary

D31276.diff

diff --git a/tests/sys/net/Makefile b/tests/sys/net/Makefile
--- a/tests/sys/net/Makefile
+++ b/tests/sys/net/Makefile
@@ -21,8 +21,11 @@
TEST_METADATA+= is_exclusive=true
${PACKAGE}FILES+= \
+ dhclient_pcp.conf \
+ pcp.py \
stp.py
+${PACKAGE}FILESMODE_pcp.py= 0555
${PACKAGE}FILESMODE_stp.py= 0555
MAN=
diff --git a/tests/sys/net/dhclient_pcp.conf b/tests/sys/net/dhclient_pcp.conf
new file mode 100644
--- /dev/null
+++ b/tests/sys/net/dhclient_pcp.conf
@@ -0,0 +1 @@
+vlan-pcp 6;
diff --git a/tests/sys/net/if_vlan.sh b/tests/sys/net/if_vlan.sh
--- a/tests/sys/net/if_vlan.sh
+++ b/tests/sys/net/if_vlan.sh
@@ -210,6 +210,52 @@
vnet_cleanup
}
+atf_test_case "bpf_pcp" "cleanup"
+bpf_pcp_head()
+{
+ atf_set descr 'Set VLAN PCP through BPF'
+ atf_set require.config 'allow_sysctl_side_effects'
+ atf_set require.user root
+ atf_set require.progs scapy
+}
+
+bpf_pcp_body()
+{
+ vnet_init
+
+ epair=$(vnet_mkepair)
+
+ ifconfig ${epair}a up
+
+ vnet_mkjail alcatraz ${epair}b
+ vlan=$(jexec alcatraz ifconfig vlan create)
+ jexec alcatraz ifconfig ${vlan} vlan 42 vlandev ${epair}b
+ jexec alcatraz ifconfig ${vlan} up
+ jexec alcatraz ifconfig ${epair}b up
+
+ sysctl net.link.vlan.mtag_pcp=1
+
+ jexec alcatraz dhclient ${vlan} &
+ atf_check -s exit:1 -o ignore -e ignore $(atf_get_srcdir)/pcp.py \
+ --expect-pcp 6 \
+ --recvif ${epair}a
+
+ jexec alcatraz killall dhclient
+ sleep 1
+
+ jexec alcatraz dhclient -c $(atf_get_srcdir)/dhclient_pcp.conf ${vlan} &
+ atf_check -s exit:0 -o ignore -e ignore $(atf_get_srcdir)/pcp.py \
+ --expect-pcp 6 \
+ --recvif ${epair}a
+}
+
+bpf_pcp_cleanup()
+{
+ sysctl net.link.vlan.mtag_pcp=0
+ jexec alcatraz killall dhclient
+ vnet_cleanup
+}
+
atf_init_test_cases()
{
atf_add_test_case "basic"
@@ -217,4 +263,5 @@
atf_add_test_case "qinq_deep"
atf_add_test_case "qinq_legacy"
atf_add_test_case "qinq_dot"
+ atf_add_test_case "bpf_pcp"
}
diff --git a/tests/sys/netpfil/common/sniffer.py b/tests/sys/net/pcp.py
copy from tests/sys/netpfil/common/sniffer.py
copy to tests/sys/net/pcp.py
--- a/tests/sys/netpfil/common/sniffer.py
+++ b/tests/sys/net/pcp.py
@@ -1,8 +1,8 @@
-# $FreeBSD$
+#!/usr/bin/env python3
#
-# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+# SPDX-License-Identifier: BSD-2-Clause
#
-# Copyright (c) 2017 Kristof Provost <kp@FreeBSD.org>
+# Copyright (c) 2021 Rubicon Communications, LLC (Netgate).
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -24,31 +24,51 @@
# 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.
-#
-import threading
+import argparse
+import logging
+logging.getLogger("scapy").setLevel(logging.CRITICAL)
import scapy.all as sp
+import sys
+import os
+curdir = os.path.dirname(os.path.realpath(__file__))
+netpfil_common = curdir + "/../netpfil/common"
+sys.path.append(netpfil_common)
+from sniffer import Sniffer
+
+def check_pcp(args, packet):
+ vlan = packet.getlayer(sp.Dot1Q)
+
+ if vlan is None:
+ return False
+
+ if not packet.getlayer(sp.BOOTP):
+ return False
+
+ if vlan.prio == int(args.expect_pcp[0]):
+ return True
+
+ return False
+
+def main():
+ parser = argparse.ArgumentParser("pcp.py",
+ description="PCP test tool")
+ parser.add_argument('--recvif', nargs=1,
+ required=True,
+ help='The interface where to look for packets to check')
+ parser.add_argument('--expect-pcp', nargs=1,
+ help='The expected PCP value on VLAN packets')
+
+ args = parser.parse_args()
+
+ sniffer = Sniffer(args, check_pcp, recvif=args.recvif[0], timeout=20)
+
+ sniffer.join()
+
+ if sniffer.foundCorrectPacket:
+ sys.exit(0)
+
+ sys.exit(1)
-class Sniffer(threading.Thread):
- def __init__(self, args, check_function, recvif=None):
- threading.Thread.__init__(self)
-
- self._args = args
- if recvif is not None:
- self._recvif = recvif
- else:
- self._recvif = args.recvif[0]
- self._check_function = check_function
- self.foundCorrectPacket = False
-
- self.start()
-
- def _checkPacket(self, packet):
- ret = self._check_function(self._args, packet)
- if ret:
- self.foundCorrectPacket = True
- return ret
-
- def run(self):
- self.packets = sp.sniff(iface=self._recvif,
- stop_filter=self._checkPacket, timeout=3)
+if __name__ == '__main__':
+ main()
diff --git a/tests/sys/netpfil/common/sniffer.py b/tests/sys/netpfil/common/sniffer.py
--- a/tests/sys/netpfil/common/sniffer.py
+++ b/tests/sys/netpfil/common/sniffer.py
@@ -28,12 +28,14 @@
import threading
import scapy.all as sp
+import sys
class Sniffer(threading.Thread):
- def __init__(self, args, check_function, recvif=None):
+ def __init__(self, args, check_function, recvif=None, timeout=3):
threading.Thread.__init__(self)
self._args = args
+ self._timeout = timeout
if recvif is not None:
self._recvif = recvif
else:
@@ -50,5 +52,9 @@
return ret
def run(self):
- self.packets = sp.sniff(iface=self._recvif,
- stop_filter=self._checkPacket, timeout=3)
+ self.packets = []
+ try:
+ self.packets = sp.sniff(iface=self._recvif,
+ stop_filter=self._checkPacket, timeout=self._timeout)
+ except Exception as e:
+ print(e, file=sys.stderr)

File Metadata

Mime Type
text/plain
Expires
Sat, Nov 16, 7:20 AM (20 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14655098
Default Alt Text
D31276.diff (5 KB)

Event Timeline