cmsg_ipv6.sh 3.3 KB

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