Commit Graph
277 Commits
Author SHA1 Message Date
Matt Muggeridge d4c8de21a0 IPv6 RA: Support the Retrans Timer field (IPv6 Conformance Test: v6LC.2.1.5)
The RA's Retransmission Timer field was being ignored. This resolves the IPv6
Core Conformance test, v6LC.2.1.5 [1].

Retransmission Timer is a 32-bit unsigned integer. The time, in milliseconds,
between retransmitted Neighbor Solicitation messages. Used by the Address
Resolution and Neighbor Unreachability Detection (NUD) algorithm.

Support setting a default value for the neighbour retransmission timer value with:

    [Network]
    IPv6RetransmissionTimeSec=<int>

By default, upon receiving a Router Advertisement with the Retransmission Timer
field set to a non-zero value, it will update the kernel's retransmit timer value.
To disable this behaviour, configure the UseIPv6RetransmissionTime= under the
[IPv6AcceptRA] section.

    [IPv6AcceptRA]
    UseIPv6RetransmissionTime=<bool>

RFC4861: Neighbor Discovery in IPv6
  * Section 4.2 RA Message Format.
  * Section 6.3.4 Processing Received Router Advertisements

A Router Advertisement field (e.g., Cur Hop Limit, Reachable Time,
and Retrans Timer) may contain a value denoting that it is
unspecified. In such cases, the parameter should be ignored and the
host should continue using whatever value it is already using. In
particular, a host MUST NOT interpret the unspecified value as
meaning change back to the default value that was in use before the
first Router Advertisement was received.

The RetransTimer variable SHOULD be copied from the Retrans Timer
field, if the received value is non-zero.

References
[1] IPv6 Core Conformance Spec (PDF)
2024-01-23 03:18:01 +09:00
Yu Watanabe e217da1380 network/route: drop unnecessary ownership transfer
Let's free Route objects on the caller side.
2024-01-19 19:20:29 +09:00
Yu Watanabe 5a18697d61 network/route: convert route before requesting
Previously,
1. use the passed Route object as is when a route is requested,
2. when the route becomes ready to configure, convert the Route object
   if necessary, to resolve outgoing interface name, and split multipath
   routes, and save them to the associated interfaces,
3. configure the route with the passed Route object.

However, there are several inconsistencies with what kernel does:
- The kernel does not merge nor split IPv4 multipath routes. However, we
  unconditionally split multipath routes to manage.
- The kernel does not set gateway or so to a route if it has nexthop ID.

Fortunately, I do not find any issues caused by the inconsistencies. But
for safety, let's manage routes in a consistent way with the kernel.

This makes,
1. when a route is requested, split IPv6 multipath routes, but keep IPv4
   multipath routes as is, and queue (possibly multiple) requests for
   the route.
2. when the route becomes ready to configure, resolve nexthop and interface
   name, and requeue request if necessary.
3. configure the (possibly split) route.

By using the logic,
- Now we manage routes in a mostly consistent way with the kernel.
- We can drop ConvertedRoutes object.
- Hopefully the code becomes much simpler.
2024-01-19 19:20:29 +09:00
Yu Watanabe 2f542fc3d4 network: adjust nexthops of dynamic routes before requesting
No effective functionality is changed. Preparation for later commits.
2024-01-19 10:23:14 +09:00
Yu Watanabe 413ea20ab3 network/route-nexthop: introduce route_nexthops_copy()
This also introduce an extra argument for route_dup(), but it is
currently unused, will be used later.

No functional change, just preparation for later commits.
2024-01-19 10:21:55 +09:00
Yu Watanabe 054b8c2817 network/route: also use RouteNextHop for managing gateway
No functional change, just refactoring.
2024-01-15 10:28:25 +09:00
Luca Boccassi f60c964535 Merge pull request #30897 from yuwata/network-route-expiration
network: several cleanups for route expiration handling
2024-01-12 23:32:12 +00:00
Yu Watanabe be89a76a46 network/ndisc: do not try to set too large value for ICMP ratelimting
Follow-up for 6197db53ba.

