kernel: bump 4.14 to 4.14.174

Remove upstream patches:
- 600-ipv6-addrconf-call-ipv6_mc_up-for-non-Ethernet-inter.patch

Signed-off-by: CN_SZTL <cnsztl@project-openwrt.eu.org>
This commit is contained in:
CN_SZTL 2020-04-01 06:32:16 +08:00
parent 33733198bf
commit 9a4de1f5a2
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
26 changed files with 296 additions and 264 deletions

View File

@ -7,11 +7,11 @@ ifdef CONFIG_TESTING_KERNEL
endif
LINUX_VERSION-4.9 = .215
LINUX_VERSION-4.14 = .173
LINUX_VERSION-4.14 = .174
LINUX_VERSION-4.19 = .110
LINUX_KERNEL_HASH-4.9.215 = 236f2f47853700f22b9925cb17917d97ff7120fcc8110ec827c5a030a8129f48
LINUX_KERNEL_HASH-4.14.173 = a282ad7a445dcfc7ff8939d18d55ee09e59f96d2aa96d05583483f155f1db74f
LINUX_KERNEL_HASH-4.14.174 = 4c223ca3565d4267b403f7432860d87c8301767eb654d046d268782b18155189
LINUX_KERNEL_HASH-4.19.110 = ca113d2c4a061cbb6efaab60290b10dda0298e3249ff1d0c2327eb3d827c6b96
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))

View File

