summaryrefslogtreecommitdiffstats
path: root/drivers/net/geneve.c
diff options
context:
space:
mode:
authorHannes Frederic Sowa <hannes@stressinduktion.org>2016-05-19 09:58:33 -0400
committerDavid S. Miller <davem@davemloft.net>2016-05-20 19:56:02 -0400
commite5aed006be918af163eb397e45aa5ea6cefd5e01 (patch)
tree26eeaaa452ebb326fe6aefff37ec7aaefa8aae8f /drivers/net/geneve.c
parentcb543e80f43b2db9d3adcc80d522b27829e60d82 (diff)
udp: prevent skbs lingering in tunnel socket queues
In case we find a socket with encapsulation enabled we should call the encap_recv function even if just a udp header without payload is available. The callbacks are responsible for correctly verifying and dropping the packets. Also, in case the header validation fails for geneve and vxlan we shouldn't put the skb back into the socket queue, no one will pick them up there. Instead we can simply discard them in the respective encap_recv functions. Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/geneve.c')
-rw-r--r--drivers/net/geneve.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index a6dc11ce497f..cadefe4fdaa2 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -335,15 +335,15 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
335 335
336 /* Need Geneve and inner Ethernet header to be present */ 336 /* Need Geneve and inner Ethernet header to be present */
337 if (unlikely(!pskb_may_pull(skb, GENEVE_BASE_HLEN))) 337 if (unlikely(!pskb_may_pull(skb, GENEVE_BASE_HLEN)))
338 goto error; 338 goto drop;
339 339
340 /* Return packets with reserved bits set */ 340 /* Return packets with reserved bits set */
341 geneveh = geneve_hdr(skb); 341 geneveh = geneve_hdr(skb);
342 if (unlikely(geneveh->ver != GENEVE_VER)) 342 if (unlikely(geneveh->ver != GENEVE_VER))
343 goto error; 343 goto drop;
344 344
345 if (unlikely(geneveh->proto_type != htons(ETH_P_TEB))) 345 if (unlikely(geneveh->proto_type != htons(ETH_P_TEB)))
346 goto error; 346 goto drop;
347 347
348 gs = rcu_dereference_sk_user_data(sk); 348 gs = rcu_dereference_sk_user_data(sk);
349 if (!gs) 349 if (!gs)
@@ -366,10 +366,6 @@ drop:
366 /* Consume bad packet */ 366 /* Consume bad packet */
367 kfree_skb(skb); 367 kfree_skb(skb);
368 return 0; 368 return 0;
369
370error:
371 /* Let the UDP layer deal with the skb */
372 return 1;
373} 369}
374 370
375static struct socket *geneve_create_sock(struct net *net, bool ipv6, 371static struct socket *geneve_create_sock(struct net *net, bool ipv6,