1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
2 | #ifndef _UAPI_LINUX_DCCP_H |
3 | #define _UAPI_LINUX_DCCP_H |
4 | |
5 | #include <linux/types.h> |
6 | #include <asm/byteorder.h> |
7 | |
8 | /** |
9 | * struct dccp_hdr - generic part of DCCP packet header |
10 | * |
11 | * @dccph_sport - Relevant port on the endpoint that sent this packet |
12 | * @dccph_dport - Relevant port on the other endpoint |
13 | * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words |
14 | * @dccph_ccval - Used by the HC-Sender CCID |
15 | * @dccph_cscov - Parts of the packet that are covered by the Checksum field |
16 | * @dccph_checksum - Internet checksum, depends on dccph_cscov |
17 | * @dccph_x - 0 = 24 bit sequence number, 1 = 48 |
18 | * @dccph_type - packet type, see DCCP_PKT_ prefixed macros |
19 | * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x |
20 | */ |
21 | struct dccp_hdr { |
22 | __be16 dccph_sport, |
23 | dccph_dport; |
24 | __u8 dccph_doff; |
25 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
26 | __u8 dccph_cscov:4, |
27 | dccph_ccval:4; |
28 | #elif defined(__BIG_ENDIAN_BITFIELD) |
29 | __u8 dccph_ccval:4, |
30 | dccph_cscov:4; |
31 | #else |
32 | #error "Adjust your <asm/byteorder.h> defines" |
33 | #endif |
34 | __sum16 dccph_checksum; |
35 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
36 | __u8 dccph_x:1, |
37 | dccph_type:4, |
38 | dccph_reserved:3; |
39 | #elif defined(__BIG_ENDIAN_BITFIELD) |
40 | __u8 dccph_reserved:3, |
41 | dccph_type:4, |
42 | dccph_x:1; |
43 | #else |
44 | #error "Adjust your <asm/byteorder.h> defines" |
45 | #endif |
46 | __u8 dccph_seq2; |
47 | __be16 dccph_seq; |
48 | }; |
49 | |
50 | /** |
51 | * struct dccp_hdr_ext - the low bits of a 48 bit seq packet |
52 | * |
53 | * @dccph_seq_low - low 24 bits of a 48 bit seq packet |
54 | */ |
55 | struct dccp_hdr_ext { |
56 | __be32 dccph_seq_low; |
57 | }; |
58 | |
59 | /** |
60 | * struct dccp_hdr_request - Connection initiation request header |
61 | * |
62 | * @dccph_req_service - Service to which the client app wants to connect |
63 | */ |
64 | struct dccp_hdr_request { |
65 | __be32 dccph_req_service; |
66 | }; |
67 | /** |
68 | * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets |
69 | * |
70 | * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR |
71 | * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR |
72 | */ |
73 | struct dccp_hdr_ack_bits { |
74 | __be16 dccph_reserved1; |
75 | __be16 dccph_ack_nr_high; |
76 | __be32 dccph_ack_nr_low; |
77 | }; |
78 | /** |
79 | * struct dccp_hdr_response - Connection initiation response header |
80 | * |
81 | * @dccph_resp_ack - 48 bit Acknowledgment Number Subheader (5.3) |
82 | * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request |
83 | */ |
84 | struct dccp_hdr_response { |
85 | struct dccp_hdr_ack_bits dccph_resp_ack; |
86 | __be32 dccph_resp_service; |
87 | }; |
88 | |
89 | /** |
90 | * struct dccp_hdr_reset - Unconditionally shut down a connection |
91 | * |
92 | * @dccph_reset_ack - 48 bit Acknowledgment Number Subheader (5.6) |
93 | * @dccph_reset_code - one of %dccp_reset_codes |
94 | * @dccph_reset_data - the Data 1 ... Data 3 fields from 5.6 |
95 | */ |
96 | struct dccp_hdr_reset { |
97 | struct dccp_hdr_ack_bits dccph_reset_ack; |
98 | __u8 dccph_reset_code, |
99 | dccph_reset_data[3]; |
100 | }; |
101 | |
102 | enum dccp_pkt_type { |
103 | DCCP_PKT_REQUEST = 0, |
104 | DCCP_PKT_RESPONSE, |
105 | DCCP_PKT_DATA, |
106 | DCCP_PKT_ACK, |
107 | DCCP_PKT_DATAACK, |
108 | DCCP_PKT_CLOSEREQ, |
109 | DCCP_PKT_CLOSE, |
110 | DCCP_PKT_RESET, |
111 | DCCP_PKT_SYNC, |
112 | DCCP_PKT_SYNCACK, |
113 | DCCP_PKT_INVALID, |
114 | }; |
115 | |
116 | #define DCCP_NR_PKT_TYPES DCCP_PKT_INVALID |
117 | |
118 | static inline unsigned int dccp_packet_hdr_len(const __u8 type) |
119 | { |
120 | if (type == DCCP_PKT_DATA) |
121 | return 0; |
122 | if (type == DCCP_PKT_DATAACK || |
123 | type == DCCP_PKT_ACK || |
124 | type == DCCP_PKT_SYNC || |
125 | type == DCCP_PKT_SYNCACK || |
126 | type == DCCP_PKT_CLOSE || |
127 | type == DCCP_PKT_CLOSEREQ) |
128 | return sizeof(struct dccp_hdr_ack_bits); |
129 | if (type == DCCP_PKT_REQUEST) |
130 | return sizeof(struct dccp_hdr_request); |
131 | if (type == DCCP_PKT_RESPONSE) |
132 | return sizeof(struct dccp_hdr_response); |
133 | return sizeof(struct dccp_hdr_reset); |
134 | } |
135 | enum dccp_reset_codes { |
136 | DCCP_RESET_CODE_UNSPECIFIED = 0, |
137 | DCCP_RESET_CODE_CLOSED, |
138 | DCCP_RESET_CODE_ABORTED, |
139 | DCCP_RESET_CODE_NO_CONNECTION, |
140 | DCCP_RESET_CODE_PACKET_ERROR, |
141 | DCCP_RESET_CODE_OPTION_ERROR, |
142 | DCCP_RESET_CODE_MANDATORY_ERROR, |
143 | DCCP_RESET_CODE_CONNECTION_REFUSED, |
144 | DCCP_RESET_CODE_BAD_SERVICE_CODE, |
145 | DCCP_RESET_CODE_TOO_BUSY, |
146 | DCCP_RESET_CODE_BAD_INIT_COOKIE, |
147 | DCCP_RESET_CODE_AGGRESSION_PENALTY, |
148 | |
149 | DCCP_MAX_RESET_CODES /* Leave at the end! */ |
150 | }; |
151 | |
152 | /* DCCP options */ |
153 | enum { |
154 | DCCPO_PADDING = 0, |
155 | DCCPO_MANDATORY = 1, |
156 | DCCPO_MIN_RESERVED = 3, |
157 | DCCPO_MAX_RESERVED = 31, |
158 | DCCPO_CHANGE_L = 32, |
159 | DCCPO_CONFIRM_L = 33, |
160 | DCCPO_CHANGE_R = 34, |
161 | DCCPO_CONFIRM_R = 35, |
162 | DCCPO_NDP_COUNT = 37, |
163 | DCCPO_ACK_VECTOR_0 = 38, |
164 | DCCPO_ACK_VECTOR_1 = 39, |
165 | DCCPO_TIMESTAMP = 41, |
166 | DCCPO_TIMESTAMP_ECHO = 42, |
167 | DCCPO_ELAPSED_TIME = 43, |
168 | DCCPO_MAX = 45, |
169 | DCCPO_MIN_RX_CCID_SPECIFIC = 128, /* from sender to receiver */ |
170 | DCCPO_MAX_RX_CCID_SPECIFIC = 191, |
171 | DCCPO_MIN_TX_CCID_SPECIFIC = 192, /* from receiver to sender */ |
172 | DCCPO_MAX_TX_CCID_SPECIFIC = 255, |
173 | }; |
174 | /* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */ |
175 | #define DCCP_SINGLE_OPT_MAXLEN 253 |
176 | |
177 | /* DCCP CCIDS */ |
178 | enum { |
179 | DCCPC_CCID2 = 2, |
180 | DCCPC_CCID3 = 3, |
181 | }; |
182 | |
183 | /* DCCP features (RFC 4340 section 6.4) */ |
184 | enum dccp_feature_numbers { |
185 | DCCPF_RESERVED = 0, |
186 | DCCPF_CCID = 1, |
187 | DCCPF_SHORT_SEQNOS = 2, |
188 | DCCPF_SEQUENCE_WINDOW = 3, |
189 | DCCPF_ECN_INCAPABLE = 4, |
190 | DCCPF_ACK_RATIO = 5, |
191 | DCCPF_SEND_ACK_VECTOR = 6, |
192 | DCCPF_SEND_NDP_COUNT = 7, |
193 | DCCPF_MIN_CSUM_COVER = 8, |
194 | DCCPF_DATA_CHECKSUM = 9, |
195 | /* 10-127 reserved */ |
196 | DCCPF_MIN_CCID_SPECIFIC = 128, |
197 | DCCPF_SEND_LEV_RATE = 192, /* RFC 4342, sec. 8.4 */ |
198 | DCCPF_MAX_CCID_SPECIFIC = 255, |
199 | }; |
200 | |
201 | /* DCCP socket control message types for cmsg */ |
202 | enum dccp_cmsg_type { |
203 | DCCP_SCM_PRIORITY = 1, |
204 | DCCP_SCM_QPOLICY_MAX = 0xFFFF, |
205 | /* ^-- Up to here reserved exclusively for qpolicy parameters */ |
206 | DCCP_SCM_MAX |
207 | }; |
208 | |
209 | /* DCCP priorities for outgoing/queued packets */ |
210 | enum dccp_packet_dequeueing_policy { |
211 | DCCPQ_POLICY_SIMPLE, |
212 | DCCPQ_POLICY_PRIO, |
213 | DCCPQ_POLICY_MAX |
214 | }; |
215 | |
216 | /* DCCP socket options */ |
217 | #define DCCP_SOCKOPT_PACKET_SIZE 1 /* XXX deprecated, without effect */ |
218 | #define DCCP_SOCKOPT_SERVICE 2 |
219 | #define DCCP_SOCKOPT_CHANGE_L 3 |
220 | #define DCCP_SOCKOPT_CHANGE_R 4 |
221 | #define DCCP_SOCKOPT_GET_CUR_MPS 5 |
222 | #define DCCP_SOCKOPT_SERVER_TIMEWAIT 6 |
223 | #define DCCP_SOCKOPT_SEND_CSCOV 10 |
224 | #define DCCP_SOCKOPT_RECV_CSCOV 11 |
225 | #define DCCP_SOCKOPT_AVAILABLE_CCIDS 12 |
226 | #define DCCP_SOCKOPT_CCID 13 |
227 | #define DCCP_SOCKOPT_TX_CCID 14 |
228 | #define DCCP_SOCKOPT_RX_CCID 15 |
229 | #define DCCP_SOCKOPT_QPOLICY_ID 16 |
230 | #define DCCP_SOCKOPT_QPOLICY_TXQLEN 17 |
231 | #define DCCP_SOCKOPT_CCID_RX_INFO 128 |
232 | #define DCCP_SOCKOPT_CCID_TX_INFO 192 |
233 | |
234 | /* maximum number of services provided on the same listening port */ |
235 | #define DCCP_SERVICE_LIST_MAX_LEN 32 |
236 | |
237 | |
238 | #endif /* _UAPI_LINUX_DCCP_H */ |
239 | |