pedit_ip.sh 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. # This test sends traffic from H1 to H2. Either on ingress of $swp1, or on
  4. # egress of $swp2, the traffic is acted upon by a pedit action. An ingress
  5. # filter installed on $h2 verifies that the packet looks like expected.
  6. #
  7. # +----------------------+ +----------------------+
  8. # | H1 | | H2 |
  9. # | + $h1 | | $h2 + |
  10. # | | 192.0.2.1/28 | | 192.0.2.2/28 | |
  11. # +----|-----------------+ +----------------|-----+
  12. # | |
  13. # +----|----------------------------------------------------------------|-----+
  14. # | SW | | |
  15. # | +-|----------------------------------------------------------------|-+ |
  16. # | | + $swp1 BR $swp2 + | |
  17. # | +--------------------------------------------------------------------+ |
  18. # +---------------------------------------------------------------------------+
  19. ALL_TESTS="
  20. ping_ipv4
  21. ping_ipv6
  22. test_ip4_src
  23. test_ip4_dst
  24. test_ip6_src
  25. test_ip6_dst
  26. "
  27. NUM_NETIFS=4
  28. source lib.sh
  29. source tc_common.sh
  30. h1_create()
  31. {
  32. simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64
  33. }
  34. h1_destroy()
  35. {
  36. simple_if_fini $h1 192.0.2.1/28 2001:db8:1::1/64
  37. }
  38. h2_create()
  39. {
  40. simple_if_init $h2 192.0.2.2/28 2001:db8:1::2/64
  41. tc qdisc add dev $h2 clsact
  42. }
  43. h2_destroy()
  44. {
  45. tc qdisc del dev $h2 clsact
  46. simple_if_fini $h2 192.0.2.2/28 2001:db8:1::2/64
  47. }
  48. switch_create()
  49. {
  50. ip link add name br1 up type bridge vlan_filtering 1
  51. ip link set dev $swp1 master br1
  52. ip link set dev $swp1 up
  53. ip link set dev $swp2 master br1
  54. ip link set dev $swp2 up
  55. tc qdisc add dev $swp1 clsact
  56. tc qdisc add dev $swp2 clsact
  57. }
  58. switch_destroy()
  59. {
  60. tc qdisc del dev $swp2 clsact
  61. tc qdisc del dev $swp1 clsact
  62. ip link set dev $swp2 down
  63. ip link set dev $swp2 nomaster
  64. ip link set dev $swp1 down
  65. ip link set dev $swp1 nomaster
  66. ip link del dev br1
  67. }
  68. setup_prepare()
  69. {
  70. h1=${NETIFS[p1]}
  71. swp1=${NETIFS[p2]}
  72. swp2=${NETIFS[p3]}
  73. h2=${NETIFS[p4]}
  74. h2mac=$(mac_get $h2)
  75. vrf_prepare
  76. h1_create
  77. h2_create
  78. switch_create
  79. }
  80. cleanup()
  81. {
  82. pre_cleanup
  83. switch_destroy
  84. h2_destroy
  85. h1_destroy
  86. vrf_cleanup
  87. }
  88. ping_ipv4()
  89. {
  90. ping_test $h1 192.0.2.2
  91. }
  92. ping_ipv6()
  93. {
  94. ping6_test $h1 2001:db8:1::2
  95. }
  96. do_test_pedit_ip()
  97. {
  98. local pedit_locus=$1; shift
  99. local pedit_action=$1; shift
  100. local match_prot=$1; shift
  101. local match_flower=$1; shift
  102. local mz_flags=$1; shift
  103. tc filter add $pedit_locus handle 101 pref 1 \
  104. flower action pedit ex munge $pedit_action
  105. tc filter add dev $h2 ingress handle 101 pref 1 prot $match_prot \
  106. flower skip_hw $match_flower action pass
  107. RET=0
  108. $MZ $mz_flags $h1 -c 10 -d 20msec -p 100 -a own -b $h2mac -q -t ip
  109. local pkts
  110. pkts=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= 10" \
  111. tc_rule_handle_stats_get "dev $h2 ingress" 101)
  112. check_err $? "Expected to get 10 packets, but got $pkts."
  113. pkts=$(tc_rule_handle_stats_get "$pedit_locus" 101)
  114. ((pkts >= 10))
  115. check_err $? "Expected to get 10 packets on pedit rule, but got $pkts."
  116. log_test "$pedit_locus pedit $pedit_action"
  117. tc filter del dev $h2 ingress pref 1
  118. tc filter del $pedit_locus pref 1
  119. }
  120. do_test_pedit_ip6()
  121. {
  122. local locus=$1; shift
  123. local pedit_addr=$1; shift
  124. local flower_addr=$1; shift
  125. do_test_pedit_ip "$locus" "$pedit_addr set 2001:db8:2::1" ipv6 \
  126. "$flower_addr 2001:db8:2::1" \
  127. "-6 -A 2001:db8:1::1 -B 2001:db8:1::2"
  128. }
  129. do_test_pedit_ip4()
  130. {
  131. local locus=$1; shift
  132. local pedit_addr=$1; shift
  133. local flower_addr=$1; shift
  134. do_test_pedit_ip "$locus" "$pedit_addr set 198.51.100.1" ip \
  135. "$flower_addr 198.51.100.1" \
  136. "-A 192.0.2.1 -B 192.0.2.2"
  137. }
  138. test_ip4_src()
  139. {
  140. do_test_pedit_ip4 "dev $swp1 ingress" "ip src" src_ip
  141. do_test_pedit_ip4 "dev $swp2 egress" "ip src" src_ip
  142. }
  143. test_ip4_dst()
  144. {
  145. do_test_pedit_ip4 "dev $swp1 ingress" "ip dst" dst_ip
  146. do_test_pedit_ip4 "dev $swp2 egress" "ip dst" dst_ip
  147. }
  148. test_ip6_src()
  149. {
  150. do_test_pedit_ip6 "dev $swp1 ingress" "ip6 src" src_ip
  151. do_test_pedit_ip6 "dev $swp2 egress" "ip6 src" src_ip
  152. }
  153. test_ip6_dst()
  154. {
  155. do_test_pedit_ip6 "dev $swp1 ingress" "ip6 dst" dst_ip
  156. do_test_pedit_ip6 "dev $swp2 egress" "ip6 dst" dst_ip
  157. }
  158. trap cleanup EXIT
  159. setup_prepare
  160. setup_wait
  161. tests_run
  162. exit $EXIT_STATUS