Skip to content
Snippets Groups Projects
Select Git revision
  • 98fa6271cfcb1de873b3fe0caf48d9daa1bcc0ac
  • vme-testing default
  • ci-test
  • master
  • remoteproc
  • am625-sk-ov5640
  • pcal6534-upstreaming
  • lps22df-upstreaming
  • msc-upstreaming
  • imx8mp
  • iio/noa1305
  • vme-next
  • vme-next-4.14-rc4
  • v4.14-rc4
  • v4.14-rc3
  • v4.14-rc2
  • v4.14-rc1
  • v4.13
  • vme-next-4.13-rc7
  • v4.13-rc7
  • v4.13-rc6
  • v4.13-rc5
  • v4.13-rc4
  • v4.13-rc3
  • v4.13-rc2
  • v4.13-rc1
  • v4.12
  • v4.12-rc7
  • v4.12-rc6
  • v4.12-rc5
  • v4.12-rc4
  • v4.12-rc3
32 results

tcp_metrics.c

Blame
  • tcp_metrics.c 26.55 KiB
    // SPDX-License-Identifier: GPL-2.0
    #include <linux/rcupdate.h>
    #include <linux/spinlock.h>
    #include <linux/jiffies.h>
    #include <linux/module.h>
    #include <linux/cache.h>
    #include <linux/slab.h>
    #include <linux/init.h>
    #include <linux/tcp.h>
    #include <linux/hash.h>
    #include <linux/tcp_metrics.h>
    #include <linux/vmalloc.h>
    
    #include <net/inet_connection_sock.h>
    #include <net/net_namespace.h>
    #include <net/request_sock.h>
    #include <net/inetpeer.h>
    #include <net/sock.h>
    #include <net/ipv6.h>
    #include <net/dst.h>
    #include <net/tcp.h>
    #include <net/genetlink.h>
    
    static struct tcp_metrics_block *__tcp_get_metrics(const struct inetpeer_addr *saddr,
    						   const struct inetpeer_addr *daddr,
    						   struct net *net, unsigned int hash);
    
    struct tcp_fastopen_metrics {
    	u16	mss;
    	u16	syn_loss:10,		/* Recurring Fast Open SYN losses */
    		try_exp:2;		/* Request w/ exp. option (once) */
    	unsigned long	last_syn_loss;	/* Last Fast Open SYN loss */
    	struct	tcp_fastopen_cookie	cookie;
    };
    
    /* TCP_METRIC_MAX includes 2 extra fields for userspace compatibility
     * Kernel only stores RTT and RTTVAR in usec resolution
     */
    #define TCP_METRIC_MAX_KERNEL (TCP_METRIC_MAX - 2)
    
    struct tcp_metrics_block {
    	struct tcp_metrics_block __rcu	*tcpm_next;
    	possible_net_t			tcpm_net;
    	struct inetpeer_addr		tcpm_saddr;
    	struct inetpeer_addr		tcpm_daddr;
    	unsigned long			tcpm_stamp;
    	u32				tcpm_lock;
    	u32				tcpm_vals[TCP_METRIC_MAX_KERNEL + 1];
    	struct tcp_fastopen_metrics	tcpm_fastopen;
    
    	struct rcu_head			rcu_head;
    };
    
    static inline struct net *tm_net(struct tcp_metrics_block *tm)
    {
    	return read_pnet(&tm->tcpm_net);
    }
    
    static bool tcp_metric_locked(struct tcp_metrics_block *tm,
    			      enum tcp_metric_index idx)
    {
    	return tm->tcpm_lock & (1 << idx);
    }
    
    static u32 tcp_metric_get(struct tcp_metrics_block *tm,
    			  enum tcp_metric_index idx)
    {
    	return tm->tcpm_vals[idx];
    }