1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-28 11:55:44 +03:00

Merge pull request #17551 from yuwata/radv-router-lifetime

network: about router lifetime
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2020-11-09 21:07:16 +01:00 committed by GitHub
commit a1b24ee147
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 25 additions and 17 deletions

View File

@ -2254,9 +2254,8 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<varlistentry> <varlistentry>
<term><varname>RouterLifetimeSec=</varname></term> <term><varname>RouterLifetimeSec=</varname></term>
<listitem><para>Takes a timespan. Configures the IPv6 router lifetime in seconds. If set, <listitem><para>Takes a timespan. Configures the IPv6 router lifetime in seconds. When set to
this host also announces itself in Router Advertisements as an IPv6 0, the host is not acting as a router. Defaults to 30 minutes.</para>
router for the network link. When unset, the host is not acting as a router.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -466,14 +466,14 @@ _public_ int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit) {
return 0; return 0;
} }
_public_ int sd_radv_set_router_lifetime(sd_radv *ra, uint32_t router_lifetime) { _public_ int sd_radv_set_router_lifetime(sd_radv *ra, uint16_t router_lifetime) {
assert_return(ra, -EINVAL); assert_return(ra, -EINVAL);
if (ra->state != SD_RADV_STATE_IDLE) if (ra->state != SD_RADV_STATE_IDLE)
return -EBUSY; return -EBUSY;
/* RFC 4191, Section 2.2, "...If the Router Lifetime is zero, the /* RFC 4191, Section 2.2, "...If the Router Lifetime is zero, the preference value MUST be set
preference value MUST be set to (00) by the sender..." */ * to (00) by the sender..." */
if (router_lifetime == 0 && if (router_lifetime == 0 &&
(ra->flags & (0x3 << 3)) != (SD_NDISC_PREFERENCE_MEDIUM << 3)) (ra->flags & (0x3 << 3)) != (SD_NDISC_PREFERENCE_MEDIUM << 3))
return -ETIME; return -ETIME;
@ -506,17 +506,20 @@ _public_ int sd_radv_set_other_information(sd_radv *ra, int other) {
} }
_public_ int sd_radv_set_preference(sd_radv *ra, unsigned preference) { _public_ int sd_radv_set_preference(sd_radv *ra, unsigned preference) {
int r = 0;
assert_return(ra, -EINVAL); assert_return(ra, -EINVAL);
assert_return(IN_SET(preference, assert_return(IN_SET(preference,
SD_NDISC_PREFERENCE_LOW, SD_NDISC_PREFERENCE_LOW,
SD_NDISC_PREFERENCE_MEDIUM, SD_NDISC_PREFERENCE_MEDIUM,
SD_NDISC_PREFERENCE_HIGH), -EINVAL); SD_NDISC_PREFERENCE_HIGH), -EINVAL);
/* RFC 4191, Section 2.2, "...If the Router Lifetime is zero, the preference value MUST be set
* to (00) by the sender..." */
if (ra->lifetime == 0 && preference != SD_NDISC_PREFERENCE_MEDIUM)
return -EINVAL;
ra->flags = (ra->flags & ~(0x3 << 3)) | (preference << 3); ra->flags = (ra->flags & ~(0x3 << 3)) | (preference << 3);
return r; return 0;
} }
_public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) { _public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) {

View File

@ -379,6 +379,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
.dhcp_server_emit_router = true, .dhcp_server_emit_router = true,
.dhcp_server_emit_timezone = true, .dhcp_server_emit_timezone = true,
.router_lifetime_usec = 30 * USEC_PER_MINUTE,
.router_emit_dns = true, .router_emit_dns = true,
.router_emit_domains = true, .router_emit_domains = true,

View File

@ -641,6 +641,7 @@ static bool link_radv_enabled(Link *link) {
} }
int radv_configure(Link *link) { int radv_configure(Link *link) {
uint16_t router_lifetime;
RoutePrefix *q; RoutePrefix *q;
Prefix *p; Prefix *p;
int r; int r;
@ -675,16 +676,20 @@ int radv_configure(Link *link) {
if (r < 0) if (r < 0)
return r; return r;
/* a value of 0xffffffff represents infinity, 0x0 means this host is /* a value of UINT16_MAX represents infinity, 0x0 means this host is not a router */
not a router */ if (link->network->router_lifetime_usec == USEC_INFINITY)
r = sd_radv_set_router_lifetime(link->radv, router_lifetime = UINT16_MAX;
DIV_ROUND_UP(link->network->router_lifetime_usec, USEC_PER_SEC)); else if (link->network->router_lifetime_usec > (UINT16_MAX - 1) * USEC_PER_SEC)
router_lifetime = UINT16_MAX - 1;
else
router_lifetime = DIV_ROUND_UP(link->network->router_lifetime_usec, USEC_PER_SEC);
r = sd_radv_set_router_lifetime(link->radv, router_lifetime);
if (r < 0) if (r < 0)
return r; return r;
if (link->network->router_lifetime_usec > 0) { if (router_lifetime > 0) {
r = sd_radv_set_preference(link->radv, r = sd_radv_set_preference(link->radv, link->network->router_preference);
link->network->router_preference);
if (r < 0) if (r < 0)
return r; return r;
} }

View File

@ -56,7 +56,7 @@ int sd_radv_set_ifindex(sd_radv *ra, int interface_index);
int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr); int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr);
int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu); int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu);
int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit); int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit);
int sd_radv_set_router_lifetime(sd_radv *ra, uint32_t router_lifetime); int sd_radv_set_router_lifetime(sd_radv *ra, uint16_t router_lifetime);
int sd_radv_set_managed_information(sd_radv *ra, int managed); int sd_radv_set_managed_information(sd_radv *ra, int managed);
int sd_radv_set_other_information(sd_radv *ra, int other); int sd_radv_set_other_information(sd_radv *ra, int other);
int sd_radv_set_preference(sd_radv *ra, unsigned preference); int sd_radv_set_preference(sd_radv *ra, unsigned preference);