summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2023-02-17 12:07:05 +0100
committerThomas Haller <thaller@redhat.com>2023-02-28 12:08:07 +0100
commitd755b50808eccbb4ae5e29895c23b4e41837dca1 (patch)
tree917ac85fcd5068a83595e41717a7c471b654e649
parent61388fd9c799ef92363ea73bde886a766157d1f3 (diff)
downloadNetworkManager-d755b50808eccbb4ae5e29895c23b4e41837dca1.tar.gz
platform: return extack message from add address/route operations
-rw-r--r--src/core/nm-netns.c2
-rw-r--r--src/core/platform/nm-fake-platform.c30
-rw-r--r--src/core/platform/tests/test-cleanup.c4
-rw-r--r--src/core/platform/tests/test-common.c6
-rw-r--r--src/core/platform/tests/test-route.c9
-rw-r--r--src/libnm-platform/nm-linux-platform.c20
-rw-r--r--src/libnm-platform/nm-platform.c50
-rw-r--r--src/libnm-platform/nm-platform.h23
-rw-r--r--src/libnm-platform/nmp-global-tracker.c2
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);
}
}