tunnel: Zero keys if marked as not present.
authorJesse Gross <jesse@nicira.com>
Wed, 7 Nov 2012 01:55:43 +0000 (17:55 -0800)
committerJesse Gross <jesse@nicira.com>
Wed, 7 Nov 2012 07:27:55 +0000 (23:27 -0800)
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>
datapath/vport-capwap.c
datapath/vport-gre.c

index 8a89180e5722f71e16e506c53879fe1fcffb1efc..5f31732e81dd4f8b2b075e74aed96cd1ae13e228 100644 (file)
@@ -334,8 +334,10 @@ static int capwap_rcv(struct sock *sk, struct sk_buff *skb)
        }
 
        if (key_present && mutable->key.daddr &&
-                        !(mutable->flags & TNL_F_IN_KEY_MATCH))
+                        !(mutable->flags & TNL_F_IN_KEY_MATCH)) {
                key_present = false;
+               key = 0;
+       }
 
        tnl_tun_key_init(&tun_key, iph, key, key_present ? OVS_TNL_F_KEY : 0);
        OVS_CB(skb)->tun_key = &tun_key;
index 7f8bc9a70bd5685e6d99b46fc00cf274b4d3e59f..3c134993086c0eaa5f2edfc2f25186f3f001abb6 100644 (file)
@@ -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);