#![allow(dead_code)]
use core::fmt;
pub const SCTP_COMMON_HEADER_LEN: usize = 12;
pub const SCTP_CHUNK_HEADER_LEN: usize = 4;
pub const SCTP_PARAMETER_HEADER_LEN: usize = 4;
pub const SCTP_ERROR_CAUSE_HEADER_LEN: usize = 4;
pub const SCTP_ALIGNMENT: usize = 4;
pub const SCTP_CHECKSUM_LEN: usize = 4;
pub const SCTP_CHECKSUM_OFFSET: usize = 8;
pub const SCTP_IP_PROTOCOL: u8 = crate::protocols::ip::shared::IPPROTO_SCTP;
pub const SCTP_IPV4_PROTOCOL: u8 = SCTP_IP_PROTOCOL;
pub const SCTP_IPV6_NEXT_HEADER: u8 = SCTP_IP_PROTOCOL;
pub const SCTP_UDP_ENCAPSULATION_PORT: u16 = 9_899;
pub const SCTP_UDP_TUNNELING_PORT: u16 = SCTP_UDP_ENCAPSULATION_PORT;
pub const SCTP_CHUNK_TYPE_DATA: u8 = 0;
pub const SCTP_CHUNK_TYPE_INIT: u8 = 1;
pub const SCTP_CHUNK_TYPE_INIT_ACK: u8 = 2;
pub const SCTP_CHUNK_TYPE_SACK: u8 = 3;
pub const SCTP_CHUNK_TYPE_HEARTBEAT: u8 = 4;
pub const SCTP_CHUNK_TYPE_HEARTBEAT_ACK: u8 = 5;
pub const SCTP_CHUNK_TYPE_ABORT: u8 = 6;
pub const SCTP_CHUNK_TYPE_SHUTDOWN: u8 = 7;
pub const SCTP_CHUNK_TYPE_SHUTDOWN_ACK: u8 = 8;
pub const SCTP_CHUNK_TYPE_ERROR: u8 = 9;
pub const SCTP_CHUNK_TYPE_COOKIE_ECHO: u8 = 10;
pub const SCTP_CHUNK_TYPE_COOKIE_ACK: u8 = 11;
pub const SCTP_CHUNK_TYPE_ECNE: u8 = 12;
pub const SCTP_CHUNK_TYPE_CWR: u8 = 13;
pub const SCTP_CHUNK_TYPE_SHUTDOWN_COMPLETE: u8 = 14;
pub const SCTP_CHUNK_TYPE_AUTH: u8 = 15;
pub const SCTP_CHUNK_TYPE_IETF_DEFINED_EXTENSION_1: u8 = 63;
pub const SCTP_CHUNK_TYPE_I_DATA: u8 = 64;
pub const SCTP_CHUNK_TYPE_DTLS: u8 = 65;
pub const SCTP_CHUNK_TYPE_IETF_DEFINED_EXTENSION_2: u8 = 127;
pub const SCTP_CHUNK_TYPE_ASCONF_ACK: u8 = 128;
pub const SCTP_CHUNK_TYPE_RE_CONFIG: u8 = 130;
pub const SCTP_CHUNK_TYPE_PAD: u8 = 132;
pub const SCTP_CHUNK_TYPE_IETF_DEFINED_EXTENSION_3: u8 = 191;
pub const SCTP_CHUNK_TYPE_FORWARD_TSN: u8 = 192;
pub const SCTP_CHUNK_TYPE_ASCONF: u8 = 193;
pub const SCTP_CHUNK_TYPE_I_FORWARD_TSN: u8 = 194;
pub const SCTP_CHUNK_TYPE_IETF_DEFINED_EXTENSION_4: u8 = 255;
pub const SCTP_PARAMETER_TYPE_HEARTBEAT_INFO: u16 = 1;
pub const SCTP_PARAMETER_TYPE_IPV4_ADDRESS: u16 = 5;
pub const SCTP_PARAMETER_TYPE_IPV6_ADDRESS: u16 = 6;
pub const SCTP_PARAMETER_TYPE_STATE_COOKIE: u16 = 7;
pub const SCTP_PARAMETER_TYPE_UNRECOGNIZED_PARAMETER: u16 = 8;
pub const SCTP_PARAMETER_TYPE_COOKIE_PRESERVATIVE: u16 = 9;
pub const SCTP_PARAMETER_TYPE_HOST_NAME_ADDRESS: u16 = 11;
pub const SCTP_PARAMETER_TYPE_SUPPORTED_ADDRESS_TYPES: u16 = 12;
pub const SCTP_PARAMETER_TYPE_OUTGOING_SSN_RESET_REQUEST: u16 = 13;
pub const SCTP_PARAMETER_TYPE_INCOMING_SSN_RESET_REQUEST: u16 = 14;
pub const SCTP_PARAMETER_TYPE_SSN_TSN_RESET_REQUEST: u16 = 15;
pub const SCTP_PARAMETER_TYPE_RE_CONFIGURATION_RESPONSE: u16 = 16;
pub const SCTP_PARAMETER_TYPE_ADD_OUTGOING_STREAMS_REQUEST: u16 = 17;
pub const SCTP_PARAMETER_TYPE_ADD_INCOMING_STREAMS_REQUEST: u16 = 18;
pub const SCTP_PARAMETER_TYPE_ECN_CAPABLE: u16 = 32_768;
pub const SCTP_PARAMETER_TYPE_ZERO_CHECKSUM_ACCEPTABLE: u16 = 32_769;
pub const SCTP_PARAMETER_TYPE_RANDOM: u16 = 32_770;
pub const SCTP_PARAMETER_TYPE_CHUNK_LIST: u16 = 32_771;
pub const SCTP_PARAMETER_TYPE_REQUESTED_HMAC_ALGORITHM: u16 = 32_772;
pub const SCTP_PARAMETER_TYPE_PADDING: u16 = 32_773;
pub const SCTP_PARAMETER_TYPE_DTLS_KEY_MANAGEMENT: u16 = 32_774;
pub const SCTP_PARAMETER_TYPE_SUPPORTED_EXTENSIONS: u16 = 32_776;
pub const SCTP_PARAMETER_TYPE_FORWARD_TSN_SUPPORTED: u16 = 49_152;
pub const SCTP_PARAMETER_TYPE_ADD_IP_ADDRESS: u16 = 49_153;
pub const SCTP_PARAMETER_TYPE_DELETE_IP_ADDRESS: u16 = 49_154;
pub const SCTP_PARAMETER_TYPE_ERROR_CAUSE_INDICATION: u16 = 49_155;
pub const SCTP_PARAMETER_TYPE_SET_PRIMARY_ADDRESS: u16 = 49_156;
pub const SCTP_PARAMETER_TYPE_SUCCESS_INDICATION: u16 = 49_157;
pub const SCTP_PARAMETER_TYPE_ADAPTATION_LAYER_INDICATION: u16 = 49_158;
pub const SCTP_PARAMETER_TYPE_IETF_DEFINED_EXTENSION: u16 = 65_535;
pub const SCTP_CAUSE_CODE_INVALID_STREAM_IDENTIFIER: u16 = 1;
pub const SCTP_CAUSE_CODE_MISSING_MANDATORY_PARAMETER: u16 = 2;
pub const SCTP_CAUSE_CODE_STALE_COOKIE: u16 = 3;
pub const SCTP_CAUSE_CODE_OUT_OF_RESOURCE: u16 = 4;
pub const SCTP_CAUSE_CODE_UNRESOLVABLE_ADDRESS: u16 = 5;
pub const SCTP_CAUSE_CODE_UNRECOGNIZED_CHUNK_TYPE: u16 = 6;
pub const SCTP_CAUSE_CODE_INVALID_MANDATORY_PARAMETER: u16 = 7;
pub const SCTP_CAUSE_CODE_UNRECOGNIZED_PARAMETERS: u16 = 8;
pub const SCTP_CAUSE_CODE_NO_USER_DATA: u16 = 9;
pub const SCTP_CAUSE_CODE_COOKIE_RECEIVED_WHILE_SHUTTING_DOWN: u16 = 10;
pub const SCTP_CAUSE_CODE_RESTART_WITH_NEW_ADDRESSES: u16 = 11;
pub const SCTP_CAUSE_CODE_USER_INITIATED_ABORT: u16 = 12;
pub const SCTP_CAUSE_CODE_PROTOCOL_VIOLATION: u16 = 13;
pub const SCTP_CAUSE_CODE_DELETE_LAST_REMAINING_IP_ADDRESS: u16 = 160;
pub const SCTP_CAUSE_CODE_OPERATION_REFUSED_RESOURCE_SHORTAGE: u16 = 161;
pub const SCTP_CAUSE_CODE_DELETE_SOURCE_IP_ADDRESS: u16 = 162;
pub const SCTP_CAUSE_CODE_ILLEGAL_ASCONF_ACK: u16 = 163;
pub const SCTP_CAUSE_CODE_REQUEST_REFUSED_NO_AUTHORIZATION: u16 = 164;
pub const SCTP_CAUSE_CODE_UNSUPPORTED_HMAC_IDENTIFIER: u16 = 261;
pub const SCTP_PPID_RESERVED: u32 = 0;
pub const SCTP_PPID_IUA: u32 = 1;
pub const SCTP_PPID_M2UA: u32 = 2;
pub const SCTP_PPID_M3UA: u32 = 3;
pub const SCTP_PPID_SUA: u32 = 4;
pub const SCTP_PPID_M2PA: u32 = 5;
pub const SCTP_PPID_V5UA: u32 = 6;
pub const SCTP_PPID_H248: u32 = 7;
pub const SCTP_PPID_BICC_Q2150_3: u32 = 8;
pub const SCTP_PPID_TALI: u32 = 9;
pub const SCTP_PPID_DUA: u32 = 10;
pub const SCTP_PPID_ASAP: u32 = 11;
pub const SCTP_PPID_ENRP: u32 = 12;
pub const SCTP_PPID_H323: u32 = 13;
pub const SCTP_PPID_QIPC_Q2150_3: u32 = 14;
pub const SCTP_PPID_SIMCO: u32 = 15;
pub const SCTP_PPID_DDP_SEGMENT_CHUNK: u32 = 16;
pub const SCTP_PPID_DDP_STREAM_SESSION_CONTROL: u32 = 17;
pub const SCTP_PPID_S1AP: u32 = 18;
pub const SCTP_PPID_RUA: u32 = 19;
pub const SCTP_PPID_HNBAP: u32 = 20;
pub const SCTP_PPID_FORCES_HP: u32 = 21;
pub const SCTP_PPID_FORCES_MP: u32 = 22;
pub const SCTP_PPID_FORCES_LP: u32 = 23;
pub const SCTP_PPID_SBC_AP: u32 = 24;
pub const SCTP_PPID_NBAP: u32 = 25;
pub const SCTP_PPID_X2AP: u32 = 27;
pub const SCTP_PPID_IRCP: u32 = 28;
pub const SCTP_PPID_LCS_AP: u32 = 29;
pub const SCTP_PPID_MPICH2: u32 = 30;
pub const SCTP_PPID_SABP: u32 = 31;
pub const SCTP_PPID_FGP: u32 = 32;
pub const SCTP_PPID_PING_PONG: u32 = 33;
pub const SCTP_PPID_CALCAPP: u32 = 34;
pub const SCTP_PPID_SSP: u32 = 35;
pub const SCTP_PPID_NPMP_CONTROL: u32 = 36;
pub const SCTP_PPID_NPMP_DATA: u32 = 37;
pub const SCTP_PPID_ECHO: u32 = 38;
pub const SCTP_PPID_DISCARD: u32 = 39;
pub const SCTP_PPID_DAYTIME: u32 = 40;
pub const SCTP_PPID_CHARGEN: u32 = 41;
pub const SCTP_PPID_3GPP_RNA: u32 = 42;
pub const SCTP_PPID_3GPP_M2AP: u32 = 43;
pub const SCTP_PPID_3GPP_M3AP: u32 = 44;
pub const SCTP_PPID_SSH_OVER_SCTP: u32 = 45;
pub const SCTP_PPID_DIAMETER: u32 = 46;
pub const SCTP_PPID_DIAMETER_DTLS: u32 = 47;
pub const SCTP_PPID_R14P: u32 = 48;
pub const SCTP_PPID_GENERIC_DATA_TRANSFER: u32 = 49;
pub const SCTP_PPID_WEBRTC_DCEP: u32 = 50;
pub const SCTP_PPID_WEBRTC_STRING: u32 = 51;
pub const SCTP_PPID_WEBRTC_BINARY_PARTIAL: u32 = 52;
pub const SCTP_PPID_WEBRTC_BINARY: u32 = 53;
pub const SCTP_PPID_WEBRTC_STRING_PARTIAL: u32 = 54;
pub const SCTP_PPID_3GPP_PUA: u32 = 55;
pub const SCTP_PPID_WEBRTC_STRING_EMPTY: u32 = 56;
pub const SCTP_PPID_WEBRTC_BINARY_EMPTY: u32 = 57;
pub const SCTP_PPID_XWAP: u32 = 58;
pub const SCTP_PPID_XW_CONTROL_PLANE: u32 = 59;
pub const SCTP_PPID_NGAP: u32 = 60;
pub const SCTP_PPID_XNAP: u32 = 61;
pub const SCTP_PPID_F1AP: u32 = 62;
pub const SCTP_PPID_HTTP_OVER_SCTP: u32 = 63;
pub const SCTP_PPID_E1AP: u32 = 64;
pub const SCTP_PPID_ELE2_LI_AND_3GPP_DTLS_START: u32 = 65;
pub const SCTP_PPID_ELE2_LI_AND_3GPP_DTLS_END: u32 = 69;
pub const SCTP_PPID_ELE2_LI: u32 = 65;
pub const SCTP_PPID_NGAP_DTLS: u32 = 66;
pub const SCTP_PPID_XNAP_DTLS: u32 = 67;
pub const SCTP_PPID_F1AP_DTLS: u32 = 68;
pub const SCTP_PPID_E1AP_DTLS: u32 = 69;
pub const SCTP_PPID_E2_CP: u32 = 70;
pub const SCTP_PPID_ORAN_D2: u32 = 71;
pub const SCTP_PPID_E2_DU: u32 = 72;
pub const SCTP_PPID_W1AP: u32 = 73;
pub const SCTP_PPID_DTLS_CHUNK_KEY_MANAGEMENT: u32 = 4_242;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SctpPpidStatus {
Reserved,
Assigned,
Draft,
Unassigned,
}
impl SctpPpidStatus {
pub const fn as_str(self) -> &'static str {
match self {
Self::Reserved => "reserved",
Self::Assigned => "assigned",
Self::Draft => "draft",
Self::Unassigned => "unassigned",
}
}
}
impl fmt::Display for SctpPpidStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
pub const fn sctp_ppid_status(ppid: u32) -> SctpPpidStatus {
match ppid {
SCTP_PPID_RESERVED => SctpPpidStatus::Reserved,
SCTP_PPID_IUA..=SCTP_PPID_NBAP
| SCTP_PPID_X2AP..=SCTP_PPID_E1AP_DTLS
| SCTP_PPID_E2_CP..=SCTP_PPID_W1AP => SctpPpidStatus::Assigned,
SCTP_PPID_DTLS_CHUNK_KEY_MANAGEMENT => SctpPpidStatus::Draft,
_ => SctpPpidStatus::Unassigned,
}
}
pub const fn sctp_ppid_is_assigned(ppid: u32) -> bool {
matches!(sctp_ppid_status(ppid), SctpPpidStatus::Assigned)
}
pub const fn sctp_ppid_is_reserved(ppid: u32) -> bool {
matches!(sctp_ppid_status(ppid), SctpPpidStatus::Reserved)
}
pub const fn sctp_ppid_is_draft(ppid: u32) -> bool {
matches!(sctp_ppid_status(ppid), SctpPpidStatus::Draft)
}
pub const fn sctp_ppid_is_unassigned(ppid: u32) -> bool {
matches!(sctp_ppid_status(ppid), SctpPpidStatus::Unassigned)
}
pub const fn sctp_ppid_name(ppid: u32) -> Option<&'static str> {
match ppid {
SCTP_PPID_RESERVED => Some("Reserved by SCTP"),
SCTP_PPID_IUA => Some("IUA"),
SCTP_PPID_M2UA => Some("M2UA"),
SCTP_PPID_M3UA => Some("M3UA"),
SCTP_PPID_SUA => Some("SUA"),
SCTP_PPID_M2PA => Some("M2PA"),
SCTP_PPID_V5UA => Some("V5UA"),
SCTP_PPID_H248 => Some("H.248"),
SCTP_PPID_BICC_Q2150_3 => Some("BICC/Q.2150.3"),
SCTP_PPID_TALI => Some("TALI"),
SCTP_PPID_DUA => Some("DUA"),
SCTP_PPID_ASAP => Some("ASAP"),
SCTP_PPID_ENRP => Some("ENRP"),
SCTP_PPID_H323 => Some("H.323"),
SCTP_PPID_QIPC_Q2150_3 => Some("Q.IPC/Q.2150.3"),
SCTP_PPID_SIMCO => Some("SIMCO"),
SCTP_PPID_DDP_SEGMENT_CHUNK => Some("DDP Segment Chunk"),
SCTP_PPID_DDP_STREAM_SESSION_CONTROL => Some("DDP Stream Session Control"),
SCTP_PPID_S1AP => Some("S1AP"),
SCTP_PPID_RUA => Some("RUA"),
SCTP_PPID_HNBAP => Some("HNBAP"),
SCTP_PPID_FORCES_HP => Some("ForCES-HP"),
SCTP_PPID_FORCES_MP => Some("ForCES-MP"),
SCTP_PPID_FORCES_LP => Some("ForCES-LP"),
SCTP_PPID_SBC_AP => Some("SBc-AP"),
SCTP_PPID_NBAP => Some("NBAP"),
SCTP_PPID_X2AP => Some("X2AP"),
SCTP_PPID_IRCP => Some("IRCP - Inter Router Capability Protocol"),
SCTP_PPID_LCS_AP => Some("LCS-AP"),
SCTP_PPID_MPICH2 => Some("MPICH2"),
SCTP_PPID_SABP => Some("Service Area Broadcast Protocol (SABP)"),
SCTP_PPID_FGP => Some("Fractal Generator Protocol (FGP)"),
SCTP_PPID_PING_PONG => Some("Ping Pong Protocol (PPP)"),
SCTP_PPID_CALCAPP => Some("CalcApp Protocol (CALCAPP)"),
SCTP_PPID_SSP => Some("Scripting Service Protocol (SSP)"),
SCTP_PPID_NPMP_CONTROL => Some("NetPerfMeter Protocol Control Channel (NPMP-CONTROL)"),
SCTP_PPID_NPMP_DATA => Some("NetPerfMeter Protocol Data Channel (NPMP-DATA)"),
SCTP_PPID_ECHO => Some("Echo (ECHO)"),
SCTP_PPID_DISCARD => Some("Discard (DISCARD)"),
SCTP_PPID_DAYTIME => Some("Daytime (DAYTIME)"),
SCTP_PPID_CHARGEN => Some("Character Generator (CHARGEN)"),
SCTP_PPID_3GPP_RNA => Some("3GPP RNA"),
SCTP_PPID_3GPP_M2AP => Some("3GPP M2AP"),
SCTP_PPID_3GPP_M3AP => Some("3GPP M3AP"),
SCTP_PPID_SSH_OVER_SCTP => Some("SSH over SCTP"),
SCTP_PPID_DIAMETER => Some("Diameter in a SCTP DATA chunk"),
SCTP_PPID_DIAMETER_DTLS => Some("Diameter in a DTLS/SCTP DATA chunk"),
SCTP_PPID_R14P => Some("R14P. BER Encoded ASN.1 over SCTP"),
SCTP_PPID_GENERIC_DATA_TRANSFER => Some("Generic Data Transfer (GDT) Protocol"),
SCTP_PPID_WEBRTC_DCEP => Some("WebRTC DCEP"),
SCTP_PPID_WEBRTC_STRING => Some("WebRTC String"),
SCTP_PPID_WEBRTC_BINARY_PARTIAL => Some("WebRTC Binary Partial (deprecated)"),
SCTP_PPID_WEBRTC_BINARY => Some("WebRTC Binary"),
SCTP_PPID_WEBRTC_STRING_PARTIAL => Some("WebRTC String Partial (deprecated)"),
SCTP_PPID_3GPP_PUA => Some("3GPP PUA"),
SCTP_PPID_WEBRTC_STRING_EMPTY => Some("WebRTC String Empty"),
SCTP_PPID_WEBRTC_BINARY_EMPTY => Some("WebRTC Binary Empty"),
SCTP_PPID_XWAP => Some("3GPP XwAP"),
SCTP_PPID_XW_CONTROL_PLANE => Some("3GPP Xw-Control Plane"),
SCTP_PPID_NGAP => Some("3GPP NG Application Protocol (NGAP)"),
SCTP_PPID_XNAP => Some("3GPP Xn Application Protocol (XnAP)"),
SCTP_PPID_F1AP => Some("3GPP F1 Application Protocol (F1 AP)"),
SCTP_PPID_HTTP_OVER_SCTP => Some("HTTP/SCTP"),
SCTP_PPID_E1AP => Some("3GPP E1 Application Protocol (E1AP)"),
SCTP_PPID_ELE2_LI => Some("ELE2 Lawful Interception"),
SCTP_PPID_NGAP_DTLS => Some("3GPP NGAP over DTLS over SCTP"),
SCTP_PPID_XNAP_DTLS => Some("3GPP XnAP over DTLS over SCTP"),
SCTP_PPID_F1AP_DTLS => Some("3GPP F1AP over DTLS over SCTP"),
SCTP_PPID_E1AP_DTLS => Some("3GPP E1AP over DTLS over SCTP"),
SCTP_PPID_E2_CP => Some("E2-CP"),
SCTP_PPID_ORAN_D2 => Some("O-RAN D2"),
SCTP_PPID_E2_DU => Some("E2-DU"),
SCTP_PPID_W1AP => Some("3GPP W1AP"),
SCTP_PPID_DTLS_CHUNK_KEY_MANAGEMENT => Some("DTLS Chunk Key-Management Messages"),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sctp_constants_header_lengths_protocol_numbers_and_ports_are_source_backed() {
assert_eq!(SCTP_COMMON_HEADER_LEN, 12);
assert_eq!(SCTP_CHUNK_HEADER_LEN, 4);
assert_eq!(SCTP_PARAMETER_HEADER_LEN, 4);
assert_eq!(SCTP_ERROR_CAUSE_HEADER_LEN, 4);
assert_eq!(SCTP_ALIGNMENT, 4);
assert_eq!(SCTP_CHECKSUM_LEN, 4);
assert_eq!(SCTP_CHECKSUM_OFFSET, 8);
assert_eq!(SCTP_IP_PROTOCOL, 132);
assert_eq!(SCTP_IPV4_PROTOCOL, SCTP_IP_PROTOCOL);
assert_eq!(SCTP_IPV6_NEXT_HEADER, SCTP_IP_PROTOCOL);
assert_eq!(SCTP_UDP_ENCAPSULATION_PORT, 9_899);
assert_eq!(SCTP_UDP_TUNNELING_PORT, SCTP_UDP_ENCAPSULATION_PORT);
}
#[test]
fn sctp_constants_chunk_type_values_are_source_backed() {
assert_eq!(SCTP_CHUNK_TYPE_DATA, 0);
assert_eq!(SCTP_CHUNK_TYPE_INIT, 1);
assert_eq!(SCTP_CHUNK_TYPE_INIT_ACK, 2);
assert_eq!(SCTP_CHUNK_TYPE_SACK, 3);
assert_eq!(SCTP_CHUNK_TYPE_HEARTBEAT, 4);
assert_eq!(SCTP_CHUNK_TYPE_HEARTBEAT_ACK, 5);
assert_eq!(SCTP_CHUNK_TYPE_ABORT, 6);
assert_eq!(SCTP_CHUNK_TYPE_SHUTDOWN, 7);
assert_eq!(SCTP_CHUNK_TYPE_SHUTDOWN_ACK, 8);
assert_eq!(SCTP_CHUNK_TYPE_ERROR, 9);
assert_eq!(SCTP_CHUNK_TYPE_COOKIE_ECHO, 10);
assert_eq!(SCTP_CHUNK_TYPE_COOKIE_ACK, 11);
assert_eq!(SCTP_CHUNK_TYPE_ECNE, 12);
assert_eq!(SCTP_CHUNK_TYPE_CWR, 13);
assert_eq!(SCTP_CHUNK_TYPE_SHUTDOWN_COMPLETE, 14);
assert_eq!(SCTP_CHUNK_TYPE_AUTH, 15);
assert_eq!(SCTP_CHUNK_TYPE_I_DATA, 64);
assert_eq!(SCTP_CHUNK_TYPE_DTLS, 65);
assert_eq!(SCTP_CHUNK_TYPE_ASCONF_ACK, 128);
assert_eq!(SCTP_CHUNK_TYPE_RE_CONFIG, 130);
assert_eq!(SCTP_CHUNK_TYPE_PAD, 132);
assert_eq!(SCTP_CHUNK_TYPE_FORWARD_TSN, 192);
assert_eq!(SCTP_CHUNK_TYPE_ASCONF, 193);
assert_eq!(SCTP_CHUNK_TYPE_I_FORWARD_TSN, 194);
assert_eq!(SCTP_CHUNK_TYPE_IETF_DEFINED_EXTENSION_4, 255);
}
#[test]
fn sctp_constants_parameter_and_cause_values_are_source_backed() {
assert_eq!(SCTP_PARAMETER_TYPE_HEARTBEAT_INFO, 1);
assert_eq!(SCTP_PARAMETER_TYPE_IPV4_ADDRESS, 5);
assert_eq!(SCTP_PARAMETER_TYPE_IPV6_ADDRESS, 6);
assert_eq!(SCTP_PARAMETER_TYPE_STATE_COOKIE, 7);
assert_eq!(SCTP_PARAMETER_TYPE_UNRECOGNIZED_PARAMETER, 8);
assert_eq!(SCTP_PARAMETER_TYPE_COOKIE_PRESERVATIVE, 9);
assert_eq!(SCTP_PARAMETER_TYPE_HOST_NAME_ADDRESS, 11);
assert_eq!(SCTP_PARAMETER_TYPE_SUPPORTED_ADDRESS_TYPES, 12);
assert_eq!(SCTP_PARAMETER_TYPE_ZERO_CHECKSUM_ACCEPTABLE, 32_769);
assert_eq!(SCTP_PARAMETER_TYPE_RANDOM, 32_770);
assert_eq!(SCTP_PARAMETER_TYPE_SUPPORTED_EXTENSIONS, 32_776);
assert_eq!(SCTP_PARAMETER_TYPE_FORWARD_TSN_SUPPORTED, 49_152);
assert_eq!(SCTP_PARAMETER_TYPE_ADAPTATION_LAYER_INDICATION, 49_158);
assert_eq!(SCTP_PARAMETER_TYPE_IETF_DEFINED_EXTENSION, 65_535);
assert_eq!(SCTP_CAUSE_CODE_INVALID_STREAM_IDENTIFIER, 1);
assert_eq!(SCTP_CAUSE_CODE_PROTOCOL_VIOLATION, 13);
assert_eq!(SCTP_CAUSE_CODE_DELETE_LAST_REMAINING_IP_ADDRESS, 160);
assert_eq!(SCTP_CAUSE_CODE_REQUEST_REFUSED_NO_AUTHORIZATION, 164);
assert_eq!(SCTP_CAUSE_CODE_UNSUPPORTED_HMAC_IDENTIFIER, 261);
}
#[test]
fn sctp_constants_ppid_values_are_source_backed() {
assert_eq!(SCTP_PPID_RESERVED, 0);
assert_eq!(SCTP_PPID_IUA, 1);
assert_eq!(SCTP_PPID_V5UA, 6);
assert_eq!(SCTP_PPID_H248, 7);
assert_eq!(SCTP_PPID_SIMCO, 15);
assert_eq!(SCTP_PPID_DDP_SEGMENT_CHUNK, 16);
assert_eq!(SCTP_PPID_NBAP, 25);
assert_eq!(SCTP_PPID_X2AP, 27);
assert_eq!(SCTP_PPID_CHARGEN, 41);
assert_eq!(SCTP_PPID_SSH_OVER_SCTP, 45);
assert_eq!(SCTP_PPID_DIAMETER, 46);
assert_eq!(SCTP_PPID_WEBRTC_DCEP, 50);
assert_eq!(SCTP_PPID_WEBRTC_BINARY_EMPTY, 57);
assert_eq!(SCTP_PPID_XWAP, 58);
assert_eq!(SCTP_PPID_E1AP, 64);
assert_eq!(SCTP_PPID_ELE2_LI_AND_3GPP_DTLS_START, 65);
assert_eq!(SCTP_PPID_ELE2_LI, 65);
assert_eq!(SCTP_PPID_E1AP_DTLS, 69);
assert_eq!(SCTP_PPID_ELE2_LI_AND_3GPP_DTLS_END, 69);
assert_eq!(SCTP_PPID_E2_CP, 70);
assert_eq!(SCTP_PPID_W1AP, 73);
assert_eq!(SCTP_PPID_DTLS_CHUNK_KEY_MANAGEMENT, 4_242);
}
#[test]
fn sctp_ppid_classification_names_and_status_are_source_backed() {
assert_eq!(
sctp_ppid_status(SCTP_PPID_RESERVED),
SctpPpidStatus::Reserved
);
assert_eq!(sctp_ppid_name(SCTP_PPID_RESERVED), Some("Reserved by SCTP"));
assert!(sctp_ppid_is_reserved(SCTP_PPID_RESERVED));
assert_eq!(
sctp_ppid_status(SCTP_PPID_WEBRTC_DCEP),
SctpPpidStatus::Assigned
);
assert_eq!(sctp_ppid_name(SCTP_PPID_WEBRTC_DCEP), Some("WebRTC DCEP"));
assert!(sctp_ppid_is_assigned(SCTP_PPID_WEBRTC_DCEP));
assert_eq!(
sctp_ppid_name(SCTP_PPID_IRCP),
Some("IRCP - Inter Router Capability Protocol")
);
assert_eq!(
sctp_ppid_name(SCTP_PPID_NPMP_CONTROL),
Some("NetPerfMeter Protocol Control Channel (NPMP-CONTROL)")
);
assert_eq!(
sctp_ppid_name(SCTP_PPID_E1AP_DTLS),
Some("3GPP E1AP over DTLS over SCTP")
);
assert_eq!(sctp_ppid_status(26), SctpPpidStatus::Unassigned);
assert_eq!(sctp_ppid_name(26), None);
assert!(sctp_ppid_is_unassigned(26));
assert_eq!(
sctp_ppid_status(SCTP_PPID_DTLS_CHUNK_KEY_MANAGEMENT),
SctpPpidStatus::Draft
);
assert_eq!(
sctp_ppid_name(SCTP_PPID_DTLS_CHUNK_KEY_MANAGEMENT),
Some("DTLS Chunk Key-Management Messages")
);
assert!(sctp_ppid_is_draft(SCTP_PPID_DTLS_CHUNK_KEY_MANAGEMENT));
assert_eq!(SctpPpidStatus::Draft.to_string(), "draft");
}
}