| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| #ifndef foosddhcp6clienthfoo |
| #define foosddhcp6clienthfoo |
| |
| /*** |
| Copyright © 2014 Intel Corporation. All rights reserved. |
| |
| systemd is free software; you can redistribute it and/or modify it |
| under the terms of the GNU Lesser General Public License as published by |
| the Free Software Foundation; either version 2.1 of the License, or |
| (at your option) any later version. |
| |
| systemd is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with systemd; If not, see <https://www.gnu.org/licenses/>. |
| ***/ |
| |
| #include <inttypes.h> |
| #include <net/ethernet.h> |
| #include <sys/types.h> |
| |
| #include "sd-device.h" |
| #include "sd-dhcp6-lease.h" |
| #include "sd-dhcp6-option.h" |
| #include "sd-event.h" |
| |
| #include "_sd-common.h" |
| |
| _SD_BEGIN_DECLARATIONS; |
| |
| enum { |
| SD_DHCP6_CLIENT_EVENT_STOP = 0, |
| SD_DHCP6_CLIENT_EVENT_RESEND_EXPIRE = 10, |
| SD_DHCP6_CLIENT_EVENT_RETRANS_MAX = 11, |
| SD_DHCP6_CLIENT_EVENT_IP_ACQUIRE = 12, |
| SD_DHCP6_CLIENT_EVENT_INFORMATION_REQUEST = 13 |
| }; |
| |
| /* https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml#dhcpv6-parameters-2 */ |
| enum { |
| SD_DHCP6_OPTION_CLIENTID = 1, /* RFC 8415 */ |
| SD_DHCP6_OPTION_SERVERID = 2, /* RFC 8415 */ |
| SD_DHCP6_OPTION_IA_NA = 3, /* RFC 8415 */ |
| SD_DHCP6_OPTION_IA_TA = 4, /* RFC 8415 */ |
| SD_DHCP6_OPTION_IAADDR = 5, /* RFC 8415 */ |
| SD_DHCP6_OPTION_ORO = 6, /* RFC 8415 */ |
| SD_DHCP6_OPTION_PREFERENCE = 7, /* RFC 8415 */ |
| SD_DHCP6_OPTION_ELAPSED_TIME = 8, /* RFC 8415 */ |
| SD_DHCP6_OPTION_RELAY_MSG = 9, /* RFC 8415 */ |
| /* option code 10 is unassigned */ |
| SD_DHCP6_OPTION_AUTH = 11, /* RFC 8415 */ |
| SD_DHCP6_OPTION_UNICAST = 12, /* RFC 8415 */ |
| SD_DHCP6_OPTION_STATUS_CODE = 13, /* RFC 8415 */ |
| SD_DHCP6_OPTION_RAPID_COMMIT = 14, /* RFC 8415 */ |
| SD_DHCP6_OPTION_USER_CLASS = 15, /* RFC 8415 */ |
| SD_DHCP6_OPTION_VENDOR_CLASS = 16, /* RFC 8415 */ |
| SD_DHCP6_OPTION_VENDOR_OPTS = 17, /* RFC 8415 */ |
| SD_DHCP6_OPTION_INTERFACE_ID = 18, /* RFC 8415 */ |
| SD_DHCP6_OPTION_RECONF_MSG = 19, /* RFC 8415 */ |
| SD_DHCP6_OPTION_RECONF_ACCEPT = 20, /* RFC 8415 */ |
| SD_DHCP6_OPTION_SIP_SERVER_DOMAIN_NAME = 21, /* RFC 3319 */ |
| SD_DHCP6_OPTION_SIP_SERVER_ADDRESS = 22, /* RFC 3319 */ |
| SD_DHCP6_OPTION_DNS_SERVER = 23, /* RFC 3646 */ |
| SD_DHCP6_OPTION_DOMAIN = 24, /* RFC 3646 */ |
| SD_DHCP6_OPTION_IA_PD = 25, /* RFC 3633, RFC 8415 */ |
| SD_DHCP6_OPTION_IA_PD_PREFIX = 26, /* RFC 3633, RFC 8415 */ |
| SD_DHCP6_OPTION_NIS_SERVER = 27, /* RFC 3898 */ |
| SD_DHCP6_OPTION_NISP_SERVER = 28, /* RFC 3898 */ |
| SD_DHCP6_OPTION_NIS_DOMAIN_NAME = 29, /* RFC 3898 */ |
| SD_DHCP6_OPTION_NISP_DOMAIN_NAME = 30, /* RFC 3898 */ |
| SD_DHCP6_OPTION_SNTP_SERVER = 31, /* RFC 4075, deprecated */ |
| SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME = 32, /* RFC 4242, 8415, sec. 21.23 */ |
| SD_DHCP6_OPTION_BCMCS_SERVER_D = 33, /* RFC 4280 */ |
| SD_DHCP6_OPTION_BCMCS_SERVER_A = 34, /* RFC 4280 */ |
| /* option code 35 is unassigned */ |
| SD_DHCP6_OPTION_GEOCONF_CIVIC = 36, /* RFC 4776 */ |
| SD_DHCP6_OPTION_REMOTE_ID = 37, /* RFC 4649 */ |
| SD_DHCP6_OPTION_SUBSCRIBER_ID = 38, /* RFC 4580 */ |
| SD_DHCP6_OPTION_CLIENT_FQDN = 39, /* RFC 4704 */ |
| SD_DHCP6_OPTION_PANA_AGENT = 40, /* RFC 5192 */ |
| SD_DHCP6_OPTION_POSIX_TIMEZONE = 41, /* RFC 4833 */ |
| SD_DHCP6_OPTION_TZDB_TIMEZONE = 42, /* RFC 4833 */ |
| SD_DHCP6_OPTION_ERO = 43, /* RFC 4994 */ |
| SD_DHCP6_OPTION_LQ_QUERY = 44, /* RFC 5007 */ |
| SD_DHCP6_OPTION_CLIENT_DATA = 45, /* RFC 5007 */ |
| SD_DHCP6_OPTION_CLT_TIME = 46, /* RFC 5007 */ |
| SD_DHCP6_OPTION_LQ_RELAY_DATA = 47, /* RFC 5007 */ |
| SD_DHCP6_OPTION_LQ_CLIENT_LINK = 48, /* RFC 5007 */ |
| SD_DHCP6_OPTION_MIP6_HNIDF = 49, /* RFC 6610 */ |
| SD_DHCP6_OPTION_MIP6_VDINF = 50, /* RFC 6610 */ |
| SD_DHCP6_OPTION_V6_LOST = 51, /* RFC 5223 */ |
| SD_DHCP6_OPTION_CAPWAP_AC_V6 = 52, /* RFC 5417 */ |
| SD_DHCP6_OPTION_RELAY_ID = 53, /* RFC 5460 */ |
| SD_DHCP6_OPTION_IPV6_ADDRESS_MOS = 54, /* RFC 5678 */ |
| SD_DHCP6_OPTION_IPV6_FQDN_MOS = 55, /* RFC 5678 */ |
| SD_DHCP6_OPTION_NTP_SERVER = 56, /* RFC 5908 */ |
| SD_DHCP6_OPTION_V6_ACCESS_DOMAIN = 57, /* RFC 5986 */ |
| SD_DHCP6_OPTION_SIP_UA_CS_LIST = 58, /* RFC 6011 */ |
| SD_DHCP6_OPTION_BOOTFILE_URL = 59, /* RFC 5970 */ |
| SD_DHCP6_OPTION_BOOTFILE_PARAM = 60, /* RFC 5970 */ |
| SD_DHCP6_OPTION_CLIENT_ARCH_TYPE = 61, /* RFC 5970 */ |
| SD_DHCP6_OPTION_NII = 62, /* RFC 5970 */ |
| SD_DHCP6_OPTION_GEOLOCATION = 63, /* RFC 6225 */ |
| SD_DHCP6_OPTION_AFTR_NAME = 64, /* RFC 6334 */ |
| SD_DHCP6_OPTION_ERP_LOCAL_DOMAIN_NAME = 65, /* RFC 6440 */ |
| SD_DHCP6_OPTION_RSOO = 66, /* RFC 6422 */ |
| SD_DHCP6_OPTION_PD_EXCLUDE = 67, /* RFC 6603 */ |
| SD_DHCP6_OPTION_VSS = 68, /* RFC 6607 */ |
| SD_DHCP6_OPTION_MIP6_IDINF = 69, /* RFC 6610 */ |
| SD_DHCP6_OPTION_MIP6_UDINF = 70, /* RFC 6610 */ |
| SD_DHCP6_OPTION_MIP6_HNP = 71, /* RFC 6610 */ |
| SD_DHCP6_OPTION_MIP6_HAA = 72, /* RFC 6610 */ |
| SD_DHCP6_OPTION_MIP6_HAF = 73, /* RFC 6610 */ |
| SD_DHCP6_OPTION_RDNSS_SELECTION = 74, /* RFC 6731 */ |
| SD_DHCP6_OPTION_KRB_PRINCIPAL_NAME = 75, /* RFC 6784 */ |
| SD_DHCP6_OPTION_KRB_REALM_NAME = 76, /* RFC 6784 */ |
| SD_DHCP6_OPTION_KRB_DEFAULT_REALM_NAME = 77, /* RFC 6784 */ |
| SD_DHCP6_OPTION_KRB_KDC = 78, /* RFC 6784 */ |
| SD_DHCP6_OPTION_CLIENT_LINKLAYER_ADDR = 79, /* RFC 6939 */ |
| SD_DHCP6_OPTION_LINK_ADDRESS = 80, /* RFC 6977 */ |
| SD_DHCP6_OPTION_RADIUS = 81, /* RFC 7037 */ |
| SD_DHCP6_OPTION_SOL_MAX_RT = 82, /* RFC 7083, RFC 8415 */ |
| SD_DHCP6_OPTION_INF_MAX_RT = 83, /* RFC 7083, RFC 8415 */ |
| SD_DHCP6_OPTION_ADDRSEL = 84, /* RFC 7078 */ |
| SD_DHCP6_OPTION_ADDRSEL_TABLE = 85, /* RFC 7078 */ |
| SD_DHCP6_OPTION_V6_PCP_SERVER = 86, /* RFC 7291 */ |
| SD_DHCP6_OPTION_DHCPV4_MSG = 87, /* RFC 7341 */ |
| SD_DHCP6_OPTION_DHCP4_O_DHCP6_SERVER = 88, /* RFC 7341 */ |
| SD_DHCP6_OPTION_S46_RULE = 89, /* RFC 7598 */ |
| SD_DHCP6_OPTION_S46_BR = 90, /* RFC 7598, RFC 8539 */ |
| SD_DHCP6_OPTION_S46_DMR = 91, /* RFC 7598 */ |
| SD_DHCP6_OPTION_S46_V4V6BIND = 92, /* RFC 7598 */ |
| SD_DHCP6_OPTION_S46_PORTPARAMS = 93, /* RFC 7598 */ |
| SD_DHCP6_OPTION_S46_CONT_MAPE = 94, /* RFC 7598 */ |
| SD_DHCP6_OPTION_S46_CONT_MAPT = 95, /* RFC 7598 */ |
| SD_DHCP6_OPTION_S46_CONT_LW = 96, /* RFC 7598 */ |
| SD_DHCP6_OPTION_4RD = 97, /* RFC 7600 */ |
| SD_DHCP6_OPTION_4RD_MAP_RULE = 98, /* RFC 7600 */ |
| SD_DHCP6_OPTION_4RD_NON_MAP_RULE = 99, /* RFC 7600 */ |
| SD_DHCP6_OPTION_LQ_BASE_TIME = 100, /* RFC 7653 */ |
| SD_DHCP6_OPTION_LQ_START_TIME = 101, /* RFC 7653 */ |
| SD_DHCP6_OPTION_LQ_END_TIME = 102, /* RFC 7653 */ |
| SD_DHCP6_OPTION_CAPTIVE_PORTAL = 103, /* RFC 8910 */ |
| SD_DHCP6_OPTION_MPL_PARAMETERS = 104, /* RFC 7774 */ |
| SD_DHCP6_OPTION_ANI_ATT = 105, /* RFC 7839 */ |
| SD_DHCP6_OPTION_ANI_NETWORK_NAME = 106, /* RFC 7839 */ |
| SD_DHCP6_OPTION_ANI_AP_NAME = 107, /* RFC 7839 */ |
| SD_DHCP6_OPTION_ANI_AP_BSSID = 108, /* RFC 7839 */ |
| SD_DHCP6_OPTION_ANI_OPERATOR_ID = 109, /* RFC 7839 */ |
| SD_DHCP6_OPTION_ANI_OPERATOR_REALM = 110, /* RFC 7839 */ |
| SD_DHCP6_OPTION_S46_PRIORITY = 111, /* RFC 8026 */ |
| SD_DHCP6_OPTION_MUD_URL_V6 = 112, /* RFC 8520 */ |
| SD_DHCP6_OPTION_V6_PREFIX64 = 113, /* RFC 8115 */ |
| SD_DHCP6_OPTION_F_BINDING_STATUS = 114, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_CONNECT_FLAGS = 115, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_DNS_REMOVAL_INFO = 116, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_DNS_HOST_NAME = 117, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_DNS_ZONE_NAME = 118, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_DNS_FLAGS = 119, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_EXPIRATION_TIME = 120, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_MAX_UNACKED_BNDUPD = 121, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_MCLT = 122, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_PARTNER_LIFETIME = 123, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_PARTNER_LIFETIME_SENT = 124, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_PARTNER_DOWN_TIME = 125, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_PARTNER_RAW_CLT_TIME = 126, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_PROTOCOL_VERSION = 127, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_KEEPALIVE_TIME = 128, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_RECONFIGURE_DATA = 129, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_RELATIONSHIP_NAME = 130, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_SERVER_FLAGS = 131, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_SERVER_STATE = 132, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_START_TIME_OF_STATE = 133, /* RFC 8156 */ |
| SD_DHCP6_OPTION_F_STATE_EXPIRATION_TIME = 134, /* RFC 8156 */ |
| SD_DHCP6_OPTION_RELAY_PORT = 135, /* RFC 8357 */ |
| SD_DHCP6_OPTION_V6_SZTP_REDIRECT = 136, /* RFC 8572 */ |
| SD_DHCP6_OPTION_S46_BIND_IPV6_PREFIX = 137, /* RFC 8539 */ |
| SD_DHCP6_OPTION_IA_LL = 138, /* RFC 8947 */ |
| SD_DHCP6_OPTION_LLADDR = 139, /* RFC 8947 */ |
| SD_DHCP6_OPTION_SLAP_QUAD = 140, /* RFC 8948 */ |
| SD_DHCP6_OPTION_V6_DOTS_RI = 141, /* RFC 8973 */ |
| SD_DHCP6_OPTION_V6_DOTS_ADDRESS = 142, /* RFC 8973 */ |
| SD_DHCP6_OPTION_IPV6_ADDRESS_ANDSF = 143 /* RFC 6153 */ |
| /* option codes 144-65535 are unassigned */ |
| }; |
| |
| typedef struct sd_dhcp6_client sd_dhcp6_client; |
| |
| typedef void (*sd_dhcp6_client_callback_t)(sd_dhcp6_client *client, int event, void *userdata); |
| int sd_dhcp6_client_set_callback( |
| sd_dhcp6_client *client, |
| sd_dhcp6_client_callback_t cb, |
| void *userdata); |
| |
| int sd_dhcp6_client_set_ifindex( |
| sd_dhcp6_client *client, |
| int interface_index); |
| int sd_dhcp6_client_set_ifname( |
| sd_dhcp6_client *client, |
| const char *interface_name); |
| int sd_dhcp6_client_get_ifname(sd_dhcp6_client *client, const char **ret); |
| int sd_dhcp6_client_set_local_address( |
| sd_dhcp6_client *client, |
| const struct in6_addr *local_address); |
| int sd_dhcp6_client_set_mac( |
| sd_dhcp6_client *client, |
| const uint8_t *addr, |
| size_t addr_len, |
| uint16_t arp_type); |
| int sd_dhcp6_client_set_duid( |
| sd_dhcp6_client *client, |
| uint16_t duid_type, |
| const void *duid, |
| size_t duid_len); |
| int sd_dhcp6_client_set_duid_llt( |
| sd_dhcp6_client *client, |
| uint64_t llt_time); |
| int sd_dhcp6_client_set_iaid( |
| sd_dhcp6_client *client, |
| uint32_t iaid); |
| int sd_dhcp6_client_get_iaid( |
| sd_dhcp6_client *client, |
| uint32_t *iaid); |
| int sd_dhcp6_client_duid_as_string( |
| sd_dhcp6_client *client, |
| char **duid); |
| int sd_dhcp6_client_set_fqdn( |
| sd_dhcp6_client *client, |
| const char *fqdn); |
| int sd_dhcp6_client_set_information_request( |
| sd_dhcp6_client *client, |
| int enabled); |
| int sd_dhcp6_client_get_information_request( |
| sd_dhcp6_client *client, |
| int *enabled); |
| int sd_dhcp6_client_set_request_option( |
| sd_dhcp6_client *client, |
| uint16_t option); |
| int sd_dhcp6_client_set_request_mud_url( |
| sd_dhcp6_client *client, |
| const char *mudurl); |
| int sd_dhcp6_client_set_request_user_class( |
| sd_dhcp6_client *client, |
| char * const *user_class); |
| int sd_dhcp6_client_set_request_vendor_class( |
| sd_dhcp6_client *client, |
| char * const *vendor_class); |
| int sd_dhcp6_client_set_prefix_delegation_hint( |
| sd_dhcp6_client *client, |
| uint8_t prefixlen, |
| const struct in6_addr *pd_prefix); |
| int sd_dhcp6_client_get_prefix_delegation(sd_dhcp6_client *client, |
| int *delegation); |
| int sd_dhcp6_client_set_prefix_delegation(sd_dhcp6_client *client, |
| int delegation); |
| int sd_dhcp6_client_get_address_request(sd_dhcp6_client *client, |
| int *request); |
| int sd_dhcp6_client_set_address_request(sd_dhcp6_client *client, |
| int request); |
| int sd_dhcp6_client_add_vendor_option(sd_dhcp6_client *client, |
| sd_dhcp6_option *v); |
| int sd_dhcp6_client_set_rapid_commit(sd_dhcp6_client *client, int enable); |
| int sd_dhcp6_client_set_send_release(sd_dhcp6_client *client, int enable); |
| |
| int sd_dhcp6_client_get_lease( |
| sd_dhcp6_client *client, |
| sd_dhcp6_lease **ret); |
| |
| int sd_dhcp6_client_add_option(sd_dhcp6_client *client, sd_dhcp6_option *v); |
| |
| int sd_dhcp6_client_stop(sd_dhcp6_client *client); |
| int sd_dhcp6_client_start(sd_dhcp6_client *client); |
| int sd_dhcp6_client_is_running(sd_dhcp6_client *client); |
| int sd_dhcp6_client_attach_event( |
| sd_dhcp6_client *client, |
| sd_event *event, |
| int64_t priority); |
| int sd_dhcp6_client_detach_event(sd_dhcp6_client *client); |
| sd_event *sd_dhcp6_client_get_event(sd_dhcp6_client *client); |
| int sd_dhcp6_client_attach_device(sd_dhcp6_client *client, sd_device *dev); |
| sd_dhcp6_client *sd_dhcp6_client_ref(sd_dhcp6_client *client); |
| sd_dhcp6_client *sd_dhcp6_client_unref(sd_dhcp6_client *client); |
| int sd_dhcp6_client_new(sd_dhcp6_client **ret); |
| |
| _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp6_client, sd_dhcp6_client_unref); |
| |
| _SD_END_DECLARATIONS; |
| |
| #endif |