Commit f5f52f08 authored by Eric Dumazet's avatar Eric Dumazet Committed by Paolo Abeni

udp: move udp->accept_udp_{l4|fraglist} to udp->udp_flags

These are read locklessly, move them to udp_flags to fix data-races.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 6d5a12eb
...@@ -37,6 +37,8 @@ enum { ...@@ -37,6 +37,8 @@ enum {
UDP_FLAGS_NO_CHECK6_TX, /* Send zero UDP6 checksums on TX? */ UDP_FLAGS_NO_CHECK6_TX, /* Send zero UDP6 checksums on TX? */
UDP_FLAGS_NO_CHECK6_RX, /* Allow zero UDP6 checksums on RX? */ UDP_FLAGS_NO_CHECK6_RX, /* Allow zero UDP6 checksums on RX? */
UDP_FLAGS_GRO_ENABLED, /* Request GRO aggregation */ UDP_FLAGS_GRO_ENABLED, /* Request GRO aggregation */
UDP_FLAGS_ACCEPT_FRAGLIST,
UDP_FLAGS_ACCEPT_L4,
}; };
struct udp_sock { struct udp_sock {
...@@ -50,13 +52,11 @@ struct udp_sock { ...@@ -50,13 +52,11 @@ struct udp_sock {
int pending; /* Any pending frames ? */ int pending; /* Any pending frames ? */
__u8 encap_type; /* Is this an Encapsulation socket? */ __u8 encap_type; /* Is this an Encapsulation socket? */
unsigned char encap_enabled:1, /* This socket enabled encap unsigned char encap_enabled:1; /* This socket enabled encap
* processing; UDP tunnels and * processing; UDP tunnels and
* different encapsulation layer set * different encapsulation layer set
* this * this
*/ */
accept_udp_l4:1,
accept_udp_fraglist:1;
/* indicator bits used by pcflag: */ /* indicator bits used by pcflag: */
#define UDPLITE_BIT 0x1 /* set by udplite proto init function */ #define UDPLITE_BIT 0x1 /* set by udplite proto init function */
#define UDPLITE_SEND_CC 0x2 /* set via udplite setsockopt */ #define UDPLITE_SEND_CC 0x2 /* set via udplite setsockopt */
...@@ -149,10 +149,12 @@ static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb) ...@@ -149,10 +149,12 @@ static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb)
if (!skb_is_gso(skb)) if (!skb_is_gso(skb))
return false; return false;
if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4 && !udp_sk(sk)->accept_udp_l4) if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4 &&
!udp_test_bit(ACCEPT_L4, sk))
return true; return true;
if (skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST && !udp_sk(sk)->accept_udp_fraglist) if (skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST &&
!udp_test_bit(ACCEPT_FRAGLIST, sk))
return true; return true;
return false; return false;
...@@ -160,8 +162,8 @@ static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb) ...@@ -160,8 +162,8 @@ static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb)
static inline void udp_allow_gso(struct sock *sk) static inline void udp_allow_gso(struct sock *sk)
{ {
udp_sk(sk)->accept_udp_l4 = 1; udp_set_bit(ACCEPT_L4, sk);
udp_sk(sk)->accept_udp_fraglist = 1; udp_set_bit(ACCEPT_FRAGLIST, sk);
} }
#define udp_portaddr_for_each_entry(__sk, list) \ #define udp_portaddr_for_each_entry(__sk, list) \
......
...@@ -2716,7 +2716,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname, ...@@ -2716,7 +2716,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
if (valbool) if (valbool)
udp_tunnel_encap_enable(sk->sk_socket); udp_tunnel_encap_enable(sk->sk_socket);
udp_assign_bit(GRO_ENABLED, sk, valbool); udp_assign_bit(GRO_ENABLED, sk, valbool);
up->accept_udp_l4 = valbool; udp_assign_bit(ACCEPT_L4, sk, valbool);
release_sock(sk); release_sock(sk);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment