diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-05-05 22:46:44 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-05-12 11:26:06 +0900 |
commit | 76c5a0f27bb578b9069d779eed72f6c4f26976ac (patch) | |
tree | eb47324d26ab5bbe8caedf692fc588739bcba8d6 /src/network/networkd-address.h | |
parent | 40ca350ea1846d28fb3403217d47ed87eac57ad7 (diff) | |
download | systemd-76c5a0f27bb578b9069d779eed72f6c4f26976ac.tar.gz |
network: use request queue to configure addresses, routes, and nexthops
Why is this necessary? Several examples below.
- When a route sets prefsrc, then the address must be already assigned
(see issue #19285), and also it must be ready if IPv6.
- When a route or nexthop sets gateway, then the address must be reachable.
- When a route sets nexthop ID, then the corresponding nexthop must be
assigned.
- When a route sets multipath routes on another interface, then the
interface must exist and be ready to configure.
- When configuring address, the same address must not be under removing
(see issue #18108).
Etc,. etc,...
So, this makes all requests about addresses, routes, and nethops are once
stored in the queue, and will be processed when they are ready to configure.
Fixes #18108 and #19285.
Diffstat (limited to 'src/network/networkd-address.h')
-rw-r--r-- | src/network/networkd-address.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index e6a564714b..e9fddddf9f 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -16,6 +16,7 @@ typedef struct Manager Manager; typedef struct Network Network; +typedef struct Request Request; typedef int (*address_ready_callback_t)(Address *address); typedef struct Address { @@ -52,7 +53,6 @@ int address_new(Address **ret); Address *address_free(Address *address); int address_get(Link *link, const Address *in, Address **ret); int address_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg); -int address_configure(const Address *address, Link *link, link_netlink_message_handler_t callback, Address **ret); int address_remove_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg); int address_remove(const Address *address, Link *link, link_netlink_message_handler_t callback); bool address_equal(const Address *a1, const Address *a2); @@ -62,7 +62,6 @@ int generate_ipv6_eui_64_address(const Link *link, struct in6_addr *ret); DEFINE_NETWORK_SECTION_FUNCTIONS(Address, address_free); -int link_set_addresses(Link *link); int link_drop_addresses(Link *link); int link_drop_foreign_addresses(Link *link); bool link_address_is_dynamic(const Link *link, const Address *address); @@ -73,6 +72,16 @@ void ipv4_dad_unref(Link *link); int ipv4_dad_stop(Link *link); int ipv4_dad_update_mac(Link *link); +int link_request_address( + Link *link, + Address *address, + bool consume_object, + unsigned *message_counter, + link_netlink_message_handler_t netlink_handler, + Request **ret); +int link_request_static_addresses(Link *link); +int request_process_address(Request *req); + int manager_rtnl_process_address(sd_netlink *nl, sd_netlink_message *message, Manager *m); void network_drop_invalid_addresses(Network *network); |