This allows future patches to reuse the nla error detection code, by
passing their own definitions for expected attribute lengths and types.

Signed-off-by: Joe Stringer <joestrin...@nicira.com>
---
 datapath/flow_netlink.c |   34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
index e525c9d..933b2a1 100644
--- a/datapath/flow_netlink.c
+++ b/datapath/flow_netlink.c
@@ -285,9 +285,10 @@ static bool is_all_zero(const u8 *fp, size_t size)
        return true;
 }
 
-static int __parse_flow_nlattrs(const struct nlattr *attr,
-                               const struct nlattr *a[],
-                               u64 *attrsp, bool nz)
+static int parse_nlattrs(const struct nlattr *attr, const struct nlattr *a[],
+                        const int expected_lens[], int max_attr,
+                        bool allow_duplicate_attrs, const char *attr_str,
+                        u64 *attrsp, bool nz)
 {
        const struct nlattr *nla;
        u64 attrs;
@@ -298,22 +299,23 @@ static int __parse_flow_nlattrs(const struct nlattr *attr,
                u16 type = nla_type(nla);
                int expected_len;
 
-               if (type > OVS_KEY_ATTR_MAX) {
-                       OVS_NLERR("Unknown key attribute (type=%d, max=%d).\n",
-                                 type, OVS_KEY_ATTR_MAX);
+               if (type > max_attr) {
+                       OVS_NLERR("Unknown %s attribute (type=%d, max=%d).\n",
+                                 attr_str, type, max_attr);
                        return -EINVAL;
                }
 
-               if (attrs & (1ULL << type)) {
-                       OVS_NLERR("Duplicate key attribute (type %d).\n", type);
+               if (!allow_duplicate_attrs && (attrs & (1ULL << type))) {
+                       OVS_NLERR("Duplicate %s attribute (type %d).\n",
+                                 attr_str, type);
                        return -EINVAL;
                }
 
-               expected_len = ovs_key_lens[type];
+               expected_len = expected_lens[type];
                if (nla_len(nla) != expected_len && expected_len != -1) {
-                       OVS_NLERR("Key attribute has unexpected length (type=%d"
-                                 ", length=%d, expected=%d).\n", type,
-                                 nla_len(nla), expected_len);
+                       OVS_NLERR("%s attribute has unexpected length (type=%d"
+                                 ", length=%d, expected=%d).\n", attr_str,
+                                 type, nla_len(nla), expected_len);
                        return -EINVAL;
                }
 
@@ -323,7 +325,7 @@ static int __parse_flow_nlattrs(const struct nlattr *attr,
                }
        }
        if (rem) {
-               OVS_NLERR("Message has %d unknown bytes.\n", rem);
+               OVS_NLERR("%s message has %d unknown bytes.\n", attr_str, rem);
                return -EINVAL;
        }
 
@@ -334,13 +336,15 @@ static int __parse_flow_nlattrs(const struct nlattr *attr,
 static int parse_flow_mask_nlattrs(const struct nlattr *attr,
                                   const struct nlattr *a[], u64 *attrsp)
 {
-       return __parse_flow_nlattrs(attr, a, attrsp, true);
+       return parse_nlattrs(attr, a, ovs_key_lens, OVS_KEY_ATTR_MAX + 1,
+                            false, "mask", attrsp, true);
 }
 
 static int parse_flow_nlattrs(const struct nlattr *attr,
                              const struct nlattr *a[], u64 *attrsp)
 {
-       return __parse_flow_nlattrs(attr, a, attrsp, false);
+       return parse_nlattrs(attr, a, ovs_key_lens, OVS_KEY_ATTR_MAX + 1,
+                            false, "key", attrsp, false);
 }
 
 static int ipv4_tun_from_nlattr(const struct nlattr *attr,
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to