Certain DHCP servers push a gateway outside of the assigned interface subnet, to support those situations, install a host route towards the gateway. If Gateway and IP are served in same network, openwrt quagga cannot learn routes (rip routes are not getting added, showing inactive) whereas working fine when Gateway and IP are in different network. Signed-off-by: Mogula Pranay <mogula.pranay@nxp.com> Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
110 lines
2.7 KiB
Bash
Executable file
110 lines
2.7 KiB
Bash
Executable file
#!/bin/sh
|
|
[ -z "$1" ] && echo "Error: should be run by udhcpc" && exit 1
|
|
|
|
. /lib/functions.sh
|
|
. /lib/netifd/netifd-proto.sh
|
|
|
|
set_classless_routes() {
|
|
local max=128
|
|
while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do
|
|
proto_add_ipv4_route "${1%%/*}" "${1##*/}" "$2" "$ip"
|
|
max=$(($max-1))
|
|
shift 2
|
|
done
|
|
}
|
|
|
|
setup_interface () {
|
|
proto_init_update "*" 1
|
|
proto_add_ipv4_address "$ip" "${subnet:-255.255.255.0}"
|
|
# TODO: apply $broadcast
|
|
|
|
local ip_net
|
|
eval "$(ipcalc.sh "$ip/$mask")";ip_net="$NETWORK"
|
|
|
|
local i
|
|
for i in $router; do
|
|
local gw_net
|
|
eval "$(ipcalc.sh "$i/$mask")";gw_net="$NETWORK"
|
|
|
|
[ "$ip_net" != "$gw_net" ] && proto_add_ipv4_route "$i" 32 "" "$ip"
|
|
proto_add_ipv4_route 0.0.0.0 0 "$i" "$ip"
|
|
|
|
local r
|
|
for r in $CUSTOMROUTES; do
|
|
proto_add_ipv4_route "${r%%/*}" "${r##*/}" "$i" "$ip"
|
|
done
|
|
done
|
|
|
|
# CIDR STATIC ROUTES (rfc3442)
|
|
[ -n "$staticroutes" ] && set_classless_routes $staticroutes
|
|
[ -n "$msstaticroutes" ] && set_classless_routes $msstaticroutes
|
|
|
|
for i in $dns; do
|
|
proto_add_dns_server "$i"
|
|
done
|
|
for i in $domain; do
|
|
proto_add_dns_search "$i"
|
|
done
|
|
|
|
proto_add_data
|
|
[ -n "$ZONE" ] && json_add_string zone "$ZONE"
|
|
[ -n "$ntpsrv" ] && json_add_string ntpserver "$ntpsrv"
|
|
[ -n "$timesvr" ] && json_add_string timeserver "$timesvr"
|
|
[ -n "$hostname" ] && json_add_string hostname "$hostname"
|
|
[ -n "$message" ] && json_add_string message "$message"
|
|
[ -n "$timezone" ] && json_add_int timezone "$timezone"
|
|
[ -n "$lease" ] && json_add_int leasetime "$lease"
|
|
proto_close_data
|
|
|
|
proto_send_update "$INTERFACE"
|
|
|
|
|
|
if [ "$IFACE6RD" != 0 -a -n "$ip6rd" ]; then
|
|
local v4mask="${ip6rd%% *}"
|
|
ip6rd="${ip6rd#* }"
|
|
local ip6rdprefixlen="${ip6rd%% *}"
|
|
ip6rd="${ip6rd#* }"
|
|
local ip6rdprefix="${ip6rd%% *}"
|
|
ip6rd="${ip6rd#* }"
|
|
local ip6rdbr="${ip6rd%% *}"
|
|
|
|
[ -n "$ZONE" ] || ZONE=$(fw3 -q network $INTERFACE 2>/dev/null)
|
|
[ -z "$IFACE6RD" -o "$IFACE6RD" = 1 ] && IFACE6RD=${INTERFACE}_6
|
|
|
|
json_init
|
|
json_add_string name "$IFACE6RD"
|
|
json_add_string ifname "@$INTERFACE"
|
|
json_add_string proto "6rd"
|
|
json_add_string peeraddr "$ip6rdbr"
|
|
json_add_int ip4prefixlen "$v4mask"
|
|
json_add_string ip6prefix "$ip6rdprefix"
|
|
json_add_int ip6prefixlen "$ip6rdprefixlen"
|
|
json_add_string tunlink "$INTERFACE"
|
|
[ -n "$IFACE6RD_DELEGATE" ] && json_add_boolean delegate "$IFACE6RD_DELEGATE"
|
|
[ -n "$ZONE6RD" ] || ZONE6RD=$ZONE
|
|
[ -n "$ZONE6RD" ] && json_add_string zone "$ZONE6RD"
|
|
[ -n "$MTU6RD" ] && json_add_string mtu "$MTU6RD"
|
|
json_close_object
|
|
|
|
ubus call network add_dynamic "$(json_dump)"
|
|
fi
|
|
}
|
|
|
|
deconfig_interface() {
|
|
proto_init_update "*" 0
|
|
proto_send_update "$INTERFACE"
|
|
}
|
|
|
|
case "$1" in
|
|
deconfig)
|
|
deconfig_interface
|
|
;;
|
|
renew|bound)
|
|
setup_interface
|
|
;;
|
|
esac
|
|
|
|
# user rules
|
|
[ -f /etc/udhcpc.user ] && . /etc/udhcpc.user "$@"
|
|
|
|
exit 0
|