Browse Source

Merge pull request #49 from oskar456/tayga

tayga: import from oldpackages, fix broken checksum and add netifd support
sbyx 10 years ago
parent
commit
2f696b43ba

+ 49
- 0
ipv6/tayga/Makefile View File

@@ -0,0 +1,49 @@
1
+# $Id: Makefile 5624 2006-11-23 00:29:07Z nbd $
2
+
3
+include $(TOPDIR)/rules.mk
4
+
5
+PKG_NAME:=tayga
6
+PKG_VERSION:=0.9.2
7
+PKG_RELEASE:=2
8
+
9
+PKG_SOURCE:=tayga-$(PKG_VERSION).tar.bz2
10
+PKG_SOURCE_URL:=http://www.litech.org/tayga/
11
+PKG_MD5SUM:=7a7b24165ce008df772f398d86fa280e
12
+PKG_CAT:=bzcat
13
+
14
+PKG_BUILD_DIR:=$(BUILD_DIR)/tayga-$(PKG_VERSION)
15
+PKG_FIXUP:=autoreconf
16
+
17
+include $(INCLUDE_DIR)/package.mk
18
+
19
+define Package/tayga
20
+  SECTION:=net
21
+  CATEGORY:=Network
22
+  DEPENDS:=+ip +kmod-ipv6 +kmod-tun
23
+  TITLE:=Out-of-kernel stateless NAT64 implementation for Linux
24
+  URL:=http://www.litech.org/tayga/
25
+  MAINTAINER:=Ondrej Caletka <ondrej@caletka.cz>
26
+endef
27
+
28
+define Package/tayga/description
29
+  TAYGA is an out-of-kernel stateless NAT64 implementation for
30
+  Linux.  It uses the TUN driver to exchange packets with the
31
+  kernel, which is the same driver used by OpenVPN and QEMU/KVM.
32
+endef
33
+
34
+ifdef CONFIG_PACKAGE_netifd
35
+  define Package/tayga/install
36
+	$(INSTALL_DIR) $(1)/usr/sbin $(1)/lib/netifd/proto
37
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tayga $(1)/usr/sbin/
38
+	$(INSTALL_BIN) ./files/tayga-proto.sh $(1)/lib/netifd/proto/tayga.sh
39
+  endef
40
+else
41
+  define Package/tayga/install
42
+	$(INSTALL_DIR) $(1)/usr/sbin $(1)/lib/network $(1)/etc/hotplug.d/iface
43
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tayga $(1)/usr/sbin/
44
+	$(INSTALL_DATA) ./files/tayga.sh $(1)/lib/network/tayga.sh
45
+	$(INSTALL_DATA) ./files/tayga.hotplug $(1)/etc/hotplug.d/iface/95-tayga
46
+  endef
47
+endif
48
+
49
+$(eval $(call BuildPackage,tayga))

+ 92
- 0
ipv6/tayga/files/tayga-proto.sh View File

