xref: /linux/tools/testing/selftests/net/netfilter/vxlan_mtu_frag.sh (revision 1d227fcc72223cbdd34d0ce13541cbaab5e0d72f)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4source lib.sh
5
6if ! modprobe -q -n br_netfilter 2>&1; then
7        echo "SKIP: Test needs br_netfilter kernel module"
8        exit $ksft_skip
9fi
10
11cleanup()
12{
13        cleanup_all_ns
14}
15
16trap cleanup EXIT
17
18setup_ns host vtep router
19
20create_topology()
21{
22    ip link add host-eth0 netns "$host" type veth peer name vtep-host netns "$vtep"
23    ip link add vtep-router netns "$vtep" type veth peer name router-vtep netns "$router"
24}
25
26setup_host()
27{
28    # bring ports up
29    ip -n "$host" addr add 10.0.0.1/24 dev host-eth0
30    ip -n "$host" link set host-eth0 up
31
32    # Add VLAN 10,20
33    for vid in 10 20; do
34        ip -n "$host" link add link host-eth0 name host-eth0.$vid type vlan id $vid
35        ip -n "$host" addr add 10.0.$vid.1/24 dev host-eth0.$vid
36        ip -n "$host" link set host-eth0.$vid up
37    done
38}
39
40setup_vtep()
41{
42    # create bridge on vtep
43    ip -n "$vtep" link add name br0 type bridge
44    ip -n "$vtep" link set br0 type bridge vlan_filtering 1
45
46    # VLAN 10 is untagged PVID
47    ip -n "$vtep" link set dev vtep-host master br0
48    bridge -n "$vtep" vlan add dev vtep-host vid 10 pvid untagged
49
50    # VLAN 20 as other VID
51    ip -n "$vtep" link set dev vtep-host master br0
52    bridge -n "$vtep" vlan add dev vtep-host vid 20
53
54    # single-vxlan device on vtep
55    ip -n "$vtep" address add dev vtep-router 60.0.0.1/24
56    ip -n "$vtep" link add dev vxd type vxlan external \
57        vnifilter local 60.0.0.1 remote 60.0.0.2 dstport 4789 ttl 64
58    ip -n "$vtep" link set vxd master br0
59
60    # Add VLAN-VNI 1-1 mappings
61    bridge -n "$vtep" link set dev vxd vlan_tunnel on
62    for vid in 10 20; do
63        bridge -n "$vtep" vlan add dev vxd vid $vid
64        bridge -n "$vtep" vlan add dev vxd vid $vid tunnel_info id $vid
65        bridge -n "$vtep" vni add dev vxd vni $vid
66    done
67
68    # bring ports up
69    ip -n "$vtep" link set vxd up
70    ip -n "$vtep" link set vtep-router up
71    ip -n "$vtep" link set vtep-host up
72    ip -n "$vtep" link set dev br0 up
73}
74
75setup_router()
76{
77    # bring ports up
78    ip -n "$router" link set router-vtep up
79}
80
81setup()
82{
83    modprobe -q br_netfilter
84    create_topology
85    setup_host
86    setup_vtep
87    setup_router
88}
89
90test_large_mtu_untagged_traffic()
91{
92    ip -n "$vtep" link set vxd mtu 1000
93    ip -n "$host" neigh add 10.0.0.2 lladdr ca:fe:ba:be:00:01 dev host-eth0
94    ip netns exec "$host" \
95        ping -q 10.0.0.2 -I host-eth0 -c 1 -W 0.5 -s2000 > /dev/null 2>&1
96    return 0
97}
98
99test_large_mtu_tagged_traffic()
100{
101    for vid in 10 20; do
102        ip -n "$vtep" link set vxd mtu 1000
103        ip -n "$host" neigh add 10.0.$vid.2 lladdr ca:fe:ba:be:00:01 dev host-eth0.$vid
104        ip netns exec "$host" \
105            ping -q 10.0.$vid.2 -I host-eth0.$vid -c 1 -W 0.5 -s2000 > /dev/null 2>&1
106    done
107    return 0
108}
109
110do_test()
111{
112    # Frames will be dropped so ping will not succeed
113    # If it doesn't panic, it passes
114    test_large_mtu_tagged_traffic
115    test_large_mtu_untagged_traffic
116}
117
118setup && \
119echo "Test for VxLAN fragmentation with large MTU in br_netfilter:" && \
120do_test && echo "PASS!"
121exit $?
122