aboutsummaryrefslogtreecommitdiff
path: root/package/network/ipv6/ds-lite/files/dslite.sh
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
}