diff options
Diffstat (limited to 'include/net')
| -rw-r--r-- | include/net/addrconf.h | 3 | ||||
| -rw-r--r-- | include/net/amt.h | 20 | ||||
| -rw-r--r-- | include/net/bluetooth/l2cap.h | 1 | ||||
| -rw-r--r-- | include/net/cfg80211.h | 5 | ||||
| -rw-r--r-- | include/net/flow_offload.h | 1 | ||||
| -rw-r--r-- | include/net/inet_connection_sock.h | 10 | ||||
| -rw-r--r-- | include/net/inet_hashtables.h | 2 | ||||
| -rw-r--r-- | include/net/inet_sock.h | 14 | ||||
| -rw-r--r-- | include/net/ip.h | 6 | ||||
| -rw-r--r-- | include/net/mac80211.h | 3 | ||||
| -rw-r--r-- | include/net/netfilter/nf_tables.h | 30 | ||||
| -rw-r--r-- | include/net/protocol.h | 4 | ||||
| -rw-r--r-- | include/net/raw.h | 2 | ||||
| -rw-r--r-- | include/net/route.h | 2 | ||||
| -rw-r--r-- | include/net/sock.h | 10 | ||||
| -rw-r--r-- | include/net/tcp.h | 22 | ||||
| -rw-r--r-- | include/net/tls.h | 4 | ||||
| -rw-r--r-- | include/net/udp.h | 4 | 
18 files changed, 88 insertions, 55 deletions
| diff --git a/include/net/addrconf.h b/include/net/addrconf.h index f7506f08e505..c04f359655b8 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h @@ -405,6 +405,9 @@ static inline bool ip6_ignore_linkdown(const struct net_device *dev)  {  	const struct inet6_dev *idev = __in6_dev_get(dev); +	if (unlikely(!idev)) +		return true; +  	return !!idev->cnf.ignore_routes_with_linkdown;  } diff --git a/include/net/amt.h b/include/net/amt.h index 0e40c3d64fcf..08fc30cf2f34 100644 --- a/include/net/amt.h +++ b/include/net/amt.h @@ -78,6 +78,15 @@ enum amt_status {  #define AMT_STATUS_MAX (__AMT_STATUS_MAX - 1) +/* Gateway events only */ +enum amt_event { +	AMT_EVENT_NONE, +	AMT_EVENT_RECEIVE, +	AMT_EVENT_SEND_DISCOVERY, +	AMT_EVENT_SEND_REQUEST, +	__AMT_EVENT_MAX, +}; +  struct amt_header {  #if defined(__LITTLE_ENDIAN_BITFIELD)  	u8 type:4, @@ -292,6 +301,12 @@ struct amt_group_node {  	struct hlist_head	sources[];  }; +#define AMT_MAX_EVENTS	16 +struct amt_events { +	enum amt_event event; +	struct sk_buff *skb; +}; +  struct amt_dev {  	struct net_device       *dev;  	struct net_device       *stream_dev; @@ -308,6 +323,7 @@ struct amt_dev {  	struct delayed_work     req_wq;  	/* Protected by RTNL */  	struct delayed_work     secret_wq; +	struct work_struct	event_wq;  	/* AMT status */  	enum amt_status		status;  	/* Generated key */ @@ -345,6 +361,10 @@ struct amt_dev {  	/* Used only in gateway mode */  	u64			mac:48,  				reserved:16; +	/* AMT gateway side message handler queue */ +	struct amt_events	events[AMT_MAX_EVENTS]; +	u8			event_idx; +	u8			nr_events;  };  #define AMT_TOS			0xc0 diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 3c4f550e5a8b..2f766e3437ce 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -847,6 +847,7 @@ enum {  };  void l2cap_chan_hold(struct l2cap_chan *c); +struct l2cap_chan *l2cap_chan_hold_unless_zero(struct l2cap_chan *c);  void l2cap_chan_put(struct l2cap_chan *c);  static inline void l2cap_chan_lock(struct l2cap_chan *chan) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 6d02e12e4702..80f41446b1f0 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -8462,11 +8462,12 @@ int cfg80211_bss_color_notify(struct net_device *dev, gfp_t gfp,   * cfg80211_obss_color_collision_notify - notify about bss color collision   * @dev: network device   * @color_bitmap: representations of the colors that the local BSS is aware of + * @gfp: allocation flags   */  static inline int cfg80211_obss_color_collision_notify(struct net_device *dev, -						       u64 color_bitmap) +						       u64 color_bitmap, gfp_t gfp)  { -	return cfg80211_bss_color_notify(dev, GFP_KERNEL, +	return cfg80211_bss_color_notify(dev, gfp,  					 NL80211_CMD_OBSS_COLOR_COLLISION,  					 0, color_bitmap);  } diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h index 6484095a8c01..7ac313858037 100644 --- a/include/net/flow_offload.h +++ b/include/net/flow_offload.h @@ -152,6 +152,7 @@ enum flow_action_id {  	FLOW_ACTION_PIPE,  	FLOW_ACTION_VLAN_PUSH_ETH,  	FLOW_ACTION_VLAN_POP_ETH, +	FLOW_ACTION_CONTINUE,  	NUM_FLOW_ACTIONS,  }; diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 85cd695e7fd1..ee88f0f1350f 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h @@ -321,7 +321,7 @@ void inet_csk_update_fastreuse(struct inet_bind_bucket *tb,  struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu); -#define TCP_PINGPONG_THRESH	3 +#define TCP_PINGPONG_THRESH	1  static inline void inet_csk_enter_pingpong_mode(struct sock *sk)  { @@ -338,14 +338,6 @@ static inline bool inet_csk_in_pingpong_mode(struct sock *sk)  	return inet_csk(sk)->icsk_ack.pingpong >= TCP_PINGPONG_THRESH;  } -static inline void inet_csk_inc_pingpong_cnt(struct sock *sk) -{ -	struct inet_connection_sock *icsk = inet_csk(sk); - -	if (icsk->icsk_ack.pingpong < U8_MAX) -		icsk->icsk_ack.pingpong++; -} -  static inline bool inet_csk_has_ulp(struct sock *sk)  {  	return inet_sk(sk)->is_icsk && !!inet_csk(sk)->icsk_ulp_ops; diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index ebfa3df6f8dc..fd6b510d114b 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h @@ -179,7 +179,7 @@ static inline bool inet_sk_bound_dev_eq(struct net *net, int bound_dev_if,  					int dif, int sdif)  {  #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) -	return inet_bound_dev_eq(!!net->ipv4.sysctl_tcp_l3mdev_accept, +	return inet_bound_dev_eq(!!READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept),  				 bound_dev_if, dif, sdif);  #else  	return inet_bound_dev_eq(true, bound_dev_if, dif, sdif); diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index c1b5dcd6597c..6395f6b9a5d2 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -107,7 +107,8 @@ static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)  static inline u32 inet_request_mark(const struct sock *sk, struct sk_buff *skb)  { -	if (!sk->sk_mark && sock_net(sk)->ipv4.sysctl_tcp_fwmark_accept) +	if (!sk->sk_mark && +	    READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_fwmark_accept))  		return skb->mark;  	return sk->sk_mark; @@ -120,7 +121,7 @@ static inline int inet_request_bound_dev_if(const struct sock *sk,  #ifdef CONFIG_NET_L3_MASTER_DEV  	struct net *net = sock_net(sk); -	if (!bound_dev_if && net->ipv4.sysctl_tcp_l3mdev_accept) +	if (!bound_dev_if && READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept))  		return l3mdev_master_ifindex_by_index(net, skb->skb_iif);  #endif @@ -132,7 +133,7 @@ static inline int inet_sk_bound_l3mdev(const struct sock *sk)  #ifdef CONFIG_NET_L3_MASTER_DEV  	struct net *net = sock_net(sk); -	if (!net->ipv4.sysctl_tcp_l3mdev_accept) +	if (!READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept))  		return l3mdev_master_ifindex_by_index(net,  						      sk->sk_bound_dev_if);  #endif @@ -253,6 +254,11 @@ struct inet_sock {  #define IP_CMSG_CHECKSUM	BIT(7)  #define IP_CMSG_RECVFRAGSIZE	BIT(8) +static inline bool sk_is_inet(struct sock *sk) +{ +	return sk->sk_family == AF_INET || sk->sk_family == AF_INET6; +} +  /**   * sk_to_full_sk - Access to a full socket   * @sk: pointer to a socket @@ -369,7 +375,7 @@ static inline bool inet_get_convert_csum(struct sock *sk)  static inline bool inet_can_nonlocal_bind(struct net *net,  					  struct inet_sock *inet)  { -	return net->ipv4.sysctl_ip_nonlocal_bind || +	return READ_ONCE(net->ipv4.sysctl_ip_nonlocal_bind) ||  		inet->freebind || inet->transparent;  } diff --git a/include/net/ip.h b/include/net/ip.h index 26fffda78cca..1c979fd1904c 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -357,7 +357,7 @@ static inline bool sysctl_dev_name_is_allowed(const char *name)  static inline bool inet_port_requires_bind_service(struct net *net, unsigned short port)  { -	return port < net->ipv4.sysctl_ip_prot_sock; +	return port < READ_ONCE(net->ipv4.sysctl_ip_prot_sock);  }  #else @@ -384,7 +384,7 @@ void ipfrag_init(void);  void ip_static_sysctl_init(void);  #define IP4_REPLY_MARK(net, mark) \ -	((net)->ipv4.sysctl_fwmark_reflect ? (mark) : 0) +	(READ_ONCE((net)->ipv4.sysctl_fwmark_reflect) ? (mark) : 0)  static inline bool ip_is_fragment(const struct iphdr *iph)  { @@ -446,7 +446,7 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,  	struct net *net = dev_net(dst->dev);  	unsigned int mtu; -	if (net->ipv4.sysctl_ip_fwd_use_pmtu || +	if (READ_ONCE(net->ipv4.sysctl_ip_fwd_use_pmtu) ||  	    ip_mtu_locked(dst) ||  	    !forwarding) {  		mtu = rt->rt_pmtu; diff --git a/include/net/mac80211.h b/include/net/mac80211.h index ebadb2103968..47642b020706 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -6960,10 +6960,11 @@ ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,   * @vif: &struct ieee80211_vif pointer from the add_interface callback.   * @color_bitmap: a 64 bit bitmap representing the colors that the local BSS is   *	aware of. + * @gfp: allocation flags   */  void  ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif, -				       u64 color_bitmap); +				       u64 color_bitmap, gfp_t gfp);  /**   * ieee80211_is_tx_data - check if frame is a data frame diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index 279ae0fff7ad..64cf655c818c 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h @@ -657,18 +657,22 @@ static inline void nft_set_ext_prepare(struct nft_set_ext_tmpl *tmpl)  	tmpl->len = sizeof(struct nft_set_ext);  } -static inline void nft_set_ext_add_length(struct nft_set_ext_tmpl *tmpl, u8 id, -					  unsigned int len) +static inline int nft_set_ext_add_length(struct nft_set_ext_tmpl *tmpl, u8 id, +					 unsigned int len)  {  	tmpl->len	 = ALIGN(tmpl->len, nft_set_ext_types[id].align); -	BUG_ON(tmpl->len > U8_MAX); +	if (tmpl->len > U8_MAX) +		return -EINVAL; +  	tmpl->offset[id] = tmpl->len;  	tmpl->len	+= nft_set_ext_types[id].len + len; + +	return 0;  } -static inline void nft_set_ext_add(struct nft_set_ext_tmpl *tmpl, u8 id) +static inline int nft_set_ext_add(struct nft_set_ext_tmpl *tmpl, u8 id)  { -	nft_set_ext_add_length(tmpl, id, 0); +	return nft_set_ext_add_length(tmpl, id, 0);  }  static inline void nft_set_ext_init(struct nft_set_ext *ext, @@ -1338,24 +1342,28 @@ void nft_unregister_flowtable_type(struct nf_flowtable_type *type);  /**   *	struct nft_traceinfo - nft tracing information and state   * + *	@trace: other struct members are initialised + *	@nf_trace: copy of skb->nf_trace before rule evaluation + *	@type: event type (enum nft_trace_types) + *	@skbid: hash of skb to be used as trace id + *	@packet_dumped: packet headers sent in a previous traceinfo message   *	@pkt: pktinfo currently processed   *	@basechain: base chain currently processed   *	@chain: chain currently processed   *	@rule:  rule that was evaluated   *	@verdict: verdict given by rule - *	@type: event type (enum nft_trace_types) - *	@packet_dumped: packet headers sent in a previous traceinfo message - *	@trace: other struct members are initialised   */  struct nft_traceinfo { +	bool				trace; +	bool				nf_trace; +	bool				packet_dumped; +	enum nft_trace_types		type:8; +	u32				skbid;  	const struct nft_pktinfo	*pkt;  	const struct nft_base_chain	*basechain;  	const struct nft_chain		*chain;  	const struct nft_rule_dp	*rule;  	const struct nft_verdict	*verdict; -	enum nft_trace_types		type; -	bool				packet_dumped; -	bool				trace;  };  void nft_trace_init(struct nft_traceinfo *info, const struct nft_pktinfo *pkt, diff --git a/include/net/protocol.h b/include/net/protocol.h index f51c06ae365f..6aef8cb11cc8 100644 --- a/include/net/protocol.h +++ b/include/net/protocol.h @@ -35,8 +35,6 @@  /* This is used to register protocols. */  struct net_protocol { -	int			(*early_demux)(struct sk_buff *skb); -	int			(*early_demux_handler)(struct sk_buff *skb);  	int			(*handler)(struct sk_buff *skb);  	/* This returns an error if we weren't able to handle the error. */ @@ -52,8 +50,6 @@ struct net_protocol {  #if IS_ENABLED(CONFIG_IPV6)  struct inet6_protocol { -	void	(*early_demux)(struct sk_buff *skb); -	void    (*early_demux_handler)(struct sk_buff *skb);  	int	(*handler)(struct sk_buff *skb);  	/* This returns an error if we weren't able to handle the error. */ diff --git a/include/net/raw.h b/include/net/raw.h index 8ad8df594853..c51a635671a7 100644 --- a/include/net/raw.h +++ b/include/net/raw.h @@ -75,7 +75,7 @@ static inline bool raw_sk_bound_dev_eq(struct net *net, int bound_dev_if,  				       int dif, int sdif)  {  #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) -	return inet_bound_dev_eq(!!net->ipv4.sysctl_raw_l3mdev_accept, +	return inet_bound_dev_eq(READ_ONCE(net->ipv4.sysctl_raw_l3mdev_accept),  				 bound_dev_if, dif, sdif);  #else  	return inet_bound_dev_eq(true, bound_dev_if, dif, sdif); diff --git a/include/net/route.h b/include/net/route.h index 991a3985712d..bbcf2aba149f 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -373,7 +373,7 @@ static inline int ip4_dst_hoplimit(const struct dst_entry *dst)  	struct net *net = dev_net(dst->dev);  	if (hoplimit == 0) -		hoplimit = net->ipv4.sysctl_ip_default_ttl; +		hoplimit = READ_ONCE(net->ipv4.sysctl_ip_default_ttl);  	return hoplimit;  } diff --git a/include/net/sock.h b/include/net/sock.h index 72ca97ccb460..7a48991cdb19 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1529,7 +1529,7 @@ void __sk_mem_reclaim(struct sock *sk, int amount);  /* sysctl_mem values are in pages, we convert them in SK_MEM_QUANTUM units */  static inline long sk_prot_mem_limits(const struct sock *sk, int index)  { -	long val = sk->sk_prot->sysctl_mem[index]; +	long val = READ_ONCE(sk->sk_prot->sysctl_mem[index]);  #if PAGE_SIZE > SK_MEM_QUANTUM  	val <<= PAGE_SHIFT - SK_MEM_QUANTUM_SHIFT; @@ -2843,18 +2843,18 @@ static inline int sk_get_wmem0(const struct sock *sk, const struct proto *proto)  {  	/* Does this proto have per netns sysctl_wmem ? */  	if (proto->sysctl_wmem_offset) -		return *(int *)((void *)sock_net(sk) + proto->sysctl_wmem_offset); +		return READ_ONCE(*(int *)((void *)sock_net(sk) + proto->sysctl_wmem_offset)); -	return *proto->sysctl_wmem; +	return READ_ONCE(*proto->sysctl_wmem);  }  static inline int sk_get_rmem0(const struct sock *sk, const struct proto *proto)  {  	/* Does this proto have per netns sysctl_rmem ? */  	if (proto->sysctl_rmem_offset) -		return *(int *)((void *)sock_net(sk) + proto->sysctl_rmem_offset); +		return READ_ONCE(*(int *)((void *)sock_net(sk) + proto->sysctl_rmem_offset)); -	return *proto->sysctl_rmem; +	return READ_ONCE(*proto->sysctl_rmem);  }  /* Default TCP Small queue budget is ~1 ms of data (1sec >> 10) diff --git a/include/net/tcp.h b/include/net/tcp.h index 1e99f5c61f84..78a64e1b33a7 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -932,7 +932,7 @@ extern const struct inet_connection_sock_af_ops ipv6_specific;  INDIRECT_CALLABLE_DECLARE(void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb));  INDIRECT_CALLABLE_DECLARE(int tcp_v6_rcv(struct sk_buff *skb)); -INDIRECT_CALLABLE_DECLARE(void tcp_v6_early_demux(struct sk_buff *skb)); +void tcp_v6_early_demux(struct sk_buff *skb);  #endif @@ -1403,8 +1403,8 @@ static inline void tcp_slow_start_after_idle_check(struct sock *sk)  	struct tcp_sock *tp = tcp_sk(sk);  	s32 delta; -	if (!sock_net(sk)->ipv4.sysctl_tcp_slow_start_after_idle || tp->packets_out || -	    ca_ops->cong_control) +	if (!READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_slow_start_after_idle) || +	    tp->packets_out || ca_ops->cong_control)  		return;  	delta = tcp_jiffies32 - tp->lsndtime;  	if (delta > inet_csk(sk)->icsk_rto) @@ -1419,7 +1419,7 @@ void tcp_select_initial_window(const struct sock *sk, int __space,  static inline int tcp_win_from_space(const struct sock *sk, int space)  { -	int tcp_adv_win_scale = sock_net(sk)->ipv4.sysctl_tcp_adv_win_scale; +	int tcp_adv_win_scale = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_adv_win_scale);  	return tcp_adv_win_scale <= 0 ?  		(space>>(-tcp_adv_win_scale)) : @@ -1493,21 +1493,24 @@ static inline int keepalive_intvl_when(const struct tcp_sock *tp)  {  	struct net *net = sock_net((struct sock *)tp); -	return tp->keepalive_intvl ? : net->ipv4.sysctl_tcp_keepalive_intvl; +	return tp->keepalive_intvl ? : +		READ_ONCE(net->ipv4.sysctl_tcp_keepalive_intvl);  }  static inline int keepalive_time_when(const struct tcp_sock *tp)  {  	struct net *net = sock_net((struct sock *)tp); -	return tp->keepalive_time ? : net->ipv4.sysctl_tcp_keepalive_time; +	return tp->keepalive_time ? : +		READ_ONCE(net->ipv4.sysctl_tcp_keepalive_time);  }  static inline int keepalive_probes(const struct tcp_sock *tp)  {  	struct net *net = sock_net((struct sock *)tp); -	return tp->keepalive_probes ? : net->ipv4.sysctl_tcp_keepalive_probes; +	return tp->keepalive_probes ? : +		READ_ONCE(net->ipv4.sysctl_tcp_keepalive_probes);  }  static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp) @@ -1520,7 +1523,8 @@ static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp)  static inline int tcp_fin_time(const struct sock *sk)  { -	int fin_timeout = tcp_sk(sk)->linger2 ? : sock_net(sk)->ipv4.sysctl_tcp_fin_timeout; +	int fin_timeout = tcp_sk(sk)->linger2 ? : +		READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_fin_timeout);  	const int rto = inet_csk(sk)->icsk_rto;  	if (fin_timeout < (rto << 2) - (rto >> 1)) @@ -2023,7 +2027,7 @@ void __tcp_v4_send_check(struct sk_buff *skb, __be32 saddr, __be32 daddr);  static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp)  {  	struct net *net = sock_net((struct sock *)tp); -	return tp->notsent_lowat ?: net->ipv4.sysctl_tcp_notsent_lowat; +	return tp->notsent_lowat ?: READ_ONCE(net->ipv4.sysctl_tcp_notsent_lowat);  }  bool tcp_stream_memory_free(const struct sock *sk, int wake); diff --git a/include/net/tls.h b/include/net/tls.h index 8017f1703447..8bd938f98bdd 100644 --- a/include/net/tls.h +++ b/include/net/tls.h @@ -704,7 +704,7 @@ int tls_sw_fallback_init(struct sock *sk,  			 struct tls_crypto_info *crypto_info);  #ifdef CONFIG_TLS_DEVICE -void tls_device_init(void); +int tls_device_init(void);  void tls_device_cleanup(void);  void tls_device_sk_destruct(struct sock *sk);  int tls_set_device_offload(struct sock *sk, struct tls_context *ctx); @@ -724,7 +724,7 @@ static inline bool tls_is_sk_rx_device_offloaded(struct sock *sk)  	return tls_get_ctx(sk)->rx_conf == TLS_HW;  }  #else -static inline void tls_device_init(void) {} +static inline int tls_device_init(void) { return 0; }  static inline void tls_device_cleanup(void) {}  static inline int diff --git a/include/net/udp.h b/include/net/udp.h index b83a00330566..8dd4aa1485a6 100644 --- a/include/net/udp.h +++ b/include/net/udp.h @@ -167,7 +167,7 @@ static inline void udp_csum_pull_header(struct sk_buff *skb)  typedef struct sock *(*udp_lookup_t)(const struct sk_buff *skb, __be16 sport,  				     __be16 dport); -INDIRECT_CALLABLE_DECLARE(void udp_v6_early_demux(struct sk_buff *)); +void udp_v6_early_demux(struct sk_buff *skb);  INDIRECT_CALLABLE_DECLARE(int udpv6_rcv(struct sk_buff *));  struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, @@ -238,7 +238,7 @@ static inline bool udp_sk_bound_dev_eq(struct net *net, int bound_dev_if,  				       int dif, int sdif)  {  #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) -	return inet_bound_dev_eq(!!net->ipv4.sysctl_udp_l3mdev_accept, +	return inet_bound_dev_eq(!!READ_ONCE(net->ipv4.sysctl_udp_l3mdev_accept),  				 bound_dev_if, dif, sdif);  #else  	return inet_bound_dev_eq(true, bound_dev_if, dif, sdif); |