datapath: Initialize tunnel_key pad member.
authorJesse Gross <jesse@nicira.com>
Mon, 31 Dec 2012 20:28:41 +0000 (12:28 -0800)
committerJesse Gross <jesse@nicira.com>
Mon, 31 Dec 2012 21:02:37 +0000 (13:02 -0800)
When a packet is received on a tunnel the pad member is currently
left uninitialized.  This didn't previously cause problems because
userspace didn't interprete the IPV4_TUNNEL attribute and blindly
copied back the uninitialized data.  However, now that userspace
knows how to serialize this attribute it was zeroing it out, which
prevented flows that had been previously installed from being
deleted.  In addition to zeroing out the padding on packet reception,
it also does the same thing on flow setup since we should be ignoring
the value.

Reported-by: Anand Krishnamurthy <krishnamurt4@wisc.edu>
Reported-by: Saul St. John <sstjohn@cs.wisc.edu>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
Conflicts:

datapath/flow.c

datapath/flow.c
datapath/tunnel.h

index 65d6cce..4cded77 100644 (file)
@@ -1054,6 +1054,8 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp,
 
                memcpy(&swkey->phy.tun.tun_key, tun_key,
                        sizeof(swkey->phy.tun.tun_key));
+               memset(swkey->phy.tun.tun_key.pad, 0,
+                       sizeof(swkey->phy.tun.tun_key.pad));
 
                attrs &= ~(1ULL << OVS_KEY_ATTR_TUN_ID);
                attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL);
@@ -1066,6 +1068,8 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp,
 
                memcpy(&swkey->phy.tun.tun_key, tun_key,
                        sizeof(swkey->phy.tun.tun_key));
+               memset(swkey->phy.tun.tun_key.pad, 0,
+                       sizeof(swkey->phy.tun.tun_key.pad));
 
                attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL);
        }
index c268057..cd252f4 100644 (file)
@@ -199,6 +199,7 @@ static inline void tnl_tun_key_init(struct ovs_key_ipv4_tunnel *tun_key,
        tun_key->ipv4_tos = iph->tos;
        tun_key->ipv4_ttl = iph->ttl;
        tun_key->tun_flags = tun_flags;
+       memset(tun_key->pad, 0, sizeof(tun_key->pad));
 }
 
 static inline void tnl_get_param(const struct tnl_mutable_config *mutable,