@@ -0,0 +1,92 @@
1
+#!/bin/sh
2
+# tayga.sh - TAYGA proto
3
+# Copyright (c) 2014 OpenWrt.org
4
+
5
+[ -n "$INCLUDE_ONLY" ] || {
6
+	. /lib/functions.sh
7
+	. /lib/functions/network.sh
8
+	. ../netifd-proto.sh
9
+	init_proto "$@"
10
+}
11
+
12
+proto_tayga_setup() {
13
+	local cfg="$1"
14
+	local iface="$2"
15
+	local link="tayga-$cfg"
16
+
17
+	local ipv4_addr ipv6_addr prefix dynamic_pool ipaddr ip6addr
18
+	json_get_vars ipv4_addr ipv6_addr prefix dynamic_pool ipaddr ip6addr
19
+	[ -z "$ipv4_addr" -o -z "$prefix" ] && {
20
+		proto_notify_error "$cfg" "REQUIRED_PARAMETERS_MISSING"
21
+		proto_block_restart "$cfg"
22
+		return
23
+	}
24
+
25
+	local tmpconf="/var/etc/tayga-$cfg.conf"
26
+	mkdir -p /var/etc
27
+	mkdir -p /var/run/tayga/$cfg
28
+
29
+	echo "tun-device $link" >$tmpconf
30
+	echo "ipv4-addr $ipv4_addr" >>$tmpconf
31
+	[ -n "$ipv6_addr" ] &&
32
+		echo "ipv6-addr $ipv6_addr" >>$tmpconf
33
+	[ -n "$prefix" ] &&
34
+		echo "prefix $prefix" >>$tmpconf
35
+	[ -n "$dynamic_pool" ] &&
36
+		echo "dynamic-pool $dynamic_pool" >>$tmpconf
37
+	echo "data-dir /var/run/tayga/$cfg" >>$tmpconf
38
+	#TODO: Support static mapping of IPv4 <-> IPv6
39
+
40
+	# here we create TUN device and check configuration
41
+	tayga -c $tmpconf --mktun
42
+	[ "$?" -ne 0 ] && {
43
+		proto_notify_error "$cfg" "TAYGA_FAILED"
44
+		proto_block_restart "$cfg"
45
+		return
46
+	}
47
+
48
+	proto_init_update "$link" 1
49
+
50
+	[ -n "$ipaddr" ]  && proto_add_ipv4_address "$ipaddr" "255.255.255.255"
51
+	[ -n "$ip6addr" ] && proto_add_ipv6_address "$ip6addr" "128"
52
+	[ -n "$ipv6_addr" ] && proto_add_ipv6_route "$ipv6_addr" "128"
53
+	[ -n "$dynamic_pool" ] && {
54
+		local pool="${dynamic_pool%%/*}"
55
+		local mask="${dynamic_pool##*/}"
56
+		proto_add_ipv4_route "$pool" "$mask"
57
+	}
58
+	[ -n "$prefix" ] && {
59
+		local prefix6="${prefix%%/*}"
60
+		local mask6="${prefix##*/}"
61
+		proto_add_ipv6_route "$prefix6" "$mask6"
62
+	}
63
+
64
+	proto_send_update "$cfg"
65
+
66
+	proto_run_command "$cfg" tayga -n -c $tmpconf \
67
+		-p /var/run/$link.pid
68
+
69
+}
70
+
71
+proto_tayga_teardown() {
72
+	local cfg="$1"
73
+	local tmpconf="/var/etc/tayga-$cfg.conf"
74
+	proto_kill_command "$cfg"
75
+	sleep 1
76
+	tayga -c $tmpconf --rmtun
77
+}
78
+
79
+proto_tayga_init_config() {
80
+	no_device=1
81
+	available=1
82
+	proto_config_add_string "ipv4_addr"
83
+	proto_config_add_string "ipv6_addr"
84
+	proto_config_add_string "prefix"
85
+	proto_config_add_string "dynamic_pool"
86
+	proto_config_add_string "ipaddr"
87
+	proto_config_add_string "ip6addr:ip6addr"
88
+}
89
+
90
+[ -n "$INCLUDE_ONLY" ] || {
91
+	add_protocol tayga
92
+}

+ 37
- 0
ipv6/tayga/files/tayga.hotplug View File

@@ -0,0 +1,37 @@
1
+#!/bin/sh
2
+
3
+if [ "$ACTION" = ifup ]; then
4
+	. /lib/functions.sh
5
+
6
+	include /lib/network
7
+	scan_interfaces
8
+
9
+	update_tunnel() {
10
+		local cfg="$1"
11
+
12
+		local proto
13
+		config_get proto "$cfg" proto
14
+		[ "$proto" = tayga ] || return 0
15
+
16
+		local wandev4
17
+		config_get wandev4 "$cfg" wan4_device "$(find_tayga_wanif4)"
18
+
19
+		local wandev6
20
+		config_get wandev6 "$cfg" wan6_device "$(find_tayga_wanif6)"
21
+
22
+		[ "$wandev4" = "$DEVICE" ] || [ "$wandev6" = "$DEVICE" ] || return 0
23
+
24
+		local wanip4=$(find_tayga_wanip4 "$wandev4")
25
+		local wanip6=$(find_tayga_wanip6 "$wandev6")
26
+
27
+		[ -n "$wanip4" ] && [ -n "$wanip6" ] && {
28
+			uci_set_state network "$cfg" ipv4addr "$wanip4"
29
+			uci_set_state network "$cfg" ipv6addr "$wanip6"
30
+
31
+			logger -t tayga-update "Re-establishing tayga NAT64 due to change on $INTERFACE ($DEVICE)"
32
+			ifup "$cfg" &
33
+		}
34
+	}
35
+
36
+	config_foreach update_tunnel interface
37
+fi

