diff mbox

[LEDE-DEV] kernel: update kernel 4.4 to version 4.4.32

Message ID trinity-c3e6ed61-1390-4cd8-b425-7e528511ce68-1479278587205@3capp-gmx-bs66
State Rejected
Headers show

Commit Message

p.wassi@gmx.at Nov. 16, 2016, 6:43 a.m. UTC
From: Paul Wassi <p.wassi@gmx.at>

Refresh patches for all targets that support kernel 4.4.
compile/run-tested on kirkwood, ar71xx, brcm47xx.

Signed-off-by: Paul Wassi <p.wassi@gmx.at>
---
This patch is meant to be applied upon 4.4.31!
Apply https://patchwork.ozlabs.org/patch/694032/ first.

 include/kernel-version.mk                                                                         |    4 -
 target/linux/apm821xx/patches-4.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch  |    6 -
 target/linux/apm821xx/patches-4.4/802-usb-xhci-force-msi-renesas-xhci.patch                       |    2 
 target/linux/ar71xx/patches-4.4/910-unaligned_access_hacks.patch                                  |    4 -
 target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch |    4 -
 target/linux/brcm2708/patches-4.4/0220-net-sched-add-skb_at_tc_ingress-helper.patch               |   23 ------
 target/linux/generic/patches-4.4/630-packet_socket_type.patch                                     |   16 ++--
 target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch                            |   32 ++++----
 target/linux/generic/patches-4.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch                   |   37 +++++-----
 target/linux/generic/patches-4.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch |   10 +-
 target/linux/generic/patches-4.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch                 |   12 +--
 11 files changed, 66 insertions(+), 84 deletions(-)

Comments

Stijn Tintel Nov. 16, 2016, 10:19 a.m. UTC | #1
On 16-11-16 07:43, p.wassi@gmx.at wrote:
> From: Paul Wassi <p.wassi@gmx.at>
>
> Refresh patches for all targets that support kernel 4.4.
> compile/run-tested on kirkwood, ar71xx, brcm47xx.
>
> Signed-off-by: Paul Wassi <p.wassi@gmx.at>
> ---
> This patch is meant to be applied upon 4.4.31!
> Apply https://patchwork.ozlabs.org/patch/694032/ first.
Running the script to update to 4.4.32 on top of the patch above, and
already have more changed files, so NAK here as well.
As you used the script, I suspect it is because you are not using the
same quilt configuration:
https://wiki.openwrt.org/doc/devel/patches#prepare_quilt_configuration

Stijn
p.wassi@gmx.at Nov. 16, 2016, 9:50 p.m. UTC | #2
Hi Stijn,

> Running the script to update to 4.4.32 on top of the patch above, and
> already have more changed files, so NAK here as well.

I'm still on this topic, still willing to learn and improve and still
not discouraged too much. To see where things have gone wrong on my side
(which I guess was the reason for patch rejection), I've just compared
your 4.4.32 to my 4.4.32 refreshing.

In total we have four (minor) differences here:

include/kernel-version.mk:
    for the checksum you used md5 (as the name suggests), while I have sha256
    as someone has started it like this, and I've just followed it like a sheep.

apm821xx/patches-4.4/804-usb-dwc2-add-amcc-usb-otg-405ex.patch:
    Here, you add more context around the actual patch, which I completely missed
    since it applies fine.

ar71xx/patches-4.4/910-unaligned_access_hacks.patch
    Half of the patch is removed, since alreay included upstream.
    I additionally refreshed the diffstat for that patch and not only deleted the
    relevant line here.

lantiq/patches-4.4/0154-lantiq-pci-bar11mask-fix.patch
    Again, you add more context around the actual patch, which I did not do, since it
    applies fine.

Besides these things, our diffs are completely the same.
So I'm trying to understand what is wrong about my attempt.
I've re-read the https://wiki.openwrt.org/doc/devel/patches
According to the wiki, the quilt-config is just for a preferred format for patches.
It's not mandatory. Furthermore it says that for refreshing, the refresh make target
can be used. (Leaving the interpretation that there are also other ways).

However, if there's only this one and only true and correct way for this task, this
can be clearly stated in the wiki, or even here in the mailinglist.
Don't get me wrong, I'm still trying to see if I can improve here, or better put my time
into other topics. At the moment I don't see a way I could really do different here (besides
using the exact same configuration), so maybe I should look into something different then...

