summaryrefslogtreecommitdiff
path: root/package/base-files/files/etc/hotplug.d/iface/10-routes
blob: d57a5b3c780a93a7e25434daba64d41b2b1039fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
add_route() {
	local config="$1"

	# is this route intended for the
	# $INTERFACE of this hotplug event
	config_get interface "$config" interface
	[ "$interface" != "$INTERFACE" ] && return 0
	
	# get the real interface name from network config
	config_get dev "$interface" ifname

	config_get target "$config" target
	config_get netmask "$config" netmask
	config_get gateway "$config" gateway
	config_get metric "$config" metric
	config_get mtu "$config" mtu

	# make sure there is a gateway and a target
	[ -n "$target" ] || {
		echo "Missing target in route section $config"
		return 1
	}
	[ -n "$gateway" ] || {
		config_get gateway "$interface" gateway
	}

	# handle "0.0.0.0" as "no gateway given" to allow
	# defining gateway-less routes while still keeping
	# the possibility to have static routes with a
	# proper gateway on interfaces with dynamic ips 
	[ "$gateway" = "0.0.0.0" ] && gateway=""

	dest="${netmask:+-net "$target" netmask "$netmask"}"
	dest="${dest:--host "$target"}"
	
	/sbin/route add $dest ${gateway:+gw "$gateway"} \
		${dev:+dev "$dev"} ${metric:+ metric "$metric"} \
		${mtu:+mss "$mtu"}
}

add_route6() {
	local config="$1"

	# is this route intended for the
	# $INTERFACE of this hotplug event
	config_get interface "$config" interface
	[ "$interface" != "$INTERFACE" ] && return 0
	
	# get the real interface name from network config
	config_get dev "$interface" ifname

	config_get target "$config" target
	config_get gateway "$config" gateway
	config_get metric "$config" metric
	config_get mtu "$config" mtu

	# make sure there is a gateway and a target
	[ -n "$target" ] || {
		echo "Missing target in route section $config"
		return 1
	}
	[ -n "$gateway" ] || {
		config_get gateway "$interface" gateway
	}

	/sbin/route -A inet6 add $target ${gateway:+gw "$gateway"} \
		${dev:+dev "$dev"} ${metric:+ metric "$metric"} \
		${mtu:+mss "$mtu"}
}

# Skip fake devices (e.g. relayd)
grep -qs "^ *$DEVICE:" /proc/net/dev || exit 0

case "$ACTION" in
	ifup)
		include /lib/network
		scan_interfaces

		# Setup aliases
		config_set "$INTERFACE" aliases ""
		config_set "$INTERFACE" alias_count 0
		config_foreach setup_interface_alias alias "$INTERFACE" "$DEVICE"

		# Save alias references in state vars
		local aliases
		config_get aliases "$INTERFACE" aliases
		[ -z "$aliases" ] || uci_toggle_state network "$INTERFACE" aliases "$aliases"

		# Make ip6addr of parent iface the main address again
		local ip6addr
		config_get ip6addr "$INTERFACE" ip6addr
		[ -z "$ip6addr" ] || {
			ifconfig "$DEVICE" del "$ip6addr"
			ifconfig "$DEVICE" add "$ip6addr"
		}
		
		# Setup sysctls
		local proto accept_ra send_rs
		
		config_get proto "$INTERFACE" proto
		if [ "$proto" = dhcp ]; then
			accept_ra=1
			send_rs=0
		else
			accept_ra=0
			send_rs=1
		fi

		config_get_bool accept_ra "$INTERFACE" accept_ra $accept_ra
		[ $accept_ra -eq 0 ] || {
			logger -t ifup "Allowing Router Advertisements on $INTERFACE ($DEVICE)"
			accept_ra=2
		}
		do_sysctl "net.ipv6.conf.$DEVICE.accept_ra" $accept_ra

		config_get_bool send_rs "$INTERFACE" send_rs $send_rs
		[ $send_rs -eq 0 ] || {
			logger -t ifup "Enabling Router Solicitations on $INTERFACE ($DEVICE)"
			send_rs=2
		}
		do_sysctl "net.ipv6.conf.$DEVICE.forwarding" $send_rs


		# Setup routes
		config_foreach "add_route" route
		config_foreach "add_route6" route6
	;;
	ifdown)
		# Bring down named aliases
		local device=$(uci_get_state network "$INTERFACE" device)
		local ifn
		for ifn in $(ifconfig | sed -ne "s/^\(\($DEVICE${device:+\|$device}\|br-$INTERFACE\):[^[:space:]]\+\).*/\1/p"); do
			ifconfig "$ifn" down
		done
	;;
esac