Enable DHCPv6 support by creating a DHCPv6 boolean in the Network section. Add necessary dhcp6 structures and initial function calls. --- src/network/networkd-link.c | 75 ++++++++++++++++++++++++++++++++ src/network/networkd-network-gperf.gperf | 1 + src/network/networkd.h | 3 ++ 3 files changed, 79 insertions(+)
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 3653426..507e82d 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -120,6 +120,8 @@ static void link_free(Link *link) { sd_ipv4ll_unref(link->ipv4ll); + sd_dhcp6_client_unref(link->dhcp6_client); + hashmap_remove(link->manager->links, &link->ifindex); free(link->ifname); @@ -231,6 +233,17 @@ static int link_stop_clients(Link *link) { } } + if (link->network->dhcp6) { + assert(link->dhcp6_client); + + k = sd_dhcp6_client_stop(link->dhcp6_client); + if (k < 0) { + log_warning_link(link, "Could not stop DHCPv6 " + "client: %s", strerror(-r)); + r = k; + } + } + return r; } @@ -1183,6 +1196,19 @@ static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata){ } } +static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) { + Link *link = userdata; + + assert(link); + assert(link->network); + assert(link->manager); + + if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) + return; + + log_debug_link(link, "DHCPv6 event %d", event); +} + static int link_acquire_conf(Link *link) { int r; @@ -1217,6 +1243,19 @@ static int link_acquire_conf(Link *link) { } } + if (link->network->dhcp6) { + assert(link->dhcp6_client); + + log_debug_link(link, "acquiring DHCPv6 lease"); + + r = sd_dhcp6_client_start(link->dhcp6_client); + if (r < 0) { + log_warning_link(link, "could not acquire DHCPv6 " + "lease"); + return r; + } + } + return 0; } @@ -1667,6 +1706,30 @@ static int link_configure(Link *link) { } } + if (link->network->dhcp6) { + r = sd_dhcp6_client_new(&link->dhcp6_client); + if (r < 0) + return r; + + r = sd_dhcp6_client_attach_event(link->dhcp6_client, NULL, 0); + if (r < 0) + return r; + + r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac); + if (r < 0) + return r; + + r = sd_dhcp6_client_set_index(link->dhcp6_client, + link->ifindex); + if (r < 0) + return r; + + r = sd_dhcp6_client_set_callback(link->dhcp6_client, + dhcp6_handler, link); + if (r < 0) + return r; + } + if (link_has_carrier(link->flags, link->kernel_operstate)) { r = link_acquire_conf(link); if (r < 0) @@ -1974,6 +2037,18 @@ int link_update(Link *link, sd_rtnl_message *m) { return r; } } + + if (link->dhcp6_client) { + r = sd_dhcp6_client_set_mac(link->dhcp6_client, + &link->mac); + if (r < 0) { + log_warning_link(link, "Could not " + "update MAC address " + "in DHCPv6 client: %s", + strerror(-r)); + return r; + } + } } } diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 5038cb5..9e3993d 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -31,6 +31,7 @@ Network.VLAN, config_parse_netdev, 0, Network.MACVLAN, config_parse_netdev, 0, offsetof(Network, macvlans) Network.DHCP, config_parse_bool, 0, offsetof(Network, dhcp) Network.IPv4LL, config_parse_bool, 0, offsetof(Network, ipv4ll) +Network.DHCPv6, config_parse_bool, 0, offsetof(Network, dhcp6) Network.Address, config_parse_address, 0, 0 Network.Gateway, config_parse_gateway, 0, 0 Network.DNS, config_parse_dns, 0, offsetof(Network, dns) diff --git a/src/network/networkd.h b/src/network/networkd.h index 6f77c77..c943512 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -28,6 +28,7 @@ #include "sd-bus.h" #include "sd-dhcp-client.h" #include "sd-ipv4ll.h" +#include "sd-dhcp6-client.h" #include "udev.h" #include "rtnl-util.h" @@ -148,6 +149,7 @@ struct Network { bool dhcp_domainname; bool dhcp_critical; bool ipv4ll; + bool dhcp6; LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes); @@ -256,6 +258,7 @@ struct Link { char *lease_file; uint16_t original_mtu; sd_ipv4ll *ipv4ll; + sd_dhcp6_client *dhcp6_client; }; struct Manager { -- 1.9.1 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel