diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-10-02 18:14:25 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-10-07 02:50:50 +0900 |
commit | daad60d19e4f69478e7b596f175cebe834368acd (patch) | |
tree | 958835402a38557db27d7694ec6b9959964cb75b /src/network/networkd-ipv4ll.c | |
parent | 571eeba9092e18b9f082f8c933ecc1ae20e8997f (diff) | |
download | systemd-daad60d19e4f69478e7b596f175cebe834368acd.tar.gz |
network: introduce link_deserialize_ipv4ll()
Diffstat (limited to 'src/network/networkd-ipv4ll.c')
-rw-r--r-- | src/network/networkd-ipv4ll.c | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index e844799b57..ca59c86a7b 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -142,6 +142,25 @@ static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata) { } } +static int ipv4ll_init(Link *link) { + int r; + + assert(link); + + if (link->ipv4ll) + return 0; + + r = sd_ipv4ll_new(&link->ipv4ll); + if (r < 0) + return r; + + r = sd_ipv4ll_attach_event(link->ipv4ll, link->manager->event, 0); + if (r < 0) + return r; + + return 0; +} + int ipv4ll_configure(Link *link) { uint64_t seed; int r; @@ -150,15 +169,9 @@ int ipv4ll_configure(Link *link) { assert(link->network); assert(link->network->link_local & (ADDRESS_FAMILY_IPV4 | ADDRESS_FAMILY_FALLBACK_IPV4)); - if (!link->ipv4ll) { - r = sd_ipv4ll_new(&link->ipv4ll); - if (r < 0) - return r; - - r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0); - if (r < 0) - return r; - } + r = ipv4ll_init(link); + if (r < 0) + return r; if (link->sd_device && net_get_unique_predictable_data(link->sd_device, true, &seed) >= 0) { @@ -182,6 +195,30 @@ int ipv4ll_configure(Link *link) { return 0; } +int link_deserialize_ipv4ll(Link *link, const char *ipv4ll_address) { + union in_addr_union address; + int r; + + assert(link); + + if (isempty(ipv4ll_address)) + return 0; + + r = in_addr_from_string(AF_INET, ipv4ll_address, &address); + if (r < 0) + return log_link_debug_errno(link, r, "Failed to parse IPv4LL address: %s", ipv4ll_address); + + r = ipv4ll_init(link); + if (r < 0) + return log_link_debug_errno(link, r, "Failed to initialize IPv4LL client: %m"); + + r = sd_ipv4ll_set_address(link->ipv4ll, &address.in); + if (r < 0) + return log_link_debug_errno(link, r, "Failed to set initial IPv4LL address %s: %m", ipv4ll_address); + + return 0; +} + int config_parse_ipv4ll( const char* unit, const char *filename, |