| #!/bin/sh |
| [ -z "$1" ] && echo "Error: should be run by udhcpc" && exit 1 |
| |
| set_classless_routes() { |
| local max=128 |
| local type |
| while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do |
| [ ${1##*/} -eq 32 ] && type=host || type=net |
| echo "udhcpc: adding route for $type $1 via $2" |
| route add -$type "$1" gw "$2" dev "$interface" |
| max=$(($max-1)) |
| shift 2 |
| done |
| } |
| |
| setup_interface() { |
| echo "udhcpc: ip addr add $ip/${subnet:-255.255.255.0} broadcast ${broadcast:-+} dev $interface" |
| ip addr add $ip/${subnet:-255.255.255.0} broadcast ${broadcast:-+} dev $interface |
| |
| [ -n "$router" ] && [ "$router" != "0.0.0.0" ] && [ "$router" != "255.255.255.255" ] && { |
| echo "udhcpc: setting default routers: $router" |
| |
| local valid_gw="" |
| for i in $router ; do |
| route add default gw $i dev $interface |
| valid_gw="${valid_gw:+$valid_gw|}$i" |
| done |
| |
| eval $(route -n | awk ' |
| /^0.0.0.0\W{9}('$valid_gw')\W/ {next} |
| /^0.0.0.0/ {print "route del -net "$1" gw "$2";"} |
| ') |
| } |
| |
| # CIDR STATIC ROUTES (rfc3442) |
| [ -n "$staticroutes" ] && set_classless_routes $staticroutes |
| [ -n "$msstaticroutes" ] && set_classless_routes $msstaticroutes |
| } |
| |
| |
| applied= |
| case "$1" in |
| deconfig) |
| ip -4 addr flush dev "$interface" |
| ;; |
| renew) |
| setup_interface update |
| ;; |
| bound) |
| setup_interface ifup |
| ;; |
| esac |
| |
| # user rules |
| [ -f /etc/udhcpc.user ] && . /etc/udhcpc.user |
| |
| exit 0 |