From deebbbd80ca83fdfd49b41185475afcc971a6756 Mon Sep 17 00:00:00 2001 From: Geliang Tang Date: Tue, 12 Mar 2024 11:19:12 +0800 Subject: [PATCH] mptcp: add last time fields in mptcp_sock This patch adds "last time" fields last_data_sent, last_data_recv and last_ack_recv in struct mptcp_sock to record the last time data_sent, data_recv and ack_recv happened. They all are initialized as tcp_jiffies32 in __mptcp_init_sock(), but updated as tcp_jiffies32 too when data is sent in __subflow_push_pending(), data is received in mptcp_recvmsg(), and ack is received in ack_update_msk(). Signed-off-by: Geliang Tang --- net/Kconfig | 519 ------------------------------------------- net/mptcp/options.c | 1 + net/mptcp/protocol.c | 5 + net/mptcp/protocol.h | 3 + 4 files changed, 9 insertions(+), 519 deletions(-) delete mode 100644 net/Kconfig diff --git a/net/Kconfig b/net/Kconfig deleted file mode 100644 index 3e57ccf0da279..0000000000000 --- a/net/Kconfig +++ /dev/null @@ -1,519 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -# Network configuration -# - -menuconfig NET - bool "Networking support" - select NLATTR - select GENERIC_NET_UTILS - select BPF - help - Unless you really know what you are doing, you should say Y here. - The reason is that some programs need kernel networking support even - when running on a stand-alone machine that isn't connected to any - other computer. - - If you are upgrading from an older kernel, you - should consider updating your networking tools too because changes - in the kernel and the tools often go hand in hand. The tools are - contained in the package net-tools, the location and version number - of which are given in . - - For a general introduction to Linux networking, it is highly - recommended to read the NET-HOWTO, available from - . - -if NET - -config WANT_COMPAT_NETLINK_MESSAGES - bool - help - This option can be selected by other options that need compat - netlink messages. - -config COMPAT_NETLINK_MESSAGES - def_bool y - depends on COMPAT - depends on WEXT_CORE || WANT_COMPAT_NETLINK_MESSAGES - help - This option makes it possible to send different netlink messages - to tasks depending on whether the task is a compat task or not. To - achieve this, you need to set skb_shinfo(skb)->frag_list to the - compat skb before sending the skb, the netlink code will sort out - which message to actually pass to the task. - - Newly written code should NEVER need this option but do - compat-independent messages instead! - -config NET_INGRESS - bool - -config NET_EGRESS - bool - -config NET_XGRESS - select NET_INGRESS - select NET_EGRESS - bool - -config NET_REDIRECT - bool - -config SKB_EXTENSIONS - bool - -menu "Networking options" - -source "net/packet/Kconfig" -source "net/unix/Kconfig" -source "net/tls/Kconfig" -source "net/xfrm/Kconfig" -source "net/iucv/Kconfig" -source "net/smc/Kconfig" -source "net/xdp/Kconfig" - -config NET_HANDSHAKE - bool - depends on SUNRPC || NVME_TARGET_TCP || NVME_TCP - default y - -config NET_HANDSHAKE_KUNIT_TEST - tristate "KUnit tests for the handshake upcall mechanism" if !KUNIT_ALL_TESTS - default KUNIT_ALL_TESTS - depends on KUNIT - help - This builds the KUnit tests for the handshake upcall mechanism. - - KUnit tests run during boot and output the results to the debug - log in TAP format (https://testanything.org/). Only useful for - kernel devs running KUnit test harness and are not for inclusion - into a production build. - - For more information on KUnit and unit tests in general, refer - to the KUnit documentation in Documentation/dev-tools/kunit/. - -config INET - bool "TCP/IP networking" - help - These are the protocols used on the Internet and on most local - Ethernets. It is highly recommended to say Y here (this will enlarge - your kernel by about 400 KB), since some programs (e.g. the X window - system) use TCP/IP even if your machine is not connected to any - other computer. You will get the so-called loopback device which - allows you to ping yourself (great fun, that!). - - For an excellent introduction to Linux networking, please read the - Linux Networking HOWTO, available from - . - - If you say Y here and also to "/proc file system support" and - "Sysctl support" below, you can change various aspects of the - behavior of the TCP/IP code by writing to the (virtual) files in - /proc/sys/net/ipv4/*; the options are explained in the file - . - - Short answer: say Y. - -if INET -source "net/ipv4/Kconfig" -source "net/ipv6/Kconfig" -source "net/netlabel/Kconfig" -source "net/mptcp/Kconfig" - -endif # if INET - -config NETWORK_SECMARK - bool "Security Marking" - help - This enables security marking of network packets, similar - to nfmark, but designated for security purposes. - If you are unsure how to answer this question, answer N. - -config NET_PTP_CLASSIFY - def_bool n - -config NETWORK_PHY_TIMESTAMPING - bool "Timestamping in PHY devices" - select NET_PTP_CLASSIFY - help - This allows timestamping of network packets by PHYs (or - other MII bus snooping devices) with hardware timestamping - capabilities. This option adds some overhead in the transmit - and receive paths. - - If you are unsure how to answer this question, answer N. - -menuconfig NETFILTER - bool "Network packet filtering framework (Netfilter)" - help - Netfilter is a framework for filtering and mangling network packets - that pass through your Linux box. - - The most common use of packet filtering is to run your Linux box as - a firewall protecting a local network from the Internet. The type of - firewall provided by this kernel support is called a "packet - filter", which means that it can reject individual network packets - based on type, source, destination etc. The other kind of firewall, - a "proxy-based" one, is more secure but more intrusive and more - bothersome to set up; it inspects the network traffic much more - closely, modifies it and has knowledge about the higher level - protocols, which a packet filter lacks. Moreover, proxy-based - firewalls often require changes to the programs running on the local - clients. Proxy-based firewalls don't need support by the kernel, but - they are often combined with a packet filter, which only works if - you say Y here. - - You should also say Y here if you intend to use your Linux box as - the gateway to the Internet for a local network of machines without - globally valid IP addresses. This is called "masquerading": if one - of the computers on your local network wants to send something to - the outside, your box can "masquerade" as that computer, i.e. it - forwards the traffic to the intended outside destination, but - modifies the packets to make it look like they came from the - firewall box itself. It works both ways: if the outside host - replies, the Linux box will silently forward the traffic to the - correct local computer. This way, the computers on your local net - are completely invisible to the outside world, even though they can - reach the outside and can receive replies. It is even possible to - run globally visible servers from within a masqueraded local network - using a mechanism called portforwarding. Masquerading is also often - called NAT (Network Address Translation). - - Another use of Netfilter is in transparent proxying: if a machine on - the local network tries to connect to an outside host, your Linux - box can transparently forward the traffic to a local server, - typically a caching proxy server. - - Yet another use of Netfilter is building a bridging firewall. Using - a bridge with Network packet filtering enabled makes iptables "see" - the bridged traffic. For filtering on the lower network and Ethernet - protocols over the bridge, use ebtables (under bridge netfilter - configuration). - - Various modules exist for netfilter which replace the previous - masquerading (ipmasqadm), packet filtering (ipchains), transparent - proxying, and portforwarding mechanisms. Please see - under "iptables" for the location of - these packages. - -if NETFILTER - -config NETFILTER_ADVANCED - bool "Advanced netfilter configuration" - depends on NETFILTER - default y - help - If you say Y here you can select between all the netfilter modules. - If you say N the more unusual ones will not be shown and the - basic ones needed by most people will default to 'M'. - - If unsure, say Y. - -config BRIDGE_NETFILTER - tristate "Bridged IP/ARP packets filtering" - depends on BRIDGE - depends on NETFILTER && INET - depends on NETFILTER_ADVANCED - select NETFILTER_FAMILY_BRIDGE - select SKB_EXTENSIONS - help - Enabling this option will let arptables resp. iptables see bridged - ARP resp. IP traffic. If you want a bridging firewall, you probably - want this option enabled. - Enabling or disabling this option doesn't enable or disable - ebtables. - - If unsure, say N. - -source "net/netfilter/Kconfig" -source "net/ipv4/netfilter/Kconfig" -source "net/ipv6/netfilter/Kconfig" -source "net/bridge/netfilter/Kconfig" - -endif - -source "net/dccp/Kconfig" -source "net/sctp/Kconfig" -source "net/rds/Kconfig" -source "net/tipc/Kconfig" -source "net/atm/Kconfig" -source "net/l2tp/Kconfig" -source "net/802/Kconfig" -source "net/bridge/Kconfig" -source "net/dsa/Kconfig" -source "net/8021q/Kconfig" -source "net/llc/Kconfig" -source "net/appletalk/Kconfig" -source "net/x25/Kconfig" -source "net/lapb/Kconfig" -source "net/phonet/Kconfig" -source "net/6lowpan/Kconfig" -source "net/ieee802154/Kconfig" -source "net/mac802154/Kconfig" -source "net/sched/Kconfig" -source "net/dcb/Kconfig" -source "net/dns_resolver/Kconfig" -source "net/batman-adv/Kconfig" -source "net/openvswitch/Kconfig" -source "net/vmw_vsock/Kconfig" -source "net/netlink/Kconfig" -source "net/mpls/Kconfig" -source "net/nsh/Kconfig" -source "net/hsr/Kconfig" -source "net/switchdev/Kconfig" -source "net/l3mdev/Kconfig" -source "net/qrtr/Kconfig" -source "net/ncsi/Kconfig" - -config PCPU_DEV_REFCNT - bool "Use percpu variables to maintain network device refcount" - depends on SMP - default y - help - network device refcount are using per cpu variables if this option is set. - This can be forced to N to detect underflows (with a performance drop). - -config MAX_SKB_FRAGS - int "Maximum number of fragments per skb_shared_info" - range 17 45 - default 17 - help - Having more fragments per skb_shared_info can help GRO efficiency. - This helps BIG TCP workloads, but might expose bugs in some - legacy drivers. - This also increases memory overhead of small packets, - and in drivers using build_skb(). - If unsure, say 17. - -config RPS - bool - depends on SMP && SYSFS - default y - -config RFS_ACCEL - bool - depends on RPS - select CPU_RMAP - default y - -config SOCK_RX_QUEUE_MAPPING - bool - -config XPS - bool - depends on SMP - select SOCK_RX_QUEUE_MAPPING - default y - -config HWBM - bool - -config CGROUP_NET_PRIO - bool "Network priority cgroup" - depends on CGROUPS - select SOCK_CGROUP_DATA - help - Cgroup subsystem for use in assigning processes to network priorities on - a per-interface basis. - -config CGROUP_NET_CLASSID - bool "Network classid cgroup" - depends on CGROUPS - select SOCK_CGROUP_DATA - help - Cgroup subsystem for use as general purpose socket classid marker that is - being used in cls_cgroup and for netfilter matching. - -config NET_RX_BUSY_POLL - bool - default y if !PREEMPT_RT || (PREEMPT_RT && !NETCONSOLE) - -config BQL - bool - prompt "Enable Byte Queue Limits" - depends on SYSFS - select DQL - default y - -config BPF_STREAM_PARSER - bool "enable BPF STREAM_PARSER" - depends on INET - depends on BPF_SYSCALL - depends on CGROUP_BPF - select STREAM_PARSER - select NET_SOCK_MSG - help - Enabling this allows a TCP stream parser to be used with - BPF_MAP_TYPE_SOCKMAP. - -config NET_FLOW_LIMIT - bool - depends on RPS - default y - help - The network stack has to drop packets when a receive processing CPU's - backlog reaches netdev_max_backlog. If a few out of many active flows - generate the vast majority of load, drop their traffic earlier to - maintain capacity for the other flows. This feature provides servers - with many clients some protection against DoS by a single (spoofed) - flow that greatly exceeds average workload. - -menu "Network testing" - -config NET_PKTGEN - tristate "Packet Generator (USE WITH CAUTION)" - depends on INET && PROC_FS - help - This module will inject preconfigured packets, at a configurable - rate, out of a given interface. It is used for network interface - stress testing and performance analysis. If you don't understand - what was just said, you don't need it: say N. - - Documentation on how to use the packet generator can be found - at . - - To compile this code as a module, choose M here: the - module will be called pktgen. - -config NET_DROP_MONITOR - tristate "Network packet drop alerting service" - depends on INET && TRACEPOINTS - help - This feature provides an alerting service to userspace in the - event that packets are discarded in the network stack. Alerts - are broadcast via netlink socket to any listening user space - process. If you don't need network drop alerts, or if you are ok - just checking the various proc files and other utilities for - drop statistics, say N here. - -endmenu - -endmenu - -source "net/ax25/Kconfig" -source "net/can/Kconfig" -source "net/bluetooth/Kconfig" -source "net/rxrpc/Kconfig" -source "net/kcm/Kconfig" -source "net/strparser/Kconfig" -source "net/mctp/Kconfig" - -config FIB_RULES - bool - -menuconfig WIRELESS - bool "Wireless" - depends on !S390 - default y - -if WIRELESS - -source "net/wireless/Kconfig" -source "net/mac80211/Kconfig" - -endif # WIRELESS - -source "net/rfkill/Kconfig" -source "net/9p/Kconfig" -source "net/caif/Kconfig" -source "net/ceph/Kconfig" -source "net/nfc/Kconfig" -source "net/psample/Kconfig" -source "net/ife/Kconfig" - -config LWTUNNEL - bool "Network light weight tunnels" - help - This feature provides an infrastructure to support light weight - tunnels like mpls. There is no netdevice associated with a light - weight tunnel endpoint. Tunnel encapsulation parameters are stored - with light weight tunnel state associated with fib routes. - -config LWTUNNEL_BPF - bool "Execute BPF program as route nexthop action" - depends on LWTUNNEL && INET - default y if LWTUNNEL=y - help - Allows to run BPF programs as a nexthop action following a route - lookup for incoming and outgoing packets. - -config DST_CACHE - bool - default n - -config GRO_CELLS - bool - default n - -config SOCK_VALIDATE_XMIT - bool - -config NET_SELFTESTS - def_tristate PHYLIB - depends on PHYLIB && INET - -config NET_SOCK_MSG - bool - default n - help - The NET_SOCK_MSG provides a framework for plain sockets (e.g. TCP) or - ULPs (upper layer modules, e.g. TLS) to process L7 application data - with the help of BPF programs. - -config NET_DEVLINK - bool - default n - -config PAGE_POOL - bool - -config PAGE_POOL_STATS - default n - bool "Page pool stats" - depends on PAGE_POOL - help - Enable page pool statistics to track page allocation and recycling - in page pools. This option incurs additional CPU cost in allocation - and recycle paths and additional memory cost to store the statistics. - These statistics are only available if this option is enabled and if - the driver using the page pool supports exporting this data. - - If unsure, say N. - -config FAILOVER - tristate "Generic failover module" - help - The failover module provides a generic interface for paravirtual - drivers to register a netdev and a set of ops with a failover - instance. The ops are used as event handlers that get called to - handle netdev register/unregister/link change/name change events - on slave pci ethernet devices with the same mac address as the - failover netdev. This enables paravirtual drivers to use a - VF as an accelerated low latency datapath. It also allows live - migration of VMs with direct attached VFs by failing over to the - paravirtual datapath when the VF is unplugged. - -config ETHTOOL_NETLINK - bool "Netlink interface for ethtool" - default y - help - An alternative userspace interface for ethtool based on generic - netlink. It provides better extensibility and some new features, - e.g. notification messages. - -config NETDEV_ADDR_LIST_TEST - tristate "Unit tests for device address list" - default KUNIT_ALL_TESTS - depends on KUNIT - -config NET_TEST - tristate "KUnit tests for networking" if !KUNIT_ALL_TESTS - depends on KUNIT - default KUNIT_ALL_TESTS - help - KUnit tests covering core networking infra, such as sk_buff. - - If unsure, say N. - -endif # if NET diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 5926955625cfa..c0832df3b0a3e 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1069,6 +1069,7 @@ static void ack_update_msk(struct mptcp_sock *msk, __mptcp_snd_una_update(msk, new_snd_una); __mptcp_data_acked(sk); } + msk->last_ack_recv = tcp_jiffies32; mptcp_data_unlock(sk); trace_ack_update_msk(mp_opt->data_ack, diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index cdf9ec67795e4..a6b5c6492e9ba 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1556,6 +1556,7 @@ static int __subflow_push_pending(struct sock *sk, struct sock *ssk, err = copied; out: + msk->last_data_sent = tcp_jiffies32; return err; } @@ -2262,6 +2263,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, skb_queue_empty(&msk->receive_queue), copied); if (!(flags & MSG_PEEK)) mptcp_rcv_space_adjust(msk, copied); + msk->last_data_recv = tcp_jiffies32; release_sock(sk); return copied; @@ -2793,6 +2795,9 @@ static void __mptcp_init_sock(struct sock *sk) WRITE_ONCE(msk->allow_infinite_fallback, true); msk->recovery = false; msk->subflow_id = 1; + msk->last_data_sent = tcp_jiffies32; + msk->last_data_recv = tcp_jiffies32; + msk->last_ack_recv = tcp_jiffies32; mptcp_pm_data_init(msk); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 5a4538205fd6c..3a3fed3642dd2 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -282,6 +282,9 @@ struct mptcp_sock { u64 bytes_acked; u64 snd_una; u64 wnd_end; + u32 last_data_sent; + u32 last_data_recv; + u32 last_ack_recv; unsigned long timer_ival; u32 token; int rmem_released;