blob: 325401b98b55e31c3f8de693683cb7332170e3e4 (
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
138
139
140
141
142
143
|
#!/bin/sh
# dslite.sh - IPv4-in-IPv6 tunnel backend for ipip6 and ds-lite
# Copyright (c) 2013 OpenWrt.org
# Copyright (c) 2013 Steven Barth <steven@midlink.org>
# Copyright (c) 2021 Kenji Uno <ku@digitaldolphins.jp>
# Copyright (c) 2024 Arayuki Mago <ms@missing233.com>
[ -n "$INCLUDE_ONLY" ] || {
. /lib/functions.sh
. /lib/functions/network.sh
. ../netifd-proto.sh
init_proto "$@"
}
tnl_setup() {
local cfg="$1"
local iface="$2"
local tnl_type="$3"
local ip4addr="$4"
local ip4gateway="$5"
local link="$tnl_type-$cfg"
local remoteip6
local mtu ttl peeraddr ip6addr tunlink zone weakif encaplimit
json_get_vars mtu ttl peeraddr ip6addr tunlink zone weakif encaplimit
[ -z "$peeraddr" ] && {
proto_notify_error "$cfg" "MISSING_ADDRESS"
proto_block_restart "$cfg"
return
}
( proto_add_host_dependency "$cfg" "::" "$tunlink" )
remoteip6=$(resolveip -6 "$peeraddr")
if [ -z "$remoteip6" ]; then
sleep 3
remoteip6=$(resolveip -6 "$peeraddr")
if [ -z "$remoteip6" ]; then
proto_notify_error "$cfg" "AFTR_DNS_FAIL"
return
fi
fi
for ip6 in $remoteip6; do
peeraddr=$ip6
break
done
[ -z "$ip6addr" ] && {
local wanif="$tunlink"
if [ -z "$wanif" ] && ! network_find_wan6 wanif; then
proto_notify_error "$cfg" "NO_WAN_LINK"
return
fi
if ! network_get_ipaddr6 ip6addr "$wanif"; then
[ -z "$weakif" ] && weakif="lan"
if ! network_get_ipaddr6 ip6addr "$weakif"; then
proto_notify_error "$cfg" "NO_WAN_LINK"
return
fi
fi
}
proto_init_update "$link" 1
proto_add_ipv4_route "0.0.0.0" 0
proto_add_ipv4_address "$ip4addr" "" "" "$ip4gateway"
proto_add_tunnel
json_add_string mode ipip6
json_add_int mtu "${mtu:-1280}"
json_add_int ttl "${ttl:-64}"
json_add_string local "$ip6addr"
json_add_string remote "$peeraddr"
[ -n "$tunlink" ] && json_add_string link "$tunlink"
json_add_object "data"
[ -n "$encaplimit" ] && json_add_string encaplimit "$encaplimit"
json_close_object
proto_close_tunnel
proto_add_data
[ -n "$zone" ] && json_add_string zone "$zone"
if [ "$tnl_type" = "ds" ]; then
json_add_array firewall
json_add_object ""
json_add_string type nat
json_add_string target ACCEPT
json_close_object
json_close_array
fi
proto_close_data
proto_send_update "$cfg"
}
init_config() {
no_device=1
available=1
proto_config_add_string "ip6addr"
proto_config_add_string "peeraddr"
proto_config_add_string "tunlink"
proto_config_add_int "mtu"
proto_config_add_int "ttl"
proto_config_add_string "encaplimit"
proto_config_add_string "zone"
proto_config_add_string "weakif"
}
proto_ipip6_init_config() {
init_config
proto_config_add_string "ip4ifaddr"
}
proto_ipip6_setup() {
local ip4ifaddr
json_get_vars ip4ifaddr
tnl_setup "$1" "$2" "ipip6" "$ip4ifaddr" "0.0.0.0"
}
proto_ipip6_teardown() {
local cfg="$1"
}
proto_dslite_init_config() {
init_config
}
proto_dslite_setup() {
tnl_setup "$1" "$2" "ds" "192.0.0.2" "192.0.0.1"
}
proto_dslite_teardown() {
local cfg="$1"
}
[ -n "$INCLUDE_ONLY" ] || {
add_protocol ipip6
add_protocol dslite
}
|