summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2012-05-25 11:29:30 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-10-02 10:29:50 -0700
commit2ff0cd9f615bae1de9d812de92eff6426aad26c9 (patch)
treec2bb19352286bb93c6d0e32163351a1d58f0589d /net
parent6cacd608448898cf0b7bb4353e1a92c6dc7d5dd9 (diff)
downloadlinux-stable-2ff0cd9f615bae1de9d812de92eff6426aad26c9.tar.gz
linux-stable-2ff0cd9f615bae1de9d812de92eff6426aad26c9.tar.bz2
linux-stable-2ff0cd9f615bae1de9d812de92eff6426aad26c9.zip
openvswitch: Reset upper layer protocol info on internal devices.
[ Upstream commit 7fe99e2d434eafeac0c57b279a77e5de39212636 ] It's possible that packets that are sent on internal devices (from the OVS perspective) have already traversed the local IP stack. After they go through the internal device, they will again travel through the IP stack which may get confused by the presence of existing information in the skb. The problem can be observed when switching between namespaces. This clears out that information to avoid problems but deliberately leaves other metadata alone. This is to provide maximum flexibility in chaining together OVS and other Linux components. Signed-off-by: Jesse Gross <jesse@nicira.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net')
-rw-r--r--net/openvswitch/vport-internal_dev.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c
index b6b1d7daa3cb..ce5348f5f601 100644
--- a/net/openvswitch/vport-internal_dev.c
+++ b/net/openvswitch/vport-internal_dev.c
@@ -24,6 +24,9 @@
#include <linux/ethtool.h>
#include <linux/skbuff.h>
+#include <net/dst.h>
+#include <net/xfrm.h>
+
#include "datapath.h"
#include "vport-internal_dev.h"
#include "vport-netdev.h"
@@ -209,6 +212,11 @@ static int internal_dev_recv(struct vport *vport, struct sk_buff *skb)
int len;
len = skb->len;
+
+ skb_dst_drop(skb);
+ nf_reset(skb);
+ secpath_reset(skb);
+
skb->dev = netdev;
skb->pkt_type = PACKET_HOST;
skb->protocol = eth_type_trans(skb, netdev);