+ 152
- 0
ipv6/tayga/files/tayga.sh View File

@@ -0,0 +1,152 @@
1
+# tayga.sh - NAT64 backend
2
+
3
+find_tayga_wanif4() {
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"
6
+}
7
+
8
+find_tayga_wanip4() {
9
+	local ip=$(ip -4 a s dev "$1"); ip="${ip#*inet }"
10
+	echo "${ip%%[^0-9.]*}"
11
+}
12
+
13
+find_tayga_wanif6() {
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"
16
+}
17
+
18
+find_tayga_wanip6() {
19
+	local ip=$(ip -6 a s dev "$1"); ip="${ip#*inet6 }"
20
+	echo "${ip%%[^0-9A-Fa-f:]*}"
21
+}
22
+
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
26
+# the configuration.
27
+scan_tayga() {
28
+	config_set "$1" device "tayga-$1"
29
+}
30
+
31
+coldplug_interface_tayga() {
32
+	setup_interface_tayga "tayga-$1" "$1"
33
+}
34
+
35
+tayga_add_static_mappings() {
36
+	local tmpconf="$1"
37
+
38
+	(
39
+		. /lib/functions.sh
40
+		config_load firewall
41
+
42
+		tayga_map_rule_add() {
43
+			local cfg="$1"
44
+			local tmpconf="$2"
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
50
+		}
51
+
52
+		config_foreach tayga_map_rule_add nat64 "$tmpconf"
53
+	)
54
+}
55
+
56
+setup_interface_tayga() {
57
+	local iface="$1"
58
+	local cfg="$2"
59
+	local link="tayga-$cfg"
60
+
61
+	local ipv4_addr ipv6_addr prefix dynamic_pool
62
+
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
67
+
68
+	local args
69
+
70
+	include /lib/network
71
+	scan_interfaces
72
+
73
+	local wanip4=$(uci_get network "$cfg" ipv4addr)
74
+	local wanip6=$(uci_get network "$cfg" ipv6addr)
75
+
76
+	local wanif4=$(find_tayga_wanif4)
77
+	local wanif6=$(find_tayga_wanif6)
78
+
79
+	[ -z "$wanip4" ] && {
80
+		[ -n "$wanif4" ] && {
81
+			wanip4=$(find_tayga_wanip4 "$wanif4")
82
+			uci_set_state network "$cfg" wan4_device "$wanif4"
83
+		}
84
+	}
85
+
86
+	[ -z "$wanip6" ] && {
87
+		[ -n "$wanif6" ] && {
88
+			wanip6=$(find_tayga_wanip6 "$wanif6")
89
+			uci_set_state network "$cfg" wan6_device "$wanif6"
90
+		}
91
+	}
92
+
93
+	[ -n "$wanip4" ] && [ -n "$wanip6" ] || {
94
+		echo "Cannot determine local IPv4 and IPv6 addressed for tayga NAT64 $cfg - skipping"
95
+		return 1
96
+	}
97
+
98
+	local tmpconf="/var/etc/tayga-$cfg.conf"
99
+	args="-c $tmpconf"
100
+	mkdir -p /var/etc
101
+	mkdir -p /var/run/tayga/$cfg
102
+
103
+	echo "tun-device $link" >$tmpconf
104
+	echo "ipv4-addr $ipv4_addr" >>$tmpconf
105
+	[ -n "$ipv6_addr" ] &&
106
+		echo "ipv6-addr $ipv6_addr" >>$tmpconf
107
+	[ -n "$prefix" ] &&
108
+		echo "prefix $prefix" >>$tmpconf
109
+
110
+	tayga_add_static_mappings "$tmpconf"
111
+
112
+	[ -n "$dynamic_pool" ] &&
113
+		echo "dynamic-pool $dynamic_pool" >>$tmpconf
114
+	echo "data-dir /var/run/tayga/$cfg" >>$tmpconf
115
+
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
120
+
121
+	# here we create TUN device and check configuration
122
+	tayga $args --mktun || return 1
123
+
124
+	ip link set "$link" up
125
+
126
+	ip addr add "$wanip4" dev "$link"
127
+	ip addr add "$wanip6" dev "$link"
128
+
129
+	[ -n "$dynamic_pool" ] &&
130
+		ip -4 route add "$dynamic_pool" dev "$link"
131
+	[ -n "$prefix" ] &&
132
+		ip -6 route add "$prefix" dev "$link"
133
+
134
+	start-stop-daemon -S -x tayga -- $args -p /var/run/$link.pid
135
+
136
+	env -i ACTION="ifup" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \
137
+		/sbin/hotplug-call iface
138
+}
139
+
140
+stop_interface_tayga() {
141
+	local cfg="$1"
142
+	local link="tayga-$cfg"
143
+
144
+	env -i ACTION="ifdown" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \
145
+		/sbin/hotplug-call iface
146
+
147
+	service_kill tayga "/var/run/$link.pid"
148
+
149
+	ip link set "$link" down
150
+	ip addr flush dev "$link"
151
+	ip route flush dev "$link"
152
+}

