Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 # This test sends traffic from H1 to H2. Either on ingress of $swp1, or on egress of $swp2, the
0005 # traffic is acted upon by a pedit action. An ingress filter installed on $h2 verifies that the
0006 # packet looks like expected.
0007 #
0008 # +----------------------+                             +----------------------+
0009 # | H1                   |                             |                   H2 |
0010 # |    + $h1             |                             |            $h2 +     |
0011 # |    | 192.0.2.1/28    |                             |   192.0.2.2/28 |     |
0012 # +----|-----------------+                             +----------------|-----+
0013 #      |                                                                |
0014 # +----|----------------------------------------------------------------|-----+
0015 # | SW |                                                                |     |
0016 # |  +-|----------------------------------------------------------------|-+   |
0017 # |  | + $swp1                       BR                           $swp2 + |   |
0018 # |  +--------------------------------------------------------------------+   |
0019 # +---------------------------------------------------------------------------+
0020 
0021 ALL_TESTS="
0022         ping_ipv4
0023         test_udp_sport
0024         test_udp_dport
0025         test_tcp_sport
0026         test_tcp_dport
0027 "
0028 
0029 NUM_NETIFS=4
0030 source lib.sh
0031 source tc_common.sh
0032 
0033 : ${HIT_TIMEOUT:=2000} # ms
0034 
0035 h1_create()
0036 {
0037         simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64
0038 }
0039 
0040 h1_destroy()
0041 {
0042         simple_if_fini $h1 192.0.2.1/28 2001:db8:1::1/64
0043 }
0044 
0045 h2_create()
0046 {
0047         simple_if_init $h2 192.0.2.2/28 2001:db8:1::2/64
0048         tc qdisc add dev $h2 clsact
0049 }
0050 
0051 h2_destroy()
0052 {
0053         tc qdisc del dev $h2 clsact
0054         simple_if_fini $h2 192.0.2.2/28 2001:db8:1::2/64
0055 }
0056 
0057 switch_create()
0058 {
0059         ip link add name br1 up type bridge vlan_filtering 1
0060         ip link set dev $swp1 master br1
0061         ip link set dev $swp1 up
0062         ip link set dev $swp2 master br1
0063         ip link set dev $swp2 up
0064 
0065         tc qdisc add dev $swp1 clsact
0066         tc qdisc add dev $swp2 clsact
0067 }
0068 
0069 switch_destroy()
0070 {
0071         tc qdisc del dev $swp2 clsact
0072         tc qdisc del dev $swp1 clsact
0073 
0074         ip link set dev $swp2 down
0075         ip link set dev $swp2 nomaster
0076         ip link set dev $swp1 down
0077         ip link set dev $swp1 nomaster
0078         ip link del dev br1
0079 }
0080 
0081 setup_prepare()
0082 {
0083         h1=${NETIFS[p1]}
0084         swp1=${NETIFS[p2]}
0085 
0086         swp2=${NETIFS[p3]}
0087         h2=${NETIFS[p4]}
0088 
0089         h2mac=$(mac_get $h2)
0090 
0091         vrf_prepare
0092         h1_create
0093         h2_create
0094         switch_create
0095 }
0096 
0097 cleanup()
0098 {
0099         pre_cleanup
0100 
0101         switch_destroy
0102         h2_destroy
0103         h1_destroy
0104         vrf_cleanup
0105 }
0106 
0107 ping_ipv4()
0108 {
0109         ping_test $h1 192.0.2.2
0110 }
0111 
0112 ping_ipv6()
0113 {
0114         ping6_test $h1 2001:db8:1::2
0115 }
0116 
0117 do_test_pedit_l4port_one()
0118 {
0119         local pedit_locus=$1; shift
0120         local pedit_prot=$1; shift
0121         local pedit_action=$1; shift
0122         local match_prot=$1; shift
0123         local match_flower=$1; shift
0124         local mz_flags=$1; shift
0125         local saddr=$1; shift
0126         local daddr=$1; shift
0127 
0128         tc filter add $pedit_locus handle 101 pref 1 \
0129            flower action pedit ex munge $pedit_action
0130         tc filter add dev $h2 ingress handle 101 pref 1 prot $match_prot \
0131            flower skip_hw $match_flower action pass
0132 
0133         RET=0
0134 
0135         $MZ $mz_flags $h1 -c 10 -d 20msec -p 100 \
0136             -a own -b $h2mac -q -t $pedit_prot sp=54321,dp=12345
0137 
0138         local pkts
0139         pkts=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= 10" \
0140                         tc_rule_handle_stats_get "dev $h2 ingress" 101)
0141         check_err $? "Expected to get 10 packets, but got $pkts."
0142 
0143         pkts=$(tc_rule_handle_stats_get "$pedit_locus" 101)
0144         ((pkts >= 10))
0145         check_err $? "Expected to get 10 packets on pedit rule, but got $pkts."
0146 
0147         log_test "$pedit_locus pedit $pedit_action"
0148 
0149         tc filter del dev $h2 ingress pref 1
0150         tc filter del $pedit_locus pref 1
0151 }
0152 
0153 do_test_pedit_l4port()
0154 {
0155         local locus=$1; shift
0156         local prot=$1; shift
0157         local pedit_port=$1; shift
0158         local flower_port=$1; shift
0159         local port
0160 
0161         for port in 1 11111 65535; do
0162                 do_test_pedit_l4port_one "$locus" "$prot"                       \
0163                                          "$prot $pedit_port set $port"          \
0164                                          ip "ip_proto $prot $flower_port $port" \
0165                                          "-A 192.0.2.1 -B 192.0.2.2"
0166         done
0167 }
0168 
0169 test_udp_sport()
0170 {
0171         do_test_pedit_l4port "dev $swp1 ingress" udp sport src_port
0172         do_test_pedit_l4port "dev $swp2 egress"  udp sport src_port
0173 }
0174 
0175 test_udp_dport()
0176 {
0177         do_test_pedit_l4port "dev $swp1 ingress" udp dport dst_port
0178         do_test_pedit_l4port "dev $swp2 egress"  udp dport dst_port
0179 }
0180 
0181 test_tcp_sport()
0182 {
0183         do_test_pedit_l4port "dev $swp1 ingress" tcp sport src_port
0184         do_test_pedit_l4port "dev $swp2 egress"  tcp sport src_port
0185 }
0186 
0187 test_tcp_dport()
0188 {
0189         do_test_pedit_l4port "dev $swp1 ingress" tcp dport dst_port
0190         do_test_pedit_l4port "dev $swp2 egress"  tcp dport dst_port
0191 }
0192 
0193 trap cleanup EXIT
0194 
0195 setup_prepare
0196 setup_wait
0197 
0198 tests_run
0199 
0200 exit $EXIT_STATUS