check_attr_len() currently reports all unknown keys as keys with bad
length.  For example, IPv6 extension headers are printed out like this
in flow dumps:

  eth_type(0x86dd),ipv6(...)
  (bad key length 2, expected -1)(00 00/(bad mask length 2, expected -1)(00 00),
  icmpv6(type=0/0,code=0/0)

However, since the key is unknown, the length check on it makes no
sense and should be ignored.  This will allow the unknown key to be
caught later by the format_unknown_key() function and printed in a
more user-friendly way:

  eth_type(0x86dd),ipv6(...),key32(00 00/00 00),icmpv6(type=0/0,code=0/0)

'32' here is the actual index of the key attribute, so we know
that it is unknown attribute #32 with the value/mask pair printed
out inside the parenthesis.

Signed-off-by: Ilya Maximets <[email protected]>
---
 lib/odp-util.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/odp-util.c b/lib/odp-util.c
index 72e076e1c..b173acd7d 100644
--- a/lib/odp-util.c
+++ b/lib/odp-util.c
@@ -3594,9 +3594,16 @@ static bool
 check_attr_len(struct ds *ds, const struct nlattr *a, const struct nlattr *ma,
                const struct attr_len_tbl tbl[], int max_type, bool need_key)
 {
+    uint16_t type = nl_attr_type(a);
     int expected_len;
 
-    expected_len = odp_key_attr_len(tbl, max_type, nl_attr_type(a));
+    if (type > max_type) {
+        /* Unknown attribute, can't check the length. */
+        return true;
+    }
+
+    expected_len = odp_key_attr_len(tbl, max_type, type);
+
     if (expected_len != ATTR_LEN_VARIABLE &&
         expected_len != ATTR_LEN_NESTED) {
 
@@ -3605,7 +3612,7 @@ check_attr_len(struct ds *ds, const struct nlattr *a, 
const struct nlattr *ma,
 
         if (bad_key_len || bad_mask_len) {
             if (need_key) {
-                ds_put_format(ds, "key%u", nl_attr_type(a));
+                ds_put_format(ds, "key%u", type);
             }
             if (bad_key_len) {
                 ds_put_format(ds, "(bad key length %"PRIuSIZE", expected %d)(",
-- 
2.38.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to