1 # tayga.sh - NAT64 backend
4 local if=$
(ip
-4 r l e
0.0.0.0/0); if="${if#default* dev }"; if="${if%% *}"
5 [ -n "$if" ] && grep -qs "^ *$if:" /proc
/net
/dev
&& echo "$if"
9 local ip
=$
(ip
-4 a s dev
"$1"); ip
="${ip#*inet }"
10 echo "${ip%%[^0-9.]*}"
14 local if=$
(ip
-6 r l e
::/0); if="${if#default* dev }"; if="${if%% *}"
15 [ -n "$if" ] && grep -qs "^ *$if:" /proc
/net
/dev
&& echo "$if"
19 local ip
=$
(ip
-6 a s dev
"$1"); ip
="${ip#*inet6 }"
20 echo "${ip%%[^0-9A-Fa-f:]*}"
23 # Hook into scan_interfaces() to synthesize a .device option
24 # This is needed for /sbin/ifup to properly dispatch control
25 # to setup_interface_tayga() even if no .ifname is set in
28 config_set
"$1" device
"tayga-$1"
31 coldplug_interface_tayga
() {
32 setup_interface_tayga
"tayga-$1" "$1"
35 tayga_add_static_mappings
() {
42 tayga_map_rule_add
() {
45 local ipv4_addr ipv6_addr
46 config_get ipv4_addr
"$cfg" ipv4_addr
""
47 config_get ipv6_addr
"$cfg" ipv6_addr
""
48 [ -n "$ipv4_addr" ] && [ -n "$ipv6_addr" ] &&
49 echo "map $ipv4_addr $ipv6_addr" >>$tmpconf
52 config_foreach tayga_map_rule_add nat64
"$tmpconf"
56 setup_interface_tayga
() {
59 local link
="tayga-$cfg"
61 local ipv4_addr ipv6_addr prefix dynamic_pool
63 config_get ipv4_addr
"$cfg" ipv4_addr
64 config_get ipv6_addr
"$cfg" ipv6_addr
65 config_get prefix
"$cfg" prefix
66 config_get dynamic_pool
"$cfg" dynamic_pool
73 local wanip4
=$
(uci_get network
"$cfg" ipv4addr
)
74 local wanip6
=$
(uci_get network
"$cfg" ipv6addr
)
76 local wanif4
=$
(find_tayga_wanif4
)
77 local wanif6
=$
(find_tayga_wanif6
)
81 wanip4
=$
(find_tayga_wanip4
"$wanif4")
82 uci_set_state network
"$cfg" wan4_device
"$wanif4"
88 wanip6
=$
(find_tayga_wanip6
"$wanif6")
89 uci_set_state network
"$cfg" wan6_device
"$wanif6"
93 [ -n "$wanip4" ] && [ -n "$wanip6" ] ||
{
94 echo "Cannot determine local IPv4 and IPv6 addressed for tayga NAT64 $cfg - skipping"
98 local tmpconf
="/var/etc/tayga-$cfg.conf"
101 mkdir
-p /var
/run
/tayga
/$cfg
103 echo "tun-device $link" >$tmpconf
104 echo "ipv4-addr $ipv4_addr" >>$tmpconf
105 [ -n "$ipv6_addr" ] &&
106 echo "ipv6-addr $ipv6_addr" >>$tmpconf
108 echo "prefix $prefix" >>$tmpconf
110 tayga_add_static_mappings
"$tmpconf"
112 [ -n "$dynamic_pool" ] &&
113 echo "dynamic-pool $dynamic_pool" >>$tmpconf
114 echo "data-dir /var/run/tayga/$cfg" >>$tmpconf
116 # creating the tunnel below will trigger a net subsystem event
117 # prevent it from touching or iface by disabling .auto here
118 uci_set_state network
"$cfg" ifname
$link
119 uci_set_state network
"$cfg" auto
0
121 # here we create TUN device and check configuration
122 tayga
$args --mktun ||
return 1
124 ip link
set "$link" up
126 ip addr add
"$wanip4" dev
"$link"
127 ip addr add
"$wanip6" dev
"$link"
129 [ -n "$dynamic_pool" ] &&
130 ip
-4 route add
"$dynamic_pool" dev
"$link"
132 ip
-6 route add
"$prefix" dev
"$link"
134 start-stop-daemon
-S -x tayga
-- $args -p /var
/run
/$link.pid
136 env
-i ACTION
="ifup" DEVICE
="$link" INTERFACE
="$cfg" PROTO
="tayga" \
137 /sbin
/hotplug-call iface
140 stop_interface_tayga
() {
142 local link
="tayga-$cfg"
144 env
-i ACTION
="ifdown" DEVICE
="$link" INTERFACE
="$cfg" PROTO
="tayga" \
145 /sbin
/hotplug-call iface
147 service_kill tayga
"/var/run/$link.pid"
149 ip link
set "$link" down
150 ip addr flush dev
"$link"
151 ip route flush dev
"$link"