+ 11
- 0
ipv6/tayga/patches/001-configure_unset_CFLAGS.patch View File

@@ -0,0 +1,11 @@
1
+--- a/configure.ac
2
++++ b/configure.ac
3
+@@ -5,8 +5,6 @@ AC_CONFIG_HEADERS(config.h)
4
+ 
5
+ AC_PROG_CC
6
+ 
7
+-CFLAGS='-g -Wall'
8
+-
9
+ tayga_conf_path=${sysconfdir}/tayga.conf
10
+ 
11
+ AC_SUBST(tayga_conf_path)

+ 53
- 0
ipv6/tayga/patches/002-bigendian_wrong_checksum.patch View File

@@ -0,0 +1,53 @@
1
+--- a/nat64.c
2
++++ b/nat64.c
3
+@@ -19,6 +19,11 @@
4
+ 
5
+ extern struct config *gcfg;
6
+ 
7
++static uint16_t checksum_extend_byte(uint8_t b)
8
++{
9
++	return htons(b << 8);
10
++}
11
++
12
+ static uint16_t ip_checksum(void *d, int c)
13
+ {
14
+ 	uint32_t sum = 0xffff;
15
+@@ -30,7 +35,7 @@ static uint16_t ip_checksum(void *d, int
16
+ 	}
17
+ 
18
+ 	if (c)
19
+-		sum += htons(*((uint8_t *)p) << 8);
20
++		sum += checksum_extend_byte(*((uint8_t *)p));
21
+ 
22
+ 	while (sum > 0xffff)
23
+ 		sum = (sum & 0xffff) + (sum >> 16);
24
+@@ -180,10 +185,12 @@ static int xlate_payload_4to6(struct pkt
25
+ 		cksum = ones_add(p->icmp->cksum, cksum);
26
+ 		if (p->icmp->type == 8) {
27
+ 			p->icmp->type = 128;
28
+-			p->icmp->cksum = ones_add(cksum, ~(128 - 8));
29
++			p->icmp->cksum = ones_add(cksum,
30
++						~checksum_extend_byte(128 - 8));
31
+ 		} else {
32
+ 			p->icmp->type = 129;
33
+-			p->icmp->cksum = ones_add(cksum, ~(129 - 0));
34
++			p->icmp->cksum = ones_add(cksum,
35
++						~checksum_extend_byte(129 - 0));
36
+ 		}
37
+ 		return 0;
38
+ 	case 17:
39
+@@ -668,10 +675,12 @@ static int xlate_payload_6to4(struct pkt
40
+ 		cksum = ones_add(p->icmp->cksum, cksum);
41
+ 		if (p->icmp->type == 128) {
42
+ 			p->icmp->type = 8;
43
+-			p->icmp->cksum = ones_add(cksum, 128 - 8);
44
++			p->icmp->cksum = ones_add(cksum,
45
++						checksum_extend_byte(128 - 8));
46
+ 		} else {
47
+ 			p->icmp->type = 0;
48
+-			p->icmp->cksum = ones_add(cksum, 129 - 0);
49
++			p->icmp->cksum = ones_add(cksum,
50
++						checksum_extend_byte(129 - 0));
51
+ 		}
52
+ 		return 0;
53
+ 	case 17: