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