6in4.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/bin/sh
  2. # 6in4.sh - IPv6-in-IPv4 tunnel backend
  3. # Copyright (c) 2010-2014 OpenWrt.org
  4. [ -n "$INCLUDE_ONLY" ] || {
  5. . /lib/functions.sh
  6. . /lib/functions/network.sh
  7. . ../netifd-proto.sh
  8. init_proto "$@"
  9. }
  10. proto_6in4_setup() {
  11. local cfg="$1"
  12. local iface="$2"
  13. local link="6in4-$cfg"
  14. local mtu ttl ipaddr peeraddr ip6addr ip6prefix tunnelid username password updatekey sourcerouting
  15. json_get_vars mtu ttl ipaddr peeraddr ip6addr ip6prefix tunnelid username password updatekey sourcerouting
  16. [ -z "$peeraddr" ] && {
  17. proto_notify_error "$cfg" "MISSING_ADDRESS"
  18. proto_block_restart "$cfg"
  19. return
  20. }
  21. ( proto_add_host_dependency "$cfg" 0.0.0.0 )
  22. [ -z "$ipaddr" ] && {
  23. local wanif
  24. if ! network_find_wan wanif || ! network_get_ipaddr ipaddr "$wanif"; then
  25. proto_notify_error "$cfg" "NO_WAN_LINK"
  26. return
  27. fi
  28. }
  29. proto_init_update "$link" 1
  30. local source=""
  31. [ "$sourcerouting" != "0" ] && source="::/128"
  32. proto_add_ipv6_route "::" 0 "" "" "" "$source"
  33. [ -n "$ip6addr" ] && {
  34. local local6="${ip6addr%%/*}"
  35. local mask6="${ip6addr##*/}"
  36. [[ "$local6" = "$mask6" ]] && mask6=
  37. proto_add_ipv6_address "$local6" "$mask6"
  38. [ "$sourcerouting" != "0" ] && proto_add_ipv6_route "::" 0 "" "" "" "$local6/$mask6"
  39. }
  40. [ -n "$ip6prefix" ] && {
  41. proto_add_ipv6_prefix "$ip6prefix"
  42. [ "$sourcerouting" != "0" ] && proto_add_ipv6_route "::" 0 "" "" "" "$ip6prefix"
  43. }
  44. proto_add_tunnel
  45. json_add_string mode sit
  46. json_add_int mtu "${mtu:-1280}"
  47. json_add_int ttl "${ttl:-64}"
  48. json_add_string local "$ipaddr"
  49. json_add_string remote "$peeraddr"
  50. proto_close_tunnel
  51. proto_send_update "$cfg"
  52. [ -n "$tunnelid" -a -n "$username" -a \( -n "$password" -o -n "$updatekey" \) ] && {
  53. [ -n "$updatekey" ] && password="$updatekey"
  54. local url="http://ipv4.tunnelbroker.net/nic/update?username=$username&password=$password&hostname=$tunnelid"
  55. local try=0
  56. local max=3
  57. while [ $((++try)) -le $max ]; do
  58. ( exec wget -qO/dev/null "$url" 2>/dev/null ) &
  59. local pid=$!
  60. ( sleep 5; kill $pid 2>/dev/null ) &
  61. wait $pid && break
  62. done
  63. }
  64. }
  65. proto_6in4_teardown() {
  66. local cfg="$1"
  67. }
  68. proto_6in4_init_config() {
  69. no_device=1
  70. available=1
  71. proto_config_add_string "ipaddr"
  72. proto_config_add_string "ip6addr"
  73. proto_config_add_string "ip6prefix"
  74. proto_config_add_string "peeraddr"
  75. proto_config_add_string "tunnelid"
  76. proto_config_add_string "username"
  77. proto_config_add_string "password"
  78. proto_config_add_string "updatekey"
  79. proto_config_add_int "mtu"
  80. proto_config_add_int "ttl"
  81. proto_config_add_boolean "sourcerouting"
  82. }
  83. [ -n "$INCLUDE_ONLY" ] || {
  84. add_protocol 6in4
  85. }