blob: a36885b871f93ff4cd035a74dde4ad887eda589c (
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_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 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
|