}
 
        /* Extract key. */
-       ovs_match_init(&match, &new_flow->key, &mask);
+       ovs_match_init(&match, &new_flow->key, false, &mask);
        error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],
                                  a[OVS_FLOW_ATTR_MASK], log);
        if (error)
 
        ufid_present = ovs_nla_get_ufid(&sfid, a[OVS_FLOW_ATTR_UFID], log);
        if (a[OVS_FLOW_ATTR_KEY]) {
-               ovs_match_init(&match, &key, &mask);
+               ovs_match_init(&match, &key, true, &mask);
                error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],
                                          a[OVS_FLOW_ATTR_MASK], log);
        } else if (!ufid_present) {
 
        ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log);
        if (a[OVS_FLOW_ATTR_KEY]) {
-               ovs_match_init(&match, &key, NULL);
+               ovs_match_init(&match, &key, true, NULL);
                err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], NULL,
                                        log);
        } else if (!ufid_present) {
 
        ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log);
        if (a[OVS_FLOW_ATTR_KEY]) {
-               ovs_match_init(&match, &key, NULL);
+               ovs_match_init(&match, &key, true, NULL);
                err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],
                                        NULL, log);
                if (unlikely(err))
 
 
 void ovs_match_init(struct sw_flow_match *match,
                    struct sw_flow_key *key,
+                   bool reset_key,
                    struct sw_flow_mask *mask)
 {
        memset(match, 0, sizeof(*match));
        match->key = key;
        match->mask = mask;
 
-       memset(key, 0, sizeof(*key));
+       if (reset_key)
+               memset(key, 0, sizeof(*key));
 
        if (mask) {
                memset(&mask->key, 0, sizeof(mask->key));
        struct nlattr *a;
        int err = 0, start, opts_type;
 
-       ovs_match_init(&match, &key, NULL);
+       ovs_match_init(&match, &key, true, NULL);
        opts_type = ip_tun_from_nlattr(nla_data(attr), &match, false, log);
        if (opts_type < 0)
                return opts_type;
 
 size_t ovs_key_attr_size(void);
 
 void ovs_match_init(struct sw_flow_match *match,
-                   struct sw_flow_key *key, struct sw_flow_mask *mask);
+                   struct sw_flow_key *key, bool reset_key,
+                   struct sw_flow_mask *mask);
 
 int ovs_nla_put_key(const struct sw_flow_key *, const struct sw_flow_key *,
                    int attr, bool is_mask, struct sk_buff *);