diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index e03c9f29a..d8d243f59 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -5584,6 +5584,7 @@ addrconf6_start (NMDevice *self, NMSettingIP6ConfigPrivacy use_tempaddr) NMConnection *connection; NMActStageReturn ret; NMSettingIP6Config *s_ip6 = NULL; + GError *error = NULL; connection = nm_device_get_applied_connection (self); g_assert (connection); @@ -5600,9 +5601,11 @@ addrconf6_start (NMDevice *self, NMSettingIP6ConfigPrivacy use_tempaddr) priv->rdisc = nm_lndp_rdisc_new (nm_device_get_ip_ifindex (self), nm_device_get_ip_iface (self), nm_connection_get_uuid (connection), - nm_setting_ip6_config_get_addr_gen_mode (s_ip6)); + nm_setting_ip6_config_get_addr_gen_mode (s_ip6), + &error); if (!priv->rdisc) { - _LOGE (LOGD_IP6, "addrconf6: failed to start router discovery"); + _LOGE (LOGD_IP6, "addrconf6: failed to start router discovery: %s", error->message); + g_error_free (error); return FALSE; } diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c index fbe4c6988..069a68f82 100644 --- a/src/nm-iface-helper.c +++ b/src/nm-iface-helper.c @@ -475,7 +475,7 @@ main (int argc, char *argv[]) if (global_opt.slaac) { nm_platform_link_set_user_ipv6ll_enabled (NM_PLATFORM_GET, ifindex, TRUE); - rdisc = nm_lndp_rdisc_new (ifindex, global_opt.ifname, global_opt.uuid, global_opt.addr_gen_mode); + rdisc = nm_lndp_rdisc_new (ifindex, global_opt.ifname, global_opt.uuid, global_opt.addr_gen_mode, NULL); g_assert (rdisc); if (iid) diff --git a/src/rdisc/nm-lndp-rdisc.c b/src/rdisc/nm-lndp-rdisc.c index f0f56abb4..413e1c93f 100644 --- a/src/rdisc/nm-lndp-rdisc.c +++ b/src/rdisc/nm-lndp-rdisc.c @@ -297,11 +297,17 @@ ipv6_sysctl_get (const char *ifname, const char *property, gint32 defval) } NMRDisc * -nm_lndp_rdisc_new (int ifindex, const char *ifname, const char *uuid, NMSettingIP6ConfigAddrGenMode addr_gen_mode) +nm_lndp_rdisc_new (int ifindex, + const char *ifname, + const char *uuid, + NMSettingIP6ConfigAddrGenMode addr_gen_mode, + GError **error) { NMRDisc *rdisc; NMLNDPRDiscPrivate *priv; - int error; + int errsv; + + g_return_val_if_fail (!error || !*error, NULL); rdisc = g_object_new (NM_TYPE_LNDP_RDISC, NULL); @@ -318,9 +324,12 @@ nm_lndp_rdisc_new (int ifindex, const char *ifname, const char *uuid, NMSettingI NM_RDISC_RTR_SOLICITATION_INTERVAL_DEFAULT); priv = NM_LNDP_RDISC_GET_PRIVATE (rdisc); - error = ndp_open (&priv->ndp); - if (error != 0) { - _LOGD ("error creating socket for NDP; errno=%d", -error); + errsv = ndp_open (&priv->ndp); + if (errsv != 0) { + errsv = errsv > 0 ? errsv : -errsv; + g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, + "failure creating libndp socket: %s (%d)", + g_strerror (errsv), errsv); g_object_unref (rdisc); return NULL; } diff --git a/src/rdisc/nm-lndp-rdisc.h b/src/rdisc/nm-lndp-rdisc.h index 4172a3043..e6706e3c3 100644 --- a/src/rdisc/nm-lndp-rdisc.h +++ b/src/rdisc/nm-lndp-rdisc.h @@ -44,6 +44,10 @@ typedef struct { GType nm_lndp_rdisc_get_type (void); -NMRDisc *nm_lndp_rdisc_new (int ifindex, const char *ifname, const char *uuid, NMSettingIP6ConfigAddrGenMode addr_gen_mode); +NMRDisc *nm_lndp_rdisc_new (int ifindex, + const char *ifname, + const char *uuid, + NMSettingIP6ConfigAddrGenMode addr_gen_mode, + GError **error); #endif /* __NETWORKMANAGER_LNDP_RDISC_H__ */ diff --git a/src/rdisc/tests/test-rdisc-linux.c b/src/rdisc/tests/test-rdisc-linux.c index 83de91215..b93c50a77 100644 --- a/src/rdisc/tests/test-rdisc-linux.c +++ b/src/rdisc/tests/test-rdisc-linux.c @@ -41,6 +41,7 @@ main (int argc, char **argv) int ifindex = 1; const char *ifname; NMUtilsIPv6IfaceId iid = { }; + GError *error = NULL; nmtst_init_with_logging (&argc, &argv, NULL, "DEFAULT"); @@ -64,9 +65,11 @@ main (int argc, char **argv) rdisc = nm_lndp_rdisc_new (ifindex, ifname, "8ce666e8-d34d-4fb1-b858-f15a7al28086", - NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64); + NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64, + &error); if (!rdisc) { - g_print ("Failed to create NMRDisc instance\n"); + g_print ("Failed to create NMRDisc instance: %s\n", error->message); + g_error_free (error); return EXIT_FAILURE; }