0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
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}
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