pub const DHCPV6_CLIENT_SERVER_HEADER_LEN: usize = 4;
pub const DHCPV6_RELAY_HEADER_LEN: usize = 34;
pub const DHCPV6_OPTION_HEADER_LEN: usize = 4;
pub const DHCPV6_TRANSACTION_ID_LEN: usize = 3;
pub const DHCPV6_TRANSACTION_ID_MASK: u32 = 0x00ff_ffff;
pub const DHCPV6_TRANSACTION_ID_MAX: u32 = DHCPV6_TRANSACTION_ID_MASK;
pub const DHCPV6_HOP_COUNT_LIMIT: u8 = 8;
pub const DHCPV6_CLIENT_PORT: u16 = 546;
pub const DHCPV6_SERVER_PORT: u16 = 547;
pub const DHCPV6_OPTION_CLIENTID: u16 = 1;
pub const DHCPV6_OPTION_SERVERID: u16 = 2;
pub const DHCPV6_OPTION_IA_NA: u16 = 3;
pub const DHCPV6_OPTION_IAADDR: u16 = 5;
pub const DHCPV6_OPTION_ORO: u16 = 6;
pub const DHCPV6_OPTION_PREFERENCE: u16 = 7;
pub const DHCPV6_OPTION_ELAPSED_TIME: u16 = 8;
pub const DHCPV6_OPTION_RELAY_MSG: u16 = 9;
pub const DHCPV6_OPTION_AUTH: u16 = 11;
pub const DHCPV6_OPTION_STATUS_CODE: u16 = 13;
pub const DHCPV6_OPTION_RAPID_COMMIT: u16 = 14;
pub const DHCPV6_OPTION_USER_CLASS: u16 = 15;
pub const DHCPV6_OPTION_VENDOR_CLASS: u16 = 16;
pub const DHCPV6_OPTION_VENDOR_OPTS: u16 = 17;
pub const DHCPV6_OPTION_INTERFACE_ID: u16 = 18;
pub const DHCPV6_OPTION_RECONF_MSG: u16 = 19;
pub const DHCPV6_OPTION_RECONF_ACCEPT: u16 = 20;
pub const DHCPV6_OPTION_SIP_SERVER_D: u16 = 21;
pub const DHCPV6_OPTION_SIP_SERVER_A: u16 = 22;
pub const DHCPV6_OPTION_DNS_SERVERS: u16 = 23;
pub const DHCPV6_OPTION_DOMAIN_LIST: u16 = 24;
pub const DHCPV6_OPTION_IA_PD: u16 = 25;
pub const DHCPV6_OPTION_IAPREFIX: u16 = 26;
pub const DHCPV6_OPTION_INFORMATION_REFRESH_TIME: u16 = 32;
pub const DHCPV6_OPTION_SNTP_SERVERS: u16 = 31;
pub const DHCPV6_OPTION_REMOTE_ID: u16 = 37;
pub const DHCPV6_OPTION_SUBSCRIBER_ID: u16 = 38;
pub const DHCPV6_OPTION_CLIENT_FQDN: u16 = 39;
pub const DHCPV6_OPTION_NEW_POSIX_TIMEZONE: u16 = 41;
pub const DHCPV6_OPTION_NEW_TZDB_TIMEZONE: u16 = 42;
pub const DHCPV6_OPTION_LQ_QUERY: u16 = 44;
pub const DHCPV6_OPTION_CLIENT_DATA: u16 = 45;
pub const DHCPV6_OPTION_CLT_TIME: u16 = 46;
pub const DHCPV6_OPTION_LQ_RELAY_DATA: u16 = 47;
pub const DHCPV6_OPTION_LQ_CLIENT_LINK: u16 = 48;
pub const DHCPV6_OPTION_RELAY_ID: u16 = 53;
pub const DHCPV6_OPTION_NTP_SERVER: u16 = 56;
pub const DHCPV6_OPTION_SIP_UA_CS_LIST: u16 = 58;
pub const DHCPV6_OPTION_BOOTFILE_URL: u16 = 59;
pub const DHCPV6_OPTION_BOOTFILE_PARAM: u16 = 60;
pub const DHCPV6_OPTION_CLIENT_ARCH_TYPE: u16 = 61;
pub const DHCPV6_OPTION_NII: u16 = 62;
pub const DHCPV6_OPTION_AFTR_NAME: u16 = 64;
pub const DHCPV6_OPTION_ERP_LOCAL_DOMAIN_NAME: u16 = 65;
pub const DHCPV6_OPTION_RSOO: u16 = 66;
pub const DHCPV6_OPTION_PD_EXCLUDE: u16 = 67;
pub const DHCPV6_OPTION_CLIENT_LINKLAYER_ADDR: u16 = 79;
pub const DHCPV6_OPTION_RADIUS: u16 = 81;
pub const DHCPV6_OPTION_SOL_MAX_RT: u16 = 82;
pub const DHCPV6_OPTION_INF_MAX_RT: u16 = 83;
pub const DHCPV6_OPTION_DHCPV4_MSG: u16 = 87;
pub const DHCPV6_OPTION_DHCP4_O_DHCP6_SERVER: u16 = 88;
pub const DHCPV6_OPTION_S46_RULE: u16 = 89;
pub const DHCPV6_OPTION_S46_BR: u16 = 90;
pub const DHCPV6_OPTION_S46_DMR: u16 = 91;
pub const DHCPV6_OPTION_S46_V4V6BIND: u16 = 92;
pub const DHCPV6_OPTION_S46_PORTPARAMS: u16 = 93;
pub const DHCPV6_OPTION_S46_CONT_MAPE: u16 = 94;
pub const DHCPV6_OPTION_S46_CONT_MAPT: u16 = 95;
pub const DHCPV6_OPTION_S46_CONT_LW: u16 = 96;
pub const DHCPV6_OPTION_4RD: u16 = 97;
pub const DHCPV6_OPTION_4RD_MAP_RULE: u16 = 98;
pub const DHCPV6_OPTION_4RD_NON_MAP_RULE: u16 = 99;
pub const DHCPV6_OPTION_LQ_BASE_TIME: u16 = 100;
pub const DHCPV6_OPTION_LQ_START_TIME: u16 = 101;
pub const DHCPV6_OPTION_LQ_END_TIME: u16 = 102;
pub const DHCPV6_OPTION_CAPTIVE_PORTAL: u16 = 103;
pub const DHCPV6_OPTION_S46_PRIORITY: u16 = 111;
pub const DHCPV6_OPTION_MUD_URL_V6: u16 = 112;
pub const DHCPV6_OPTION_V6_PREFIX64: u16 = 113;
pub const DHCPV6_OPTION_F_BINDING_STATUS: u16 = 114;
pub const DHCPV6_OPTION_F_CONNECT_FLAGS: u16 = 115;
pub const DHCPV6_OPTION_F_DNS_REMOVAL_INFO: u16 = 116;
pub const DHCPV6_OPTION_F_DNS_HOST_NAME: u16 = 117;
pub const DHCPV6_OPTION_F_DNS_ZONE_NAME: u16 = 118;
pub const DHCPV6_OPTION_F_DNS_FLAGS: u16 = 119;
pub const DHCPV6_OPTION_F_EXPIRATION_TIME: u16 = 120;
pub const DHCPV6_OPTION_F_MAX_UNACKED_BNDUPD: u16 = 121;
pub const DHCPV6_OPTION_F_MCLT: u16 = 122;
pub const DHCPV6_OPTION_F_PARTNER_LIFETIME: u16 = 123;
pub const DHCPV6_OPTION_F_PARTNER_LIFETIME_SENT: u16 = 124;
pub const DHCPV6_OPTION_F_PARTNER_DOWN_TIME: u16 = 125;
pub const DHCPV6_OPTION_F_PARTNER_RAW_CLT_TIME: u16 = 126;
pub const DHCPV6_OPTION_F_PROTOCOL_VERSION: u16 = 127;
pub const DHCPV6_OPTION_F_KEEPALIVE_TIME: u16 = 128;
pub const DHCPV6_OPTION_F_RECONFIGURE_DATA: u16 = 129;
pub const DHCPV6_OPTION_F_RELATIONSHIP_NAME: u16 = 130;
pub const DHCPV6_OPTION_F_SERVER_FLAGS: u16 = 131;
pub const DHCPV6_OPTION_F_SERVER_STATE: u16 = 132;
pub const DHCPV6_OPTION_F_START_TIME_OF_STATE: u16 = 133;
pub const DHCPV6_OPTION_F_STATE_EXPIRATION_TIME: u16 = 134;
pub const DHCPV6_OPTION_RELAY_PORT: u16 = 135;
pub const DHCPV6_OPTION_S46_BIND_IPV6_PREFIX: u16 = 137;
pub const DHCPV6_OPTION_V6_DNR: u16 = 144;
pub const DHCPV6_OPTION_ADDR_REG_ENABLE: u16 = 148;
pub const DHCPV6_TIME_INFINITY: u32 = u32::MAX;
pub const DHCPV6_SUPPORTED_TRANSPORT_DOMTLS_BIT: u8 = 0;
pub const DHCPV6_SUPPORTED_TRANSPORT_MIN_BIT: u8 = 0;
pub const DHCPV6_SUPPORTED_TRANSPORT_MAX_BIT: u8 = 15;
pub const DHCPV6_RADIUS_ATTRIBUTE_VENDOR_SPECIFIC: u8 = 26;
pub const DHCPV6_RADIUS_ATTRIBUTE_DELEGATED_IPV6_PREFIX: u8 = 123;
pub const DHCPV6_RADIUS_ATTRIBUTE_DS_LITE_TUNNEL_NAME: u8 = 144;
pub const DHCPV6_RADIUS_ATTRIBUTE_FRAMED_IPV6_ADDRESS: u8 = 168;
pub const DHCPV6_RADIUS_ATTRIBUTE_DNS_SERVER_IPV6_ADDRESS: u8 = 169;
pub const DHCPV6_RADIUS_ATTRIBUTE_DELEGATED_IPV6_PREFIX_POOL: u8 = 171;
pub const DHCPV6_RADIUS_ATTRIBUTE_STATEFUL_IPV6_ADDRESS_POOL: u8 = 172;
pub const DHCPV6_RADIUS_ATTRIBUTE_EXTENDED_TYPE_1: u8 = 245;
pub const DHCPV6_RADIUS_ATTRIBUTE_DHCPV6_OPTIONS_EXTENDED_TYPE: u8 = 3;
pub const DHCPV6_AUTH_HEADER_LEN: usize = 11;
pub const DHCPV6_AUTH_REPLAY_DETECTION_LEN: usize = 8;
pub const DHCPV6_AUTH_PROTOCOL_CONFIGURATION_TOKEN: u8 = 0;
pub const DHCPV6_AUTH_PROTOCOL_DELAYED: u8 = 1;
pub const DHCPV6_AUTH_PROTOCOL_DHCPV6_DELAYED_OBSOLETE: u8 = 2;
pub const DHCPV6_AUTH_PROTOCOL_RECONFIGURE_KEY: u8 = 3;
pub const DHCPV6_AUTH_PROTOCOL_SPLIT_HORIZON_DNS: u8 = 4;
pub const DHCPV6_AUTH_ALGORITHM_CONFIGURATION_TOKEN: u8 = 0;
pub const DHCPV6_AUTH_ALGORITHM_HMAC_MD5: u8 = 1;
pub const DHCPV6_AUTH_RDM_MONOTONIC_COUNTER: u8 = 0;
pub const DHCPV6_SOLICIT: u8 = 1;
pub const DHCPV6_ADVERTISE: u8 = 2;
pub const DHCPV6_REQUEST: u8 = 3;
pub const DHCPV6_CONFIRM: u8 = 4;
pub const DHCPV6_RENEW: u8 = 5;
pub const DHCPV6_REBIND: u8 = 6;
pub const DHCPV6_REPLY: u8 = 7;
pub const DHCPV6_RELEASE: u8 = 8;
pub const DHCPV6_DECLINE: u8 = 9;
pub const DHCPV6_RECONFIGURE: u8 = 10;
pub const DHCPV6_INFORMATION_REQUEST: u8 = 11;
pub const DHCPV6_RELAY_FORW: u8 = 12;
pub const DHCPV6_RELAY_REPL: u8 = 13;
pub const DHCPV6_LEASEQUERY: u8 = 14;
pub const DHCPV6_LEASEQUERY_REPLY: u8 = 15;
pub const DHCPV6_LEASEQUERY_DONE: u8 = 16;
pub const DHCPV6_LEASEQUERY_DATA: u8 = 17;
pub const DHCPV6_RECONFIGURE_REQUEST: u8 = 18;
pub const DHCPV6_RECONFIGURE_REPLY: u8 = 19;
pub const DHCPV6_DHCPV4_QUERY: u8 = 20;
pub const DHCPV6_DHCPV4_RESPONSE: u8 = 21;
pub const DHCPV6_ACTIVE_LEASEQUERY: u8 = 22;
pub const DHCPV6_STARTTLS: u8 = 23;
pub const DHCPV6_BNDUPD: u8 = 24;
pub const DHCPV6_BNDREPLY: u8 = 25;
pub const DHCPV6_POOLREQ: u8 = 26;
pub const DHCPV6_POOLRESP: u8 = 27;
pub const DHCPV6_UPDREQ: u8 = 28;
pub const DHCPV6_UPDREQALL: u8 = 29;
pub const DHCPV6_UPDDONE: u8 = 30;
pub const DHCPV6_CONNECT: u8 = 31;
pub const DHCPV6_CONNECTREPLY: u8 = 32;
pub const DHCPV6_DISCONNECT: u8 = 33;
pub const DHCPV6_STATE: u8 = 34;
pub const DHCPV6_CONTACT: u8 = 35;
pub const DHCPV6_ADDR_REG_INFORM: u8 = 36;
pub const DHCPV6_ADDR_REG_REPLY: u8 = 37;
pub const DHCPV6_MESSAGE_TYPE_RESERVED: u8 = 0;
pub const DHCPV6_MESSAGE_TYPE_UNASSIGNED_START: u8 = 38;
pub const DHCPV6_MESSAGE_TYPE_UNASSIGNED_END: u8 = u8::MAX;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Dhcpv6MessageTypeStatus {
Reserved,
Registered,
Unassigned,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Dhcpv6MessageTypeMeta {
pub code: u8,
pub name: &'static str,
pub status: Dhcpv6MessageTypeStatus,
}
pub const fn dhcpv6_message_type_meta(code: u8) -> Dhcpv6MessageTypeMeta {
match code {
DHCPV6_MESSAGE_TYPE_RESERVED => {
dhcpv6_message_type_entry(code, "Reserved", Dhcpv6MessageTypeStatus::Reserved)
}
DHCPV6_SOLICIT => {
dhcpv6_message_type_entry(code, "SOLICIT", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_ADVERTISE => {
dhcpv6_message_type_entry(code, "ADVERTISE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_REQUEST => {
dhcpv6_message_type_entry(code, "REQUEST", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_CONFIRM => {
dhcpv6_message_type_entry(code, "CONFIRM", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_RENEW => {
dhcpv6_message_type_entry(code, "RENEW", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_REBIND => {
dhcpv6_message_type_entry(code, "REBIND", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_REPLY => {
dhcpv6_message_type_entry(code, "REPLY", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_RELEASE => {
dhcpv6_message_type_entry(code, "RELEASE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_DECLINE => {
dhcpv6_message_type_entry(code, "DECLINE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_RECONFIGURE => {
dhcpv6_message_type_entry(code, "RECONFIGURE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_INFORMATION_REQUEST => dhcpv6_message_type_entry(
code,
"INFORMATION-REQUEST",
Dhcpv6MessageTypeStatus::Registered,
),
DHCPV6_RELAY_FORW => {
dhcpv6_message_type_entry(code, "RELAY-FORW", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_RELAY_REPL => {
dhcpv6_message_type_entry(code, "RELAY-REPL", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_LEASEQUERY => {
dhcpv6_message_type_entry(code, "LEASEQUERY", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_LEASEQUERY_REPLY => dhcpv6_message_type_entry(
code,
"LEASEQUERY-REPLY",
Dhcpv6MessageTypeStatus::Registered,
),
DHCPV6_LEASEQUERY_DONE => {
dhcpv6_message_type_entry(code, "LEASEQUERY-DONE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_LEASEQUERY_DATA => {
dhcpv6_message_type_entry(code, "LEASEQUERY-DATA", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_RECONFIGURE_REQUEST => dhcpv6_message_type_entry(
code,
"RECONFIGURE-REQUEST",
Dhcpv6MessageTypeStatus::Registered,
),
DHCPV6_RECONFIGURE_REPLY => dhcpv6_message_type_entry(
code,
"RECONFIGURE-REPLY",
Dhcpv6MessageTypeStatus::Registered,
),
DHCPV6_DHCPV4_QUERY => {
dhcpv6_message_type_entry(code, "DHCPV4-QUERY", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_DHCPV4_RESPONSE => {
dhcpv6_message_type_entry(code, "DHCPV4-RESPONSE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_ACTIVE_LEASEQUERY => dhcpv6_message_type_entry(
code,
"ACTIVELEASEQUERY",
Dhcpv6MessageTypeStatus::Registered,
),
DHCPV6_STARTTLS => {
dhcpv6_message_type_entry(code, "STARTTLS", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_BNDUPD => {
dhcpv6_message_type_entry(code, "BNDUPD", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_BNDREPLY => {
dhcpv6_message_type_entry(code, "BNDREPLY", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_POOLREQ => {
dhcpv6_message_type_entry(code, "POOLREQ", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_POOLRESP => {
dhcpv6_message_type_entry(code, "POOLRESP", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_UPDREQ => {
dhcpv6_message_type_entry(code, "UPDREQ", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_UPDREQALL => {
dhcpv6_message_type_entry(code, "UPDREQALL", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_UPDDONE => {
dhcpv6_message_type_entry(code, "UPDDONE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_CONNECT => {
dhcpv6_message_type_entry(code, "CONNECT", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_CONNECTREPLY => {
dhcpv6_message_type_entry(code, "CONNECTREPLY", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_DISCONNECT => {
dhcpv6_message_type_entry(code, "DISCONNECT", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_STATE => {
dhcpv6_message_type_entry(code, "STATE", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_CONTACT => {
dhcpv6_message_type_entry(code, "CONTACT", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_ADDR_REG_INFORM => {
dhcpv6_message_type_entry(code, "ADDR-REG-INFORM", Dhcpv6MessageTypeStatus::Registered)
}
DHCPV6_ADDR_REG_REPLY => {
dhcpv6_message_type_entry(code, "ADDR-REG-REPLY", Dhcpv6MessageTypeStatus::Registered)
}
_ => dhcpv6_message_type_entry(code, "Unassigned", Dhcpv6MessageTypeStatus::Unassigned),
}
}
pub const fn dhcpv6_message_type_status(code: u8) -> Dhcpv6MessageTypeStatus {
dhcpv6_message_type_meta(code).status
}
pub const fn dhcpv6_message_type_name(code: u8) -> Option<&'static str> {
match dhcpv6_message_type_meta(code).status {
Dhcpv6MessageTypeStatus::Registered => Some(dhcpv6_message_type_meta(code).name),
_ => None,
}
}
const fn dhcpv6_message_type_entry(
code: u8,
name: &'static str,
status: Dhcpv6MessageTypeStatus,
) -> Dhcpv6MessageTypeMeta {
Dhcpv6MessageTypeMeta { code, name, status }
}
pub const DHCPV6_STATUS_SUCCESS: u16 = 0;
pub const DHCPV6_STATUS_UNSPEC_FAIL: u16 = 1;
pub const DHCPV6_STATUS_NO_ADDRS_AVAIL: u16 = 2;
pub const DHCPV6_STATUS_NO_BINDING: u16 = 3;
pub const DHCPV6_STATUS_NOT_ON_LINK: u16 = 4;
pub const DHCPV6_STATUS_USE_MULTICAST: u16 = 5;
pub const DHCPV6_STATUS_NO_PREFIX_AVAIL: u16 = 6;
pub const DHCPV6_STATUS_UNKNOWN_QUERY_TYPE: u16 = 7;
pub const DHCPV6_STATUS_MALFORMED_QUERY: u16 = 8;
pub const DHCPV6_STATUS_NOT_CONFIGURED: u16 = 9;
pub const DHCPV6_STATUS_NOT_ALLOWED: u16 = 10;
pub const DHCPV6_STATUS_QUERY_TERMINATED: u16 = 11;
pub const DHCPV6_STATUS_DATA_MISSING: u16 = 12;
pub const DHCPV6_STATUS_CATCH_UP_COMPLETE: u16 = 13;
pub const DHCPV6_STATUS_NOT_SUPPORTED: u16 = 14;
pub const DHCPV6_STATUS_TLS_CONNECTION_REFUSED: u16 = 15;
pub const DHCPV6_STATUS_ADDRESS_IN_USE: u16 = 16;
pub const DHCPV6_STATUS_CONFIGURATION_CONFLICT: u16 = 17;
pub const DHCPV6_STATUS_MISSING_BINDING_INFORMATION: u16 = 18;
pub const DHCPV6_STATUS_OUTDATED_BINDING_INFORMATION: u16 = 19;
pub const DHCPV6_STATUS_SERVER_SHUTTING_DOWN: u16 = 20;
pub const DHCPV6_STATUS_DNS_UPDATE_NOT_SUPPORTED: u16 = 21;
pub const DHCPV6_STATUS_EXCESSIVE_TIME_SKEW: u16 = 22;
pub const DHCPV6_STATUS_NO_SRV6_LOCATOR_AVAIL: u16 = 23;
pub const DHCPV6_STATUS_UNASSIGNED_START: u16 = 24;
pub const DHCPV6_STATUS_UNASSIGNED_END: u16 = u16::MAX;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Dhcpv6StatusCodeStatus {
Registered,
Obsolete,
Unassigned,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Dhcpv6StatusCodeMeta {
pub code: u16,
pub name: &'static str,
pub status: Dhcpv6StatusCodeStatus,
}
pub const fn dhcpv6_status_code_meta(code: u16) -> Dhcpv6StatusCodeMeta {
match code {
DHCPV6_STATUS_SUCCESS => {
dhcpv6_status_code_entry(code, "Success", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_UNSPEC_FAIL => {
dhcpv6_status_code_entry(code, "UnspecFail", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_NO_ADDRS_AVAIL => {
dhcpv6_status_code_entry(code, "NoAddrsAvail", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_NO_BINDING => {
dhcpv6_status_code_entry(code, "NoBinding", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_NOT_ON_LINK => {
dhcpv6_status_code_entry(code, "NotOnLink", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_USE_MULTICAST => {
dhcpv6_status_code_entry(code, "UseMulticast", Dhcpv6StatusCodeStatus::Obsolete)
}
DHCPV6_STATUS_NO_PREFIX_AVAIL => {
dhcpv6_status_code_entry(code, "NoPrefixAvail", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_UNKNOWN_QUERY_TYPE => {
dhcpv6_status_code_entry(code, "UnknownQueryType", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_MALFORMED_QUERY => {
dhcpv6_status_code_entry(code, "MalformedQuery", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_NOT_CONFIGURED => {
dhcpv6_status_code_entry(code, "NotConfigured", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_NOT_ALLOWED => {
dhcpv6_status_code_entry(code, "NotAllowed", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_QUERY_TERMINATED => {
dhcpv6_status_code_entry(code, "QueryTerminated", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_DATA_MISSING => {
dhcpv6_status_code_entry(code, "DataMissing", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_CATCH_UP_COMPLETE => {
dhcpv6_status_code_entry(code, "CatchUpComplete", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_NOT_SUPPORTED => {
dhcpv6_status_code_entry(code, "NotSupported", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_TLS_CONNECTION_REFUSED => dhcpv6_status_code_entry(
code,
"TLSConnectionRefused",
Dhcpv6StatusCodeStatus::Registered,
),
DHCPV6_STATUS_ADDRESS_IN_USE => {
dhcpv6_status_code_entry(code, "AddressInUse", Dhcpv6StatusCodeStatus::Registered)
}
DHCPV6_STATUS_CONFIGURATION_CONFLICT => dhcpv6_status_code_entry(
code,
"ConfigurationConflict",
Dhcpv6StatusCodeStatus::Registered,
),
DHCPV6_STATUS_MISSING_BINDING_INFORMATION => dhcpv6_status_code_entry(
code,
"MissingBindingInformation",
Dhcpv6StatusCodeStatus::Registered,
),
DHCPV6_STATUS_OUTDATED_BINDING_INFORMATION => dhcpv6_status_code_entry(
code,
"OutdatedBindingInformation",
Dhcpv6StatusCodeStatus::Registered,
),
DHCPV6_STATUS_SERVER_SHUTTING_DOWN => dhcpv6_status_code_entry(
code,
"ServerShuttingDown",
Dhcpv6StatusCodeStatus::Registered,
),
DHCPV6_STATUS_DNS_UPDATE_NOT_SUPPORTED => dhcpv6_status_code_entry(
code,
"DNSUpdateNotSupported",
Dhcpv6StatusCodeStatus::Registered,
),
DHCPV6_STATUS_EXCESSIVE_TIME_SKEW => dhcpv6_status_code_entry(
code,
"ExcessiveTimeSkew",
Dhcpv6StatusCodeStatus::Registered,
),
DHCPV6_STATUS_NO_SRV6_LOCATOR_AVAIL => dhcpv6_status_code_entry(
code,
"NoSRv6LocatorAvail",
Dhcpv6StatusCodeStatus::Registered,
),
_ => dhcpv6_status_code_entry(code, "Unassigned", Dhcpv6StatusCodeStatus::Unassigned),
}
}
pub const fn dhcpv6_status_code_status(code: u16) -> Dhcpv6StatusCodeStatus {
dhcpv6_status_code_meta(code).status
}
pub const fn dhcpv6_status_code_name(code: u16) -> Option<&'static str> {
match dhcpv6_status_code_meta(code).status {
Dhcpv6StatusCodeStatus::Registered | Dhcpv6StatusCodeStatus::Obsolete => {
Some(dhcpv6_status_code_meta(code).name)
}
Dhcpv6StatusCodeStatus::Unassigned => None,
}
}
const fn dhcpv6_status_code_entry(
code: u16,
name: &'static str,
status: Dhcpv6StatusCodeStatus,
) -> Dhcpv6StatusCodeMeta {
Dhcpv6StatusCodeMeta { code, name, status }
}
pub const DHCPV6_DUID_LLT: u16 = 1;
pub const DHCPV6_DUID_EN: u16 = 2;
pub const DHCPV6_DUID_LL: u16 = 3;
pub const DHCPV6_DUID_UUID: u16 = 4;
pub const DHCPV6_DUID_UNASSIGNED_START: u16 = 5;
pub const DHCPV6_DUID_UNASSIGNED_END: u16 = u16::MAX;
#[cfg(test)]
mod dhcpv6_constants_tests {
use super::*;
#[test]
fn dhcpv6_wire_lengths_and_ports_match_rfc9915() {
assert_eq!(DHCPV6_CLIENT_SERVER_HEADER_LEN, 4);
assert_eq!(DHCPV6_RELAY_HEADER_LEN, 34);
assert_eq!(DHCPV6_OPTION_HEADER_LEN, 4);
assert_eq!(DHCPV6_TRANSACTION_ID_LEN, 3);
assert_eq!(DHCPV6_TRANSACTION_ID_MASK, 0x00ff_ffff);
assert_eq!(DHCPV6_TRANSACTION_ID_MAX, 0x00ff_ffff);
assert_eq!(DHCPV6_HOP_COUNT_LIMIT, 8);
assert_eq!(DHCPV6_CLIENT_PORT, 546);
assert_eq!(DHCPV6_SERVER_PORT, 547);
}
#[test]
fn dhcpv6_message_registry_metadata_preserves_registered_and_unassigned() {
for code in 1..=37 {
let meta = dhcpv6_message_type_meta(code);
assert_eq!(meta.code, code);
assert_eq!(
meta.status,
Dhcpv6MessageTypeStatus::Registered,
"message type {code} should be registered",
);
assert_eq!(dhcpv6_message_type_name(code), Some(meta.name));
}
let reserved = dhcpv6_message_type_meta(DHCPV6_MESSAGE_TYPE_RESERVED);
assert_eq!(reserved.name, "Reserved");
assert_eq!(reserved.status, Dhcpv6MessageTypeStatus::Reserved);
assert_eq!(dhcpv6_message_type_name(DHCPV6_MESSAGE_TYPE_RESERVED), None);
let unassigned = dhcpv6_message_type_meta(DHCPV6_MESSAGE_TYPE_UNASSIGNED_START);
assert_eq!(unassigned.name, "Unassigned");
assert_eq!(unassigned.status, Dhcpv6MessageTypeStatus::Unassigned);
assert_eq!(
dhcpv6_message_type_name(DHCPV6_MESSAGE_TYPE_UNASSIGNED_END),
None
);
}
#[test]
fn dhcpv6_status_registry_metadata_preserves_obsolete_and_unassigned() {
for code in 0..=23 {
let meta = dhcpv6_status_code_meta(code);
assert_eq!(meta.code, code);
assert!(
matches!(
meta.status,
Dhcpv6StatusCodeStatus::Registered | Dhcpv6StatusCodeStatus::Obsolete
),
"status code {code} should be known",
);
assert_eq!(dhcpv6_status_code_name(code), Some(meta.name));
}
let obsolete = dhcpv6_status_code_meta(DHCPV6_STATUS_USE_MULTICAST);
assert_eq!(obsolete.name, "UseMulticast");
assert_eq!(obsolete.status, Dhcpv6StatusCodeStatus::Obsolete);
let unassigned = dhcpv6_status_code_meta(DHCPV6_STATUS_UNASSIGNED_START);
assert_eq!(unassigned.name, "Unassigned");
assert_eq!(unassigned.status, Dhcpv6StatusCodeStatus::Unassigned);
assert_eq!(dhcpv6_status_code_name(DHCPV6_STATUS_UNASSIGNED_END), None);
}
#[test]
fn dhcpv6_core_codepoint_constants_match_registries() {
assert_eq!(DHCPV6_SOLICIT, 1);
assert_eq!(DHCPV6_RELAY_FORW, 12);
assert_eq!(DHCPV6_ADDR_REG_REPLY, 37);
assert_eq!(DHCPV6_STATUS_SUCCESS, 0);
assert_eq!(DHCPV6_STATUS_NO_SRV6_LOCATOR_AVAIL, 23);
assert_eq!(DHCPV6_DUID_LLT, 1);
assert_eq!(DHCPV6_DUID_EN, 2);
assert_eq!(DHCPV6_DUID_LL, 3);
assert_eq!(DHCPV6_DUID_UUID, 4);
}
}