summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-02-14 16:58:55 +0100
committerThomas Haller <thaller@redhat.com>2020-02-17 14:43:13 +0100
commit9dde86d02c890b3ebaa1874f1721f414ed312774 (patch)
tree4353406a01fbdfd8845b464e9d7e6c4b2ace3984
parent10f0253f2e8e797d03c85b20d9521bbf6eae5849 (diff)
downloadNetworkManager-9dde86d02c890b3ebaa1874f1721f414ed312774.tar.gz
ndisc: implement "ipv6.ra-timeout" property
-rw-r--r--man/NetworkManager.conf.xml4
-rw-r--r--src/devices/nm-device.c23
-rw-r--r--src/ndisc/nm-lndp-ndisc.c2
-rw-r--r--src/ndisc/nm-lndp-ndisc.h1
-rw-r--r--src/ndisc/nm-ndisc.c35
-rw-r--r--src/ndisc/nm-ndisc.h4
-rw-r--r--src/ndisc/tests/test-ndisc-linux.c1
-rw-r--r--src/nm-iface-helper.c8
8 files changed, 69 insertions, 9 deletions
diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml
index 47aa4a2bf5..782f1ab52b 100644
--- a/man/NetworkManager.conf.xml
+++ b/man/NetworkManager.conf.xml
@@ -750,6 +750,10 @@ ipv6.ip6-privacy=0
</para></listitem>
</varlistentry>
<varlistentry>
+ <term><varname>ipv6.ra-timeout</varname></term>
+ <listitem><para>If left unspecified, the default value depends on the sysctl solicitation settings.</para></listitem>
+ </varlistentry>
+ <varlistentry>
<term><varname>ipv6.dhcp-duid</varname></term>
<listitem><para>If left unspecified, it defaults to "lease".</para></listitem>
</varlistentry>
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 744a1df67c..508088d288 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -10159,6 +10159,28 @@ ndisc_node_type (NMDevice *self)
return NM_NDISC_NODE_TYPE_HOST;
}
+static gint32
+get_ra_timeout (NMDevice *self)
+{
+ NMConnection *connection;
+ gint32 timeout;
+
+ G_STATIC_ASSERT_EXPR (NM_RA_TIMEOUT_DEFAULT == 0);
+ G_STATIC_ASSERT_EXPR (NM_RA_TIMEOUT_INFINITY == G_MAXINT32);
+
+ connection = nm_device_get_applied_connection (self);
+
+ timeout = nm_setting_ip6_config_get_ra_timeout (NM_SETTING_IP6_CONFIG (nm_connection_get_setting_ip6_config (connection)));
+ nm_assert (timeout >= 0);
+ if (timeout)
+ return timeout;
+
+ return nm_config_data_get_connection_default_int64 (NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT ("ipv6.ra-timeout"),
+ self,
+ 0, G_MAXINT32, 0);
+}
+
static gboolean
addrconf6_start (NMDevice *self, NMSettingIP6ConfigPrivacy use_tempaddr)
{
@@ -10189,6 +10211,7 @@ addrconf6_start (NMDevice *self, NMSettingIP6ConfigPrivacy use_tempaddr)
stable_id,
nm_setting_ip6_config_get_addr_gen_mode (s_ip6),
ndisc_node_type (self),
+ get_ra_timeout (self),
&error);
if (!priv->ndisc) {
_LOGE (LOGD_IP6, "addrconf6: failed to start neighbor discovery: %s", error->message);
diff --git a/src/ndisc/nm-lndp-ndisc.c b/src/ndisc/nm-lndp-ndisc.c
index 75ab77bfd2..d09ee5257f 100644
--- a/src/ndisc/nm-lndp-ndisc.c
+++ b/src/ndisc/nm-lndp-ndisc.c
@@ -563,6 +563,7 @@ nm_lndp_ndisc_new (NMPlatform *platform,
const char *network_id,
NMSettingIP6ConfigAddrGenMode addr_gen_mode,
NMNDiscNodeType node_type,
+ gint32 ra_timeout,
GError **error)
{
nm_auto_pop_netns NMPNetns *netns = NULL;
@@ -588,6 +589,7 @@ nm_lndp_ndisc_new (NMPlatform *platform,
NM_NDISC_MAX_ADDRESSES, ipv6_sysctl_get (platform, ifname,
"max_addresses",
0, G_MAXINT32, NM_NDISC_MAX_ADDRESSES_DEFAULT),
+ NM_NDISC_RA_TIMEOUT, (int) ra_timeout,
NM_NDISC_ROUTER_SOLICITATIONS, ipv6_sysctl_get (platform, ifname,
"router_solicitations",
1, G_MAXINT32, NM_NDISC_ROUTER_SOLICITATIONS_DEFAULT),
diff --git a/src/ndisc/nm-lndp-ndisc.h b/src/ndisc/nm-lndp-ndisc.h
index 22f21e41a4..82e7b2de16 100644
--- a/src/ndisc/nm-lndp-ndisc.h
+++ b/src/ndisc/nm-lndp-ndisc.h
@@ -28,6 +28,7 @@ NMNDisc *nm_lndp_ndisc_new (NMPlatform *platform,
const char *network_id,
NMSettingIP6ConfigAddrGenMode addr_gen_mode,
NMNDiscNodeType node_type,
+ gint32 ra_timeout,
GError **error);
#endif /* __NETWORKMANAGER_LNDP_NDISC_H__ */
diff --git a/src/ndisc/nm-ndisc.c b/src/ndisc/nm-ndisc.c
index 8ecc12b08e..4007168ba6 100644
--- a/src/ndisc/nm-ndisc.c
+++ b/src/ndisc/nm-ndisc.c
@@ -48,6 +48,7 @@ struct _NMNDiscPrivate {
char *network_id;
NMSettingIP6ConfigAddrGenMode addr_gen_mode;
NMUtilsStableType stable_type;
+ gint32 ra_timeout;
gint32 max_addresses;
gint32 router_solicitations;
gint32 router_solicitation_interval;
@@ -67,6 +68,7 @@ NM_GOBJECT_PROPERTIES_DEFINE_BASE (
PROP_NETWORK_ID,
PROP_ADDR_GEN_MODE,
PROP_MAX_ADDRESSES,
+ PROP_RA_TIMEOUT,
PROP_ROUTER_SOLICITATIONS,
PROP_ROUTER_SOLICITATION_INTERVAL,
PROP_NODE_TYPE,
@@ -907,7 +909,6 @@ nm_ndisc_start (NMNDisc *ndisc)
{
nm_auto_pop_netns NMPNetns *netns = NULL;
NMNDiscPrivate *priv;
- gint64 ra_wait_secs;
g_return_if_fail (NM_IS_NDISC (ndisc));
@@ -928,10 +929,19 @@ nm_ndisc_start (NMNDisc *ndisc)
NM_NDISC_GET_CLASS (ndisc)->start (ndisc);
if (priv->node_type == NM_NDISC_NODE_TYPE_HOST) {
- ra_wait_secs = (((gint64) priv->router_solicitations) * priv->router_solicitation_interval) + 1;
- ra_wait_secs = MAX (ra_wait_secs, 30);
- priv->ra_timeout_id = g_timeout_add_seconds (ra_wait_secs, ndisc_ra_timeout_cb, ndisc);
- _LOGD ("scheduling RA timeout in %d seconds", (int) ra_wait_secs);
+ gint32 ra_timeout = priv->ra_timeout;
+
+ G_STATIC_ASSERT_EXPR (NM_RA_TIMEOUT_DEFAULT == 0);
+ G_STATIC_ASSERT_EXPR (NM_RA_TIMEOUT_INFINITY == G_MAXINT32);
+ if (ra_timeout != NM_RA_TIMEOUT_INFINITY) {
+ if (ra_timeout == NM_RA_TIMEOUT_DEFAULT) {
+ ra_timeout = NM_MAX ((((gint64) priv->router_solicitations) * priv->router_solicitation_interval) + 1,
+ 30);
+ }
+ nm_assert (ra_timeout > 0 && ra_timeout < NM_RA_TIMEOUT_INFINITY);
+ _LOGD ("scheduling RA timeout in %d seconds", ra_timeout);
+ priv->ra_timeout_id = g_timeout_add_seconds (ra_timeout, ndisc_ra_timeout_cb, ndisc);
+ }
solicit_routers (ndisc);
return;
}
@@ -1316,6 +1326,10 @@ set_property (GObject *object, guint prop_id,
/* construct-only */
priv->max_addresses = g_value_get_int (value);
break;
+ case PROP_RA_TIMEOUT:
+ /* construct-only */
+ priv->ra_timeout = g_value_get_int (value);
+ break;
case PROP_ROUTER_SOLICITATIONS:
/* construct-only */
priv->router_solicitations = g_value_get_int (value);
@@ -1407,8 +1421,8 @@ nm_ndisc_class_init (NMNDiscClass *klass)
g_type_class_add_private (klass, sizeof (NMNDiscPrivate));
object_class->set_property = set_property;
- object_class->dispose = dispose;
- object_class->finalize = finalize;
+ object_class->dispose = dispose;
+ object_class->finalize = finalize;
obj_properties[PROP_PLATFORM] =
g_param_spec_object (NM_NDISC_PLATFORM, "", "",
@@ -1452,6 +1466,13 @@ nm_ndisc_class_init (NMNDiscClass *klass)
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
+ G_STATIC_ASSERT_EXPR (G_MAXINT32 == NM_RA_TIMEOUT_INFINITY);
+ obj_properties[PROP_RA_TIMEOUT] =
+ g_param_spec_int (NM_NDISC_RA_TIMEOUT, "", "",
+ 0, G_MAXINT32, 0,
+ G_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
obj_properties[PROP_ROUTER_SOLICITATIONS] =
g_param_spec_int (NM_NDISC_ROUTER_SOLICITATIONS, "", "",
1, G_MAXINT32, NM_NDISC_ROUTER_SOLICITATIONS_DEFAULT,
diff --git a/src/ndisc/nm-ndisc.h b/src/ndisc/nm-ndisc.h
index 4a8e53564d..eeda38e2bf 100644
--- a/src/ndisc/nm-ndisc.h
+++ b/src/ndisc/nm-ndisc.h
@@ -16,6 +16,9 @@
#include "platform/nm-platform.h"
#include "platform/nmp-object.h"
+#define NM_RA_TIMEOUT_DEFAULT ((gint32) 0)
+#define NM_RA_TIMEOUT_INFINITY G_MAXINT32
+
#define NM_TYPE_NDISC (nm_ndisc_get_type ())
#define NM_NDISC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_NDISC, NMNDisc))
#define NM_NDISC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_NDISC, NMNDiscClass))
@@ -31,6 +34,7 @@
#define NM_NDISC_STABLE_TYPE "stable-type"
#define NM_NDISC_NODE_TYPE "node-type"
#define NM_NDISC_MAX_ADDRESSES "max-addresses"
+#define NM_NDISC_RA_TIMEOUT "ra-timeout"
#define NM_NDISC_ROUTER_SOLICITATIONS "router-solicitations"
#define NM_NDISC_ROUTER_SOLICITATION_INTERVAL "router-solicitation-interval"
diff --git a/src/ndisc/tests/test-ndisc-linux.c b/src/ndisc/tests/test-ndisc-linux.c
index e9ceaa2b21..a25478e8d1 100644
--- a/src/ndisc/tests/test-ndisc-linux.c
+++ b/src/ndisc/tests/test-ndisc-linux.c
@@ -52,6 +52,7 @@ main (int argc, char **argv)
"8ce666e8-d34d-4fb1-b858-f15a7al28086",
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NM_NDISC_NODE_TYPE_HOST,
+ 0,
&error);
if (!ndisc) {
g_print ("Failed to create NMNDisc instance: %s\n", error->message);
diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c
index 955debf88e..df70c71b1f 100644
--- a/src/nm-iface-helper.c
+++ b/src/nm-iface-helper.c
@@ -552,10 +552,14 @@ main (int argc, char *argv[])
stable_type = (global_opt.stable_id[0] - '0');
stable_id = &global_opt.stable_id[2];
}
- ndisc = nm_lndp_ndisc_new (NM_PLATFORM_GET, gl.ifindex, global_opt.ifname,
- stable_type, stable_id,
+ ndisc = nm_lndp_ndisc_new (NM_PLATFORM_GET,
+ gl.ifindex,
+ global_opt.ifname,
+ stable_type,
+ stable_id,
global_opt.addr_gen_mode,
NM_NDISC_NODE_TYPE_HOST,
+ NM_RA_TIMEOUT_DEFAULT,
NULL);
g_assert (ndisc);