When we set too large value, the kernel just refuse it. So, this does
not change the net behavior.

Prompted by https://github.com/systemd/systemd/pull/30490#discussion_r1449477125.
2024-01-12 14:38:30 +00:00
Yu Watanabe 2c0b49baab network/route: update expiration timer only when we know the route exists 2024-01-12 09:46:09 +09:00
Luca Boccassi d6b39152a9 Merge pull request #30717 from yuwata/network-ref-unref
network: introduce address_ref() and friends
2024-01-10 19:34:48 +00:00
Yu Watanabe ebf4fa1e82 network/route-metric: manage uint32_t RTAX_XYZ attributes in the same way
Except for RTAX_CC_ALGO, all RTAX_XYZ attributes take uint32_t and
the kernel's default value is zero. So, let's unify handling of the
attributes.

This should not change any effective behavior. Just refactoring.
2024-01-07 14:04:00 +09:00
Yu Watanabe d32a520b09 network/route-metric: introduce RouteMetric
Then, split out route metric handling from networkd-route.c to
networkd-route-metric.c.

No functional change, just refactoring and preparation for later
commits.
2024-01-07 14:04:00 +09:00
Yu Watanabe ebd9690647 network/address: introduce ref/unref functions for Address object
Then, Address object can live if it is detached from the owner (Link or
Network object).
2024-01-04 04:58:36 +09:00
Yu Watanabe f22b586a21 network/address: introduce address_remove_and_cancel()
Then, replace address_remove_and_drop() with it.

If an address is requested, and the request is already called,
we may not received its reply and notification from the kernel, and
the corresponding address object may not be remmbered. Even in such
case, we need to remove the address, otherwise the address will come
later after the function called.
2024-01-03 04:43:34 +09:00
Yu Watanabe fe3fcb9492 Merge pull request #30633 from mrc0mmand/cocci-shenanigans
coccinelle: rework how we run the Coccinelle transformations
2023-12-26 05:45:58 +09:00
Frantisek Sumsal 4b68f70829 network: ENOTSUP -> EOPNOTSUPP 2023-12-25 18:26:59 +01:00
Yu Watanabe 372acaad58 network: use RET_GATHER() macro 2023-12-25 22:02:14 +08:00
Yu Watanabe c01a5c0527 siphash24: introduce siphash24_compress_typesafe() macro
To prevent copy-and-paste mistake.

This also introduce in_addr_hash_func().

No functional change, just refactoring.
2023-12-25 15:38:59 +09:00
Yu Watanabe 39713b075f network: fix indentation
Follow-up for f141b2c053.
2023-11-06 15:53:01 +09:00
Yu Watanabe 93e583aaba Revert "ndisc: Also set link hoplimit"
This reverts commit 0ba8374bb8.

- link->network->ipv6_hop_limit must not be updated, as it may be used
  by multiple interfaces,
- We may receive multiple RA from multiple routers with different hop
  limit, and we should not make the default hop limit flicking,
- First of all, there is no reason that we need to update the default hop
  limit,
- The original issue should be caused by the hash and compare functions
  for Route object.
2023-11-06 15:33:10 +09:00
Susant Sahani 0ba8374bb8 ndisc: Also set link hoplimit
The per route hop limit does not place the hop limit in the IPv6 header.
https://github.com/systemd/systemd/issues/28437#issuecomment-1711055181
2023-09-27 11:05:15 +02:00
Yu Watanabe 6197db53ba sd-ndisc: make sd_ndisc return time values in usec
This also introduces sd_ndisc_router_get_lifetime_timestamp() and
friends that return timestamp rather than timespan.
2023-09-23 01:34:56 +09:00
Yu Watanabe 0f9a2b802b network/ndisc: split out ndisc_router_process_icmp6_ratelimit()
Otherwise, if ndisc_router_process_default() return earlier, e.g.
when Network.ipv6_accept_ra_use_gateway is false, then the
ratelimit is not applied.
2023-09-05 22:03:34 +01:00
Yu Watanabe 4df16cd018 network/ndisc: refuse too many PREF64 prefixes
Follow-up for 6e8f5e4c1f.

