summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2020-10-21 21:28:20 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2020-10-21 21:28:20 +0000
commitc7cffd65c5d858425e90b847d2e8e583e3b13bf7 (patch)
tree43a36ae6b443b446902f50162ee514f2429996e8 /tests
parent37d411338e9de344d53ea7d55c4f886978bd8171 (diff)
downloadsrc-test-c7cffd65c5d858425e90b847d2e8e583e3b13bf7.tar.gz
src-test-c7cffd65c5d858425e90b847d2e8e583e3b13bf7.zip
Add support for stacked VLANs (IEEE 802.1ad, AKA Q-in-Q).
802.1ad interfaces are created with ifconfig using the "vlanproto" parameter. Eg., the following creates a 802.1Q VLAN (id #42) over a 802.1ad S-VLAN (id #5) over a physical Ethernet interface (em0). ifconfig vlan5 create vlandev em0 vlan 5 vlanproto 802.1ad up ifconfig vlan42 create vlandev vlan5 vlan 42 inet 10.5.42.1/24 VLAN_MTU, VLAN_HWCSUM and VLAN_TSO capabilities should be properly supported. VLAN_HWTAGGING is only partially supported, as there is currently no IFCAP_VLAN_* denoting the possibility to set the VLAN EtherType to anything else than 0x8100 (802.1ad uses 0x88A8). Submitted by: Olivier Piras Sponsored by: RG Nets Differential Revision: https://reviews.freebsd.org/D26436
Notes
Notes: svn path=/head/; revision=366917
Diffstat (limited to 'tests')
-rwxr-xr-xtests/sys/net/if_vlan.sh178
1 files changed, 178 insertions, 0 deletions
diff --git a/tests/sys/net/if_vlan.sh b/tests/sys/net/if_vlan.sh
index 60b799b25675c..2edcb16eab88f 100755
--- a/tests/sys/net/if_vlan.sh
+++ b/tests/sys/net/if_vlan.sh
@@ -36,7 +36,185 @@ basic_cleanup()
vnet_cleanup
}
+# Simple Q-in-Q (802.1Q over 802.1ad)
+
+atf_test_case "qinq_simple" "cleanup"
+qinq_simple_head()
+{
+ atf_set descr 'Simple Q-in-Q test (802.1Q over 802.1ad)'
+ atf_set require.user root
+}
+
+qinq_simple_body()
+{
+ vnet_init
+
+ epair_qinq=$(vnet_mkepair)
+
+ vnet_mkjail jqinq0 ${epair_qinq}a
+ vnet_mkjail jqinq1 ${epair_qinq}b
+
+ vlan5a=$(jexec jqinq0 ifconfig vlan create \
+ vlandev ${epair_qinq}a vlan 5 vlanproto 802.1ad)
+ vlan42a=$(jexec jqinq0 ifconfig vlan create \
+ vlandev ${vlan5a} vlan 42 vlanproto 802.1q)
+ jexec jqinq0 ifconfig ${epair_qinq}a up
+ jexec jqinq0 ifconfig ${vlan5a} up
+ jexec jqinq0 ifconfig ${vlan42a} 10.5.42.1/24 up
+
+ vlan5b=$(jexec jqinq1 ifconfig vlan create \
+ vlandev ${epair_qinq}b vlan 5 vlanproto 802.1ad)
+ vlan42b=$(jexec jqinq1 ifconfig vlan create \
+ vlandev ${vlan5b} vlan 42 vlanproto 802.1q)
+ jexec jqinq1 ifconfig ${epair_qinq}b up
+ jexec jqinq1 ifconfig ${vlan5b} up
+ jexec jqinq1 ifconfig ${vlan42b} 10.5.42.2/24 up
+
+ atf_check -s exit:0 -o ignore jexec jqinq1 ping -c 1 10.5.42.1
+}
+
+qinq_simple_cleanup()
+{
+ vnet_cleanup
+}
+
+# Deep Q-in-Q (802.1Q over 802.1ad over 802.1ad)
+
+atf_test_case "qinq_deep" "cleanup"
+qinq_deep_head()
+{
+ atf_set descr 'Deep Q-in-Q test (802.1Q over 802.1ad over 802.1ad)'
+ atf_set require.user root
+}
+
+qinq_deep_body()
+{
+ vnet_init
+
+ epair_qinq=$(vnet_mkepair)
+
+ vnet_mkjail jqinq2 ${epair_qinq}a
+ vnet_mkjail jqinq3 ${epair_qinq}b
+
+ vlan5a=$(jexec jqinq2 ifconfig vlan create \
+ vlandev ${epair_qinq}a vlan 5 vlanproto 802.1ad)
+ vlan6a=$(jexec jqinq2 ifconfig vlan create \
+ vlandev ${vlan5a} vlan 6 vlanproto 802.1ad)
+ vlan42a=$(jexec jqinq2 ifconfig vlan create \
+ vlandev ${vlan6a} vlan 42 vlanproto 802.1q)
+ jexec jqinq2 ifconfig ${epair_qinq}a up
+ jexec jqinq2 ifconfig ${vlan5a} up
+ jexec jqinq2 ifconfig ${vlan6a} up
+ jexec jqinq2 ifconfig ${vlan42a} 10.6.42.1/24 up
+
+ vlan5b=$(jexec jqinq3 ifconfig vlan create \
+ vlandev ${epair_qinq}b vlan 5 vlanproto 802.1ad)
+ vlan6b=$(jexec jqinq3 ifconfig vlan create \
+ vlandev ${vlan5b} vlan 6 vlanproto 802.1ad)
+ vlan42b=$(jexec jqinq3 ifconfig vlan create \
+ vlandev ${vlan6b} vlan 42 vlanproto 802.1q)
+ jexec jqinq3 ifconfig ${epair_qinq}b up
+ jexec jqinq3 ifconfig ${vlan5b} up
+ jexec jqinq3 ifconfig ${vlan6b} up
+ jexec jqinq3 ifconfig ${vlan42b} 10.6.42.2/24 up
+
+ atf_check -s exit:0 -o ignore jexec jqinq3 ping -c 1 10.6.42.1
+}
+
+qinq_deep_cleanup()
+{
+ vnet_cleanup
+}
+
+# Legacy Q-in-Q (802.1Q over 802.1Q)
+
+atf_test_case "qinq_legacy" "cleanup"
+qinq_legacy_head()
+{
+ atf_set descr 'Legacy Q-in-Q test (802.1Q over 802.1Q)'
+ atf_set require.user root
+}
+
+qinq_legacy_body()
+{
+ vnet_init
+
+ epair_qinq=$(vnet_mkepair)
+
+ vnet_mkjail jqinq4 ${epair_qinq}a
+ vnet_mkjail jqinq5 ${epair_qinq}b
+
+ vlan5a=$(jexec jqinq4 ifconfig vlan create \
+ vlandev ${epair_qinq}a vlan 5)
+ vlan42a=$(jexec jqinq4 ifconfig vlan create \
+ vlandev ${vlan5a} vlan 42)
+ jexec jqinq4 ifconfig ${epair_qinq}a up
+ jexec jqinq4 ifconfig ${vlan5a} up
+ jexec jqinq4 ifconfig ${vlan42a} 10.5.42.1/24 up
+
+ vlan5b=$(jexec jqinq5 ifconfig vlan create \
+ vlandev ${epair_qinq}b vlan 5)
+ vlan42b=$(jexec jqinq5 ifconfig vlan create \
+ vlandev ${vlan5b} vlan 42)
+ jexec jqinq5 ifconfig ${epair_qinq}b up
+ jexec jqinq5 ifconfig ${vlan5b} up
+ jexec jqinq5 ifconfig ${vlan42b} 10.5.42.2/24 up
+
+ atf_check -s exit:0 -o ignore jexec jqinq5 ping -c 1 10.5.42.1
+}
+
+qinq_legacy_cleanup()
+{
+ vnet_cleanup
+}
+
+# Simple Q-in-Q with dot notation
+
+atf_test_case "qinq_dot" "cleanup"
+qinq_dot_head()
+{
+ atf_set descr 'Simple Q-in-Q test with dot notation'
+ atf_set require.user root
+}
+
+qinq_dot_body()
+{
+ vnet_init
+
+ epair_qinq=$(vnet_mkepair)
+
+ vnet_mkjail jqinq6 ${epair_qinq}a
+ vnet_mkjail jqinq7 ${epair_qinq}b
+
+ jexec jqinq6 ifconfig vlan5 create \
+ vlandev ${epair_qinq}a vlan 5 vlanproto 802.1ad
+ jexec jqinq6 ifconfig vlan5.42 create \
+ vlanproto 802.1q
+ jexec jqinq6 ifconfig ${epair_qinq}a up
+ jexec jqinq6 ifconfig vlan5 up
+ jexec jqinq6 ifconfig vlan5.42 10.5.42.1/24 up
+
+ vlan5b=$(jexec jqinq7 ifconfig vlan create \
+ vlandev ${epair_qinq}b vlan 5 vlanproto 802.1ad)
+ vlan42b=$(jexec jqinq7 ifconfig vlan create \
+ vlandev ${vlan5b} vlan 42 vlanproto 802.1q)
+ jexec jqinq7 ifconfig ${epair_qinq}b up
+ jexec jqinq7 ifconfig ${vlan5b} up
+ jexec jqinq7 ifconfig ${vlan42b} 10.5.42.2/24 up
+
+ atf_check -s exit:0 -o ignore jexec jqinq7 ping -c 1 10.5.42.1
+}
+
+qinq_dot_cleanup()
+{
+ vnet_cleanup
+}
+
atf_init_test_cases()
{
atf_add_test_case "basic"
+ atf_add_test_case "qinq_simple"
+ atf_add_test_case "qinq_deep"
+ atf_add_test_case "qinq_legacy"
+ atf_add_test_case "qinq_dot"
}