@ -55,7 +55,7 @@ Cc: Kir Kolyshkin <kir@openvz.org>
rwlock_t sk_callback_lock;
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -2745,6 +2745,7 @@ void sock_init_data(struct socket *sock,
@@ -2748,6 +2748,7 @@ void sock_init_data(struct socket *sock,
sk->sk_max_pacing_rate = ~0U;
sk->sk_pacing_rate = ~0U;

View File

@ -27,7 +27,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -51,6 +51,7 @@
@@ -52,6 +52,7 @@
#include <linux/workqueue.h>
#include <net/genetlink.h>
#include <net/netlink.h>
@ -35,7 +35,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
#include <uapi/linux/batman_adv.h>
#include "bat_algo.h"
@@ -62,7 +63,6 @@
@@ -63,7 +64,6 @@
#include "netlink.h"
#include "network-coding.h"
#include "originator.h"
@ -45,7 +45,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
#include "translation-table.h"
--- a/net/batman-adv/bat_v.c
+++ b/net/batman-adv/bat_v.c
@@ -37,6 +37,7 @@
@@ -36,6 +36,7 @@
#include <linux/workqueue.h>
#include <net/genetlink.h>
#include <net/netlink.h>
@ -53,7 +53,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
#include <uapi/linux/batman_adv.h>
#include "bat_algo.h"
@@ -49,7 +50,6 @@
@@ -48,7 +49,6 @@
#include "log.h"
#include "netlink.h"
#include "originator.h"
@ -80,7 +80,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/net/batman-adv/bat_v_ogm.c
+++ b/net/batman-adv/bat_v_ogm.c
@@ -38,13 +38,13 @@
@@ -40,13 +40,13 @@
#include <linux/string.h>
#include <linux/types.h>
#include <linux/workqueue.h>
@ -174,7 +174,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
/**
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -36,6 +36,7 @@
@@ -37,6 +37,7 @@
#include <linux/spinlock.h>
#include <net/net_namespace.h>
#include <net/rtnetlink.h>
@ -182,7 +182,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
#include "bat_v.h"
#include "bridge_loop_avoidance.h"
@@ -44,7 +45,6 @@
@@ -45,7 +46,6 @@
#include "gateway_client.h"
#include "log.h"
#include "originator.h"
@ -1025,7 +1025,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -34,10 +34,9 @@
@@ -35,10 +35,9 @@
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/workqueue.h>

View File

@ -1,71 +0,0 @@
From 82afdcd4ec3c8ca6551cbf7c43c09e2fd240487a Mon Sep 17 00:00:00 2001
From: Hangbin Liu <liuhangbin@gmail.com>
Date: Tue, 10 Mar 2020 15:27:37 +0800
Subject: [PATCH] ipv6/addrconf: call ipv6_mc_up() for non-Ethernet interface
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Rafał found an issue that for non-Ethernet interface, if we down and up
frequently, the memory will be consumed slowly.
The reason is we add allnodes/allrouters addressed in multicast list in
ipv6_add_dev(). When link down, we call ipv6_mc_down(), store all multicast
addresses via mld_add_delrec(). But when link up, we don't call ipv6_mc_up()
for non-Ethernet interface to remove the addresses. This makes idev->mc_tomb
getting bigger and bigger. The call stack looks like:
addrconf_notify(NETDEV_REGISTER)
ipv6_add_dev
ipv6_dev_mc_inc(ff01::1)
ipv6_dev_mc_inc(ff02::1)
ipv6_dev_mc_inc(ff02::2)
addrconf_notify(NETDEV_UP)
addrconf_dev_config
/* Alas, we support only Ethernet autoconfiguration. */
return;
addrconf_notify(NETDEV_DOWN)
addrconf_ifdown
ipv6_mc_down
igmp6_group_dropped(ff02::2)
mld_add_delrec(ff02::2)
igmp6_group_dropped(ff02::1)
igmp6_group_dropped(ff01::1)
After investigating, I can't found a rule to disable multicast on
non-Ethernet interface. In RFC2460, the link could be Ethernet, PPP, ATM,
tunnels, etc. In IPv4, it doesn't check the dev type when calls ip_mc_up()
in inetdev_event(). Even for IPv6, we don't check the dev type and call
ipv6_add_dev(), ipv6_dev_mc_inc() after register device.
So I think it's OK to fix this memory consumer by calling ipv6_mc_up() for
non-Ethernet interface.
v2: Also check IFF_MULTICAST flag to make sure the interface supports
multicast
Reported-by: Rafał Miłecki <zajec5@gmail.com>
Tested-by: Rafał Miłecki <zajec5@gmail.com>
Fixes: 74235a25c673 ("[IPV6] addrconf: Fix IPv6 on tuntap tunnels")
Fixes: 1666d49e1d41 ("mld: do not remove mld souce list info when set link down")
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/ipv6/addrconf.c | 4 ++++
1 file changed, 4 insertions(+)
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3223,6 +3223,10 @@ static void addrconf_dev_config(struct n
(dev->type != ARPHRD_TUNNEL) &&
(dev->type != ARPHRD_NONE)) {
/* Alas, we support only Ethernet autoconfiguration. */
+ idev = __in6_dev_get(dev);
+ if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP &&
+ dev->flags & IFF_MULTICAST)
+ ipv6_mc_up(idev);
return;
}

View File

@ -20,5 +20,5 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
-KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
+KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
GCC_PLUGINS_CFLAGS :=
CLANG_FLAGS :=
export ARCH SRCARCH SUBARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD

View File

@ -114,7 +114,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
config MODULES_TREE_LOOKUP
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -3022,9 +3022,11 @@ static struct module *setup_load_info(st
@@ -3024,9 +3024,11 @@ static struct module *setup_load_info(st
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
{
@ -127,7 +127,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (flags & MODULE_INIT_IGNORE_VERMAGIC)
modmagic = NULL;
@@ -3045,6 +3047,7 @@ static int check_modinfo(struct module *
@@ -3047,6 +3049,7 @@ static int check_modinfo(struct module *
mod->name);
add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
}

View File

@ -17,7 +17,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
depends on NETFILTER_ADVANCED
help
H.323 is a VoIP signalling protocol from ITU-T. As one of the most
@@ -1052,7 +1051,6 @@ config NETFILTER_XT_TARGET_SECMARK
@@ -1064,7 +1063,6 @@ config NETFILTER_XT_TARGET_SECMARK
config NETFILTER_XT_TARGET_TCPMSS
tristate '"TCPMSS" target support'

View File

@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
help
This option adds the flow table core infrastructure.
@@ -974,6 +973,15 @@ config NETFILTER_XT_TARGET_NOTRACK
@@ -986,6 +985,15 @@ config NETFILTER_XT_TARGET_NOTRACK
depends on NETFILTER_ADVANCED
select NETFILTER_XT_TARGET_CT
@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o
obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o
obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
obj-$(CONFIG_NETFILTER_XT_TARGET_IMQ) += xt_IMQ.o
--- /dev/null
+++ b/net/netfilter/xt_FLOWOFFLOAD.c
@@ -0,0 +1,422 @@

View File

@ -83,7 +83,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
EXPORT_SYMBOL(default_qdisc_ops);
/* Main transmission queue. */
@@ -764,7 +764,7 @@ static void attach_one_default_qdisc(str
@@ -772,7 +772,7 @@ static void attach_one_default_qdisc(str
void *_unused)
{
struct Qdisc *qdisc;

View File

@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -453,146 +453,6 @@ struct Qdisc_ops noqueue_qdisc_ops __rea
@@ -461,146 +461,6 @@ struct Qdisc_ops noqueue_qdisc_ops __rea
.owner = THIS_MODULE,
};

View File

@ -1,6 +1,6 @@
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -547,6 +547,12 @@ struct phy_driver {
@@ -549,6 +549,12 @@ struct phy_driver {
/* Determines the negotiated speed and duplex */
int (*read_status)(struct phy_device *phydev);
@ -15,7 +15,7 @@
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1462,6 +1462,9 @@ int genphy_update_link(struct phy_device
@@ -1466,6 +1466,9 @@ int genphy_update_link(struct phy_device
{
int status;

View File

@ -56,7 +56,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
*/
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2532,6 +2532,10 @@ static inline int pskb_trim(struct sk_bu
@@ -2551,6 +2551,10 @@ static inline int pskb_trim(struct sk_bu
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
}
@ -67,7 +67,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/**
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
* @skb: buffer to alter
@@ -2663,16 +2667,6 @@ static inline struct sk_buff *dev_alloc_
@@ -2682,16 +2686,6 @@ static inline struct sk_buff *dev_alloc_
}
@ -101,8 +101,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
help
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3004,10 +3004,20 @@ static int xmit_one(struct sk_buff *skb,
if (!list_empty(&ptype_all) || !list_empty(&dev->ptype_all))
@@ -3012,10 +3012,20 @@ static int xmit_one(struct sk_buff *skb,
#endif
dev_queue_xmit_nit(skb, dev);
- len = skb->len;
@ -136,7 +136,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#include <net/protocol.h>
#include <net/dst.h>
@@ -503,6 +504,22 @@ skb_fail:
@@ -584,6 +585,22 @@ skb_fail:
}
EXPORT_SYMBOL(__napi_alloc_skb);

View File

@ -327,7 +327,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -3384,6 +3384,8 @@ static __net_initdata struct pernet_oper
@@ -3387,6 +3387,8 @@ static __net_initdata struct pernet_oper
static int __init proto_init(void)
{

View File

@ -1,5 +1,3 @@
diff --git a/include/net/netfilter/nf_conntrack_ecache.h b/include/net/netfilter/nf_conntrack_ecache.h
index 12d967b..c2b98b6 100644
--- a/include/net/netfilter/nf_conntrack_ecache.h
+++ b/include/net/netfilter/nf_conntrack_ecache.h
@@ -71,6 +71,10 @@ struct nf_ct_event {
@ -67,8 +65,6 @@ index 12d967b..c2b98b6 100644
return nf_conntrack_eventmask_report(1 << event, ct, 0, 0);
}
diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h
index e469e85..1d31db8 100644
--- a/include/net/netns/conntrack.h
+++ b/include/net/netns/conntrack.h
@@ -114,7 +114,11 @@ struct netns_ct {
@ -83,13 +79,11 @@ index e469e85..1d31db8 100644
struct nf_exp_event_notifier __rcu *nf_expect_event_cb;
struct nf_ip_net nf_ct_proto;
#if defined(CONFIG_NF_CONNTRACK_LABELS)
diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
index 63073be..08d7aab 100644
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
@@ -118,6 +118,14 @@ config NF_CONNTRACK_EVENTS
If unsure, say `N'.
@@ -136,6 +136,14 @@ config NF_CONNTRACK_RTCACHE
To compile it as a module, choose M here. If unsure, say N.
The module will be called nf_conntrack_rtcache.
+config NF_CONNTRACK_CHAIN_EVENTS
+ bool "Register multiple callbacks to ct events"
@ -102,11 +96,9 @@ index 63073be..08d7aab 100644
config NF_CONNTRACK_TIMEOUT
bool 'Connection tracking timeout'
depends on NETFILTER_ADVANCED
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 6bd1508..9b81c7c 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -2167,6 +2167,10 @@ int nf_conntrack_init_net(struct net *ne
@@ -2249,6 +2249,10 @@ int nf_conntrack_init_net(struct net *ne
ret = nf_conntrack_proto_pernet_init(net);
if (ret < 0)
goto err_proto;
@ -117,8 +109,6 @@ index 6bd1508..9b81c7c 100644
return 0;
err_proto:
diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c
index da9df2d..e0e2a8f 100644
--- a/net/netfilter/nf_conntrack_ecache.c
+++ b/net/netfilter/nf_conntrack_ecache.c
@@ -18,6 +18,9 @@
@ -268,8 +258,6 @@ index da9df2d..e0e2a8f 100644
EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
int nf_ct_expect_register_notifier(struct net *net,
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
index 04111c1..8c741f7 100644
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -28,6 +28,11 @@
@ -282,9 +270,9 @@ index 04111c1..8c741f7 100644
+#endif
+
#include <linux/slab.h>
#include <linux/siphash.h>
#include <linux/netfilter.h>
@@ -618,14 +623,22 @@ static size_t ctnetlink_nlmsg_size(const
@@ -621,14 +626,22 @@ static size_t ctnetlink_nlmsg_size(const
;
}
@ -307,7 +295,7 @@ index 04111c1..8c741f7 100644
struct nf_conn *ct = item->ct;
struct sk_buff *skb;
unsigned int type;
@@ -3290,9 +3303,15 @@ static int ctnetlink_stat_exp_cpu(struct
@@ -3335,9 +3348,15 @@ static int ctnetlink_stat_exp_cpu(struct
}
#ifdef CONFIG_NF_CONNTRACK_EVENTS

View File

@ -1,5 +1,3 @@
diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c
index c8ac57f..7f7d847 100644
--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
+++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
@@ -1196,7 +1196,7 @@ static int snmp_translate(struct nf_conn

View File

@ -8,7 +8,7 @@ Signed-off-by: Giuseppe Lippolis <giu.lippolis@gmail.com>
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -669,6 +669,7 @@ static const struct of_device_id spidev_
@@ -672,6 +672,7 @@ static const struct of_device_id spidev_
{ .compatible = "lineartechnology,ltc2488" },
{ .compatible = "ge,achc" },
{ .compatible = "semtech,sx1301" },

View File

@ -1,6 +1,6 @@
--- a/drivers/net/Kconfig 2018-04-22 23:17:57.583718674 -0400
+++ b/drivers/net/Kconfig 2018-04-22 23:20:39.331768961 -0400
@@ -277,6 +277,125 @@
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -277,6 +277,125 @@ config RIONET_RX_SIZE
depends on RIONET
default "128"
@ -126,9 +126,9 @@
config TUN
tristate "Universal TUN/TAP device driver support"
depends on INET
--- a/drivers/net/Makefile 2018-04-22 23:17:57.583718674 -0400
+++ b/drivers/net/Makefile 2018-04-22 23:20:39.411768985 -0400
@@ -13,6 +13,7 @@
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_DUMMY) += dummy.o
obj-$(CONFIG_EQUALIZER) += eql.o
obj-$(CONFIG_IFB) += ifb.o
obj-$(CONFIG_MACSEC) += macsec.o
@ -136,8 +136,8 @@
obj-$(CONFIG_MACVLAN) += macvlan.o
obj-$(CONFIG_MACVTAP) += macvtap.o
obj-$(CONFIG_MII) += mii.o
--- /dev/null 2018-03-30 15:39:24.291451107 -0400
+++ b/drivers/net/imq.c 2018-05-20 11:10:23.471713282 -0400
--- /dev/null
+++ b/drivers/net/imq.c
@@ -0,0 +1,1268 @@
+/*
+ * Pseudo-driver for the intermediate queue device.
@ -1407,8 +1407,8 @@
+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See https://github.com/imq/linuximq/wiki for more information.");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS_RTNL_LINK("imq");
--- /dev/null 2018-03-30 15:39:24.291451107 -0400
+++ b/include/linux/imq.h 2018-04-22 23:20:39.411768985 -0400
--- /dev/null
+++ b/include/linux/imq.h
@@ -0,0 +1,13 @@
+#ifndef _IMQ_H
+#define _IMQ_H
@ -1423,9 +1423,9 @@
+
+#endif /* _IMQ_H */
+
--- a/include/linux/netdevice.h 2018-04-22 23:18:14.351723881 -0400
+++ b/include/linux/netdevice.h 2018-04-22 23:20:39.411768985 -0400
@@ -1785,6 +1785,11 @@
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1779,6 +1779,11 @@ struct net_device {
/*
* Cache lines mostly used on receive path (including eth_type_trans())
*/
@ -1437,7 +1437,7 @@
/* Interface address info used in eth_type_trans() */
unsigned char *dev_addr;
@@ -3646,6 +3651,19 @@
@@ -3667,6 +3672,19 @@ static inline void netif_tx_unlock_bh(st
} \
}
@ -1457,8 +1457,8 @@
static inline void netif_tx_disable(struct net_device *dev)
{
unsigned int i;
--- /dev/null 2018-03-30 15:39:24.291451107 -0400
+++ b/include/linux/netfilter/xt_IMQ.h 2018-04-22 23:20:39.415768987 -0400
--- /dev/null
+++ b/include/linux/netfilter/xt_IMQ.h
@@ -0,0 +1,9 @@
+#ifndef _XT_IMQ_H
+#define _XT_IMQ_H
@ -1469,8 +1469,8 @@
+
+#endif /* _XT_IMQ_H */
+
--- /dev/null 2018-03-30 15:39:24.291451107 -0400
+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h 2018-04-22 23:20:39.415768987 -0400
--- /dev/null
+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h
@@ -0,0 +1,10 @@
+#ifndef _IPT_IMQ_H
+#define _IPT_IMQ_H
@ -1482,8 +1482,8 @@
+
+#endif /* _IPT_IMQ_H */
+
--- /dev/null 2018-03-30 15:39:24.291451107 -0400
+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h 2018-04-22 23:20:39.415768987 -0400
--- /dev/null
+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h
@@ -0,0 +1,10 @@
+#ifndef _IP6T_IMQ_H
+#define _IP6T_IMQ_H
@ -1495,8 +1495,8 @@
+
+#endif /* _IP6T_IMQ_H */
+
--- a/include/linux/skbuff.h 2018-04-22 23:18:15.079724108 -0400
+++ b/include/linux/skbuff.h 2018-04-22 23:20:39.415768987 -0400
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -40,6 +40,10 @@
#include <linux/in6.h>
#include <linux/if_packet.h>
@ -1508,7 +1508,7 @@
/* The interface for checksum offload between the stack and networking drivers
* is as follows...
@@ -582,7 +586,7 @@
@@ -582,7 +586,7 @@ typedef unsigned int sk_buff_data_t;
typedef unsigned char *sk_buff_data_t;
#endif
@ -1517,7 +1517,7 @@
* struct sk_buff - socket buffer
* @next: Next buffer in list
* @prev: Previous buffer in list
@@ -685,6 +689,9 @@
@@ -691,6 +695,9 @@ struct sk_buff {
* first. This is owned by whoever has the skb queued ATM.
*/
char cb[48] __aligned(8);
@ -1527,7 +1527,7 @@
unsigned long _skb_refdst;
void (*destructor)(struct sk_buff *skb);
@@ -694,6 +701,9 @@
@@ -700,6 +707,9 @@ struct sk_buff {
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
unsigned long _nfct;
#endif
@ -1537,7 +1537,7 @@
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
struct nf_bridge_info *nf_bridge;
#endif
@@ -771,6 +781,9 @@
@@ -776,6 +786,9 @@ struct sk_buff {
#ifdef CONFIG_NET_SWITCHDEV
__u8 offload_fwd_mark:1;
#endif
@ -1547,7 +1547,7 @@
#ifdef CONFIG_NET_CLS_ACT
__u8 tc_skip_classify:1;
__u8 tc_at_ingress:1;
@@ -870,7 +883,7 @@
@@ -874,7 +887,7 @@ static inline bool skb_pfmemalloc(const
*/
static inline struct dst_entry *skb_dst(const struct sk_buff *skb)
{
@ -1556,7 +1556,7 @@
* rcu_read_lock section
*/
WARN_ON((skb->_skb_refdst & SKB_DST_NOREF) &&
@@ -960,6 +973,12 @@
@@ -964,6 +977,12 @@ void skb_tx_error(struct sk_buff *skb);
void consume_skb(struct sk_buff *skb);
void __consume_stateless_skb(struct sk_buff *skb);
void __kfree_skb(struct sk_buff *skb);
@ -1569,7 +1569,7 @@
extern struct kmem_cache *skbuff_head_cache;
void kfree_skb_partial(struct sk_buff *skb, bool head_stolen);
@@ -3779,8 +3798,12 @@
@@ -3847,8 +3866,12 @@ static inline void __nf_copy(struct sk_b
dst->_nfct = src->_nfct;
nf_conntrack_get(skb_nfct(src));
#endif
@ -1583,9 +1583,9 @@
nf_bridge_get(src->nf_bridge);
#endif
#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) || defined(CONFIG_NF_TABLES)
--- a/include/net/netfilter/nf_queue.h 2018-04-22 23:18:15.199724146 -0400
+++ b/include/net/netfilter/nf_queue.h 2018-04-22 23:20:39.419768987 -0400
@@ -31,6 +31,12 @@
--- a/include/net/netfilter/nf_queue.h
+++ b/include/net/netfilter/nf_queue.h
@@ -31,6 +31,12 @@ struct nf_queue_handler {
void nf_register_queue_handler(struct net *net, const struct nf_queue_handler *qh);
void nf_unregister_queue_handler(struct net *net);
void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict);
@ -1598,9 +1598,9 @@
void nf_queue_entry_get_refs(struct nf_queue_entry *entry);
void nf_queue_entry_release_refs(struct nf_queue_entry *entry);
--- a/include/net/pkt_sched.h 2018-04-22 23:18:15.219724151 -0400
+++ b/include/net/pkt_sched.h 2018-04-22 23:20:39.419768987 -0400
@@ -109,6 +109,8 @@
--- a/include/net/pkt_sched.h
+++ b/include/net/pkt_sched.h
@@ -109,6 +109,8 @@ int sch_direct_xmit(struct sk_buff *skb,
void __qdisc_run(struct Qdisc *q);
@ -1609,9 +1609,9 @@
static inline void qdisc_run(struct Qdisc *q)
{
if (qdisc_run_begin(q))
--- a/include/net/sch_generic.h 2018-04-22 23:18:15.227724154 -0400
+++ b/include/net/sch_generic.h 2018-04-22 23:20:39.419768987 -0400
@@ -567,6 +567,13 @@
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -571,6 +571,13 @@ static inline int qdisc_enqueue(struct s
return sch->enqueue(skb, sch, to_free);
}
@ -1625,8 +1625,8 @@
static inline bool qdisc_is_percpu_stats(const struct Qdisc *q)
{
return q->flags & TCQ_F_CPUSTATS;
--- a/include/uapi/linux/netfilter.h 2018-04-22 23:18:16.159724442 -0400
+++ b/include/uapi/linux/netfilter.h 2018-04-22 23:20:39.419768987 -0400
--- a/include/uapi/linux/netfilter.h
+++ b/include/uapi/linux/netfilter.h
@@ -14,7 +14,8 @@
#define NF_QUEUE 3
#define NF_REPEAT 4
@ -1637,8 +1637,8 @@
/* we overload the higher bits for encoding auxiliary data such as the queue
* number or errno values. Not nice, but better than additional function
--- a/net/core/dev.c 2018-04-22 23:18:24.391727000 -0400
+++ b/net/core/dev.c 2018-04-22 23:20:39.419768987 -0400
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -143,6 +143,9 @@
#include <linux/hrtimer.h>
#include <linux/netfilter_ingress.h>
@ -1649,7 +1649,7 @@
#include <linux/sctp.h>
#include <net/udp_tunnel.h>
@@ -2979,7 +2982,12 @@
@@ -3001,7 +3004,12 @@ static int xmit_one(struct sk_buff *skb,
unsigned int len;
int rc;
@ -1661,8 +1661,8 @@
+#endif
dev_queue_xmit_nit(skb, dev);
#ifdef CONFIG_ETHERNET_PACKET_MANGLE
@@ -3028,6 +3036,8 @@
len = skb->len;
@@ -3040,6 +3048,8 @@ out:
return skb;
}
@ -1671,9 +1671,9 @@
static struct sk_buff *validate_xmit_vlan(struct sk_buff *skb,
netdev_features_t features)
{
--- a/net/core/skbuff.c 2018-04-22 23:18:24.395727003 -0400
+++ b/net/core/skbuff.c 2018-04-22 23:20:39.419768987 -0400
@@ -82,6 +82,87 @@
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -81,6 +81,87 @@ struct kmem_cache *skbuff_head_cache __r
static struct kmem_cache *skbuff_fclone_cache __read_mostly;
int sysctl_max_skb_frags __read_mostly = MAX_SKB_FRAGS;
EXPORT_SYMBOL(sysctl_max_skb_frags);
@ -1761,7 +1761,7 @@
/**
* skb_panic - private function for out-of-line support
@@ -628,6 +709,28 @@
@@ -615,6 +696,28 @@ void skb_release_head_state(struct sk_bu
WARN_ON(in_irq());
skb->destructor(skb);
}
@ -1790,7 +1790,7 @@
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
nf_conntrack_put(skb_nfct(skb));
#endif
@@ -817,6 +920,10 @@
@@ -804,6 +907,10 @@ static void __copy_skb_header(struct sk_
new->sp = secpath_get(old->sp);
#endif
__nf_copy(new, old, false);
@ -1801,7 +1801,7 @@
/* Note : this field could be in headers_start/headers_end section
* It is not yet because we do not want to have a 16 bit hole
@@ -3915,6 +4022,13 @@
@@ -3943,6 +4050,13 @@ void __init skb_init(void)
0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC,
NULL);
@ -1815,9 +1815,9 @@
}
static int
--- a/net/netfilter/core.c 2018-04-22 23:18:26.019727507 -0400
+++ b/net/netfilter/core.c 2018-04-22 23:20:39.419768987 -0400
@@ -457,6 +457,11 @@
--- a/net/netfilter/core.c
+++ b/net/netfilter/core.c
@@ -490,6 +490,11 @@ int nf_hook_slow(struct sk_buff *skb, st
if (ret == 0)
ret = -EPERM;
return ret;
@ -1829,9 +1829,9 @@
case NF_QUEUE:
ret = nf_queue(skb, state, e, s, verdict);
if (ret == 1)
--- a/net/netfilter/Kconfig 2018-04-22 23:18:25.751727424 -0400
+++ b/net/netfilter/Kconfig 2018-04-22 23:20:39.419768987 -0400
@@ -902,6 +902,18 @@
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
@@ -910,6 +910,18 @@ config NETFILTER_XT_TARGET_LOG
To compile it as a module, choose M here. If unsure, say N.
@ -1850,18 +1850,18 @@
config NETFILTER_XT_TARGET_MARK
tristate '"MARK" target support'
depends on NETFILTER_ADVANCED
--- a/net/netfilter/Makefile 2018-04-22 23:18:25.711727410 -0400
+++ b/net/netfilter/Makefile 2018-04-22 23:20:39.423768990 -0400
@@ -136,6 +136,7 @@
obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o
--- a/net/netfilter/Makefile
+++ b/net/netfilter/Makefile
@@ -135,6 +135,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CT) +=
obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o
obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o
+obj-$(CONFIG_NETFILTER_XT_TARGET_IMQ) += xt_IMQ.o
obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
obj-$(CONFIG_NETFILTER_XT_TARGET_LOG) += xt_LOG.o
obj-$(CONFIG_NETFILTER_XT_TARGET_NETMAP) += xt_NETMAP.o
--- a/net/netfilter/nf_queue.c 2018-04-22 23:18:25.699727407 -0400
+++ b/net/netfilter/nf_queue.c 2018-04-22 23:22:59.395812579 -0400
--- a/net/netfilter/nf_queue.c
+++ b/net/netfilter/nf_queue.c
@@ -1,4 +1,4 @@
-/*
+ /*
@ -1892,7 +1892,7 @@
/* return EBUSY when somebody else is registered, return EEXIST if the
* same handler is registered, return 0 in case of success. */
void nf_register_queue_handler(struct net *net, const struct nf_queue_handler *qh)
@@ -144,16 +161,29 @@
@@ -141,16 +158,29 @@ static void nf_ip6_saveroute(const struc
static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state,
const struct nf_hook_entries *entries,
@ -1924,7 +1924,7 @@
if (!qh) {
status = -ESRCH;
goto err;
@@ -217,8 +248,16 @@
@@ -218,8 +248,16 @@ int nf_queue(struct sk_buff *skb, struct
{
int ret;
@ -1942,7 +1942,7 @@
if (ret == -ESRCH &&
(verdict & NF_VERDICT_FLAG_QUEUE_BYPASS))
return 1;
@@ -302,6 +341,7 @@
@@ -323,6 +361,7 @@ next_hook:
local_bh_enable();
break;
case NF_QUEUE:
@ -1950,8 +1950,8 @@
err = nf_queue(skb, &entry->state, hooks, i, verdict);
if (err == 1)
goto next_hook;
--- /dev/null 2018-03-30 15:39:24.291451107 -0400
+++ b/net/netfilter/xt_IMQ.c 2018-04-22 23:20:39.423768990 -0400
--- /dev/null
+++ b/net/netfilter/xt_IMQ.c
@@ -0,0 +1,72 @@
+/*
+ * This target marks packets to be enqueued to an imq device
@ -2025,9 +2025,9 @@
+MODULE_ALIAS("ipt_IMQ");
+MODULE_ALIAS("ip6t_IMQ");
+
--- a/net/sched/sch_generic.c 2018-04-22 23:18:26.623727693 -0400
+++ b/net/sched/sch_generic.c 2018-04-22 23:20:39.423768990 -0400
@@ -158,6 +158,14 @@
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -158,6 +158,14 @@ trace:
return skb;
}

View File

@ -15,21 +15,24 @@ Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h
--- a/include/net/inet_connection_sock.h
+++ b/include/net/inet_connection_sock.h
@@ -138,4 +138,4 @@
@@ -136,8 +136,8 @@ struct inet_connection_sock {
} icsk_mtup;
u32 icsk_user_timeout;
- u64 icsk_ca_priv[88 / sizeof(u64)];
-#define ICSK_CA_PRIV_SIZE (11 * sizeof(u64))
+ u64 icsk_ca_priv[104 / sizeof(u64)];
+#define ICSK_CA_PRIV_SIZE (13 * sizeof(u64))
};
diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
#define ICSK_TIME_RETRANS 1 /* Retransmit timer */
--- a/net/ipv4/tcp_bbr.c
+++ b/net/ipv4/tcp_bbr.c
@@ -97,8 +97,6 @@
@@ -95,12 +95,10 @@ struct bbr {
u32 mode:3, /* current bbr_mode in state machine */
prev_ca_state:3, /* CA state on previous ACK */
packet_conservation:1, /* use packet conservation? */
- restore_cwnd:1, /* decided to revert cwnd to old value */
round_start:1, /* start of packet-timed tx->ack round? */
@ -39,7 +42,11 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
- unused:5,
+ unused:13,
lt_is_sampling:1, /* taking long-term ("LT") samples now? */
@@ -119,2 +117,10 @@
lt_rtt_cnt:7, /* round trips in long-term interval */
lt_use_bw:1; /* use lt_bw as our bw estimate? */
@@ -117,6 +115,14 @@ struct bbr {
unused_b:5;
u32 prior_cwnd; /* prior cwnd upon entering loss recovery */
u32 full_bw; /* recent bw, to estimate if pipe is full */
+
+ /* For tracking ACK aggregation: */
@ -50,7 +57,11 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+ extra_acked_win_idx:1, /* current index in extra_acked array */
+ unused_c:6;
};
@@ -178,2 +184,13 @@
#define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */
@@ -176,6 +182,17 @@ static const u32 bbr_lt_bw_diff = 4000 /
/* If we estimate we're policed, use lt_bw for this many round trips: */
static const u32 bbr_lt_bw_max_rtts = 48;
+/* Gain factor for adding extra_acked to target cwnd: */
+static const int bbr_extra_acked_gain = BBR_UNIT;
@ -64,7 +75,11 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+static void bbr_check_probe_rtt_done(struct sock *sk);
+
/* Do we estimate that STARTUP filled the pipe? */
@@ -202,2 +219,12 @@
static bool bbr_full_bw_reached(const struct sock *sk)
{
@@ -200,13 +217,31 @@ static u32 bbr_bw(const struct sock *sk)
return bbr->lt_use_bw ? bbr->lt_bw : bbr_max_bw(sk);
}
+/* Return maximum extra acked in past k-2k round trips,
+ * where k = bbr_extra_acked_win_rtts.
@ -77,7 +92,8 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+}
+
/* Return rate in bytes per second, optionally with a gain.
@@ -206,5 +233,13 @@
* The order here is chosen carefully to avoid overflow of u64. This should
* work for input rates of up to 2.9Tbit/sec and gain of 2.89x.
*/
+static bool tcp_needs_internal_pacing(const struct sock *sk)
+{
@ -92,7 +108,11 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+ mss = tcp_mss_to_mtu(sk, mss);
+ rate *= mss;
rate *= gain;
@@ -263,19 +298,21 @@
rate >>= BBR_SCALE;
rate *= USEC_PER_SEC;
@@ -261,23 +296,25 @@ static void bbr_set_pacing_rate(struct s
sk->sk_pacing_rate = rate;
}
-/* Return count of segments we want in the skbs we send, or 0 for default. */
-static u32 bbr_tso_segs_goal(struct sock *sk)
@ -112,30 +132,36 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
- struct bbr *bbr = inet_csk_ca(sk);
- u32 min_segs;
+ u32 segs, bytes;
- min_segs = sk->sk_pacing_rate < (bbr_min_tso_rate >> 3) ? 1 : 2;
- bbr->tso_segs_goal = min(tcp_tso_autosize(sk, tp->mss_cache, min_segs),
- 0x7FU);
+
+ /* Sort of tcp_tso_autosize() but ignoring
+ * driver provided sk_gso_max_size.
+ */
+ bytes = min_t(u32, sk->sk_pacing_rate >> sk->sk_pacing_shift,
+ GSO_MAX_SIZE - 1 - MAX_TCP_HEADER);
+ segs = max_t(u32, bytes / tp->mss_cache, bbr_min_tso_segs(sk));
+
- min_segs = sk->sk_pacing_rate < (bbr_min_tso_rate >> 3) ? 1 : 2;
- bbr->tso_segs_goal = min(tcp_tso_autosize(sk, tp->mss_cache, min_segs),
- 0x7FU);
+ return min(segs, 0x7FU);
}
@@ -301,2 +338,4 @@
/* Save "last known good" cwnd so we can restore it after losses or PROBE_RTT */
@@ -299,38 +336,31 @@ static void bbr_cwnd_event(struct sock *
if (event == CA_EVENT_TX_START && tp->app_limited) {
bbr->idle_restart = 1;
+ bbr->ack_epoch_mstamp = tp->tcp_mstamp;
+ bbr->ack_epoch_acked = 0;
/* Avoid pointless buffer overflows: pace at est. bw if we don't
@@ -306,2 +345,4 @@
* need more speed (we're restarting from idle and app-limited).
*/
if (bbr->mode == BBR_PROBE_BW)
bbr_set_pacing_rate(sk, bbr_bw(sk), BBR_UNIT);
+ else if (bbr->mode == BBR_PROBE_RTT)
+ bbr_check_probe_rtt_done(sk);
}
@@ -309,6 +350,5 @@
}
-/* Find target cwnd. Right-size the cwnd based on min RTT and the
- * estimated bottleneck bandwidth:
@ -144,7 +170,9 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
- * cwnd = bw * min_rtt * gain = BDP * gain
+ * bdp = bw * min_rtt * gain
*
@@ -318,17 +358,7 @@
* The key factor, gain, controls the amount of queue. While a small gain
* builds a smaller queue, it becomes more vulnerable to noise in RTT
* measurements (e.g., delayed ACKs or other ACK compression effects). This
* noise may cause BBR to under-estimate the rate.
- *
- * To achieve full performance in high-speed paths, we budget enough cwnd to
@ -164,7 +192,11 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
- u32 cwnd;
+ u32 bdp;
u64 w;
@@ -347,6 +377,23 @@
/* If we've never had a valid RTT sample, cap cwnd at the initial
@@ -345,21 +375,65 @@ static u32 bbr_target_cwnd(struct sock *
w = (u64)bw * bbr->min_rtt_us;
/* Apply a gain to the given value, then remove the BW_SCALE shift. */
- cwnd = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT;
+ bdp = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT;
@ -190,12 +222,16 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
- cwnd += 3 * bbr->tso_segs_goal;
+ cwnd += 3 * bbr_tso_segs_goal(sk);
@@ -356,3 +403,3 @@
/* Reduce delayed ACKs by rounding up cwnd to the next even number. */
cwnd = (cwnd + 1) & ~1U;
/* Ensure gain cycling gets inflight above BDP even for small BDPs. */
- if (bbr->mode == BBR_PROBE_BW && gain > BBR_UNIT)
+ if (bbr->mode == BBR_PROBE_BW && bbr->cycle_idx == 0)
cwnd += 2;
@@ -362,2 +409,29 @@
return cwnd;
}
+/* Find inflight based on min RTT and the estimated bottleneck bandwidth. */
+static u32 bbr_inflight(struct sock *sk, u32 bw, int gain)
@ -225,12 +261,17 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+}
+
/* An optimization in BBR to reduce losses: On the first round of recovery, we
@@ -393,3 +467,3 @@
* follow the packet conservation principle: send P packets per P packets acked.
* After that, we slow-start and send at most 2*P packets per P packets acked.
@@ -391,17 +465,11 @@ static bool bbr_set_cwnd_to_recover_or_r
cwnd = tcp_packets_in_flight(tp) + acked;
} else if (prev_state >= TCP_CA_Recovery && state < TCP_CA_Recovery) {
/* Exiting loss recovery; restore cwnd saved before recovery. */
- bbr->restore_cwnd = 1;
+ cwnd = max(cwnd, bbr->prior_cwnd);
bbr->packet_conservation = 0;
@@ -398,8 +472,2 @@
}
bbr->prev_ca_state = state;
- if (bbr->restore_cwnd) {
- /* Restore cwnd after exiting loss recovery or PROBE_RTT. */
@ -239,7 +280,11 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
- }
-
if (bbr->packet_conservation) {
@@ -420,6 +488,6 @@
*new_cwnd = max(cwnd, tcp_packets_in_flight(tp) + acked);
return true; /* yes, using packet conservation */
@@ -418,16 +486,23 @@ static void bbr_set_cwnd(struct sock *sk
{
struct tcp_sock *tp = tcp_sk(sk);
struct bbr *bbr = inet_csk_ca(sk);
- u32 cwnd = 0, target_cwnd = 0;
+ u32 cwnd = tp->snd_cwnd, target_cwnd = 0;
@ -248,7 +293,8 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
- return;
+ goto done; /* no packet fully ACKed; just apply caps */
@@ -428,4 +496,11 @@
if (bbr_set_cwnd_to_recover_or_restore(sk, rs, acked, &cwnd))
goto done;
+ target_cwnd = bbr_bdp(sk, bw, gain);
+
@ -261,32 +307,55 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
/* If we're below target cwnd, slow start cwnd toward target cwnd. */
- target_cwnd = bbr_target_cwnd(sk, bw, gain);
if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */
@@ -470,3 +545,3 @@
cwnd = min(cwnd + acked, target_cwnd);
else if (cwnd < target_cwnd || tp->delivered < TCP_INIT_CWND)
@@ -468,14 +543,14 @@ static bool bbr_is_next_cycle_phase(stru
if (bbr->pacing_gain > BBR_UNIT)
return is_full_length &&
(rs->losses || /* perhaps pacing_gain*BDP won't fit */
- inflight >= bbr_target_cwnd(sk, bw, bbr->pacing_gain));
+ inflight >= bbr_inflight(sk, bw, bbr->pacing_gain));
@@ -477,3 +552,3 @@
/* A pacing_gain < 1.0 tries to drain extra queue we added if bw
* probing didn't find more bw. If inflight falls to match BDP then we
* estimate queue is drained; persisting would underutilize the pipe.
*/
return is_full_length ||
- inflight <= bbr_target_cwnd(sk, bw, BBR_UNIT);
+ inflight <= bbr_inflight(sk, bw, BBR_UNIT);
}
@@ -487,4 +562,2 @@
static void bbr_advance_cycle_phase(struct sock *sk)
@@ -485,8 +560,6 @@ static void bbr_advance_cycle_phase(stru
bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1);
bbr->cycle_mstamp = tp->delivered_mstamp;
- bbr->pacing_gain = bbr->lt_use_bw ? BBR_UNIT :
- bbr_pacing_gain[bbr->cycle_idx];
}
@@ -506,4 +579,2 @@
/* Gain cycling: cycle pacing gain to converge to fair share of available bw. */
@@ -504,8 +577,6 @@ static void bbr_reset_startup_mode(struc
struct bbr *bbr = inet_csk_ca(sk);
bbr->mode = BBR_STARTUP;
- bbr->pacing_gain = bbr_high_gain;
- bbr->cwnd_gain = bbr_high_gain;
}
@@ -515,4 +586,2 @@
static void bbr_reset_probe_bw_mode(struct sock *sk)
@@ -513,8 +584,6 @@ static void bbr_reset_probe_bw_mode(stru
struct bbr *bbr = inet_csk_ca(sk);
bbr->mode = BBR_PROBE_BW;
- bbr->pacing_gain = BBR_UNIT;
- bbr->cwnd_gain = bbr_cwnd_gain;
bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand);
@@ -700,2 +768,63 @@
bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */
}
@@ -697,6 +766,67 @@ static void bbr_update_bw(struct sock *s
}
}
+/* Estimates the windowed max degree of ack aggregation.
+ * This is used to provision extra in-flight data to keep sending during
@ -350,19 +419,23 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+}
+
/* Estimate when the pipe is full, using the change in delivery rate: BBR
@@ -734,4 +863,4 @@
* estimates that STARTUP filled the pipe if the estimated bw hasn't changed by
* at least bbr_full_bw_thresh (25%) after bbr_full_bw_cnt (3) non-app-limited
@@ -731,15 +861,29 @@ static void bbr_check_drain(struct sock
if (bbr->mode == BBR_STARTUP && bbr_full_bw_reached(sk)) {
bbr->mode = BBR_DRAIN; /* drain queue we created */
- bbr->pacing_gain = bbr_drain_gain; /* pace slow to drain */
- bbr->cwnd_gain = bbr_high_gain; /* maintain cwnd */
+ tcp_sk(sk)->snd_ssthresh =
+ bbr_inflight(sk, bbr_max_bw(sk), BBR_UNIT);
} /* fall through to check if in-flight is already small: */
@@ -739,3 +868,3 @@
if (bbr->mode == BBR_DRAIN &&
tcp_packets_in_flight(tcp_sk(sk)) <=
- bbr_target_cwnd(sk, bbr_max_bw(sk), BBR_UNIT))
+ bbr_inflight(sk, bbr_max_bw(sk), BBR_UNIT))
bbr_reset_probe_bw_mode(sk); /* we estimate queue is drained */
@@ -743,2 +872,16 @@
}
+static void bbr_check_probe_rtt_done(struct sock *sk)
+{
@ -379,18 +452,30 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+}
+
/* The goal of PROBE_RTT mode is to have BBR flows cooperatively and
@@ -772,3 +915,4 @@
* periodically drain the bottleneck queue, to converge to measure the true
* min_rtt (unloaded propagation delay). This allows the flows to keep queues
@@ -769,7 +913,8 @@ static void bbr_update_min_rtt(struct so
filter_expired = after(tcp_jiffies32,
bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);
if (rs->rtt_us >= 0 &&
- (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) {
+ (rs->rtt_us <= bbr->min_rtt_us ||
+ (filter_expired && !rs->is_ack_delayed))) {
bbr->min_rtt_us = rs->rtt_us;
@@ -780,4 +924,2 @@
bbr->min_rtt_stamp = tcp_jiffies32;
}
@@ -777,8 +922,6 @@ static void bbr_update_min_rtt(struct so
if (bbr_probe_rtt_mode_ms > 0 && filter_expired &&
!bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) {
bbr->mode = BBR_PROBE_RTT; /* dip, drain queue */
- bbr->pacing_gain = BBR_UNIT;
- bbr->cwnd_gain = BBR_UNIT;
bbr_save_cwnd(sk); /* note cwnd so we can restore it */
@@ -800,8 +942,4 @@
bbr->probe_rtt_done_stamp = 0;
}
@@ -797,12 +940,8 @@ static void bbr_update_min_rtt(struct so
} else if (bbr->probe_rtt_done_stamp) {
if (bbr->round_start)
bbr->probe_rtt_round_done = 1;
- if (bbr->probe_rtt_round_done &&
- after(tcp_jiffies32, bbr->probe_rtt_done_stamp)) {
@ -401,7 +486,11 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+ if (bbr->probe_rtt_round_done)
+ bbr_check_probe_rtt_done(sk);
}
@@ -813,2 +951,31 @@
}
/* Restart after idle ends only once we process a new S/ACK for data */
@@ -810,13 +949,44 @@ static void bbr_update_min_rtt(struct so
bbr->idle_restart = 0;
}
+static void bbr_update_gains(struct sock *sk)
+{
@ -433,28 +522,45 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+}
+
static void bbr_update_model(struct sock *sk, const struct rate_sample *rs)
@@ -816,2 +983,3 @@
{
bbr_update_bw(sk, rs);
+ bbr_update_ack_aggregation(sk, rs);
bbr_update_cycle_phase(sk, rs);
@@ -820,2 +988,3 @@
bbr_check_full_bw_reached(sk, rs);
bbr_check_drain(sk, rs);
bbr_update_min_rtt(sk, rs);
+ bbr_update_gains(sk);
}
@@ -831,3 +1000,2 @@
static void bbr_main(struct sock *sk, const struct rate_sample *rs)
@@ -828,7 +998,6 @@ static void bbr_main(struct sock *sk, co
bw = bbr_bw(sk);
bbr_set_pacing_rate(sk, bw, bbr->pacing_gain);
- bbr_set_tso_segs_goal(sk);
bbr_set_cwnd(sk, rs, rs->acked_sacked, bw, bbr->cwnd_gain);
@@ -841,3 +1009,3 @@
}
@@ -838,7 +1007,7 @@ static void bbr_init(struct sock *sk)
struct bbr *bbr = inet_csk_ca(sk);
bbr->prior_cwnd = 0;
- bbr->tso_segs_goal = 0; /* default segs per skb until first ACK */
+ tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
bbr->rtt_cnt = 0;
@@ -857,3 +1025,2 @@
bbr->next_rtt_delivered = 0;
bbr->prev_ca_state = TCP_CA_Open;
@@ -854,7 +1023,6 @@ static void bbr_init(struct sock *sk)
bbr->has_seen_rtt = 0;
bbr_init_pacing_rate_from_rtt(sk);
- bbr->restore_cwnd = 0;
bbr->round_start = 0;
@@ -868,2 +1035,9 @@
bbr->idle_restart = 0;
bbr->full_bw_reached = 0;
@@ -865,6 +1033,13 @@ static void bbr_init(struct sock *sk)
bbr_reset_lt_bw_sampling(sk);
bbr_reset_startup_mode(sk);
+ bbr->ack_epoch_mstamp = tp->tcp_mstamp;
+ bbr->ack_epoch_acked = 0;
@ -464,27 +570,42 @@ diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+ bbr->extra_acked[1] = 0;
+
cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED);
@@ -894,3 +1068,3 @@
}
@@ -891,7 +1066,7 @@ static u32 bbr_undo_cwnd(struct sock *sk
static u32 bbr_ssthresh(struct sock *sk)
{
bbr_save_cwnd(sk);
- return TCP_INFINITE_SSTHRESH; /* BBR does not use ssthresh */
+ return tcp_sk(sk)->snd_ssthresh;
}
@@ -943,3 +1117,3 @@
static size_t bbr_get_info(struct sock *sk, u32 ext, int *attr,
@@ -940,7 +1115,7 @@ static struct tcp_congestion_ops tcp_bbr
.undo_cwnd = bbr_undo_cwnd,
.cwnd_event = bbr_cwnd_event,
.ssthresh = bbr_ssthresh,
- .tso_segs_goal = bbr_tso_segs_goal,
+ .min_tso_segs = bbr_min_tso_segs,
.get_info = bbr_get_info,
diff --git a/include/net/tcp.h b/include/net/tcp.h
.set_state = bbr_set_state,
};
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1000,2 +1000,3 @@
@@ -998,6 +998,7 @@ struct rate_sample {
u32 prior_in_flight; /* in flight before this ACK */
bool is_app_limited; /* is sample from packet with bubble in pipe? */
bool is_retrans; /* is sample from retransmission? */
+ bool is_ack_delayed; /* is this (likely) a delayed ACK? */
};
@@ -1026,2 +1027,4 @@
struct tcp_congestion_ops {
@@ -1024,6 +1025,8 @@ struct tcp_congestion_ops {
u32 (*undo_cwnd)(struct sock *sk);
/* hook for packet ack accounting (optional) */
void (*pkts_acked)(struct sock *sk, const struct ack_sample *sample);
+ /* override sysctl_tcp_min_tso_segs */
+ u32 (*min_tso_segs)(struct sock *sk);
/* suggest number of segments for each skb to transmit (optional) */
u32 (*tso_segs_goal)(struct sock *sk);
/* returns the multiplier used in tcp_sndbuf_expand (optional) */

View File

@ -269,7 +269,7 @@
+#endif /*_IPT_WEBURL_H*/
--- a/net/ipv4/netfilter/Kconfig
+++ b/net/ipv4/netfilter/Kconfig
@@ -417,5 +417,25 @@ config IP_NF_ARP_MANGLE
@@ -430,5 +430,25 @@ config IP_NF_ARP_MANGLE
endif # IP_NF_ARPTABLES
@ -297,7 +297,7 @@
--- a/net/ipv4/netfilter/Makefile
+++ b/net/ipv4/netfilter/Makefile
@@ -55,6 +55,10 @@ obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o
@@ -57,6 +57,10 @@ obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o
obj-$(CONFIG_IP_NF_SECURITY) += iptable_security.o
# matches
@ -3908,7 +3908,6 @@
+module_init(init);
+module_exit(fini);
+
--- /dev/null
+++ b/net/ipv4/netfilter/ipt_bandwidth.mod.c
@@ -0,0 +1,20 @@
@ -4077,7 +4076,6 @@
+module_init(init);
+module_exit(fini);
+
--- /dev/null
+++ b/net/ipv4/netfilter/ipt_timerange.mod.c
@@ -0,0 +1,20 @@
@ -5423,7 +5421,6 @@
+
+module_init(init);
+module_exit(fini);
--- /dev/null
+++ b/net/ipv4/netfilter/ipt_weburl.c
@@ -0,0 +1,537 @@
@ -5964,7 +5961,6 @@
+
+module_init(init);
+module_exit(fini);
--- /dev/null
+++ b/net/ipv4/netfilter/ipt_weburl.mod.c
@@ -0,0 +1,20 @@

View File

@ -87,7 +87,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (!net_eq(dev_net(dev), sock_net(sk)))
goto drop;
@@ -3301,6 +3303,7 @@ static int packet_create(struct net *net
@@ -3302,6 +3304,7 @@ static int packet_create(struct net *net
mutex_init(&po->pg_vec_lock);
po->rollover = NULL;
po->prot_hook.func = packet_rcv;
@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (sock->type == SOCK_PACKET)
po->prot_hook.func = packet_rcv_spkt;
@@ -3923,6 +3926,16 @@ packet_setsockopt(struct socket *sock, i
@@ -3924,6 +3927,16 @@ packet_setsockopt(struct socket *sock, i
po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
return 0;
}
@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
default:
return -ENOPROTOOPT;
}
@@ -3975,6 +3988,13 @@ static int packet_getsockopt(struct sock
@@ -3976,6 +3989,13 @@ static int packet_getsockopt(struct sock
case PACKET_VNET_HDR:
val = po->has_vnet_hdr;
break;

View File

@ -9,7 +9,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2496,7 +2496,7 @@ static inline int pskb_network_may_pull(
@@ -2515,7 +2515,7 @@ static inline int pskb_network_may_pull(
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
*/
#ifndef NET_SKB_PAD

View File

@ -22,7 +22,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#endif
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -782,6 +782,7 @@ struct sk_buff {
@@ -795,6 +795,7 @@ struct sk_buff {
__u8 tc_redirected:1;
__u8 tc_from_ingress:1;
#endif
@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
__u16 tc_index; /* traffic control index */
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4805,6 +4805,9 @@ static enum gro_result dev_gro_receive(s
@@ -4815,6 +4815,9 @@ static enum gro_result dev_gro_receive(s
enum gro_result ret;
int grow;
@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (netif_elide_gro(skb->dev))
goto normal;
@@ -6282,6 +6285,48 @@ static void __netdev_adjacent_dev_unlink
@@ -6292,6 +6295,48 @@ static void __netdev_adjacent_dev_unlink
&upper_dev->adj_list.lower);
}
@ -91,7 +91,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 *upper_priv, void *upper_info)
@@ -6320,6 +6365,7 @@ static int __netdev_upper_dev_link(struc
@@ -6330,6 +6375,7 @@ static int __netdev_upper_dev_link(struc
if (ret)
return ret;
@ -99,7 +99,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
&changeupper_info.info);
ret = notifier_to_errno(ret);
@@ -6397,6 +6443,7 @@ void netdev_upper_dev_unlink(struct net_
@@ -6407,6 +6453,7 @@ void netdev_upper_dev_unlink(struct net_
__netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);
@ -107,7 +107,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
&changeupper_info.info);
}
@@ -6961,6 +7008,7 @@ int dev_set_mac_address(struct net_devic
@@ -6971,6 +7018,7 @@ int dev_set_mac_address(struct net_devic
if (err)
return err;
dev->addr_assign_type = NET_ADDR_SET;

View File

@ -171,7 +171,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/**
* Search the device tree for the best MAC address to use. 'mac-address' is
* checked first, because that is supposed to contain to "most recent" MAC
@@ -64,11 +192,18 @@ static const void *of_get_mac_addr(struc
@@ -64,11 +197,18 @@ static const void *of_get_mac_addr(struc
* addresses. Some older U-Boots only initialized 'local-mac-address'. In
* this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
* but is all zeros.

View File

@ -85,7 +85,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
* @phydev: the phy_device struct
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -909,6 +909,7 @@ void phy_ethtool_ksettings_get(struct ph
@@ -911,6 +911,7 @@ void phy_ethtool_ksettings_get(struct ph
struct ethtool_link_ksettings *cmd);
int phy_ethtool_ksettings_set(struct phy_device *phydev,
const struct ethtool_link_ksettings *cmd);

View File

@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1106,6 +1106,9 @@ void phy_detach(struct phy_device *phyde
@@ -1110,6 +1110,9 @@ void phy_detach(struct phy_device *phyde
struct module *ndev_owner = dev->dev.parent->driver->owner;
struct mii_bus *bus;
@ -23,7 +23,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev");
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -559,6 +559,12 @@ struct phy_driver {
@@ -561,6 +561,12 @@ struct phy_driver {
*/
int (*did_interrupt)(struct phy_device *phydev);

View File

@ -1,6 +1,6 @@
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -613,4 +613,16 @@ config USB_NET_CH9200
@@ -612,4 +612,16 @@ config USB_NET_CH9200
To compile this driver as a module, choose M here: the
module will be called ch9200.