Addresses https://github.com/systemd/systemd/pull/29009#issuecomment-1705700926.
2023-09-06 01:22:43 +09:00
Yu Watanabe fabea9c092 network/ndisc: drop outdated PREF64 prefixes
Follow-up for 6e8f5e4c1f.

Addresses https://github.com/systemd/systemd/pull/29009#issuecomment-1705741844.
2023-09-06 01:22:43 +09:00
Susant Sahani 6e8f5e4c1f network: ndisc - Allow to parse PREF64 prefix 2023-09-04 23:41:02 +09:00
Yu Watanabe 218f3738d8 network/ndisc: drop captive portals with zero lifetime earlier
This also adds a comment about that we use the main lifetime for captive
portals.
2023-09-02 22:25:17 +09:00
Yu Watanabe 2b4fca55d0 Revert "network: ndisc - drop routes of lifetime 0"
This reverts commit 4ccd48cb26.

From RFC 4861 section 4.2.
> The Router Lifetime applies only to the router's usefulness as a default
> router; it does not apply to information contained in other message fields
> or options.  Options that need time limits for their information include
> their own lifetime fields.

Hence, based on the lifetime field of the message header, we should not
drop any other information.
Note that, in ndisc_router_process_default(), we have already dropp the
default gateway when the lifetime is zero. Hence, we can safely drop the
change.
2023-09-02 14:34:56 +09:00
Yu Watanabe 6df82d128c network/ndisc: use the first captive portal in each RA
To handle malicious RA packets gracefully.

Also prompted by https://github.com/systemd/systemd/pull/28285#issuecomment-1627585140.
2023-08-24 20:01:08 +09:00
Yu Watanabe bf943a9d49 network/ndisc: do not store too many captive portals provided through RA
Prompted by https://github.com/systemd/systemd/pull/28285#issuecomment-1627585140.
2023-08-24 19:59:34 +09:00
Susant Sahani 4ccd48cb26 network: ndisc - drop routes of lifetime 0
A Lifetime of 0 indicates that the router is not a default router anymore
and associated default route should be discarded from host's routing table.

https://datatracker.ietf.org/doc/html/rfc4861
```
Router Lifetime
     16-bit unsigned integer.  The lifetime associated
     with the default router in units of seconds.  The
     field can contain values up to 65535 and receivers
     should handle any value, while the sending rules in
     Section 6 limit the lifetime to 9000 seconds.  A
     Lifetime of 0 indicates that the router is not a
     default router and SHOULD NOT appear on the default
     router list.  The Router Lifetime applies only to
     the router's usefulness as a default router; it
     does not apply to information contained in other
     message fields or options.  Options that need time
     limits for their information include their own
     lifetime fields.

```
2023-08-22 21:28:11 +05:30
Susant Sahani f44eebd1ba network: ndisc - Also fill router preference 2023-08-22 18:41:09 +05:30
Susant Sahani 9175002864 network: ndisc - Allow to use ICMP6 rate limit from received RA 2023-08-21 11:14:42 +02:00
Susant Sahani 3912d49d0d network: ndisc - Ignore route information if reserved (10) value is
received

RFC4191 – Section 2.3 Route Information Option's Prf field:
If the Reserved (10) value is received, the Route Information Option MUST be ignored.
2023-08-14 12:43:38 +09:00
Susant Sahani f141b2c053 network: ndisc - Honour CurHopLimit
RFC4861 Neighbor Discovery – Sections 4.2 and 6.3.4

From section 4.2. Router Advertisement Message Format:

Cur Hop Limit        8-bit unsigned integer.  The default value that
                     should be placed in the Hop Count field of the IP
                     header for outgoing IP packets.  A value of zero
                     means unspecified (by this router).
