diff options
author | Thomas Haller <thaller@redhat.com> | 2014-11-26 11:34:55 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2014-11-27 15:57:28 (GMT) |
commit | 3a8d6cfd5616df2122e116c12dc865b16ee97d5e (patch) | |
tree | 581a476d3ece404e25536cbf0a024b4287bb42a2 | |
parent | bf4b042ed1fdd304a541e412970d6757475d5ecc (diff) | |
download | libnl-3a8d6cfd5616df2122e116c12dc865b16ee97d5e.zip libnl-3a8d6cfd5616df2122e116c12dc865b16ee97d5e.tar.gz libnl-3a8d6cfd5616df2122e116c12dc865b16ee97d5e.tar.bz2 |
idiag: fix set of identifying properties for idiag_msg_obj
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>
-rw-r--r-- | lib/idiag/idiag_msg_obj.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/idiag/idiag_msg_obj.c b/lib/idiag/idiag_msg_obj.c index 3be6dfc..d7cf722 100644 --- a/lib/idiag/idiag_msg_obj.c +++ b/lib/idiag/idiag_msg_obj.c @@ -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), }; |