From 2eab63bff2624d154891c949bd815c1fe7082f60 Mon Sep 17 00:00:00 2001 From: Tobias Jungel Date: Thu, 4 Aug 2016 10:01:43 +0200 Subject: [PATCH 1/2] route/addr: address attributes based on object addr_id_attrs_get returned a fixed set of attributes for AF_INET. This leads to an invalid cache in case the default cache manager is used. The error was cause by nl_object_identical, which checkes the ce_mask of an object against the req_attrs. For route/addr objects the ce_mask may contain the ADDR_ATTR_PEER, but the addr_id_attrs_get always includes this attribute. Thus nl_object_identical fails always in case no peer exists, which is the default for local addresses. Fixes: 83e851ca9c842ccb6dae411d3fff9c7e9561269a https://github.com/thom311/libnl/pull/105 Signed-off-by: Thomas Haller (cherry picked from commit dfaba51b5b2b5ad7e3c4990c2af3f30acbe5f8d9) --- lib/route/addr.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/route/addr.c b/lib/route/addr.c index b699c64..7d3ff39 100644 --- a/lib/route/addr.c +++ b/lib/route/addr.c @@ -467,12 +467,15 @@ static void addr_dump_stats(struct nl_object *obj, struct nl_dump_params *p) static uint32_t addr_id_attrs_get(struct nl_object *obj) { struct rtnl_addr *addr = (struct rtnl_addr *)obj; + uint32_t rv; switch (addr->a_family) { case AF_INET: - return (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX | - ADDR_ATTR_LOCAL | ADDR_ATTR_PREFIXLEN | - ADDR_ATTR_PEER); + rv = (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX | + ADDR_ATTR_LOCAL | ADDR_ATTR_PREFIXLEN); + if (addr->a_peer) + rv |= ADDR_ATTR_PEER; + return rv; case AF_INET6: return (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX | ADDR_ATTR_LOCAL); -- 2.7.4 From f2ac27c8a513eaf6b838796aacf2ec444a2c1227 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 14 Aug 2016 11:05:48 +0200 Subject: [PATCH 2/2] lib: capability NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX for ID comparison of v4 addresses The ID attributes for IPv4 addresses were broken which causes wrong nl_object_identical() and cache lookup. This capability shall indicate that the bug was fixed. Signed-off-by: Thomas Haller (cherry picked from commit 99b1d8acf87bcb35efed49f412d54af682bf1738) --- include/netlink/utils.h | 7 +++++++ lib/utils.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/netlink/utils.h b/include/netlink/utils.h index 3b10340..1115bb4 100644 --- a/include/netlink/utils.h +++ b/include/netlink/utils.h @@ -217,6 +217,13 @@ enum { NL_CAPABILITY_VERSION_3_2_28 = 19, #define NL_CAPABILITY_VERSION_3_2_28 NL_CAPABILITY_VERSION_3_2_28 + /** + * After NL_CAPABILITY_RTNL_ADDR_PEER_FIX, a follow up regression to lookup + * IPv4 addresses in the cache was fixed (PR#105). + */ + NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX = 20, +#define NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX + __NL_CAPABILITY_MAX, NL_CAPABILITY_MAX = (__NL_CAPABILITY_MAX - 1), #define NL_CAPABILITY_MAX NL_CAPABILITY_MAX diff --git a/lib/utils.c b/lib/utils.c index 3399c03..0f2a252 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -1164,7 +1164,7 @@ int nl_has_capability (int capability) NL_CAPABILITY_XFRM_SA_KEY_SIZE, NL_CAPABILITY_RTNL_ADDR_PEER_FIX, NL_CAPABILITY_VERSION_3_2_28, - 0, + NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX, 0, 0, 0, -- 2.7.4