dhcp.script 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/bin/sh
  2. [ -z "$1" ] && echo "Error: should be run by udhcpc" && exit 1
  3. . /lib/functions.sh
  4. . /lib/netifd/netifd-proto.sh
  5. set_classless_routes() {
  6. local max=128
  7. while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do
  8. proto_add_ipv4_route "${1%%/*}" "${1##*/}" "$2" "$ip"
  9. max=$(($max-1))
  10. shift 2
  11. done
  12. }
  13. setup_interface () {
  14. proto_init_update "*" 1
  15. proto_add_ipv4_address "$ip" "${subnet:-255.255.255.0}"
  16. # TODO: apply $broadcast
  17. local ip_net
  18. eval "$(ipcalc.sh "$ip/$mask")";ip_net="$NETWORK"
  19. local i
  20. for i in $router; do
  21. local gw_net
  22. eval "$(ipcalc.sh "$i/$mask")";gw_net="$NETWORK"
  23. [ "$ip_net" != "$gw_net" ] && proto_add_ipv4_route "$i" 32 "" "$ip"
  24. proto_add_ipv4_route 0.0.0.0 0 "$i" "$ip"
  25. local r
  26. for r in $CUSTOMROUTES; do
  27. proto_add_ipv4_route "${r%%/*}" "${r##*/}" "$i" "$ip"
  28. done
  29. done
  30. # CIDR STATIC ROUTES (rfc3442)
  31. [ -n "$staticroutes" ] && set_classless_routes $staticroutes
  32. [ -n "$msstaticroutes" ] && set_classless_routes $msstaticroutes
  33. for i in $dns; do
  34. proto_add_dns_server "$i"
  35. done
  36. for i in $domain; do
  37. proto_add_dns_search "$i"
  38. done
  39. proto_add_data
  40. [ -n "$ZONE" ] && json_add_string zone "$ZONE"
  41. [ -n "$ntpsrv" ] && json_add_string ntpserver "$ntpsrv"
  42. [ -n "$timesvr" ] && json_add_string timeserver "$timesvr"
  43. [ -n "$hostname" ] && json_add_string hostname "$hostname"
  44. [ -n "$message" ] && json_add_string message "$message"
  45. [ -n "$timezone" ] && json_add_int timezone "$timezone"
  46. [ -n "$lease" ] && json_add_int leasetime "$lease"
  47. proto_close_data
  48. proto_send_update "$INTERFACE"
  49. if [ "$IFACE6RD" != 0 -a -n "$ip6rd" ]; then
  50. local v4mask="${ip6rd%% *}"
  51. ip6rd="${ip6rd#* }"
  52. local ip6rdprefixlen="${ip6rd%% *}"
  53. ip6rd="${ip6rd#* }"
  54. local ip6rdprefix="${ip6rd%% *}"
  55. ip6rd="${ip6rd#* }"
  56. local ip6rdbr="${ip6rd%% *}"
  57. [ -n "$ZONE" ] || ZONE=$(fw3 -q network $INTERFACE 2>/dev/null)
  58. [ -z "$IFACE6RD" -o "$IFACE6RD" = 1 ] && IFACE6RD=${INTERFACE}_6
  59. json_init
  60. json_add_string name "$IFACE6RD"
  61. json_add_string ifname "@$INTERFACE"
  62. json_add_string proto "6rd"
  63. json_add_string peeraddr "$ip6rdbr"
  64. json_add_int ip4prefixlen "$v4mask"
  65. json_add_string ip6prefix "$ip6rdprefix"
  66. json_add_int ip6prefixlen "$ip6rdprefixlen"
  67. json_add_string tunlink "$INTERFACE"
  68. [ -n "$IFACE6RD_DELEGATE" ] && json_add_boolean delegate "$IFACE6RD_DELEGATE"
  69. [ -n "$ZONE6RD" ] || ZONE6RD=$ZONE
  70. [ -n "$ZONE6RD" ] && json_add_string zone "$ZONE6RD"
  71. [ -n "$MTU6RD" ] && json_add_string mtu "$MTU6RD"
  72. json_close_object
  73. ubus call network add_dynamic "$(json_dump)"
  74. fi
  75. }
  76. deconfig_interface() {
  77. proto_init_update "*" 0
  78. proto_send_update "$INTERFACE"
  79. }
  80. case "$1" in
  81. deconfig)
  82. deconfig_interface
  83. ;;
  84. renew|bound)
  85. setup_interface
  86. ;;
  87. esac
  88. # user rules
  89. [ -f /etc/udhcpc.user ] && . /etc/udhcpc.user "$@"
  90. exit 0