summaryrefslogtreecommitdiffstats
path: root/package/base-files/files/etc/hotplug.d/iface/10-routes
blob: 14fb75eec2b01b1fd5a782da3fe25016a180a6d5 (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
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

	# 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"}
}

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

	# 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"}
}

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_set_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 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