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 <krishnamu...@wisc.edu> Reported-by: Saul St. John <sstj...@cs.wisc.edu> Signed-off-by: Jesse Gross <je...@nicira.com> --- datapath/flow.c | 2 ++ datapath/tunnel.h | 1 + 2 files changed, 3 insertions(+) diff --git a/datapath/flow.c b/datapath/flow.c index 0c3d75f..63eef77 100644 --- a/datapath/flow.c +++ b/datapath/flow.c @@ -1053,6 +1053,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, return -EINVAL; memcpy(&swkey->tun_key, tun_key, sizeof(swkey->tun_key)); + memset(swkey->tun_key.pad, 0, sizeof(swkey->tun_key.pad)); attrs &= ~(1ULL << OVS_KEY_ATTR_TUN_ID); attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL); @@ -1064,6 +1065,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, return -EINVAL; memcpy(&swkey->tun_key, tun_key, sizeof(swkey->tun_key)); + memset(swkey->tun_key.pad, 0, sizeof(swkey->tun_key.pad)); attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL); } diff --git a/datapath/tunnel.h b/datapath/tunnel.h index b7de7a9..7705475 100644 --- a/datapath/tunnel.h +++ b/datapath/tunnel.h @@ -201,6 +201,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, -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev