tfo_passive.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. source lib.sh
  4. NSIM_SV_ID=$((256 + RANDOM % 256))
  5. NSIM_SV_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_SV_ID
  6. NSIM_CL_ID=$((512 + RANDOM % 256))
  7. NSIM_CL_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_CL_ID
  8. NSIM_DEV_SYS_NEW=/sys/bus/netdevsim/new_device
  9. NSIM_DEV_SYS_DEL=/sys/bus/netdevsim/del_device
  10. NSIM_DEV_SYS_LINK=/sys/bus/netdevsim/link_device
  11. NSIM_DEV_SYS_UNLINK=/sys/bus/netdevsim/unlink_device
  12. SERVER_IP=192.168.1.1
  13. CLIENT_IP=192.168.1.2
  14. SERVER_PORT=48675
  15. setup_ns()
  16. {
  17. set -e
  18. ip netns add nssv
  19. ip netns add nscl
  20. NSIM_SV_NAME=$(find $NSIM_SV_SYS/net -maxdepth 1 -type d ! \
  21. -path $NSIM_SV_SYS/net -exec basename {} \;)
  22. NSIM_CL_NAME=$(find $NSIM_CL_SYS/net -maxdepth 1 -type d ! \
  23. -path $NSIM_CL_SYS/net -exec basename {} \;)
  24. ip link set $NSIM_SV_NAME netns nssv
  25. ip link set $NSIM_CL_NAME netns nscl
  26. ip netns exec nssv ip addr add "${SERVER_IP}/24" dev $NSIM_SV_NAME
  27. ip netns exec nscl ip addr add "${CLIENT_IP}/24" dev $NSIM_CL_NAME
  28. ip netns exec nssv ip link set dev $NSIM_SV_NAME up
  29. ip netns exec nscl ip link set dev $NSIM_CL_NAME up
  30. # Enable passive TFO
  31. ip netns exec nssv sysctl -w net.ipv4.tcp_fastopen=519 > /dev/null
  32. set +e
  33. }
  34. cleanup_ns()
  35. {
  36. ip netns del nscl
  37. ip netns del nssv
  38. }
  39. ###
  40. ### Code start
  41. ###
  42. modprobe netdevsim
  43. # linking
  44. echo $NSIM_SV_ID > $NSIM_DEV_SYS_NEW
  45. echo $NSIM_CL_ID > $NSIM_DEV_SYS_NEW
  46. udevadm settle
  47. setup_ns
  48. NSIM_SV_FD=$((256 + RANDOM % 256))
  49. exec {NSIM_SV_FD}</var/run/netns/nssv
  50. NSIM_SV_IFIDX=$(ip netns exec nssv cat /sys/class/net/$NSIM_SV_NAME/ifindex)
  51. NSIM_CL_FD=$((256 + RANDOM % 256))
  52. exec {NSIM_CL_FD}</var/run/netns/nscl
  53. NSIM_CL_IFIDX=$(ip netns exec nscl cat /sys/class/net/$NSIM_CL_NAME/ifindex)
  54. echo "$NSIM_SV_FD:$NSIM_SV_IFIDX $NSIM_CL_FD:$NSIM_CL_IFIDX" > \
  55. $NSIM_DEV_SYS_LINK
  56. if [ $? -ne 0 ]; then
  57. echo "linking netdevsim1 with netdevsim2 should succeed"
  58. cleanup_ns
  59. exit 1
  60. fi
  61. out_file=$(mktemp)
  62. timeout -k 1s 30s ip netns exec nssv ./tfo \
  63. -s \
  64. -p ${SERVER_PORT} \
  65. -o ${out_file}&
  66. server_pid="$!"
  67. wait_local_port_listen nssv ${SERVER_PORT} tcp
  68. ip netns exec nscl ./tfo -c -h ${SERVER_IP} -p ${SERVER_PORT}
  69. client_exit_status="$?"
  70. wait "$server_pid"
  71. server_exit_status="$?"
  72. res=$(cat $out_file)
  73. rm $out_file
  74. if [ "$res" = "0" ]; then
  75. echo "got invalid NAPI ID from passive TFO socket"
  76. cleanup_ns
  77. exit 1
  78. fi
  79. if [ "$client_exit_status" -ne 0 ] || [ "$server_exit_status" -ne 0 ]; then
  80. # Note: timeout(1) exits with 124 if it timed out
  81. echo "client exited with ${client_exit_status}"
  82. echo "server exited with ${server_exit_status}"
  83. cleanup_ns
  84. exit 1
  85. fi
  86. echo "$NSIM_SV_FD:$NSIM_SV_IFIDX" > $NSIM_DEV_SYS_UNLINK
  87. echo $NSIM_CL_ID > $NSIM_DEV_SYS_DEL
  88. cleanup_ns
  89. modprobe -r netdevsim
  90. exit 0