Best regards,
P. Wassi
Rafał Miłecki Nov. 17, 2016, 5:05 a.m. UTC | #3
On 16 November 2016 at 22:50,  <p.wassi@gmx.at> wrote:
> apm821xx/patches-4.4/804-usb-dwc2-add-amcc-usb-otg-405ex.patch:
>     Here, you add more context around the actual patch, which I completely missed
>     since it applies fine.

That patch was /wrong/ in the first place, a proper refresh should fix
that context as it did for Stijn it seems.


> ar71xx/patches-4.4/910-unaligned_access_hacks.patch
>     Half of the patch is removed, since alreay included upstream.
>     I additionally refreshed the diffstat for that patch and not only deleted the
>     relevant line here.

You are overcomplicating this, really. Keep things simple, save time &
avoid extra steps of possible failure. Our patches shouldn't really
include diffstats, usually they only do when we copy patches from some
git repositories (e.g. backports).


> lantiq/patches-4.4/0154-lantiq-pci-bar11mask-fix.patch
>     Again, you add more context around the actual patch, which I did not do, since it
>     applies fine.

Same as above.
p.wassi@gmx.at Nov. 17, 2016, 6:27 a.m. UTC | #4
Hi Rafal,

ok, then I'll really better stop sending those patches. Anyway, I'll
keep an eye on that, compare upcoming ones to local ones if everything is
fine then and eventually actively come back later to this topic.

Thanks, best regards,
P. Wassi
diff mbox

Patch

diff --git a/include/kernel-version.mk b/include/kernel-version.mk
--- a/include/kernel-version.mk
+++ b/include/kernel-version.mk
@@ -4,11 +4,11 @@  LINUX_RELEASE?=1
 
 LINUX_VERSION-3.18 = .43
 LINUX_VERSION-4.1 = .34
-LINUX_VERSION-4.4 = .31
+LINUX_VERSION-4.4 = .32
 
 LINUX_KERNEL_MD5SUM-3.18.43 = b1faeb4a2e1e70ffe061bdbb3452840a
 LINUX_KERNEL_MD5SUM-4.1.34 = fba99f0f4765ebf01033e69518740a3c
-LINUX_KERNEL_MD5SUM-4.4.31 = 29d9b0b1aa4dec3eb1a9edf1b84e79c5
+LINUX_KERNEL_MD5SUM-4.4.32 = ecda1c3a2f1103e91504ee4c90ed17ce508a585e5e8ecf9b4f000a86d7e7c30e
 
 ifdef KERNEL_PATCHVER
   LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER)))
diff --git a/target/linux/apm821xx/patches-4.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch b/target/linux/apm821xx/patches-4.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch
--- a/target/linux/apm821xx/patches-4.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch
+++ b/target/linux/apm821xx/patches-4.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch
@@ -44,7 +44,7 @@  Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
  
  #include "xhci.h"
  #include "xhci-trace.h"
