From b8f689ac5388baf9c9b59fba625d21a88efccef4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 25 Feb 2022 21:01:04 +0100 Subject: [PATCH] all: add support for route type "throw" After adding support for "blackhole", "unreachable" and "prohibit" route types, let's also add support for "throw" type. It works basically the same as the other types, so supporting it seems very straight forward. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1124 --- src/core/NetworkManagerUtils.c | 9 +++++++-- src/core/platform/tests/test-platform-general.c | 1 + src/core/platform/tests/test-route.c | 7 +++++-- src/libnm-core-impl/nm-setting-ip-config.c | 4 +++- src/libnm-core-impl/nm-setting-ip4-config.c | 3 ++- src/libnm-core-impl/nm-setting-ip6-config.c | 3 ++- src/libnm-platform/nm-linux-platform.c | 3 ++- src/libnm-platform/nm-platform.h | 6 +++++- 8 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index b7dd104b45..5727aac814 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -1352,8 +1352,13 @@ nm_utils_ip_route_attribute_to_platform(int addr_family, int type; type = nm_net_aux_rtnl_rtntype_a2n(g_variant_get_string(variant, NULL)); - nm_assert( - NM_IN_SET(type, RTN_UNICAST, RTN_LOCAL, RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT)); + nm_assert(NM_IN_SET(type, + RTN_UNICAST, + RTN_LOCAL, + RTN_BLACKHOLE, + RTN_UNREACHABLE, + RTN_PROHIBIT, + RTN_THROW)); r->type_coerced = nm_platform_route_type_coerce(type); } else diff --git a/src/core/platform/tests/test-platform-general.c b/src/core/platform/tests/test-platform-general.c index 6d156d2a87..42e05dadfe 100644 --- a/src/core/platform/tests/test-platform-general.c +++ b/src/core/platform/tests/test-platform-general.c @@ -762,6 +762,7 @@ test_route_type_is_nodev(void) case RTN_BLACKHOLE: case RTN_UNREACHABLE: case RTN_PROHIBIT: + case RTN_THROW: is_nodev = TRUE; break; default: diff --git a/src/core/platform/tests/test-route.c b/src/core/platform/tests/test-route.c index cf0236e0e6..e39b17e2cb 100644 --- a/src/core/platform/tests/test-route.c +++ b/src/core/platform/tests/test-route.c @@ -1899,14 +1899,17 @@ test_blackhole(gconstpointer test_data) NMPlatformIPXRoute rr = {}; int r = -1; int i; + guint8 rtn_type; + + rtn_type = nmtst_rand_select(RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT, RTN_THROW); if (IS_IPv4) { rr.r4 = (const NMPlatformIP4Route){ - .type_coerced = nmtst_rand_select(RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT), + .type_coerced = nm_platform_route_type_coerce(rtn_type), }; } else { rr.r6 = (const NMPlatformIP6Route){ - .type_coerced = nmtst_rand_select(RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT), + .type_coerced = nm_platform_route_type_coerce(rtn_type), .metric = 1000, }; } diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index 46824819dd..cffd5b19ff 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -1390,7 +1390,8 @@ _ip_route_attribute_validate(const char *name, RTN_LOCAL, RTN_BLACKHOLE, RTN_UNREACHABLE, - RTN_PROHIBIT)) { + RTN_PROHIBIT, + RTN_THROW)) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -1494,6 +1495,7 @@ _nm_ip_route_attribute_validate_all(const NMIPRoute *route, GError **error) case RTN_BLACKHOLE: case RTN_UNREACHABLE: case RTN_PROHIBIT: + case RTN_THROW: if (route->next_hop) { g_set_error(error, NM_CONNECTION_ERROR, diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c index 5b06739c11..bf5551684b 100644 --- a/src/libnm-core-impl/nm-setting-ip4-config.c +++ b/src/libnm-core-impl/nm-setting-ip4-config.c @@ -1006,7 +1006,8 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) * * * "type" - one of unicast, local, blackhole, - * unavailable, prohibit. The default is unicast. + * unavailable, prohibit, throw. + * The default is unicast. * * * "window" - an unsigned 32 bit integer. diff --git a/src/libnm-core-impl/nm-setting-ip6-config.c b/src/libnm-core-impl/nm-setting-ip6-config.c index f4623b2819..01956c3bb1 100644 --- a/src/libnm-core-impl/nm-setting-ip6-config.c +++ b/src/libnm-core-impl/nm-setting-ip6-config.c @@ -1042,7 +1042,8 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) * * * "type" - one of unicast, local, blackhole, - * unavailable, prohibit. The default is unicast. + * unavailable, prohibit, throw. + * The default is unicast. * * * "window" - an unsigned 32 bit integer. diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index e3cc7a4dbc..19a661b9f7 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -3455,7 +3455,8 @@ _new_from_nl_route(struct nlmsghdr *nlh, gboolean id_only, ParseNlmsgIter *parse RTN_LOCAL, RTN_BLACKHOLE, RTN_UNREACHABLE, - RTN_PROHIBIT)) + RTN_PROHIBIT, + RTN_THROW)) return NULL; if (nlmsg_parse_arr(nlh, sizeof(struct rtmsg), tb, policy) < 0) diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index 0882f240e3..8965336045 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -1411,7 +1411,11 @@ _nm_platform_link_get_inet6_addr_gen_mode(const NMPlatformLink *pllink) static inline gboolean nm_platform_route_type_is_nodev(guint8 type) { - return NM_IN_SET(type, 6 /* RTN_BLACKHOLE */, 7 /* RTN_UNREACHABLE */, 8 /* RTN_PROHIBIT */); + return NM_IN_SET(type, + 6 /* RTN_BLACKHOLE */, + 7 /* RTN_UNREACHABLE */, + 8 /* RTN_PROHIBIT */, + 9 /* RTN_THROW */); } /**