2023-07-30 14:37:21 +01:00
Yu Watanabe f60e65583e network/address: free Address object by caller that passed to link_request_address()
Follow-up for 9684a8ded0.

Now, the input Address object is always copied, hence it is not
necessary to free it in link_request_address().
2023-07-29 22:48:49 +09:00
Susant Sahani fc4a7f13bb ndisc: honour MTU for onlink prefix
Fixes #26520
2023-07-13 09:45:38 +09:00
Yu Watanabe 75a9122678 network,ndisc: use ndisc_captive_portal_free() at one more place
Fixes another memleak introduced by 64de00c49f.
Fixes #28283.
2023-07-07 09:18:25 +09:00
Yu Watanabe 535134bc51 network,ndisc: use correct free function for captive portal
Fixes memleak introduced by 64de00c49f.
Fixes #28277.
2023-07-06 20:30:22 +01:00
Yu Watanabe 2c5bca1734 network/ndisc: downgrade log level
The failures may be critical for per-link operation, but not critical
for the service.
2023-07-06 14:55:58 +09:00
Yu Watanabe 64de00c49f network: handle captive portal with multiple routers
Before this patch, if a network has multiple routers and one of them
provides a captive portal, then the portal was overwritten or cleared
when another RA from another router is received.

This makes captive portals managed in the similar way as DNS servers or
DNS domains. So now captive portal can safely handled even if a network
has multiple routers.
2023-07-06 14:55:58 +09:00
Ronan Pigott 8231286faf ndisc: reject malformed captive portal URI with EBADMSG
This allows the correct, gracious, error handling to follow up in the
ndisc handler. Otherwise, an internal error is assumed and the interface
disabled.

Fixes: 9747955d2d ("ndisc: parse RFC8910 captive portal ipv6ra option")
2023-07-03 03:07:57 -07:00
Ronan Pigott 16290f50e9 ndisc: clear ndisc captive portal value on bogus zero-len option
This value was freed but erroneously never cleared, leading to
use-after-free.

Fixes: 9747955d2d ("ndisc: parse RFC8910 captive portal ipv6ra option")
2023-07-03 01:10:41 -07:00
Ronan Pigott 9747955d2d ndisc: parse RFC8910 captive portal ipv6ra option 2023-07-02 01:13:29 -07:00
Yu Watanabe 5908d86425 network: do not enter failed state when received an invalid RA
Fixes the issue reported at https://github.com/systemd/systemd/issues/25891#issuecomment-1368509262.
2023-01-19 12:36:26 +00:00
Yu Watanabe f95fb19922 network: introduce QuickAck= for [DHCPv4] and [IPv6AcceptRA]
Closes #25906.
2023-01-16 14:40:22 +09:00
Yu Watanabe d9a95033bf network: unset Link.ndisc_configured only when a new address or route is requested
This fixes an issue introduced by af2aea8bb6.

When an outdated address or route is passed to link_request_address()/route(),
then they return 0 and the address or route will not be assigned. Such
situation can happen when we receive RA with zero lifetime. In that
case, we should not unset Link.ndisc_configured flag, otherwise even
no new address nor route will assigned, the interface will enter to the
configuring state, and unnecessary DBus property change is emit and the state
file will be updated. That makes resolved or timesyncd triggered to
reconfigure the interface.

Fixes #25456.
2022-12-01 23:15:09 +01:00
Yu Watanabe 6a4f43cd66 network: drop invalid and unused flag
Route.flags can only take RTNH_F_ONLINK, and other flags are silently
dropped.
2022-11-29 04:31:27 +09:00
Yu Watanabe d87c5cd8d9 network: fix indentation 2022-11-29 04:30:12 +09:00
Yu Watanabe 6f812d2899 network: adjust route priority based on preference
Even if different preference is specified, the kernel merges multiple
routes with the same preference. This is problematic when a network has
multiple routers.

Fixes #25138.
2022-10-28 15:48:28 +09:00