162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 262306a36Sopenharmony_ci#ifndef _UAPI_LINUX_DCCP_H 362306a36Sopenharmony_ci#define _UAPI_LINUX_DCCP_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/types.h> 662306a36Sopenharmony_ci#include <asm/byteorder.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci/** 962306a36Sopenharmony_ci * struct dccp_hdr - generic part of DCCP packet header 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * @dccph_sport - Relevant port on the endpoint that sent this packet 1262306a36Sopenharmony_ci * @dccph_dport - Relevant port on the other endpoint 1362306a36Sopenharmony_ci * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words 1462306a36Sopenharmony_ci * @dccph_ccval - Used by the HC-Sender CCID 1562306a36Sopenharmony_ci * @dccph_cscov - Parts of the packet that are covered by the Checksum field 1662306a36Sopenharmony_ci * @dccph_checksum - Internet checksum, depends on dccph_cscov 1762306a36Sopenharmony_ci * @dccph_x - 0 = 24 bit sequence number, 1 = 48 1862306a36Sopenharmony_ci * @dccph_type - packet type, see DCCP_PKT_ prefixed macros 1962306a36Sopenharmony_ci * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_cistruct dccp_hdr { 2262306a36Sopenharmony_ci __be16 dccph_sport, 2362306a36Sopenharmony_ci dccph_dport; 2462306a36Sopenharmony_ci __u8 dccph_doff; 2562306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD) 2662306a36Sopenharmony_ci __u8 dccph_cscov:4, 2762306a36Sopenharmony_ci dccph_ccval:4; 2862306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD) 2962306a36Sopenharmony_ci __u8 dccph_ccval:4, 3062306a36Sopenharmony_ci dccph_cscov:4; 3162306a36Sopenharmony_ci#else 3262306a36Sopenharmony_ci#error "Adjust your <asm/byteorder.h> defines" 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci __sum16 dccph_checksum; 3562306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD) 3662306a36Sopenharmony_ci __u8 dccph_x:1, 3762306a36Sopenharmony_ci dccph_type:4, 3862306a36Sopenharmony_ci dccph_reserved:3; 3962306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD) 4062306a36Sopenharmony_ci __u8 dccph_reserved:3, 4162306a36Sopenharmony_ci dccph_type:4, 4262306a36Sopenharmony_ci dccph_x:1; 4362306a36Sopenharmony_ci#else 4462306a36Sopenharmony_ci#error "Adjust your <asm/byteorder.h> defines" 4562306a36Sopenharmony_ci#endif 4662306a36Sopenharmony_ci __u8 dccph_seq2; 4762306a36Sopenharmony_ci __be16 dccph_seq; 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/** 5162306a36Sopenharmony_ci * struct dccp_hdr_ext - the low bits of a 48 bit seq packet 5262306a36Sopenharmony_ci * 5362306a36Sopenharmony_ci * @dccph_seq_low - low 24 bits of a 48 bit seq packet 5462306a36Sopenharmony_ci */ 5562306a36Sopenharmony_cistruct dccp_hdr_ext { 5662306a36Sopenharmony_ci __be32 dccph_seq_low; 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/** 6062306a36Sopenharmony_ci * struct dccp_hdr_request - Connection initiation request header 6162306a36Sopenharmony_ci * 6262306a36Sopenharmony_ci * @dccph_req_service - Service to which the client app wants to connect 6362306a36Sopenharmony_ci */ 6462306a36Sopenharmony_cistruct dccp_hdr_request { 6562306a36Sopenharmony_ci __be32 dccph_req_service; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci/** 6862306a36Sopenharmony_ci * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets 6962306a36Sopenharmony_ci * 7062306a36Sopenharmony_ci * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR 7162306a36Sopenharmony_ci * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_cistruct dccp_hdr_ack_bits { 7462306a36Sopenharmony_ci __be16 dccph_reserved1; 7562306a36Sopenharmony_ci __be16 dccph_ack_nr_high; 7662306a36Sopenharmony_ci __be32 dccph_ack_nr_low; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci/** 7962306a36Sopenharmony_ci * struct dccp_hdr_response - Connection initiation response header 8062306a36Sopenharmony_ci * 8162306a36Sopenharmony_ci * @dccph_resp_ack - 48 bit Acknowledgment Number Subheader (5.3) 8262306a36Sopenharmony_ci * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request 8362306a36Sopenharmony_ci */ 8462306a36Sopenharmony_cistruct dccp_hdr_response { 8562306a36Sopenharmony_ci struct dccp_hdr_ack_bits dccph_resp_ack; 8662306a36Sopenharmony_ci __be32 dccph_resp_service; 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/** 9062306a36Sopenharmony_ci * struct dccp_hdr_reset - Unconditionally shut down a connection 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci * @dccph_reset_ack - 48 bit Acknowledgment Number Subheader (5.6) 9362306a36Sopenharmony_ci * @dccph_reset_code - one of %dccp_reset_codes 9462306a36Sopenharmony_ci * @dccph_reset_data - the Data 1 ... Data 3 fields from 5.6 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_cistruct dccp_hdr_reset { 9762306a36Sopenharmony_ci struct dccp_hdr_ack_bits dccph_reset_ack; 9862306a36Sopenharmony_ci __u8 dccph_reset_code, 9962306a36Sopenharmony_ci dccph_reset_data[3]; 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cienum dccp_pkt_type { 10362306a36Sopenharmony_ci DCCP_PKT_REQUEST = 0, 10462306a36Sopenharmony_ci DCCP_PKT_RESPONSE, 10562306a36Sopenharmony_ci DCCP_PKT_DATA, 10662306a36Sopenharmony_ci DCCP_PKT_ACK, 10762306a36Sopenharmony_ci DCCP_PKT_DATAACK, 10862306a36Sopenharmony_ci DCCP_PKT_CLOSEREQ, 10962306a36Sopenharmony_ci DCCP_PKT_CLOSE, 11062306a36Sopenharmony_ci DCCP_PKT_RESET, 11162306a36Sopenharmony_ci DCCP_PKT_SYNC, 11262306a36Sopenharmony_ci DCCP_PKT_SYNCACK, 11362306a36Sopenharmony_ci DCCP_PKT_INVALID, 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define DCCP_NR_PKT_TYPES DCCP_PKT_INVALID 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic inline unsigned int dccp_packet_hdr_len(const __u8 type) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci if (type == DCCP_PKT_DATA) 12162306a36Sopenharmony_ci return 0; 12262306a36Sopenharmony_ci if (type == DCCP_PKT_DATAACK || 12362306a36Sopenharmony_ci type == DCCP_PKT_ACK || 12462306a36Sopenharmony_ci type == DCCP_PKT_SYNC || 12562306a36Sopenharmony_ci type == DCCP_PKT_SYNCACK || 12662306a36Sopenharmony_ci type == DCCP_PKT_CLOSE || 12762306a36Sopenharmony_ci type == DCCP_PKT_CLOSEREQ) 12862306a36Sopenharmony_ci return sizeof(struct dccp_hdr_ack_bits); 12962306a36Sopenharmony_ci if (type == DCCP_PKT_REQUEST) 13062306a36Sopenharmony_ci return sizeof(struct dccp_hdr_request); 13162306a36Sopenharmony_ci if (type == DCCP_PKT_RESPONSE) 13262306a36Sopenharmony_ci return sizeof(struct dccp_hdr_response); 13362306a36Sopenharmony_ci return sizeof(struct dccp_hdr_reset); 13462306a36Sopenharmony_ci} 13562306a36Sopenharmony_cienum dccp_reset_codes { 13662306a36Sopenharmony_ci DCCP_RESET_CODE_UNSPECIFIED = 0, 13762306a36Sopenharmony_ci DCCP_RESET_CODE_CLOSED, 13862306a36Sopenharmony_ci DCCP_RESET_CODE_ABORTED, 13962306a36Sopenharmony_ci DCCP_RESET_CODE_NO_CONNECTION, 14062306a36Sopenharmony_ci DCCP_RESET_CODE_PACKET_ERROR, 14162306a36Sopenharmony_ci DCCP_RESET_CODE_OPTION_ERROR, 14262306a36Sopenharmony_ci DCCP_RESET_CODE_MANDATORY_ERROR, 14362306a36Sopenharmony_ci DCCP_RESET_CODE_CONNECTION_REFUSED, 14462306a36Sopenharmony_ci DCCP_RESET_CODE_BAD_SERVICE_CODE, 14562306a36Sopenharmony_ci DCCP_RESET_CODE_TOO_BUSY, 14662306a36Sopenharmony_ci DCCP_RESET_CODE_BAD_INIT_COOKIE, 14762306a36Sopenharmony_ci DCCP_RESET_CODE_AGGRESSION_PENALTY, 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci DCCP_MAX_RESET_CODES /* Leave at the end! */ 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* DCCP options */ 15362306a36Sopenharmony_cienum { 15462306a36Sopenharmony_ci DCCPO_PADDING = 0, 15562306a36Sopenharmony_ci DCCPO_MANDATORY = 1, 15662306a36Sopenharmony_ci DCCPO_MIN_RESERVED = 3, 15762306a36Sopenharmony_ci DCCPO_MAX_RESERVED = 31, 15862306a36Sopenharmony_ci DCCPO_CHANGE_L = 32, 15962306a36Sopenharmony_ci DCCPO_CONFIRM_L = 33, 16062306a36Sopenharmony_ci DCCPO_CHANGE_R = 34, 16162306a36Sopenharmony_ci DCCPO_CONFIRM_R = 35, 16262306a36Sopenharmony_ci DCCPO_NDP_COUNT = 37, 16362306a36Sopenharmony_ci DCCPO_ACK_VECTOR_0 = 38, 16462306a36Sopenharmony_ci DCCPO_ACK_VECTOR_1 = 39, 16562306a36Sopenharmony_ci DCCPO_TIMESTAMP = 41, 16662306a36Sopenharmony_ci DCCPO_TIMESTAMP_ECHO = 42, 16762306a36Sopenharmony_ci DCCPO_ELAPSED_TIME = 43, 16862306a36Sopenharmony_ci DCCPO_MAX = 45, 16962306a36Sopenharmony_ci DCCPO_MIN_RX_CCID_SPECIFIC = 128, /* from sender to receiver */ 17062306a36Sopenharmony_ci DCCPO_MAX_RX_CCID_SPECIFIC = 191, 17162306a36Sopenharmony_ci DCCPO_MIN_TX_CCID_SPECIFIC = 192, /* from receiver to sender */ 17262306a36Sopenharmony_ci DCCPO_MAX_TX_CCID_SPECIFIC = 255, 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci/* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */ 17562306a36Sopenharmony_ci#define DCCP_SINGLE_OPT_MAXLEN 253 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* DCCP CCIDS */ 17862306a36Sopenharmony_cienum { 17962306a36Sopenharmony_ci DCCPC_CCID2 = 2, 18062306a36Sopenharmony_ci DCCPC_CCID3 = 3, 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/* DCCP features (RFC 4340 section 6.4) */ 18462306a36Sopenharmony_cienum dccp_feature_numbers { 18562306a36Sopenharmony_ci DCCPF_RESERVED = 0, 18662306a36Sopenharmony_ci DCCPF_CCID = 1, 18762306a36Sopenharmony_ci DCCPF_SHORT_SEQNOS = 2, 18862306a36Sopenharmony_ci DCCPF_SEQUENCE_WINDOW = 3, 18962306a36Sopenharmony_ci DCCPF_ECN_INCAPABLE = 4, 19062306a36Sopenharmony_ci DCCPF_ACK_RATIO = 5, 19162306a36Sopenharmony_ci DCCPF_SEND_ACK_VECTOR = 6, 19262306a36Sopenharmony_ci DCCPF_SEND_NDP_COUNT = 7, 19362306a36Sopenharmony_ci DCCPF_MIN_CSUM_COVER = 8, 19462306a36Sopenharmony_ci DCCPF_DATA_CHECKSUM = 9, 19562306a36Sopenharmony_ci /* 10-127 reserved */ 19662306a36Sopenharmony_ci DCCPF_MIN_CCID_SPECIFIC = 128, 19762306a36Sopenharmony_ci DCCPF_SEND_LEV_RATE = 192, /* RFC 4342, sec. 8.4 */ 19862306a36Sopenharmony_ci DCCPF_MAX_CCID_SPECIFIC = 255, 19962306a36Sopenharmony_ci}; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci/* DCCP socket control message types for cmsg */ 20262306a36Sopenharmony_cienum dccp_cmsg_type { 20362306a36Sopenharmony_ci DCCP_SCM_PRIORITY = 1, 20462306a36Sopenharmony_ci DCCP_SCM_QPOLICY_MAX = 0xFFFF, 20562306a36Sopenharmony_ci /* ^-- Up to here reserved exclusively for qpolicy parameters */ 20662306a36Sopenharmony_ci DCCP_SCM_MAX 20762306a36Sopenharmony_ci}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci/* DCCP priorities for outgoing/queued packets */ 21062306a36Sopenharmony_cienum dccp_packet_dequeueing_policy { 21162306a36Sopenharmony_ci DCCPQ_POLICY_SIMPLE, 21262306a36Sopenharmony_ci DCCPQ_POLICY_PRIO, 21362306a36Sopenharmony_ci DCCPQ_POLICY_MAX 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci/* DCCP socket options */ 21762306a36Sopenharmony_ci#define DCCP_SOCKOPT_PACKET_SIZE 1 /* XXX deprecated, without effect */ 21862306a36Sopenharmony_ci#define DCCP_SOCKOPT_SERVICE 2 21962306a36Sopenharmony_ci#define DCCP_SOCKOPT_CHANGE_L 3 22062306a36Sopenharmony_ci#define DCCP_SOCKOPT_CHANGE_R 4 22162306a36Sopenharmony_ci#define DCCP_SOCKOPT_GET_CUR_MPS 5 22262306a36Sopenharmony_ci#define DCCP_SOCKOPT_SERVER_TIMEWAIT 6 22362306a36Sopenharmony_ci#define DCCP_SOCKOPT_SEND_CSCOV 10 22462306a36Sopenharmony_ci#define DCCP_SOCKOPT_RECV_CSCOV 11 22562306a36Sopenharmony_ci#define DCCP_SOCKOPT_AVAILABLE_CCIDS 12 22662306a36Sopenharmony_ci#define DCCP_SOCKOPT_CCID 13 22762306a36Sopenharmony_ci#define DCCP_SOCKOPT_TX_CCID 14 22862306a36Sopenharmony_ci#define DCCP_SOCKOPT_RX_CCID 15 22962306a36Sopenharmony_ci#define DCCP_SOCKOPT_QPOLICY_ID 16 23062306a36Sopenharmony_ci#define DCCP_SOCKOPT_QPOLICY_TXQLEN 17 23162306a36Sopenharmony_ci#define DCCP_SOCKOPT_CCID_RX_INFO 128 23262306a36Sopenharmony_ci#define DCCP_SOCKOPT_CCID_TX_INFO 192 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/* maximum number of services provided on the same listening port */ 23562306a36Sopenharmony_ci#define DCCP_SERVICE_LIST_MAX_LEN 32 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci#endif /* _UAPI_LINUX_DCCP_H */ 239