int dhcp6_request_address(Link *link) { int r, inf_req; bool running; assert(link); assert(link->dhcp6_client); r = sd_dhcp6_client_get_information_request(link->dhcp6_client, &inf_req); if (r < 0) return r; if (!inf_req) return 0; r = sd_dhcp6_client_is_running(link->dhcp6_client); if (r < 0) return r; else running = !!r; if (running) { r = sd_dhcp6_client_stop(link->dhcp6_client); if (r < 0) return r; } r = sd_dhcp6_client_set_information_request(link->dhcp6_client, false); if (r < 0) return r; return 0; }
static void stop (NMDhcpClient *client, gboolean release, const GByteArray *duid) { NMDhcpSystemdPrivate *priv = NM_DHCP_SYSTEMD_GET_PRIVATE (client); int r = 0; if (priv->client4) r = sd_dhcp_client_stop (priv->client4); else if (priv->client6) r = sd_dhcp6_client_stop (priv->client6); if (r) { nm_log_warn (priv->client6 ? LOGD_DHCP6 : LOGD_DHCP4, "(%s): failed to stop DHCP client (%d)", nm_dhcp_client_get_iface (client), r); } }
int dhcp6_request_address(Link *link, int ir) { int r, inf_req; bool running; assert(link); assert(link->dhcp6_client); assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0); r = sd_dhcp6_client_is_running(link->dhcp6_client); if (r < 0) return r; else running = !!r; if (running) { r = sd_dhcp6_client_get_information_request(link->dhcp6_client, &inf_req); if (r < 0) return r; if (inf_req == ir) return 0; r = sd_dhcp6_client_stop(link->dhcp6_client); if (r < 0) return r; } else { r = sd_dhcp6_client_set_local_address(link->dhcp6_client, &link->ipv6ll_address); if (r < 0) return r; } r = sd_dhcp6_client_set_information_request(link->dhcp6_client, ir); if (r < 0) return r; r = sd_dhcp6_client_start(link->dhcp6_client); if (r < 0) return r; return 0; }
static void dispose (GObject *object) { NMDhcpSystemdPrivate *priv = NM_DHCP_SYSTEMD_GET_PRIVATE (object); g_clear_pointer (&priv->lease_file, g_free); if (priv->client4) { sd_dhcp_client_stop (priv->client4); sd_dhcp_client_unref (priv->client4); priv->client4 = NULL; } if (priv->client6) { sd_dhcp6_client_stop (priv->client6); sd_dhcp6_client_unref (priv->client6); priv->client6 = NULL; } G_OBJECT_CLASS (nm_dhcp_systemd_parent_class)->dispose (object); }
static void stop (NMDhcpClient *client, gboolean release, const GByteArray *duid) { NMDhcpSystemd *self = NM_DHCP_SYSTEMD (client); NMDhcpSystemdPrivate *priv = NM_DHCP_SYSTEMD_GET_PRIVATE (self); int r = 0; _LOGT ("dhcp-client%d: stop %p", priv->client4 ? '4' : '6', priv->client4 ? (gpointer) priv->client4 : (gpointer) priv->client6); if (priv->client4) { sd_dhcp_client_set_callback (priv->client4, NULL, NULL); r = sd_dhcp_client_stop (priv->client4); } else if (priv->client6) { sd_dhcp6_client_set_callback (priv->client6, NULL, NULL); r = sd_dhcp6_client_stop (priv->client6); } if (r) _LOGW ("failed to stop client (%d)", r); }
static void test_client_information_cb(sd_dhcp6_client *client, int event, void *userdata) { sd_event *e = userdata; sd_dhcp6_lease *lease; struct in6_addr *addrs; struct in6_addr address = { { { 0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01 } } }; char **domains; assert_se(e); assert_se(event == SD_DHCP6_CLIENT_EVENT_INFORMATION_REQUEST); assert_se(sd_dhcp6_client_get_lease(client, &lease) >= 0); assert_se(sd_dhcp6_lease_get_domains(lease, &domains) == 1); assert_se(!strcmp("lab.intra", domains[0])); assert_se(domains[1] == NULL); assert_se(sd_dhcp6_lease_get_dns(lease, &addrs) == 1); assert_se(!memcmp(addrs, &msg_advertise[124], 16)); assert_se(sd_dhcp6_lease_get_ntp_addrs(lease, &addrs) == 1); assert_se(!memcmp(addrs, &msg_advertise[159], 16)); if (verbose) printf(" got DHCPv6 event %d\n", event); assert_se(sd_dhcp6_client_set_information_request(client, false) == -EBUSY); assert_se(sd_dhcp6_client_set_callback(client, NULL, e) >= 0); assert_se(sd_dhcp6_client_stop(client) >= 0); assert_se(sd_dhcp6_client_set_information_request(client, false) >= 0); assert_se(sd_dhcp6_client_set_callback(client, test_client_solicit_cb, e) >= 0); assert_se(sd_dhcp6_client_set_local_address(client, &address) >= 0); assert_se(sd_dhcp6_client_start(client) >= 0); }
static int dhcp6_configure(Link *link, int event) { int r; bool information_request; assert_return(link, -EINVAL); assert_return(IN_SET(event, SD_ICMP6_ND_EVENT_ROUTER_ADVERTISMENT_TIMEOUT, SD_ICMP6_ND_EVENT_ROUTER_ADVERTISMENT_OTHER, SD_ICMP6_ND_EVENT_ROUTER_ADVERTISMENT_MANAGED), -EINVAL); link->dhcp6_configured = false; if (link->dhcp6_client) { r = sd_dhcp6_client_get_information_request(link->dhcp6_client, &information_request); if (r < 0) { log_link_warning_errno(link, r, "Could not get DHCPv6 Information request setting: %m"); goto error; } if (information_request && event != SD_ICMP6_ND_EVENT_ROUTER_ADVERTISMENT_OTHER) { r = sd_dhcp6_client_stop(link->dhcp6_client); if (r < 0) { log_link_warning_errno(link, r, "Could not stop DHCPv6 while setting Managed mode: %m"); goto error; } r = sd_dhcp6_client_set_information_request(link->dhcp6_client, false); if (r < 0) { log_link_warning_errno(link, r, "Could not unset DHCPv6 Information request: %m"); goto error; } } r = sd_dhcp6_client_start(link->dhcp6_client); if (r < 0 && r != -EALREADY) { log_link_warning_errno(link, r, "Could not restart DHCPv6: %m"); goto error; } if (r == -EALREADY) link->dhcp6_configured = true; return r; } r = sd_dhcp6_client_new(&link->dhcp6_client); if (r < 0) goto error; r = sd_dhcp6_client_attach_event(link->dhcp6_client, NULL, 0); if (r < 0) goto error; r = sd_dhcp6_client_set_mac(link->dhcp6_client, (const uint8_t *) &link->mac, sizeof (link->mac), ARPHRD_ETHER); if (r < 0) goto error; r = sd_dhcp6_client_set_index(link->dhcp6_client, link->ifindex); if (r < 0) goto error; r = sd_dhcp6_client_set_callback(link->dhcp6_client, dhcp6_handler, link); if (r < 0) goto error; if (event == SD_ICMP6_ND_EVENT_ROUTER_ADVERTISMENT_OTHER) { r = sd_dhcp6_client_set_information_request(link->dhcp6_client, true); if (r < 0) goto error; } r = sd_dhcp6_client_start(link->dhcp6_client); if (r < 0) goto error; return r; error: link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client); return r; }