From bead44cba8cb487d1dee88a7aff832c418657d64 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 13 Feb 2014 21:31:37 +0100 Subject: [PATCH 1/2] route: rtnl_route_build_msg() should not overwrite the route scope rtnl_route_build_msg() should allow the user to set the route scope explicitly to RT_SCOPE_NOWHERE. This is useful for IPv4 routes, because when deleting a route, the kernel requires the scope to match, unless the scope is set to RT_SCOPE_NOWHERE. Thus by setting the scope to RT_SCOPE_NOWHERE, the user can delete a route, even without knowing its scope. rtnl_route_build_msg() should only try to guess the scope, if it was not explicitly specified. Signed-off-by: Thomas Haller Acked-by: Thomas Graf (cherry picked from commit 85ec9c7ad80c60f4f619472f2bb9d9595da93b26) --- lib/route/route_obj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/route/route_obj.c b/lib/route/route_obj.c index 8f1e515..57b8f23 100644 --- a/lib/route/route_obj.c +++ b/lib/route/route_obj.c @@ -1194,7 +1194,7 @@ int rtnl_route_build_msg(struct nl_msg *msg, struct rtnl_route *route) if (route->rt_src) rtmsg.rtm_src_len = nl_addr_get_prefixlen(route->rt_src); - if (rtmsg.rtm_scope == RT_SCOPE_NOWHERE) + if (!(route->ce_mask & ROUTE_ATTR_SCOPE)) rtmsg.rtm_scope = rtnl_route_guess_scope(route); if (rtnl_route_get_nnexthops(route) == 1) { -- 1.8.5.3 From 5ee88135f410a9630321f10b8a2ea824c88b22ba Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 13 Mar 2014 13:16:51 +0100 Subject: [PATCH 2/2] utils: indicate capability NL_CAPABILITY_ROUTE_BUILD_MSG_SET_SCOPE This capability indicates that libnl does no longer overwrites the route scope in rtnl_route_build_msg(), as fixed by commit 85ec9c7ad80c60f4f619472f2bb9d9595da93b26. Acked-by: Thomas Graf Signed-off-by: Thomas Haller (cherry picked from commit 015c4ee59b786fec35118c2a963532b3e05ba5a2) --- include/netlink/utils.h | 8 ++++++++ lib/utils.c | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/include/netlink/utils.h b/include/netlink/utils.h index da46a55..2094bb4 100644 --- a/include/netlink/utils.h +++ b/include/netlink/utils.h @@ -82,6 +82,14 @@ extern void nl_dump_line(struct nl_dump_params *, const char *, ...); enum { NL_CAPABILITY_NONE, + /** + * rtnl_route_build_msg() no longer guesses the route scope + * if explicitly set to RT_SCOPE_NOWHERE. + * @ingroup utils + */ + NL_CAPABILITY_ROUTE_BUILD_MSG_SET_SCOPE = 1, +#define NL_CAPABILITY_ROUTE_BUILD_MSG_SET_SCOPE NL_CAPABILITY_ROUTE_BUILD_MSG_SET_SCOPE + __NL_CAPABILITY_MAX #define NL_CAPABILITY_MAX (__NL_CAPABILITY_MAX - 1) }; diff --git a/lib/utils.c b/lib/utils.c index 7354956..d7f6724 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -1129,6 +1129,15 @@ int nl_has_capability (int capability) _NL_SETV((i), 1, (v1)) | _NL_SETV((i), 5, (v5)) | \ _NL_SETV((i), 2, (v2)) | _NL_SETV((i), 6, (v6)) | \ _NL_SETV((i), 3, (v3)) | _NL_SETV((i), 7, (v7)) ) + _NL_SET(0, + NL_CAPABILITY_ROUTE_BUILD_MSG_SET_SCOPE, + 0, + 0, + 0, + 0, + 0, + 0, + 0), #undef _NL_SET #undef _NL_SETV #undef _NL_ASSERT -- 1.8.5.3