datapath: Use a single attribute array for parsing values and masks.
authorJesse Gross <jesse@nicira.com>
Fri, 21 Jun 2013 00:08:09 +0000 (17:08 -0700)
committerJesse Gross <jesse@nicira.com>
Fri, 21 Jun 2013 23:21:07 +0000 (16:21 -0700)
When parsing flow Netlink messages we currently have arrays to hold the
attribute pointers for both values and masks. This results in a large
stack, which some compilers warn about. It's not actually necessary
to have both arrays at the same time, so we can collapse this to a
single array.

Reported-by: Pravin B Shelar <pshelar@nicira.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
datapath/flow.c

index 9149e43..72aa664 100644 (file)
@@ -1477,7 +1477,6 @@ int ovs_match_from_nlattrs(struct sw_flow_match *match,
                           const struct nlattr *mask)
 {
        const struct nlattr *a[OVS_KEY_ATTR_MAX + 1];
-       const struct nlattr *m[OVS_KEY_ATTR_MAX + 1];
        const struct nlattr *encap;
        u64 key_attrs = 0;
        u64 mask_attrs = 0;
@@ -1514,19 +1513,19 @@ int ovs_match_from_nlattrs(struct sw_flow_match *match,
                return err;
 
        if (mask) {
-               err = parse_flow_mask_nlattrs(mask, m, &mask_attrs);
+               err = parse_flow_mask_nlattrs(mask, a, &mask_attrs);
                if (err)
                        return err;
 
                if ((mask_attrs & 1ULL << OVS_KEY_ATTR_ENCAP) && encap_valid) {
                        __be16 eth_type = 0;
 
-                       if (m[OVS_KEY_ATTR_ETHERTYPE])
-                               eth_type = nla_get_be16(m[OVS_KEY_ATTR_ETHERTYPE]);
+                       if (a[OVS_KEY_ATTR_ETHERTYPE])
+                               eth_type = nla_get_be16(a[OVS_KEY_ATTR_ETHERTYPE]);
                        if (eth_type == htons(0xffff)) {
                                mask_attrs &= ~(1ULL << OVS_KEY_ATTR_ETHERTYPE);
-                               encap = m[OVS_KEY_ATTR_ENCAP];
-                               err = parse_flow_mask_nlattrs(encap, m, &mask_attrs);
+                               encap = a[OVS_KEY_ATTR_ENCAP];
+                               err = parse_flow_mask_nlattrs(encap, a, &mask_attrs);
                        } else
                                err = -EINVAL;
 
@@ -1534,7 +1533,7 @@ int ovs_match_from_nlattrs(struct sw_flow_match *match,
                                return err;
                }
 
-               err = ovs_key_from_nlattrs(match,  mask_attrs, m, true);
+               err = ovs_key_from_nlattrs(match, mask_attrs, a, true);
                if (err)
                        return err;
        } else {