summaryrefslogtreecommitdiff
path: root/src/network/networkd-address.h
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-05-05 22:46:44 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-05-12 11:26:06 +0900
commit76c5a0f27bb578b9069d779eed72f6c4f26976ac (patch)
treeeb47324d26ab5bbe8caedf692fc588739bcba8d6 /src/network/networkd-address.h
parent40ca350ea1846d28fb3403217d47ed87eac57ad7 (diff)
downloadsystemd-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.h13
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);