diff --git a/patches/openwrt/0009-Revert-odhcp6c-work-around-RIOs-matching-PIOs-as-sent-by-some-apple-routers.patch b/patches/openwrt/0009-Revert-odhcp6c-work-around-RIOs-matching-PIOs-as-sent-by-some-apple-routers.patch new file mode 100644 index 00000000..65120445 --- /dev/null +++ b/patches/openwrt/0009-Revert-odhcp6c-work-around-RIOs-matching-PIOs-as-sent-by-some-apple-routers.patch @@ -0,0 +1,34 @@ +From: Matthias Schiffer +Date: Sun, 21 Jun 2015 05:47:46 +0200 +Subject: Revert "odhcp6c: work around RIOs matching PIOs as sent by some apple routers" + +This reverts commit c46402e106ee924e3861f9685d6187552e7f8f2b. + +diff --git a/package/network/ipv6/odhcp6c/Makefile b/package/network/ipv6/odhcp6c/Makefile +index d0935eb..a90f5ce 100644 +--- a/package/network/ipv6/odhcp6c/Makefile ++++ b/package/network/ipv6/odhcp6c/Makefile +@@ -8,7 +8,7 @@ + include $(TOPDIR)/rules.mk + + PKG_NAME:=odhcp6c +-PKG_VERSION:=2015-06-10 ++PKG_VERSION:=2015-06-09 + PKG_RELEASE=$(PKG_SOURCE_VERSION) + + PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.script b/package/network/ipv6/odhcp6c/files/dhcpv6.script +index 84eb706..650c9b2 100755 +--- a/package/network/ipv6/odhcp6c/files/dhcpv6.script ++++ b/package/network/ipv6/odhcp6c/files/dhcpv6.script +@@ -88,10 +88,6 @@ setup_interface () { + + if [ -z "$gw" ]; then + proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" +- +- # work around if there is a PIO matching a RIO +- # Linux seems to prefer source-dest over dest-only even if metric is higher +- proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" "$addr/$mask" + else + for prefix in $PREFIXES $ADDRESSES; do + local paddr="${prefix%%,*}" diff --git a/patches/openwrt/0010-Revert-6to4-Remove-sourcerouting-parameter-registration.patch b/patches/openwrt/0010-Revert-6to4-Remove-sourcerouting-parameter-registration.patch new file mode 100644 index 00000000..63d6b796 --- /dev/null +++ b/patches/openwrt/0010-Revert-6to4-Remove-sourcerouting-parameter-registration.patch @@ -0,0 +1,18 @@ +From: Matthias Schiffer +Date: Sun, 21 Jun 2015 05:47:54 +0200 +Subject: Revert "6to4: Remove sourcerouting parameter registration" + +This reverts commit b64e2fa3f75b9ae21d670a9084ca855ea39c25e6. + +diff --git a/package/network/ipv6/6to4/files/6to4.sh b/package/network/ipv6/6to4/files/6to4.sh +index a5d0567..57efc52 100755 +--- a/package/network/ipv6/6to4/files/6to4.sh ++++ b/package/network/ipv6/6to4/files/6to4.sh +@@ -91,6 +91,7 @@ proto_6to4_init_config() { + proto_config_add_int "mtu" + proto_config_add_int "ttl" + proto_config_add_string "tos" ++ proto_config_add_boolean "sourcerouting" + } + + [ -n "$INCLUDE_ONLY" ] || { diff --git a/patches/openwrt/0011-Revert-6rd-Remove-sourcerouting-parameter-registration.patch b/patches/openwrt/0011-Revert-6rd-Remove-sourcerouting-parameter-registration.patch new file mode 100644 index 00000000..0be7d722 --- /dev/null +++ b/patches/openwrt/0011-Revert-6rd-Remove-sourcerouting-parameter-registration.patch @@ -0,0 +1,18 @@ +From: Matthias Schiffer +Date: Sun, 21 Jun 2015 05:48:01 +0200 +Subject: Revert "6rd: Remove sourcerouting parameter registration" + +This reverts commit cedaf068bf920099483adfad2e106e35737c964f. + +diff --git a/package/network/ipv6/6rd/files/6rd.sh b/package/network/ipv6/6rd/files/6rd.sh +index 62d35b6..6c68b3b 100644 +--- a/package/network/ipv6/6rd/files/6rd.sh ++++ b/package/network/ipv6/6rd/files/6rd.sh +@@ -94,6 +94,7 @@ proto_6rd_init_config() { + proto_config_add_string "ip6prefixlen" + proto_config_add_string "ip4prefixlen" + proto_config_add_string "tunlink" ++ proto_config_add_boolean "sourcerouting" + proto_config_add_string "zone" + } + diff --git a/patches/openwrt/0012-Revert-ipv6-remove-now-unneeded-source-dest-routing-workarounds.patch b/patches/openwrt/0012-Revert-ipv6-remove-now-unneeded-source-dest-routing-workarounds.patch new file mode 100644 index 00000000..5c7b5d4c --- /dev/null +++ b/patches/openwrt/0012-Revert-ipv6-remove-now-unneeded-source-dest-routing-workarounds.patch @@ -0,0 +1,214 @@ +From: Matthias Schiffer +Date: Sun, 21 Jun 2015 05:48:45 +0200 +Subject: Revert "ipv6: remove now unneeded source-dest-routing workarounds" + +This reverts commit 31214c38c8dd0f70366b523f9b0335145b9386bd. + +diff --git a/package/network/ipv6/6in4/Makefile b/package/network/ipv6/6in4/Makefile +index b7c2da7..21e69e6 100644 +--- a/package/network/ipv6/6in4/Makefile ++++ b/package/network/ipv6/6in4/Makefile +@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk + + PKG_NAME:=6in4 + PKG_VERSION:=21 +-PKG_RELEASE:=2 ++PKG_RELEASE:=1 + PKG_LICENSE:=GPL-2.0 + + include $(INCLUDE_DIR)/package.mk +diff --git a/package/network/ipv6/6in4/files/6in4.sh b/package/network/ipv6/6in4/files/6in4.sh +index af2ddca..0289df3 100755 +--- a/package/network/ipv6/6in4/files/6in4.sh ++++ b/package/network/ipv6/6in4/files/6in4.sh +@@ -27,8 +27,8 @@ proto_6in4_setup() { + local iface="$2" + local link="6in4-$cfg" + +- local mtu ttl tos ipaddr peeraddr ip6addr ip6prefix tunnelid username password updatekey +- json_get_vars mtu ttl tos ipaddr peeraddr ip6addr ip6prefix tunnelid username password updatekey ++ local mtu ttl tos ipaddr peeraddr ip6addr ip6prefix tunnelid username password updatekey sourcerouting ++ json_get_vars mtu ttl tos ipaddr peeraddr ip6addr ip6prefix tunnelid username password updatekey sourcerouting + + [ -z "$peeraddr" ] && { + proto_notify_error "$cfg" "MISSING_ADDRESS" +@@ -48,17 +48,21 @@ proto_6in4_setup() { + + proto_init_update "$link" 1 + ++ local source="" ++ [ "$sourcerouting" != "0" ] && source="::/128" ++ proto_add_ipv6_route "::" 0 "" "" "" "$source" ++ + [ -n "$ip6addr" ] && { + local local6="${ip6addr%%/*}" + local mask6="${ip6addr##*/}" + [[ "$local6" = "$mask6" ]] && mask6= + proto_add_ipv6_address "$local6" "$mask6" +- proto_add_ipv6_route "::" 0 "" "" "" "$local6/$mask6" ++ [ "$sourcerouting" != "0" ] && proto_add_ipv6_route "::" 0 "" "" "" "$local6/$mask6" + } + + [ -n "$ip6prefix" ] && { + proto_add_ipv6_prefix "$ip6prefix" +- proto_add_ipv6_route "::" 0 "" "" "" "$ip6prefix" ++ [ "$sourcerouting" != "0" ] && proto_add_ipv6_route "::" 0 "" "" "" "$ip6prefix" + } + + proto_add_tunnel +@@ -142,6 +146,7 @@ proto_6in4_init_config() { + proto_config_add_int "mtu" + proto_config_add_int "ttl" + proto_config_add_string "tos" ++ proto_config_add_boolean "sourcerouting" + } + + [ -n "$INCLUDE_ONLY" ] || { +diff --git a/package/network/ipv6/6rd/Makefile b/package/network/ipv6/6rd/Makefile +index cde7117..f9b7eae 100644 +--- a/package/network/ipv6/6rd/Makefile ++++ b/package/network/ipv6/6rd/Makefile +@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk + + PKG_NAME:=6rd + PKG_VERSION:=9 +-PKG_RELEASE:=2 ++PKG_RELEASE:=1 + PKG_LICENSE:=GPL-2.0 + + include $(INCLUDE_DIR)/package.mk +diff --git a/package/network/ipv6/6rd/files/6rd.sh b/package/network/ipv6/6rd/files/6rd.sh +index 6c68b3b..b485136 100644 +--- a/package/network/ipv6/6rd/files/6rd.sh ++++ b/package/network/ipv6/6rd/files/6rd.sh +@@ -14,8 +14,8 @@ proto_6rd_setup() { + local iface="$2" + local link="6rd-$cfg" + +- local mtu df ttl tos ipaddr peeraddr ip6prefix ip6prefixlen ip4prefixlen tunlink zone +- json_get_vars mtu df ttl tos ipaddr peeraddr ip6prefix ip6prefixlen ip4prefixlen tunlink zone ++ local mtu df ttl tos ipaddr peeraddr ip6prefix ip6prefixlen ip4prefixlen tunlink sourcerouting zone ++ json_get_vars mtu df ttl tos ipaddr peeraddr ip6prefix ip6prefixlen ip4prefixlen tunlink sourcerouting zone + + [ -z "$ip6prefix" -o -z "$peeraddr" ] && { + proto_notify_error "$cfg" "MISSING_ADDRESS" +@@ -54,8 +54,13 @@ proto_6rd_setup() { + proto_add_ipv6_address "$ip6addr" "$ip6prefixlen" + proto_add_ipv6_prefix "$ip6lanprefix" + +- proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 "" "$ip6addr/$ip6prefixlen" +- proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 "" "$ip6lanprefix" ++ if [ "$sourcerouting" != "0" ]; then ++ proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 "" "::/128" ++ proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 "" "$ip6addr/$ip6prefixlen" ++ proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 "" "$ip6lanprefix" ++ else ++ proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 ++ fi + + proto_add_tunnel + json_add_string mode sit +diff --git a/package/network/ipv6/6to4/Makefile b/package/network/ipv6/6to4/Makefile +index fcec90d..6be2cc5 100644 +--- a/package/network/ipv6/6to4/Makefile ++++ b/package/network/ipv6/6to4/Makefile +@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk + + PKG_NAME:=6to4 + PKG_VERSION:=12 +-PKG_RELEASE:=2 ++PKG_RELEASE:=1 + PKG_LICENSE:=GPL-2.0 + + include $(INCLUDE_DIR)/package.mk +diff --git a/package/network/ipv6/6to4/files/6to4.sh b/package/network/ipv6/6to4/files/6to4.sh +index 57efc52..ce1de53 100755 +--- a/package/network/ipv6/6to4/files/6to4.sh ++++ b/package/network/ipv6/6to4/files/6to4.sh +@@ -34,8 +34,8 @@ proto_6to4_setup() { + local iface="$2" + local link="6to4-$cfg" + +- local mtu ttl tos ipaddr +- json_get_vars mtu ttl tos ipaddr ++ local mtu ttl tos ipaddr sourcerouting ++ json_get_vars mtu ttl tos ipaddr sourcerouting + + ( proto_add_host_dependency "$cfg" 0.0.0.0 ) + +@@ -65,8 +65,13 @@ proto_6to4_setup() { + proto_add_ipv6_address "$local6" 16 + proto_add_ipv6_prefix "$prefix6::/48" + +- proto_add_ipv6_route "::" 0 "::192.88.99.1" "" "" "$local6/16" +- proto_add_ipv6_route "::" 0 "::192.88.99.1" "" "" "$prefix6::/48" ++ if [ "$sourcerouting" != "0" ]; then ++ proto_add_ipv6_route "::" 0 "::192.88.99.1" "" "" "::/128" ++ proto_add_ipv6_route "::" 0 "::192.88.99.1" "" "" "$local6/16" ++ proto_add_ipv6_route "::" 0 "::192.88.99.1" "" "" "$prefix6::/48" ++ else ++ proto_add_ipv6_route "::" 0 "::192.88.99.1" ++ fi + + proto_add_tunnel + json_add_string mode sit +diff --git a/package/network/ipv6/odhcp6c/Makefile b/package/network/ipv6/odhcp6c/Makefile +index a90f5ce..ddd6917 100644 +--- a/package/network/ipv6/odhcp6c/Makefile ++++ b/package/network/ipv6/odhcp6c/Makefile +@@ -8,7 +8,7 @@ + include $(TOPDIR)/rules.mk + + PKG_NAME:=odhcp6c +-PKG_VERSION:=2015-06-09 ++PKG_VERSION:=2015-05-16 + PKG_RELEASE=$(PKG_SOURCE_VERSION) + + PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.script b/package/network/ipv6/odhcp6c/files/dhcpv6.script +index 650c9b2..6cd59fa 100755 +--- a/package/network/ipv6/odhcp6c/files/dhcpv6.script ++++ b/package/network/ipv6/odhcp6c/files/dhcpv6.script +@@ -86,9 +86,10 @@ setup_interface () { + entry="${entry#*,}" + local metric="${entry%%,*}" + +- if [ -z "$gw" ]; then ++ if [ -z "$SOURCE_ROUTING" -o -z "$gw" ]; then + proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" + else ++ proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" "::/128" + for prefix in $PREFIXES $ADDRESSES; do + local paddr="${prefix%%,*}" + proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" "$paddr" +diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.sh b/package/network/ipv6/odhcp6c/files/dhcpv6.sh +index adcb100..9fb6fa3 100755 +--- a/package/network/ipv6/odhcp6c/files/dhcpv6.sh ++++ b/package/network/ipv6/odhcp6c/files/dhcpv6.sh +@@ -23,6 +23,7 @@ proto_dhcpv6_init_config() { + proto_config_add_string zone_464xlat + proto_config_add_string zone + proto_config_add_string 'ifaceid:ip6addr' ++ proto_config_add_string 'sourcerouting:bool' + proto_config_add_string "userclass" + proto_config_add_string "vendorclass" + proto_config_add_boolean delegate +@@ -34,8 +35,8 @@ proto_dhcpv6_setup() { + local config="$1" + local iface="$2" + +- local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes +- json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes ++ local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid sourcerouting userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes ++ json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid sourcerouting userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes + + + # Configure +@@ -69,6 +70,7 @@ proto_dhcpv6_setup() { + [ -n "$iface_dslite" ] && proto_export "IFACE_DSLITE=$iface_dslite" + [ -n "$iface_map" ] && proto_export "IFACE_MAP=$iface_map" + [ -n "$iface_464xlat" ] && proto_export "IFACE_464XLAT=$iface_464xlat" ++ [ "$sourcerouting" != "0" ] && proto_export "SOURCE_ROUTING=1" + [ "$delegate" = "0" ] && proto_export "IFACE_DSLITE_DELEGATE=0" + [ "$delegate" = "0" ] && proto_export "IFACE_MAP_DELEGATE=0" + [ -n "$zone_dslite" ] && proto_export "ZONE_DSLITE=$zone_dslite" diff --git a/patches/openwrt/0013-Revert-linux-backport-IPv6-SAS-fixes-for-source-specific-routes.patch b/patches/openwrt/0013-Revert-linux-backport-IPv6-SAS-fixes-for-source-specific-routes.patch new file mode 100644 index 00000000..1bc94146 --- /dev/null +++ b/patches/openwrt/0013-Revert-linux-backport-IPv6-SAS-fixes-for-source-specific-routes.patch @@ -0,0 +1,108 @@ +From: Matthias Schiffer +Date: Sun, 21 Jun 2015 05:49:05 +0200 +Subject: Revert "linux: backport IPv6 SAS fixes for source-specific routes" + +This reverts commit 5168c9a5702648eb690d32ec821647aca80aeba9. + +diff --git a/target/linux/generic/patches-3.18/667-ipv6-Fixed-source-specific-default-route-handling.patch b/target/linux/generic/patches-3.18/667-ipv6-Fixed-source-specific-default-route-handling.patch +deleted file mode 100644 +index f67ef47..0000000 +--- a/target/linux/generic/patches-3.18/667-ipv6-Fixed-source-specific-default-route-handling.patch ++++ /dev/null +@@ -1,96 +0,0 @@ +-From e16e888b525503be05b3aea64190e8b3bdef44d0 Mon Sep 17 00:00:00 2001 +-From: Markus Stenberg +-Date: Tue, 5 May 2015 13:36:59 +0300 +-Subject: [PATCH] ipv6: Fixed source specific default route handling. +- +-If there are only IPv6 source specific default routes present, the +-host gets -ENETUNREACH on e.g. connect() because ip6_dst_lookup_tail +-calls ip6_route_output first, and given source address any, it fails, +-and ip6_route_get_saddr is never called. +- +-The change is to use the ip6_route_get_saddr, even if the initial +-ip6_route_output fails, and then doing ip6_route_output _again_ after +-we have appropriate source address available. +- +-Note that this is '99% fix' to the problem; a correct fix would be to +-do route lookups only within addrconf.c when picking a source address, +-and never call ip6_route_output before source address has been +-populated. +- +-Signed-off-by: Markus Stenberg +-Signed-off-by: David S. Miller +---- +- net/ipv6/ip6_output.c | 39 +++++++++++++++++++++++++++++++-------- +- net/ipv6/route.c | 5 +++-- +- 2 files changed, 34 insertions(+), 10 deletions(-) +- +---- a/net/ipv6/ip6_output.c +-+++ b/net/ipv6/ip6_output.c +-@@ -898,21 +898,45 @@ static int ip6_dst_lookup_tail(struct so +- #endif +- int err; +- +-- if (*dst == NULL) +-- *dst = ip6_route_output(net, sk, fl6); +-- +-- if ((err = (*dst)->error)) +-- goto out_err_release; +-+ /* The correct way to handle this would be to do +-+ * ip6_route_get_saddr, and then ip6_route_output; however, +-+ * the route-specific preferred source forces the +-+ * ip6_route_output call _before_ ip6_route_get_saddr. +-+ * +-+ * In source specific routing (no src=any default route), +-+ * ip6_route_output will fail given src=any saddr, though, so +-+ * that's why we try it again later. +-+ */ +-+ if (ipv6_addr_any(&fl6->saddr) && (!*dst || !(*dst)->error)) { +-+ struct rt6_info *rt; +-+ bool had_dst = *dst != NULL; +- +-- if (ipv6_addr_any(&fl6->saddr)) { +-- struct rt6_info *rt = (struct rt6_info *) *dst; +-+ if (!had_dst) +-+ *dst = ip6_route_output(net, sk, fl6); +-+ rt = (*dst)->error ? NULL : (struct rt6_info *)*dst; +- err = ip6_route_get_saddr(net, rt, &fl6->daddr, +- sk ? inet6_sk(sk)->srcprefs : 0, +- &fl6->saddr); +- if (err) +- goto out_err_release; +-+ +-+ /* If we had an erroneous initial result, pretend it +-+ * never existed and let the SA-enabled version take +-+ * over. +-+ */ +-+ if (!had_dst && (*dst)->error) { +-+ dst_release(*dst); +-+ *dst = NULL; +-+ } +- } +- +-+ if (!*dst) +-+ *dst = ip6_route_output(net, sk, fl6); +-+ +-+ err = (*dst)->error; +-+ if (err) +-+ goto out_err_release; +-+ +- #ifdef CONFIG_IPV6_OPTIMISTIC_DAD +- /* +- * Here if the dst entry we've looked up +---- a/net/ipv6/route.c +-+++ b/net/ipv6/route.c +-@@ -2182,9 +2182,10 @@ int ip6_route_get_saddr(struct net *net, +- unsigned int prefs, +- struct in6_addr *saddr) +- { +-- struct inet6_dev *idev = ip6_dst_idev((struct dst_entry *)rt); +-+ struct inet6_dev *idev = +-+ rt ? ip6_dst_idev((struct dst_entry *)rt) : NULL; +- int err = 0; +-- if (rt->rt6i_prefsrc.plen) +-+ if (rt && rt->rt6i_prefsrc.plen) +- *saddr = rt->rt6i_prefsrc.addr; +- else +- err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,