diff options
author | Thomas Haller <thaller@redhat.com> | 2023-02-17 12:07:05 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2023-02-28 12:08:07 +0100 |
commit | d755b50808eccbb4ae5e29895c23b4e41837dca1 (patch) | |
tree | 917ac85fcd5068a83595e41717a7c471b654e649 | |
parent | 61388fd9c799ef92363ea73bde886a766157d1f3 (diff) | |
download | NetworkManager-d755b50808eccbb4ae5e29895c23b4e41837dca1.tar.gz |
platform: return extack message from add address/route operations
-rw-r--r-- | src/core/nm-netns.c | 2 | ||||
-rw-r--r-- | src/core/platform/nm-fake-platform.c | 30 | ||||
-rw-r--r-- | src/core/platform/tests/test-cleanup.c | 4 | ||||
-rw-r--r-- | src/core/platform/tests/test-common.c | 6 | ||||
-rw-r--r-- | src/core/platform/tests/test-route.c | 9 | ||||
-rw-r--r-- | src/libnm-platform/nm-linux-platform.c | 20 | ||||
-rw-r--r-- | src/libnm-platform/nm-platform.c | 50 | ||||
-rw-r--r-- | src/libnm-platform/nm-platform.h | 23 | ||||
-rw-r--r-- | src/libnm-platform/nmp-global-tracker.c | 2 |
9 files changed, 100 insertions, 46 deletions
diff --git a/src/core/nm-netns.c b/src/core/nm-netns.c index 12ca850898..dfdaaa06c7 100644 --- a/src/core/nm-netns.c +++ b/src/core/nm-netns.c @@ -815,7 +815,7 @@ nm_netns_ip_route_ecmp_commit(NMNetns *self, if (changed || is_reapply) { _LOGT("ecmp-route: multi-hop %s", nmp_object_to_string(route_obj, NMP_OBJECT_TO_STRING_PUBLIC, sbuf, sizeof(sbuf))); - nm_platform_ip_route_add(priv->platform, NMP_NLM_FLAG_APPEND, route_obj); + nm_platform_ip_route_add(priv->platform, NMP_NLM_FLAG_APPEND, route_obj, NULL); } } } diff --git a/src/core/platform/nm-fake-platform.c b/src/core/platform/nm-fake-platform.c index c92d9aef56..c5ecd90ddf 100644 --- a/src/core/platform/nm-fake-platform.c +++ b/src/core/platform/nm-fake-platform.c @@ -102,7 +102,9 @@ static gboolean ip6_address_add(NMPlatform *platform, struct in6_addr peer_addr, guint32 lifetime, guint32 preferred, - guint flags); + guint flags, + char **out_extack_msg); + static gboolean ip6_address_delete(NMPlatform *platform, int ifindex, struct in6_addr addr, guint8 plen); @@ -542,7 +544,7 @@ link_changed(NMPlatform *platform, nm_platform_cache_update_emit_signal(platform, cache_op, obj_old, device->obj); if (!IN6_IS_ADDR_UNSPECIFIED(&device->ip6_lladdr)) { - if (device->obj->link.connected) + if (device->obj->link.connected) { ip6_address_add(platform, device->obj->link.ifindex, device->ip6_lladdr, @@ -550,8 +552,9 @@ link_changed(NMPlatform *platform, in6addr_any, NM_PLATFORM_LIFETIME_PERMANENT, NM_PLATFORM_LIFETIME_PERMANENT, - 0); - else + 0, + NULL); + } else ip6_address_delete(platform, device->obj->link.ifindex, device->ip6_lladdr, 64); } @@ -865,7 +868,10 @@ mesh_set_ssid(NMPlatform *platform, int ifindex, const guint8 *ssid, gsize len) /*****************************************************************************/ static gboolean -ipx_address_add(NMPlatform *platform, int addr_family, const NMPlatformObject *address) +ipx_address_add(NMPlatform *platform, + int addr_family, + const NMPlatformObject *address, + char **out_extack_msg) { nm_auto_nmpobj NMPObject *obj = NULL; NMPCacheOpsType cache_op; @@ -874,6 +880,7 @@ ipx_address_add(NMPlatform *platform, int addr_family, const NMPlatformObject *a NMPCache *cache = nm_platform_get_cache(platform); g_assert(NM_IN_SET(addr_family, AF_INET, AF_INET6)); + g_assert(!out_extack_msg || !*out_extack_msg); obj = nmp_object_new(addr_family == AF_INET ? NMP_OBJECT_TYPE_IP4_ADDRESS : NMP_OBJECT_TYPE_IP6_ADDRESS, @@ -894,7 +901,8 @@ ip4_address_add(NMPlatform *platform, guint32 lifetime, guint32 preferred, guint32 flags, - const char *label) + const char *label, + char **out_extack_msg) { NMPlatformIP4Address address; @@ -914,7 +922,7 @@ ip4_address_add(NMPlatform *platform, if (label) g_strlcpy(address.label, label, sizeof(address.label)); - return ipx_address_add(platform, AF_INET, (const NMPlatformObject *) &address); + return ipx_address_add(platform, AF_INET, (const NMPlatformObject *) &address, out_extack_msg); } static gboolean @@ -925,7 +933,8 @@ ip6_address_add(NMPlatform *platform, struct in6_addr peer_addr, guint32 lifetime, guint32 preferred, - guint32 flags) + guint32 flags, + char **out_extack_msg) { NMPlatformIP6Address address; @@ -942,7 +951,7 @@ ip6_address_add(NMPlatform *platform, address.preferred = preferred; address.n_ifa_flags = flags; - return ipx_address_add(platform, AF_INET6, (const NMPlatformObject *) &address); + return ipx_address_add(platform, AF_INET6, (const NMPlatformObject *) &address, out_extack_msg); } static gboolean @@ -1092,7 +1101,7 @@ object_delete(NMPlatform *platform, const NMPObject *obj) } static int -ip_route_add(NMPlatform *platform, NMPNlmFlags flags, NMPObject *obj_stack) +ip_route_add(NMPlatform *platform, NMPNlmFlags flags, NMPObject *obj_stack, char **out_extack_msg) { NMDedupMultiIter iter; nm_auto_nmpobj NMPObject *obj = NULL; @@ -1114,6 +1123,7 @@ ip_route_add(NMPlatform *platform, NMPNlmFlags flags, NMPObject *obj_stack) g_assert(NM_IN_SET(NMP_OBJECT_GET_TYPE(obj_stack), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)); + g_assert(!out_extack_msg || !*out_extack_msg); addr_family = NMP_OBJECT_GET_ADDR_FAMILY(obj_stack); diff --git a/src/core/platform/tests/test-cleanup.c b/src/core/platform/tests/test-cleanup.c index 139a028001..c643e71c4a 100644 --- a/src/core/platform/tests/test-cleanup.c +++ b/src/core/platform/tests/test-cleanup.c @@ -77,6 +77,7 @@ test_cleanup_internal(void) lifetime, preferred, 0, + NULL, NULL)); g_assert(nm_platform_ip6_address_add(NM_PLATFORM_GET, ifindex, @@ -85,7 +86,8 @@ test_cleanup_internal(void) in6addr_any, lifetime, preferred, - flags)); + flags, + NULL)); nmtstp_ip4_route_add(NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, diff --git a/src/core/platform/tests/test-common.c b/src/core/platform/tests/test-common.c index a37982fc69..5a39d3aaf7 100644 --- a/src/core/platform/tests/test-common.c +++ b/src/core/platform/tests/test-common.c @@ -1809,7 +1809,8 @@ _ip_address_add(NMPlatform *platform, lifetime, preferred, flags, - label); + label, + NULL); } else { g_assert(label == NULL); success = nm_platform_ip6_address_add(platform, @@ -1819,7 +1820,8 @@ _ip_address_add(NMPlatform *platform, peer_address->addr6, lifetime, preferred, - flags); + flags, + NULL); } g_assert(success); } diff --git a/src/core/platform/tests/test-route.c b/src/core/platform/tests/test-route.c index bd8fdc271c..9aa21a9ac6 100644 --- a/src/core/platform/tests/test-route.c +++ b/src/core/platform/tests/test-route.c @@ -421,7 +421,8 @@ test_ip6_route(void) in6addr_any, NM_PLATFORM_LIFETIME_PERMANENT, NM_PLATFORM_LIFETIME_PERMANENT, - 0)); + 0, + NULL)); accept_signals(route_added, 0, 3); _wait_for_ipv6_addr_non_tentative(NM_PLATFORM_GET, 200, ifindex, 1, &pref_src); @@ -706,7 +707,8 @@ test_ip4_route_options(gconstpointer test_data) a->lifetime, a->preferred, a->n_ifa_flags, - a->label)); + a->label, + NULL)); if (a->peer_address == a->address) _wait_for_ipv4_addr_device_route(NM_PLATFORM_GET, 200, a->ifindex, a->address, a->plen); } @@ -878,7 +880,8 @@ test_ip6_route_options(gconstpointer test_data) addr[i].peer_address, addr[i].lifetime, addr[i].preferred, - addr[i].n_ifa_flags)); + addr[i].n_ifa_flags, + NULL)); } _wait_for_ipv6_addr_non_tentative(NM_PLATFORM_GET, 400, IFINDEX, addr_n, addr_in6); diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index 9a671d0856..cf47fb35ee 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -8041,7 +8041,8 @@ static int do_add_addrroute(NMPlatform *platform, const NMPObject *obj_id, struct nl_msg *nlmsg, - gboolean suppress_netlink_failure) + gboolean suppress_netlink_failure, + char **out_extack_msg) { char sbuf1[NM_UTILS_TO_STRING_BUFFER_SIZE]; WaitForNlResponseResult seq_result = WAIT_FOR_NL_RESPONSE_RESULT_UNKNOWN; @@ -8049,6 +8050,7 @@ do_add_addrroute(NMPlatform *platform, int nle; char s_buf[256]; + nm_assert(!out_extack_msg || !*out_extack_msg); nm_assert(NM_IN_SET(NMP_OBJECT_GET_TYPE(obj_id), NMP_OBJECT_TYPE_IP4_ADDRESS, NMP_OBJECT_TYPE_IP6_ADDRESS, @@ -8064,6 +8066,7 @@ do_add_addrroute(NMPlatform *platform, nmp_object_to_string(obj_id, NMP_OBJECT_TO_STRING_ID, sbuf1, sizeof(sbuf1)), nm_strerror(nle), -nle); + NM_SET_OUT(out_extack_msg, g_steal_pointer(&extack_msg)); return -NME_PL_NETLINK; } @@ -9489,7 +9492,8 @@ ip4_address_add(NMPlatform *platform, guint32 lifetime, guint32 preferred, guint32 flags, - const char *label) + const char *label, + char **out_extack_msg) { NMPObject obj_id; nm_auto_nlmsg struct nl_msg *nlmsg = NULL; @@ -9509,7 +9513,7 @@ ip4_address_add(NMPlatform *platform, label); nmp_object_stackinit_id_ip4_address(&obj_id, ifindex, addr, plen, peer_addr); - return (do_add_addrroute(platform, &obj_id, nlmsg, FALSE) >= 0); + return (do_add_addrroute(platform, &obj_id, nlmsg, FALSE, out_extack_msg) >= 0); } static gboolean @@ -9520,7 +9524,8 @@ ip6_address_add(NMPlatform *platform, struct in6_addr peer_addr, guint32 lifetime, guint32 preferred, - guint32 flags) + guint32 flags, + char **out_extack_msg) { NMPObject obj_id; nm_auto_nlmsg struct nl_msg *nlmsg = NULL; @@ -9540,7 +9545,7 @@ ip6_address_add(NMPlatform *platform, NULL); nmp_object_stackinit_id_ip6_address(&obj_id, ifindex, &addr); - return (do_add_addrroute(platform, &obj_id, nlmsg, FALSE) >= 0); + return (do_add_addrroute(platform, &obj_id, nlmsg, FALSE, out_extack_msg) >= 0); } static gboolean @@ -9602,7 +9607,7 @@ ip6_address_delete(NMPlatform *platform, int ifindex, struct in6_addr addr, guin /*****************************************************************************/ static int -ip_route_add(NMPlatform *platform, NMPNlmFlags flags, NMPObject *obj_stack) +ip_route_add(NMPlatform *platform, NMPNlmFlags flags, NMPObject *obj_stack, char **out_extack_msg) { nm_auto_nlmsg struct nl_msg *nlmsg = NULL; @@ -9612,7 +9617,8 @@ ip_route_add(NMPlatform *platform, NMPNlmFlags flags, NMPObject *obj_stack) return do_add_addrroute(platform, obj_stack, nlmsg, - NM_FLAGS_HAS(flags, NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE)); + NM_FLAGS_HAS(flags, NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE), + out_extack_msg); } static gboolean diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c index c80d964851..c4cd61cf47 100644 --- a/src/libnm-platform/nm-platform.c +++ b/src/libnm-platform/nm-platform.c @@ -3559,7 +3559,8 @@ nm_platform_ip4_address_add(NMPlatform *self, guint32 lifetime, guint32 preferred, guint32 flags, - const char *label) + const char *label, + char **out_extack_msg) { _CHECK_SELF(self, klass, FALSE); @@ -3569,6 +3570,7 @@ nm_platform_ip4_address_add(NMPlatform *self, g_return_val_if_fail(preferred <= lifetime, FALSE); g_return_val_if_fail(!label || strlen(label) < sizeof(((NMPlatformIP4Address *) NULL)->label), FALSE); + nm_assert(!out_extack_msg || !*out_extack_msg); if (_LOGD_ENABLED()) { char sbuf[NM_UTILS_TO_STRING_BUFFER_SIZE]; @@ -3601,7 +3603,8 @@ nm_platform_ip4_address_add(NMPlatform *self, lifetime, preferred, flags, - label); + label, + out_extack_msg); } gboolean @@ -3612,7 +3615,8 @@ nm_platform_ip6_address_add(NMPlatform *self, struct in6_addr peer_address, guint32 lifetime, guint32 preferred, - guint32 flags) + guint32 flags, + char **out_extack_msg) { _CHECK_SELF(self, klass, FALSE); @@ -3620,6 +3624,7 @@ nm_platform_ip6_address_add(NMPlatform *self, g_return_val_if_fail(plen <= 128, FALSE); g_return_val_if_fail(lifetime > 0, FALSE); g_return_val_if_fail(preferred <= lifetime, FALSE); + nm_assert(!out_extack_msg || !*out_extack_msg); if (_LOGD_ENABLED()) { char sbuf[NM_UTILS_TO_STRING_BUFFER_SIZE]; @@ -3640,8 +3645,15 @@ nm_platform_ip6_address_add(NMPlatform *self, nm_platform_ip6_dadfailed_set(self, ifindex, &address, FALSE); - return klass - ->ip6_address_add(self, ifindex, address, plen, peer_address, lifetime, preferred, flags); + return klass->ip6_address_add(self, + ifindex, + address, + plen, + peer_address, + lifetime, + preferred, + flags, + out_extack_msg); } gboolean @@ -4464,7 +4476,8 @@ next_plat:; NM_FLAGS_HAS(flags, NMP_IP_ADDRESS_SYNC_FLAGS_WITH_NOPREFIXROUTE) ? IFA_F_NOPREFIXROUTE : 0, - known_address->a4.label)) + known_address->a4.label, + NULL)) success = FALSE; } else { if (!nm_platform_ip6_address_add( @@ -4478,7 +4491,8 @@ next_plat:; (NM_FLAGS_HAS(flags, NMP_IP_ADDRESS_SYNC_FLAGS_WITH_NOPREFIXROUTE) ? IFA_F_NOPREFIXROUTE : 0) - | known_address->a6.n_ifa_flags)) + | known_address->a6.n_ifa_flags, + NULL)) success = FALSE; } } @@ -4975,7 +4989,8 @@ sync_route_add: r = nm_platform_ip_route_add(self, NMP_NLM_FLAG_APPEND | NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE, - conf_o); + conf_o, + NULL); if (r < 0) { if (r == -EEXIST) { /* Don't fail for EEXIST. It's not clear that the existing route @@ -5085,7 +5100,8 @@ sync_route_add: r2 = nm_platform_ip_route_add(self, NMP_NLM_FLAG_APPEND | NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE, - &oo); + &oo, + NULL); if (r2 < 0) { _LOG3D("route-sync: failure to add gateway IPv%c route: %s: %s", @@ -5250,7 +5266,7 @@ nm_platform_ip_route_normalize(int addr_family, NMPlatformIPRoute *route) } static int -_ip_route_add(NMPlatform *self, NMPNlmFlags flags, NMPObject *obj_stack) +_ip_route_add(NMPlatform *self, NMPNlmFlags flags, NMPObject *obj_stack, char **out_extack_msg) { char sbuf[NM_UTILS_TO_STRING_BUFFER_SIZE]; int ifindex; @@ -5266,6 +5282,7 @@ _ip_route_add(NMPlatform *self, NMPNlmFlags flags, NMPObject *obj_stack) nm_assert(NM_IN_SET(NMP_OBJECT_GET_TYPE(obj_stack), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)); + nm_assert(!out_extack_msg || !*out_extack_msg); nm_assert(NMP_OBJECT_GET_TYPE(obj_stack) != NMP_OBJECT_TYPE_IP4_ROUTE || obj_stack->ip4_route.n_nexthops <= 1u || obj_stack->_ip4_route.extra_nexthops); @@ -5287,11 +5304,14 @@ _ip_route_add(NMPlatform *self, NMPNlmFlags flags, NMPObject *obj_stack) * is stack allocated (and the potential "extra_nexthops" array is * guaranteed to stay alive too). */ - return klass->ip_route_add(self, flags, obj_stack); + return klass->ip_route_add(self, flags, obj_stack, out_extack_msg); } int -nm_platform_ip_route_add(NMPlatform *self, NMPNlmFlags flags, const NMPObject *obj) +nm_platform_ip_route_add(NMPlatform *self, + NMPNlmFlags flags, + const NMPObject *obj, + char **out_extack_msg) { nm_auto_nmpobj const NMPObject *obj_keep_alive = NULL; NMPObject obj_stack; @@ -5309,7 +5329,7 @@ nm_platform_ip_route_add(NMPlatform *self, NMPNlmFlags flags, const NMPObject *o obj_stack._ip4_route.extra_nexthops = obj->_ip4_route.extra_nexthops; } - return _ip_route_add(self, flags, &obj_stack); + return _ip_route_add(self, flags, &obj_stack, out_extack_msg); } int @@ -5341,7 +5361,7 @@ nm_platform_ip4_route_add(NMPlatform *self, &extra_nexthops_free); } - return _ip_route_add(self, flags, &obj); + return _ip_route_add(self, flags, &obj, NULL); } int @@ -5350,7 +5370,7 @@ nm_platform_ip6_route_add(NMPlatform *self, NMPNlmFlags flags, const NMPlatformI NMPObject obj; nmp_object_stackinit(&obj, NMP_OBJECT_TYPE_IP6_ROUTE, (const NMPlatformObject *) route); - return _ip_route_add(self, flags, &obj); + return _ip_route_add(self, flags, &obj, NULL); } gboolean diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index 1cd9c6c6f9..39f8edabd8 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -1215,7 +1215,8 @@ typedef struct { guint32 lifetime, guint32 preferred_lft, guint32 flags, - const char *label); + const char *label, + char **out_extack_msg); gboolean (*ip6_address_add)(NMPlatform *self, int ifindex, struct in6_addr address, @@ -1223,7 +1224,8 @@ typedef struct { struct in6_addr peer_address, guint32 lifetime, guint32 preferred_lft, - guint32 flags); + guint32 flags, + char **out_extack_msg); gboolean (*ip4_address_delete)(NMPlatform *self, int ifindex, in_addr_t address, @@ -1234,7 +1236,11 @@ typedef struct { struct in6_addr address, guint8 plen); - int (*ip_route_add)(NMPlatform *self, NMPNlmFlags flags, NMPObject *obj_stack); + int (*ip_route_add)(NMPlatform *self, + NMPNlmFlags flags, + NMPObject *obj_stack, + char **out_extack_msg); + int (*ip_route_get)(NMPlatform *self, int addr_family, gconstpointer address, @@ -2130,7 +2136,8 @@ gboolean nm_platform_ip4_address_add(NMPlatform *self, guint32 lifetime, guint32 preferred_lft, guint32 flags, - const char *label); + const char *label, + char **out_extack_msg); gboolean nm_platform_ip6_address_add(NMPlatform *self, int ifindex, struct in6_addr address, @@ -2138,7 +2145,8 @@ gboolean nm_platform_ip6_address_add(NMPlatform *self, struct in6_addr peer_address, guint32 lifetime, guint32 preferred_lft, - guint32 flags); + guint32 flags, + char **out_extack_msg); gboolean nm_platform_ip4_address_delete(NMPlatform *self, int ifindex, in_addr_t address, @@ -2251,7 +2259,10 @@ nm_platform_ip_route_get_gateway(int addr_family, const NMPlatformIPRoute *route return &((NMPlatformIP6Route *) route)->gateway; } -int nm_platform_ip_route_add(NMPlatform *self, NMPNlmFlags flags, const NMPObject *route); +int nm_platform_ip_route_add(NMPlatform *self, + NMPNlmFlags flags, + const NMPObject *route, + char **out_extack_msg); int nm_platform_ip4_route_add(NMPlatform *self, NMPNlmFlags flags, const NMPlatformIP4Route *route, diff --git a/src/libnm-platform/nmp-global-tracker.c b/src/libnm-platform/nmp-global-tracker.c index 3fd31e4e14..8f36c124ef 100644 --- a/src/libnm-platform/nmp-global-tracker.c +++ b/src/libnm-platform/nmp-global-tracker.c @@ -1101,7 +1101,7 @@ nmp_global_tracker_sync(NMPGlobalTracker *self, NMPObjectType obj_type, gboolean NMP_NLM_FLAG_ADD, NMP_OBJECT_CAST_ROUTING_RULE(obj_data->obj)); } else - nm_platform_ip_route_add(self->platform, NMP_NLM_FLAG_APPEND, obj_data->obj); + nm_platform_ip_route_add(self->platform, NMP_NLM_FLAG_APPEND, obj_data->obj, NULL); } } |