/* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once /*** Copyright © 2014-2015 Intel Corporation. All rights reserved. ***/ #include #include #include "sd-event.h" #include "sd-dhcp6-client.h" #include "dhcp-identifier.h" #include "dhcp6-option.h" #include "dhcp6-protocol.h" #include "ether-addr-util.h" #include "hashmap.h" #include "macro.h" #include "network-common.h" #include "ordered-set.h" #include "sparse-endian.h" #include "time-util.h" /* what to request from the server, addresses (IA_NA) and/or prefixes (IA_PD) */ typedef enum DHCP6RequestIA { DHCP6_REQUEST_IA_NA = 1 << 0, DHCP6_REQUEST_IA_TA = 1 << 1, /* currently not used */ DHCP6_REQUEST_IA_PD = 1 << 2, } DHCP6RequestIA; struct sd_dhcp6_client { unsigned n_ref; int ifindex; char *ifname; struct in6_addr local_address; struct hw_addr_data hw_addr; uint16_t arp_type; sd_event *event; sd_event_source *receive_message; sd_event_source *timeout_resend; sd_event_source *timeout_expire; sd_event_source *timeout_t1; sd_event_source *timeout_t2; int event_priority; int fd; sd_device *dev; DHCP6State state; bool information_request; usec_t information_request_time_usec; usec_t information_refresh_time_usec; be32_t transaction_id; usec_t transaction_start; usec_t retransmit_time; uint8_t retransmit_count; bool iaid_set; DHCP6IA ia_na; DHCP6IA ia_pd; DHCP6RequestIA request_ia; struct duid duid; size_t duid_len; be16_t *req_opts; size_t n_req_opts; char *fqdn; char *mudurl; char **user_class; char **vendor_class; OrderedHashmap *extra_options; OrderedSet *vendor_options; bool rapid_commit; struct sd_dhcp6_lease *lease; sd_dhcp6_client_callback_t callback; void *userdata; bool send_release; /* Ignore machine-ID when generating DUID. See dhcp_identifier_set_duid_en(). */ bool test_mode; }; int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *address); int dhcp6_network_send_udp_socket(int s, struct in6_addr *address, const void *packet, size_t len); int dhcp6_client_send_message(sd_dhcp6_client *client); void dhcp6_client_set_test_mode(sd_dhcp6_client *client, bool test_mode); int dhcp6_client_set_transaction_id(sd_dhcp6_client *client, uint32_t transaction_id); #define log_dhcp6_client_errno(client, error, fmt, ...) \ log_interface_prefix_full_errno( \ "DHCPv6 client: ", \ sd_dhcp6_client, client, \ error, fmt, ##__VA_ARGS__) #define log_dhcp6_client(client, fmt, ...) \ log_interface_prefix_full_errno_zerook( \ "DHCPv6 client: ", \ sd_dhcp6_client, client, \ 0, fmt, ##__VA_ARGS__)