cmsg_ipv6.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ksft_skip=4
  4. NS=ns
  5. IP6=2001:db8:1::1/64
  6. TGT6=2001:db8:1::2
  7. TMPF=$(mktemp --suffix ".pcap")
  8. cleanup()
  9. {
  10. rm -f $TMPF
  11. ip netns del $NS
  12. }
  13. trap cleanup EXIT
  14. NSEXE="ip netns exec $NS"
  15. tcpdump -h | grep immediate-mode >> /dev/null
  16. if [ $? -ne 0 ]; then
  17. echo "SKIP - tcpdump with --immediate-mode option required"
  18. exit $ksft_skip
  19. fi
  20. # Namespaces
  21. ip netns add $NS
  22. $NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null
  23. # Connectivity
  24. ip -netns $NS link add type dummy
  25. ip -netns $NS link set dev dummy0 up
  26. ip -netns $NS addr add $IP6 dev dummy0
  27. # Test
  28. BAD=0
  29. TOTAL=0
  30. check_result() {
  31. ((TOTAL++))
  32. if [ $1 -ne $2 ]; then
  33. echo " Case $3 returned $1, expected $2"
  34. ((BAD++))
  35. fi
  36. }
  37. # IPV6_DONTFRAG
  38. for ovr in setsock cmsg both diff; do
  39. for df in 0 1; do
  40. for p in u i r; do
  41. [ $p == "u" ] && prot=UDP
  42. [ $p == "i" ] && prot=ICMP
  43. [ $p == "r" ] && prot=RAW
  44. [ $ovr == "setsock" ] && m="-F $df"
  45. [ $ovr == "cmsg" ] && m="-f $df"
  46. [ $ovr == "both" ] && m="-F $df -f $df"
  47. [ $ovr == "diff" ] && m="-F $((1 - df)) -f $df"
  48. $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 1234
  49. check_result $? $df "DONTFRAG $prot $ovr"
  50. done
  51. done
  52. done
  53. # IPV6_TCLASS
  54. TOS=0x10
  55. TOS2=0x20
  56. ip -6 -netns $NS rule add tos $TOS lookup 300
  57. ip -6 -netns $NS route add table 300 prohibit any
  58. for ovr in setsock cmsg both diff; do
  59. for p in u i r; do
  60. [ $p == "u" ] && prot=UDP
  61. [ $p == "i" ] && prot=ICMP
  62. [ $p == "r" ] && prot=RAW
  63. [ $ovr == "setsock" ] && m="-C"
  64. [ $ovr == "cmsg" ] && m="-c"
  65. [ $ovr == "both" ] && m="-C $((TOS2)) -c"
  66. [ $ovr == "diff" ] && m="-C $((TOS )) -c"
  67. $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
  68. BG=$!
  69. sleep 0.05
  70. $NSEXE ./cmsg_sender -6 -p $p $m $((TOS2)) $TGT6 1234
  71. check_result $? 0 "TCLASS $prot $ovr - pass"
  72. while [ -d /proc/$BG ]; do
  73. $NSEXE ./cmsg_sender -6 -p u $TGT6 1234
  74. done
  75. tcpdump -r $TMPF -v 2>&1 | grep "class $TOS2" >> /dev/null
  76. check_result $? 0 "TCLASS $prot $ovr - packet data"
  77. rm $TMPF
  78. [ $ovr == "both" ] && m="-C $((TOS )) -c"
  79. [ $ovr == "diff" ] && m="-C $((TOS2)) -c"
  80. $NSEXE ./cmsg_sender -6 -p $p $m $((TOS)) -s $TGT6 1234
  81. check_result $? 1 "TCLASS $prot $ovr - rejection"
  82. done
  83. done
  84. # IPV6_HOPLIMIT
  85. LIM=4
  86. for ovr in setsock cmsg both diff; do
  87. for p in u i r; do
  88. [ $p == "u" ] && prot=UDP
  89. [ $p == "i" ] && prot=ICMP
  90. [ $p == "r" ] && prot=RAW
  91. [ $ovr == "setsock" ] && m="-L"
  92. [ $ovr == "cmsg" ] && m="-l"
  93. [ $ovr == "both" ] && m="-L $LIM -l"
  94. [ $ovr == "diff" ] && m="-L $((LIM + 1)) -l"
  95. $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
  96. BG=$!
  97. sleep 0.05
  98. $NSEXE ./cmsg_sender -6 -p $p $m $LIM $TGT6 1234
  99. check_result $? 0 "HOPLIMIT $prot $ovr - pass"
  100. while [ -d /proc/$BG ]; do
  101. $NSEXE ./cmsg_sender -6 -p u $TGT6 1234
  102. done
  103. tcpdump -r $TMPF -v 2>&1 | grep "hlim $LIM[^0-9]" >> /dev/null
  104. check_result $? 0 "HOPLIMIT $prot $ovr - packet data"
  105. rm $TMPF
  106. done
  107. done
  108. # IPV6 exthdr
  109. for p in u i r; do
  110. # Very basic "does it crash" test
  111. for h in h d r; do
  112. $NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234
  113. check_result $? 0 "ExtHdr $prot $ovr - pass"
  114. done
  115. done
  116. # Summary
  117. if [ $BAD -ne 0 ]; then
  118. echo "FAIL - $BAD/$TOTAL cases failed"
  119. exit 1
  120. else
  121. echo "OK"
  122. exit 0
  123. fi