summaryrefslogtreecommitdiff
path: root/datapath/vport-gre.c
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2012-11-06 17:55:43 -0800
committerJesse Gross <jesse@nicira.com>2012-11-06 23:27:55 -0800
commit7827e96773426263e60d09a2dcf9dd75e6f25567 (patch)
treef00d4a066b4876706981f7b3db647a2e0748c4c3 /datapath/vport-gre.c
parent8432bb09305ac380451fc1bbd39336d6e2c472eb (diff)
downloadopenvswitch-7827e96773426263e60d09a2dcf9dd75e6f25567.tar.gz
tunnel: Zero keys if marked as not present.
If a key used to find a port then we mark it as being not present (previously this was accomplished by setting it to zero). However, we also still pass the key to userspace which could lead to an inconsistent state. This also zeros out the key as before in order to make our reported results consistent. Signed-off-by: Jesse Gross <jesse@nicira.com> Acked-by: Kyle Mestery <kmestery@cisco.com>
Diffstat (limited to 'datapath/vport-gre.c')
-rw-r--r--datapath/vport-gre.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c
index 7f8bc9a70..3c1349930 100644
--- a/datapath/vport-gre.c
+++ b/datapath/vport-gre.c
@@ -353,15 +353,16 @@ static bool check_checksum(struct sk_buff *skb)
}
static u32 gre_flags_to_tunnel_flags(const struct tnl_mutable_config *mutable,
- __be16 gre_flags)
+ __be16 gre_flags, __be64 *key)
{
u32 tunnel_flags = 0;
if (gre_flags & GRE_KEY) {
- if (mutable->key.daddr && (mutable->flags & TNL_F_IN_KEY_MATCH))
- tunnel_flags = OVS_TNL_F_KEY;
- else if (!mutable->key.daddr)
+ if (mutable->flags & TNL_F_IN_KEY_MATCH ||
+ !mutable->key.daddr)
tunnel_flags = OVS_TNL_F_KEY;
+ else
+ *key = 0;
}
if (gre_flags & GRE_CSUM)
@@ -378,7 +379,8 @@ static int gre_rcv(struct sk_buff *skb)
int hdr_len;
struct iphdr *iph;
struct ovs_key_ipv4_tunnel tun_key;
- __be16 flags;
+ __be16 gre_flags;
+ u32 tnl_flags;
__be64 key;
u32 tunnel_type;
@@ -387,7 +389,7 @@ static int gre_rcv(struct sk_buff *skb)
if (unlikely(!check_checksum(skb)))
goto error;
- hdr_len = parse_header(ip_hdr(skb), &flags, &key, &tunnel_type);
+ hdr_len = parse_header(ip_hdr(skb), &gre_flags, &key, &tunnel_type);
if (unlikely(hdr_len < 0))
goto error;
@@ -402,7 +404,8 @@ static int gre_rcv(struct sk_buff *skb)
goto error;
}
- tnl_tun_key_init(&tun_key, iph, key, gre_flags_to_tunnel_flags(mutable, flags));
+ tnl_flags = gre_flags_to_tunnel_flags(mutable, gre_flags, &key);
+ tnl_tun_key_init(&tun_key, iph, key, tnl_flags);
OVS_CB(skb)->tun_key = &tun_key;
__skb_pull(skb, hdr_len);