]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
idiag: fix set of identifying properties for idiag_msg_obj
authorThomas Haller <thaller@redhat.com>
Wed, 26 Nov 2014 11:34:55 +0000 (12:34 +0100)
committerThomas Haller <thaller@redhat.com>
Thu, 27 Nov 2014 15:57:28 +0000 (16:57 +0100)
The key for a struct idiag_msg_obj should be
'family x src x dst x sport x dport'.

http://lists.infradead.org/pipermail/libnl/2014-November/001768.html

Signed-off-by: Thomas Haller <thaller@redhat.com>
lib/idiag/idiag_msg_obj.c

index 3be6dfc100193561f1861623fbc23fb8d9cb648c..d7cf7222049e90832733e25f1cd44d9f9551b86a 100644 (file)
@@ -894,21 +894,32 @@ static void idiagnl_keygen(struct nl_object *obj, uint32_t *hashkey,
        unsigned int key_sz;
        struct idiagnl_hash_key {
                uint8_t family;
-               uint8_t state;
+               uint32_t src_hash;
+               uint32_t dst_hash;
                uint16_t sport;
                uint16_t dport;
        } __attribute__((packed)) key;
 
        key_sz = sizeof(key);
        key.family = msg->idiag_family;
-       key.state = msg->idiag_state;
+       key.src_hash = 0;
+       key.dst_hash = 0;
        key.sport = msg->idiag_sport;
        key.dport = msg->idiag_dport;
 
+       if (msg->idiag_src) {
+               key.src_hash = nl_hash (nl_addr_get_binary_addr(msg->idiag_src),
+                                       nl_addr_get_len(msg->idiag_src), 0);
+       }
+       if (msg->idiag_dst) {
+               key.dst_hash = nl_hash (nl_addr_get_binary_addr(msg->idiag_dst),
+                                       nl_addr_get_len(msg->idiag_dst), 0);
+       }
+
        *hashkey = nl_hash(&key, key_sz, 0) % table_sz;
 
-       NL_DBG(5, "idiagnl %p key (fam %d state %d sport %d dport %d) keysz %d, hash 0x%x\n",
-              msg, key.family, key.state, key.sport, key.dport, key_sz, *hashkey);
+       NL_DBG(5, "idiagnl %p key (fam %d src_hash %d dst_hash %d sport %d dport %d) keysz %d, hash 0x%x\n",
+              msg, key.family, key.src_hash, key.dst_hash, key.sport, key.dport, key_sz, *hashkey);
 
        return;
 }
@@ -928,7 +939,8 @@ struct nl_object_ops idiagnl_msg_obj_ops = {
        .oo_keygen                      = idiagnl_keygen,
        .oo_attrs2str                   = _idiagnl_attrs2str,
        .oo_id_attrs                    = (IDIAGNL_ATTR_FAMILY |
-                                          IDIAGNL_ATTR_STATE |
+                                          IDIAGNL_ATTR_SRC |
+                                          IDIAGNL_ATTR_DST |
                                           IDIAGNL_ATTR_SPORT |
                                           IDIAGNL_ATTR_DPORT),
 };