}
set_vpngateway_route() {
- $IPROUTE route add `$IPROUTE route get "$VPNGATEWAY" | fix_ip_get_output`
- $IPROUTE route flush cache 2>/dev/null
- }
-
- set_vpngateway_route_attempt_reconnect() {
# We'll attempt to add a host route to the gateway through every route that matches
# its address (excluding those through TUNDEV because the goal is to avoid loopback).
# - keep lines starting with 'default' or '0.0.0.0', but exclude bogus routes '0.0.0.0/nn' where nn != 0
# - remove lines containing IPv6 addresses (':')
# - remove lines for link-local routes (https://superuser.com/a/1067742)
- netstat -r -n | awk '/:/ { next; } /link#/ { next; } /^(default|0\.0\.0\.0([[:space:]]|\/0))/ { print $2; exit; }'
- }
-
- get_default_gw_excl_tunnel() {
- # Get rid of lines containing $TUNDEV (we don't want loopback)
+ # - remove lines containing $TUNDEV (we don't want loopback)
netstat -r -n | awk '/:/ { next; } /link#/ { next; } /[[:space:]]'"$TUNDEV"'([[:space:]]|$)/ { next; } /^(default|0\.0\.0\.0([[:space:]]|\/0))/ { print $2; exit; }'
}
esac
}
- set_vpngateway_route_attempt_reconnect() {
- case "$VPNGATEWAY" in
- *:*) route add $route_syntax_inet6_host "$VPNGATEWAY" $route_syntax_gw "`get_ipv6_default_gw_excl_tunnel`";;
- *) route add -host "$VPNGATEWAY" $route_syntax_gw "`get_default_gw_excl_tunnel`";;
- esac
- }
-
del_vpngateway_route() {
case "$VPNGATEWAY" in
*:*) route $route_syntax_del $route_syntax_inet6_host "$VPNGATEWAY" $route_syntax_gw "`get_ipv6_default_gw`";;
# Intended behavior, starting with `netstat -r -n` IPv6 output:
# - keep lines starting with 'default' or '::'
# - append %$interface to link-local routes (fe80::/10)
- # - remove lines for loopback interface (lo)
+ # - remove lines for loopback interface (lo)
+ # - remove lines containing $TUNDEV (we don't want loopback)
# FIXME: is there a better way to exclude loopback routes than filtering interface /^lo/?
- netstat -r -n $netstat_syntax_ipv6 | awk '/^(default|::\/0)/ { if ($NF!~/^lo/) { print ($2~/^fe[89ab]/ ? $2"%"$NF : $2); } }'
- }
-
- get_ipv6_default_gw_excl_tunnel() {
netstat -r -n $netstat_syntax_ipv6 | awk '/^(default|::\/0)/ { if ($NF!~/^lo/ && /$NF!~/'"$TUNDEV"'([[:space:]]|$)/) { print ($2~/^fe[89ab]/ ? $2"%"$NF : $2); } }'
}
}
do_attempt_reconnect() {
- set_vpngateway_route_attempt_reconnect
+ set_vpngateway_route
}
#### Main