-@@ -209,6 +211,458 @@ static void xhci_pme_acpi_rtd3_enable(st
+@@ -211,6 +213,458 @@ static void xhci_pme_acpi_rtd3_enable(st
  static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { }
  #endif /* CONFIG_ACPI */
  
@@ -503,7 +503,7 @@  Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
  /* called during probe() after chip reset completes */
  static int xhci_pci_setup(struct usb_hcd *hcd)
  {
-@@ -248,6 +702,22 @@ static int xhci_pci_probe(struct pci_dev
+@@ -250,6 +704,22 @@ static int xhci_pci_probe(struct pci_dev
  	struct hc_driver *driver;
  	struct usb_hcd *hcd;
  
@@ -526,7 +526,7 @@  Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
  	driver = (struct hc_driver *)id->driver_data;
  
  	/* Prevent runtime suspending between USB-2 and USB-3 initialization */
-@@ -305,6 +775,16 @@ static void xhci_pci_remove(struct pci_d
+@@ -307,6 +777,16 @@ static void xhci_pci_remove(struct pci_d
  {
  	struct xhci_hcd *xhci;
  
diff --git a/target/linux/apm821xx/patches-4.4/802-usb-xhci-force-msi-renesas-xhci.patch b/target/linux/apm821xx/patches-4.4/802-usb-xhci-force-msi-renesas-xhci.patch
--- a/target/linux/apm821xx/patches-4.4/802-usb-xhci-force-msi-renesas-xhci.patch
+++ b/target/linux/apm821xx/patches-4.4/802-usb-xhci-force-msi-renesas-xhci.patch
@@ -13,7 +13,7 @@  produce a noisy warning.
 
 --- a/drivers/usb/host/xhci-pci.c
 +++ b/drivers/usb/host/xhci-pci.c
-@@ -176,7 +176,7 @@ static void xhci_pci_quirks(struct devic
+@@ -178,7 +178,7 @@ static void xhci_pci_quirks(struct devic
  	}
  	if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
  			pdev->device == 0x0015)
diff --git a/target/linux/ar71xx/patches-4.4/910-unaligned_access_hacks.patch b/target/linux/ar71xx/patches-4.4/910-unaligned_access_hacks.patch
--- a/target/linux/ar71xx/patches-4.4/910-unaligned_access_hacks.patch
+++ b/target/linux/ar71xx/patches-4.4/910-unaligned_access_hacks.patch
@@ -310,7 +310,7 @@ 
  	if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK)
 --- a/net/ipv6/ip6_tunnel.c
 +++ b/net/ipv6/ip6_tunnel.c
-@@ -1386,7 +1386,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
+@@ -1388,7 +1388,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
  
  	dsfield = ipv6_get_dsfield(ipv6h);
  	if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS)
@@ -838,7 +838,7 @@ 
  
 --- a/net/ipv4/tcp_input.c
 +++ b/net/ipv4/tcp_input.c
-@@ -3819,14 +3819,16 @@ static bool tcp_parse_aligned_timestamp(
+@@ -3818,14 +3818,16 @@ static bool tcp_parse_aligned_timestamp(
  {
  	const __be32 *ptr = (const __be32 *)(th + 1);
  
diff --git a/target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch b/target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
--- a/target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
+++ b/target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
@@ -10,7 +10,7 @@  Subject: [PATCH] config: Enable CONFIG_MEMCG, but leave it disabled (due to
 
 --- a/kernel/cgroup.c
 +++ b/kernel/cgroup.c
-@@ -5307,7 +5307,7 @@ int __init cgroup_init_early(void)
+@@ -5310,7 +5310,7 @@ int __init cgroup_init_early(void)
  	return 0;
  }
  
@@ -19,7 +19,7 @@  Subject: [PATCH] config: Enable CONFIG_MEMCG, but leave it disabled (due to
  
  /**
   * cgroup_init - cgroup initialization
-@@ -5803,6 +5803,27 @@ static int __init cgroup_disable(char *s
+@@ -5806,6 +5806,27 @@ static int __init cgroup_disable(char *s
  }
  __setup("cgroup_disable=", cgroup_disable);
  
diff --git a/target/linux/brcm2708/patches-4.4/0220-net-sched-add-skb_at_tc_ingress-helper.patch b/target/linux/brcm2708/patches-4.4/0220-net-sched-add-skb_at_tc_ingress-helper.patch
--- a/target/linux/brcm2708/patches-4.4/0220-net-sched-add-skb_at_tc_ingress-helper.patch
+++ b/target/linux/brcm2708/patches-4.4/0220-net-sched-add-skb_at_tc_ingress-helper.patch
@@ -10,28 +10,9 @@  Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
 Acked-by: Alexei Starovoitov <ast@kernel.org>
 Signed-off-by: David S. Miller <davem@davemloft.net>
 ---
- include/net/sch_generic.h | 9 +++++++++
- net/sched/cls_bpf.c       | 6 +-----
- 2 files changed, 10 insertions(+), 5 deletions(-)
+ net/shed/cls_bpf.c |    6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
 
---- a/include/net/sch_generic.h
-+++ b/include/net/sch_generic.h
-@@ -409,6 +409,15 @@ bool tcf_destroy(struct tcf_proto *tp, b
- void tcf_destroy_chain(struct tcf_proto __rcu **fl);
- int skb_do_redirect(struct sk_buff *);
- 
-+static inline bool skb_at_tc_ingress(const struct sk_buff *skb)
-+{
-+#ifdef CONFIG_NET_CLS_ACT
-+	return G_TC_AT(skb->tc_verd) & AT_INGRESS;
-+#else
-+	return false;
-+#endif
-+}
-+
- /* Reset all TX qdiscs greater then index of a device.  */
- static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
- {
 --- a/net/sched/cls_bpf.c
 +++ b/net/sched/cls_bpf.c
 @@ -79,12 +79,8 @@ static int cls_bpf_classify(struct sk_bu
diff --git a/target/linux/generic/patches-4.4/630-packet_socket_type.patch b/target/linux/generic/patches-4.4/630-packet_socket_type.patch
--- a/target/linux/generic/patches-4.4/630-packet_socket_type.patch
+++ b/target/linux/generic/patches-4.4/630-packet_socket_type.patch
@@ -26,7 +26,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  #define PACKET_FANOUT_LB		1
 --- a/net/packet/af_packet.c
 +++ b/net/packet/af_packet.c
-@@ -1764,6 +1764,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1763,6 +1763,7 @@ static int packet_rcv_spkt(struct sk_buf
  {
  	struct sock *sk;
  	struct sockaddr_pkt *spkt;
@@ -34,7 +34,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	/*
  	 *	When we registered the protocol we saved the socket in the data
-@@ -1771,6 +1772,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1770,6 +1771,7 @@ static int packet_rcv_spkt(struct sk_buf
  	 */
  
  	sk = pt->af_packet_priv;
@@ -42,7 +42,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	/*
  	 *	Yank back the headers [hope the device set this
-@@ -1783,7 +1785,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1782,7 +1784,7 @@ static int packet_rcv_spkt(struct sk_buf
  	 *	so that this procedure is noop.
  	 */
  
@@ -51,7 +51,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		goto out;
  
  	if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -1986,12 +1988,12 @@ static int packet_rcv(struct sk_buff *sk
+@@ -1985,12 +1987,12 @@ static int packet_rcv(struct sk_buff *sk
  	int skb_len = skb->len;
  	unsigned int snaplen, res;
  
@@ -67,7 +67,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	if (!net_eq(dev_net(dev), sock_net(sk)))
  		goto drop;
  
-@@ -2111,12 +2113,12 @@ static int tpacket_rcv(struct sk_buff *s
+@@ -2110,12 +2112,12 @@ static int tpacket_rcv(struct sk_buff *s
  	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
  	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
  
@@ -83,7 +83,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	if (!net_eq(dev_net(dev), sock_net(sk)))
  		goto drop;
  
-@@ -3092,6 +3094,7 @@ static int packet_create(struct net *net
+@@ -3091,6 +3093,7 @@ static int packet_create(struct net *net
  	mutex_init(&po->pg_vec_lock);
  	po->rollover = NULL;
  	po->prot_hook.func = packet_rcv;
@@ -91,7 +91,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	if (sock->type == SOCK_PACKET)
  		po->prot_hook.func = packet_rcv_spkt;
-@@ -3708,6 +3711,16 @@ packet_setsockopt(struct socket *sock, i
+@@ -3707,6 +3710,16 @@ packet_setsockopt(struct socket *sock, i
  		po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
  		return 0;
  	}
@@ -108,7 +108,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	default:
  		return -ENOPROTOOPT;
  	}
-@@ -3760,6 +3773,13 @@ static int packet_getsockopt(struct sock
+@@ -3759,6 +3772,13 @@ static int packet_getsockopt(struct sock
  	case PACKET_VNET_HDR:
  		val = po->has_vnet_hdr;
  		break;
diff --git a/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch b/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch
--- a/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch
+++ b/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch
@@ -127,7 +127,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  }
  #endif
  
-@@ -998,6 +1021,7 @@ static int br_ip4_multicast_igmp3_report
+@@ -1003,6 +1026,7 @@ static int br_ip4_multicast_igmp3_report
  					 struct sk_buff *skb,
  					 u16 vid)
  {
@@ -135,7 +135,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  	struct igmpv3_report *ih;
  	struct igmpv3_grec *grec;
  	int i;
-@@ -1038,12 +1062,13 @@ static int br_ip4_multicast_igmp3_report
+@@ -1043,12 +1067,13 @@ static int br_ip4_multicast_igmp3_report
  			continue;
  		}
  
@@ -151,7 +151,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  			if (err)
  				break;
  		}
-@@ -1058,6 +1083,7 @@ static int br_ip6_multicast_mld2_report(
+@@ -1063,6 +1088,7 @@ static int br_ip6_multicast_mld2_report(
  					struct sk_buff *skb,
  					u16 vid)
  {
@@ -159,7 +159,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  	struct icmp6hdr *icmp6h;
  	struct mld2_grec *grec;
  	int i;
-@@ -1109,10 +1135,10 @@ static int br_ip6_multicast_mld2_report(
+@@ -1114,10 +1140,10 @@ static int br_ip6_multicast_mld2_report(
  		     grec->grec_type == MLD2_MODE_IS_INCLUDE) &&
  		    ntohs(*nsrcs) == 0) {
  			br_ip6_multicast_leave_group(br, port, &grec->grec_mca,
@@ -172,7 +172,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  			if (err)
  				break;
  		}
-@@ -1427,7 +1453,8 @@ br_multicast_leave_group(struct net_brid
+@@ -1432,7 +1458,8 @@ br_multicast_leave_group(struct net_brid
  			 struct net_bridge_port *port,
  			 struct br_ip *group,
  			 struct bridge_mcast_other_query *other_query,
@@ -182,7 +182,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  {
  	struct net_bridge_mdb_htable *mdb;
  	struct net_bridge_mdb_entry *mp;
-@@ -1451,7 +1478,7 @@ br_multicast_leave_group(struct net_brid
+@@ -1456,7 +1483,7 @@ br_multicast_leave_group(struct net_brid
  		for (pp = &mp->ports;
  		     (p = mlock_dereference(*pp, br)) != NULL;
  		     pp = &p->next) {
@@ -191,7 +191,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  				continue;
  
  			rcu_assign_pointer(*pp, p->next);
-@@ -1514,7 +1541,7 @@ br_multicast_leave_group(struct net_brid
+@@ -1519,7 +1546,7 @@ br_multicast_leave_group(struct net_brid
  	for (p = mlock_dereference(mp->ports, br);
  	     p != NULL;
  	     p = mlock_dereference(p->next, br)) {
@@ -200,7 +200,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  			continue;
  
  		if (!hlist_unhashed(&p->mglist) &&
-@@ -1532,8 +1559,8 @@ out:
+@@ -1537,8 +1564,8 @@ out:
  
  static void br_ip4_multicast_leave_group(struct net_bridge *br,
  					 struct net_bridge_port *port,
@@ -211,7 +211,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  {
  	struct br_ip br_group;
  	struct bridge_mcast_own_query *own_query;
-@@ -1548,14 +1575,14 @@ static void br_ip4_multicast_leave_group
+@@ -1553,14 +1580,14 @@ static void br_ip4_multicast_leave_group
  	br_group.vid = vid;
  
  	br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query,
@@ -228,7 +228,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  {
  	struct br_ip br_group;
  	struct bridge_mcast_own_query *own_query;
-@@ -1570,7 +1597,7 @@ static void br_ip6_multicast_leave_group
+@@ -1575,7 +1602,7 @@ static void br_ip6_multicast_leave_group
  	br_group.vid = vid;
  
  	br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query,
@@ -237,7 +237,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  }
  #endif
  
-@@ -1579,6 +1606,7 @@ static int br_multicast_ipv4_rcv(struct
+@@ -1584,6 +1611,7 @@ static int br_multicast_ipv4_rcv(struct
  				 struct sk_buff *skb,
  				 u16 vid)
  {
@@ -245,7 +245,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  	struct sk_buff *skb_trimmed = NULL;
  	struct igmphdr *ih;
  	int err;
-@@ -1595,12 +1623,13 @@ static int br_multicast_ipv4_rcv(struct
+@@ -1600,12 +1628,13 @@ static int br_multicast_ipv4_rcv(struct
  
  	BR_INPUT_SKB_CB(skb)->igmp = 1;
  	ih = igmp_hdr(skb);
@@ -260,7 +260,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  		break;
  	case IGMPV3_HOST_MEMBERSHIP_REPORT:
  		err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid);
-@@ -1609,7 +1638,7 @@ static int br_multicast_ipv4_rcv(struct
+@@ -1614,7 +1643,7 @@ static int br_multicast_ipv4_rcv(struct
  		err = br_ip4_multicast_query(br, port, skb_trimmed, vid);
  		break;
  	case IGMP_HOST_LEAVE_MESSAGE:
@@ -269,7 +269,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  		break;
  	}
  
-@@ -1625,6 +1654,7 @@ static int br_multicast_ipv6_rcv(struct
+@@ -1630,6 +1659,7 @@ static int br_multicast_ipv6_rcv(struct
  				 struct sk_buff *skb,
  				 u16 vid)
  {
@@ -277,7 +277,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  	struct sk_buff *skb_trimmed = NULL;
  	struct mld_msg *mld;
  	int err;
-@@ -1644,8 +1674,9 @@ static int br_multicast_ipv6_rcv(struct
+@@ -1649,8 +1679,9 @@ static int br_multicast_ipv6_rcv(struct
  
  	switch (mld->mld_type) {
  	case ICMPV6_MGM_REPORT:
@@ -288,7 +288,7 @@  Implement optinal multicast->unicast conversion for igmp snooping
  		break;
  	case ICMPV6_MLD2_REPORT:
  		err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid);
-@@ -1654,7 +1685,8 @@ static int br_multicast_ipv6_rcv(struct
+@@ -1659,7 +1690,8 @@ static int br_multicast_ipv6_rcv(struct
  		err = br_ip6_multicast_query(br, port, skb_trimmed, vid);
  		break;
  	case ICMPV6_MGM_REDUCTION:
diff --git a/target/linux/generic/patches-4.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch b/target/linux/generic/patches-4.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch
--- a/target/linux/generic/patches-4.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch
+++ b/target/linux/generic/patches-4.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch
@@ -94,7 +94,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  }
  
  static int ip6_tnl_dev_init(struct net_device *dev);
-@@ -230,27 +230,36 @@ EXPORT_SYMBOL_GPL(ip6_tnl_dst_init);
+@@ -230,20 +230,29 @@ EXPORT_SYMBOL_GPL(ip6_tnl_dst_init);
  static struct ip6_tnl *
  ip6_tnl_lookup(struct net *net, const struct in6_addr *remote, const struct in6_addr *local)
  {
@@ -128,7 +128,8 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
 +	hash = HASH(local);
  	for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
  		if (ipv6_addr_equal(local, &t->parms.laddr) &&
- 		    (t->dev->flags & IFF_UP))
+ 		    ipv6_addr_any(&t->parms.raddr) &&
+@@ -251,7 +260,7 @@ ip6_tnl_lookup(struct net *net, const st
  			return t;
  	}
  
@@ -136,8 +137,8 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
 +	hash = HASH(&any);
  	for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
  		if (ipv6_addr_equal(remote, &t->parms.raddr) &&
- 		    (t->dev->flags & IFF_UP))
-@@ -285,7 +294,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n,
+ 		    ipv6_addr_any(&t->parms.laddr) &&
+@@ -287,7 +296,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n,
  
  	if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) {
  		prio = 1;
@@ -146,7 +147,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  	}
  	return &ip6n->tnls[prio][h];
  }
-@@ -458,6 +467,12 @@ ip6_tnl_dev_uninit(struct net_device *de
+@@ -460,6 +469,12 @@ ip6_tnl_dev_uninit(struct net_device *de
  	struct net *net = t->net;
  	struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
  
@@ -159,7 +160,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  	if (dev == ip6n->fb_tnl_dev)
  		RCU_INIT_POINTER(ip6n->tnls_wc[0], NULL);
  	else
-@@ -844,6 +859,108 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t,
+@@ -846,6 +861,108 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t,
  }
  EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl);
  
@@ -268,7 +269,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  /**
   * ip6_tnl_rcv - decapsulate IPv6 packet and retransmit it locally
   *   @skb: received socket buffer
-@@ -889,6 +1006,26 @@ static int ip6_tnl_rcv(struct sk_buff *s
+@@ -891,6 +1008,26 @@ static int ip6_tnl_rcv(struct sk_buff *s
  		skb_reset_network_header(skb);
  		skb->protocol = htons(protocol);
  		memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
@@ -295,7 +296,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  
  		__skb_tunnel_rx(skb, t->dev, t->net);
  
-@@ -1224,6 +1361,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
+@@ -1226,6 +1363,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
  	__u32 mtu;
  	u8 tproto;
  	int err;
@@ -303,7 +304,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  
  	tproto = ACCESS_ONCE(t->parms.proto);
  	if ((tproto != IPPROTO_IPV6 && tproto != 0) ||
-@@ -1254,6 +1392,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
+@@ -1256,6 +1394,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
  	if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK)
  		fl6.flowi6_mark = skb->mark;
  
@@ -322,7 +323,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  	err = ip6_tnl_xmit2(skb, dev, dsfield, &fl6, encap_limit, &mtu);
  	if (err != 0) {
  		if (err == -EMSGSIZE)
-@@ -1368,6 +1518,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
+@@ -1370,6 +1520,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
  	t->parms.flowinfo = p->flowinfo;
  	t->parms.link = p->link;
  	t->parms.proto = p->proto;
@@ -337,7 +338,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  	ip6_tnl_dst_reset(t);
  	ip6_tnl_link_config(t);
  	return 0;
-@@ -1406,6 +1564,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
+@@ -1408,6 +1566,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
  	p->flowinfo = u->flowinfo;
  	p->link = u->link;
  	p->proto = u->proto;
@@ -345,7 +346,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  	memcpy(p->name, u->name, sizeof(u->name));
  }
  
-@@ -1701,6 +1860,15 @@ static int ip6_tnl_validate(struct nlatt
+@@ -1703,6 +1862,15 @@ static int ip6_tnl_validate(struct nlatt
  	return 0;
  }
  
@@ -361,7 +362,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  static void ip6_tnl_netlink_parms(struct nlattr *data[],
  				  struct __ip6_tnl_parm *parms)
  {
-@@ -1732,6 +1900,46 @@ static void ip6_tnl_netlink_parms(struct
+@@ -1734,6 +1902,46 @@ static void ip6_tnl_netlink_parms(struct
  
  	if (data[IFLA_IPTUN_PROTO])
  		parms->proto = nla_get_u8(data[IFLA_IPTUN_PROTO]);
@@ -408,7 +409,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  }
  
  static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev,
-@@ -1784,6 +1992,12 @@ static void ip6_tnl_dellink(struct net_d
+@@ -1786,6 +1994,12 @@ static void ip6_tnl_dellink(struct net_d
  
  static size_t ip6_tnl_get_size(const struct net_device *dev)
  {
@@ -421,7 +422,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  	return
  		/* IFLA_IPTUN_LINK */
  		nla_total_size(4) +
-@@ -1801,6 +2015,24 @@ static size_t ip6_tnl_get_size(const str
+@@ -1803,6 +2017,24 @@ static size_t ip6_tnl_get_size(const str
  		nla_total_size(4) +
  		/* IFLA_IPTUN_PROTO */
  		nla_total_size(1) +
@@ -446,7 +447,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  		0;
  }
  
-@@ -1808,6 +2040,9 @@ static int ip6_tnl_fill_info(struct sk_b
+@@ -1810,6 +2042,9 @@ static int ip6_tnl_fill_info(struct sk_b
  {
  	struct ip6_tnl *tunnel = netdev_priv(dev);
  	struct __ip6_tnl_parm *parm = &tunnel->parms;
@@ -456,7 +457,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  
  	if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
  	    nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||
-@@ -1816,8 +2051,27 @@ static int ip6_tnl_fill_info(struct sk_b
+@@ -1818,8 +2053,27 @@ static int ip6_tnl_fill_info(struct sk_b
  	    nla_put_u8(skb, IFLA_IPTUN_ENCAP_LIMIT, parm->encap_limit) ||
  	    nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
  	    nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||
@@ -485,7 +486,7 @@  Signed-off-by: Steven Barth <cyrus@openwrt.org>
  	return 0;
  
  nla_put_failure:
-@@ -1841,6 +2095,7 @@ static const struct nla_policy ip6_tnl_p
+@@ -1843,6 +2097,7 @@ static const struct nla_policy ip6_tnl_p
  	[IFLA_IPTUN_FLOWINFO]		= { .type = NLA_U32 },
  	[IFLA_IPTUN_FLAGS]		= { .type = NLA_U32 },
  	[IFLA_IPTUN_PROTO]		= { .type = NLA_U8 },
diff --git a/target/linux/generic/patches-4.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/patches-4.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch
--- a/target/linux/generic/patches-4.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch
+++ b/target/linux/generic/patches-4.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch
@@ -193,7 +193,7 @@  Signed-off-by: Jonas Gorski <jogo@openwrt.org>
  		case -EAGAIN:
  			rtm->rtm_type = RTN_THROW;
  			break;
-@@ -3360,6 +3397,8 @@ static int ip6_route_dev_notify(struct n
+@@ -3362,6 +3399,8 @@ static int ip6_route_dev_notify(struct n
  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
  		net->ipv6.ip6_prohibit_entry->dst.dev = dev;
  		net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
@@ -202,7 +202,7 @@  Signed-off-by: Jonas Gorski <jogo@openwrt.org>
  		net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
  		net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
  #endif
-@@ -3576,6 +3615,17 @@ static int __net_init ip6_route_net_init
+@@ -3578,6 +3617,17 @@ static int __net_init ip6_route_net_init
  	net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
  	dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
  			 ip6_template_metrics, true);
@@ -220,7 +220,7 @@  Signed-off-by: Jonas Gorski <jogo@openwrt.org>
  #endif
  
  	net->ipv6.sysctl.flush_delay = 0;
-@@ -3594,6 +3644,8 @@ out:
+@@ -3596,6 +3646,8 @@ out:
  	return ret;
  
  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
@@ -229,7 +229,7 @@  Signed-off-by: Jonas Gorski <jogo@openwrt.org>
  out_ip6_prohibit_entry:
  	kfree(net->ipv6.ip6_prohibit_entry);
  out_ip6_null_entry:
-@@ -3611,6 +3663,7 @@ static void __net_exit ip6_route_net_exi
+@@ -3613,6 +3665,7 @@ static void __net_exit ip6_route_net_exi
  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
  	kfree(net->ipv6.ip6_prohibit_entry);
  	kfree(net->ipv6.ip6_blk_hole_entry);
@@ -237,7 +237,7 @@  Signed-off-by: Jonas Gorski <jogo@openwrt.org>
  #endif
  	dst_entries_destroy(&net->ipv6.ip6_dst_ops);
  }
-@@ -3708,6 +3761,9 @@ int __init ip6_route_init(void)
+@@ -3710,6 +3763,9 @@ int __init ip6_route_init(void)
  	init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
  	init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
  	init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
diff --git a/target/linux/generic/patches-4.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/target/linux/generic/patches-4.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch
--- a/target/linux/generic/patches-4.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch
+++ b/target/linux/generic/patches-4.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch
@@ -17,7 +17,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/core/dev.c
 +++ b/net/core/dev.c
-@@ -4221,6 +4221,9 @@ static enum gro_result dev_gro_receive(s
+@@ -4222,6 +4222,9 @@ static enum gro_result dev_gro_receive(s
  	enum gro_result ret;
  	int grow;
  
@@ -27,7 +27,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	if (!(skb->dev->features & NETIF_F_GRO))
  		goto normal;
  
-@@ -5373,6 +5376,48 @@ static void __netdev_adjacent_dev_unlink
+@@ -5381,6 +5384,48 @@ static void __netdev_adjacent_dev_unlink
  					   &upper_dev->adj_list.lower);
  }
  
@@ -76,7 +76,7 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  static int __netdev_upper_dev_link(struct net_device *dev,
  				   struct net_device *upper_dev, bool master,
  				   void *private)
-@@ -5444,6 +5489,7 @@ static int __netdev_upper_dev_link(struc
+@@ -5452,6 +5497,7 @@ static int __netdev_upper_dev_link(struc
  			goto rollback_lower_mesh;
  	}
  
@@ -84,15 +84,15 @@  Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
  				      &changeupper_info.info);
  	return 0;
-@@ -5570,6 +5616,7 @@ void netdev_upper_dev_unlink(struct net_
+@@ -5578,6 +5624,7 @@ void netdev_upper_dev_unlink(struct net_
  	list_for_each_entry(i, &upper_dev->all_adj_list.upper, list)
- 		__netdev_adjacent_dev_unlink(dev, i->dev);
+ 		__netdev_adjacent_dev_unlink(dev, i->dev, i->ref_nr);
  
 +	netdev_update_addr_mask(dev);
  	call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
  				      &changeupper_info.info);
  }
-@@ -6110,6 +6157,7 @@ int dev_set_mac_address(struct net_devic
+@@ -6118,6 +6165,7 @@ int dev_set_mac_address(struct net_devic
  	if (err)
  		return err;
  	dev->addr_assign_type = NET_ADDR_SET;