Blame view

include/linux/dccp.h 16.5 KB
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
1
2
  #ifndef _LINUX_DCCP_H
  #define _LINUX_DCCP_H
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
3
  #include <linux/types.h>
5a47a470e   Harald Welte   [DCCP]: make <lin...
4
  #include <asm/byteorder.h>
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
5

7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  /**
   * struct dccp_hdr - generic part of DCCP packet header
   *
   * @dccph_sport - Relevant port on the endpoint that sent this packet
   * @dccph_dport - Relevant port on the other endpoint
   * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words
   * @dccph_ccval - Used by the HC-Sender CCID
   * @dccph_cscov - Parts of the packet that are covered by the Checksum field
   * @dccph_checksum - Internet checksum, depends on dccph_cscov
   * @dccph_x - 0 = 24 bit sequence number, 1 = 48
   * @dccph_type - packet type, see DCCP_PKT_ prefixed macros
   * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x
   */
  struct dccp_hdr {
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
20
  	__be16	dccph_sport,
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
21
22
23
24
25
26
27
28
29
30
31
  		dccph_dport;
  	__u8	dccph_doff;
  #if defined(__LITTLE_ENDIAN_BITFIELD)
  	__u8	dccph_cscov:4,
  		dccph_ccval:4;
  #elif defined(__BIG_ENDIAN_BITFIELD)
  	__u8	dccph_ccval:4,
  		dccph_cscov:4;
  #else
  #error  "Adjust your <asm/byteorder.h> defines"
  #endif
9981a0e36   Al Viro   [NET]: Annotate c...
32
  	__sum16	dccph_checksum;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
33
  #if defined(__LITTLE_ENDIAN_BITFIELD)
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
34
  	__u8	dccph_x:1,
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
35
  		dccph_type:4,
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
36
  		dccph_reserved:3;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
37
  #elif defined(__BIG_ENDIAN_BITFIELD)
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
38
  	__u8	dccph_reserved:3,
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
39
  		dccph_type:4,
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
40
  		dccph_x:1;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
41
42
43
  #else
  #error  "Adjust your <asm/byteorder.h> defines"
  #endif
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
44
45
  	__u8	dccph_seq2;
  	__be16	dccph_seq;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
46
  };
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
47
48
49
50
51
52
  /**
   * struct dccp_hdr_ext - the low bits of a 48 bit seq packet
   *
   * @dccph_seq_low - low 24 bits of a 48 bit seq packet
   */
  struct dccp_hdr_ext {
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
53
  	__be32	dccph_seq_low;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
54
  };
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
55
  /**
0430ee345   Gerrit Renker   [DCCP]: Add Suppo...
56
   * struct dccp_hdr_request - Connection initiation request header
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
57
58
   *
   * @dccph_req_service - Service to which the client app wants to connect
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
59
60
   */
  struct dccp_hdr_request {
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
61
  	__be32	dccph_req_service;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
62
  };
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
63
64
65
66
67
68
69
  /**
   * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets
   *
   * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR
   * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR
   */
  struct dccp_hdr_ack_bits {
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
70
71
72
  	__be16	dccph_reserved1;
  	__be16	dccph_ack_nr_high;
  	__be32	dccph_ack_nr_low;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
73
  };
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
74
  /**
0430ee345   Gerrit Renker   [DCCP]: Add Suppo...
75
   * struct dccp_hdr_response - Connection initiation response header
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
76
   *
0430ee345   Gerrit Renker   [DCCP]: Add Suppo...
77
   * @dccph_resp_ack - 48 bit Acknowledgment Number Subheader (5.3)
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
78
   * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
79
80
81
   */
  struct dccp_hdr_response {
  	struct dccp_hdr_ack_bits	dccph_resp_ack;
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
82
  	__be32				dccph_resp_service;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
83
  };
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
84
85
86
  /**
   * struct dccp_hdr_reset - Unconditionally shut down a connection
   *
0430ee345   Gerrit Renker   [DCCP]: Add Suppo...
87
88
89
   * @dccph_reset_ack - 48 bit Acknowledgment Number Subheader (5.6)
   * @dccph_reset_code - one of %dccp_reset_codes
   * @dccph_reset_data - the Data 1 ... Data 3 fields from 5.6
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
90
91
92
93
94
95
   */
  struct dccp_hdr_reset {
  	struct dccp_hdr_ack_bits	dccph_reset_ack;
  	__u8				dccph_reset_code,
  					dccph_reset_data[3];
  };
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  enum dccp_pkt_type {
  	DCCP_PKT_REQUEST = 0,
  	DCCP_PKT_RESPONSE,
  	DCCP_PKT_DATA,
  	DCCP_PKT_ACK,
  	DCCP_PKT_DATAACK,
  	DCCP_PKT_CLOSEREQ,
  	DCCP_PKT_CLOSE,
  	DCCP_PKT_RESET,
  	DCCP_PKT_SYNC,
  	DCCP_PKT_SYNCACK,
  	DCCP_PKT_INVALID,
  };
  
  #define DCCP_NR_PKT_TYPES DCCP_PKT_INVALID
  
  static inline unsigned int dccp_packet_hdr_len(const __u8 type)
  {
  	if (type == DCCP_PKT_DATA)
  		return 0;
  	if (type == DCCP_PKT_DATAACK	||
  	    type == DCCP_PKT_ACK	||
  	    type == DCCP_PKT_SYNC	||
  	    type == DCCP_PKT_SYNCACK	||
  	    type == DCCP_PKT_CLOSE	||
  	    type == DCCP_PKT_CLOSEREQ)
  		return sizeof(struct dccp_hdr_ack_bits);
  	if (type == DCCP_PKT_REQUEST)
  		return sizeof(struct dccp_hdr_request);
  	if (type == DCCP_PKT_RESPONSE)
  		return sizeof(struct dccp_hdr_response);
  	return sizeof(struct dccp_hdr_reset);
  }
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
129
130
131
132
133
134
135
136
137
138
139
140
141
  enum dccp_reset_codes {
  	DCCP_RESET_CODE_UNSPECIFIED = 0,
  	DCCP_RESET_CODE_CLOSED,
  	DCCP_RESET_CODE_ABORTED,
  	DCCP_RESET_CODE_NO_CONNECTION,
  	DCCP_RESET_CODE_PACKET_ERROR,
  	DCCP_RESET_CODE_OPTION_ERROR,
  	DCCP_RESET_CODE_MANDATORY_ERROR,
  	DCCP_RESET_CODE_CONNECTION_REFUSED,
  	DCCP_RESET_CODE_BAD_SERVICE_CODE,
  	DCCP_RESET_CODE_TOO_BUSY,
  	DCCP_RESET_CODE_BAD_INIT_COOKIE,
  	DCCP_RESET_CODE_AGGRESSION_PENALTY,
d8ef2c29a   Gerrit Renker   [DCCP]: Convert R...
142
143
  
  	DCCP_MAX_RESET_CODES		/* Leave at the end!  */
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
144
145
146
147
148
149
150
151
  };
  
  /* DCCP options */
  enum {
  	DCCPO_PADDING = 0,
  	DCCPO_MANDATORY = 1,
  	DCCPO_MIN_RESERVED = 3,
  	DCCPO_MAX_RESERVED = 31,
afe00251d   Andrea Bittau   [DCCP]: Initial f...
152
153
154
155
  	DCCPO_CHANGE_L = 32,
  	DCCPO_CONFIRM_L = 33,
  	DCCPO_CHANGE_R = 34,
  	DCCPO_CONFIRM_R = 35,
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
156
157
158
159
160
161
162
  	DCCPO_NDP_COUNT = 37,
  	DCCPO_ACK_VECTOR_0 = 38,
  	DCCPO_ACK_VECTOR_1 = 39,
  	DCCPO_TIMESTAMP = 41,
  	DCCPO_TIMESTAMP_ECHO = 42,
  	DCCPO_ELAPSED_TIME = 43,
  	DCCPO_MAX = 45,
a18213d1d   Gerrit Renker   dccp: Replace mag...
163
164
165
166
  	DCCPO_MIN_RX_CCID_SPECIFIC = 128,	/* from sender to receiver */
  	DCCPO_MAX_RX_CCID_SPECIFIC = 191,
  	DCCPO_MIN_TX_CCID_SPECIFIC = 192,	/* from receiver to sender */
  	DCCPO_MAX_TX_CCID_SPECIFIC = 255,
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
167
  };
b20a9c24d   Gerrit Renker   dccp: Set per-con...
168
169
  /* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */
  #define DCCP_SINGLE_OPT_MAXLEN	253
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
170

b83eff641   Ian McDonald   [DCCP]: Introduce...
171
172
173
174
175
  /* DCCP CCIDS */
  enum {
  	DCCPC_CCID2 = 2,
  	DCCPC_CCID3 = 3,
  };
c02fdc0e8   Gerrit Renker   [DCCP]: Make feat...
176
  /* DCCP features (RFC 4340 section 6.4) */
7d43d1a0f   Gerrit Renker   dccp: Implement l...
177
  enum dccp_feature_numbers {
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
178
179
  	DCCPF_RESERVED = 0,
  	DCCPF_CCID = 1,
7d43d1a0f   Gerrit Renker   dccp: Implement l...
180
  	DCCPF_SHORT_SEQNOS = 2,
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
181
  	DCCPF_SEQUENCE_WINDOW = 3,
7d43d1a0f   Gerrit Renker   dccp: Implement l...
182
  	DCCPF_ECN_INCAPABLE = 4,
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
183
184
185
  	DCCPF_ACK_RATIO = 5,
  	DCCPF_SEND_ACK_VECTOR = 6,
  	DCCPF_SEND_NDP_COUNT = 7,
6f4e5fff1   Gerrit Renker   [DCCP]: Support f...
186
  	DCCPF_MIN_CSUM_COVER = 8,
7d43d1a0f   Gerrit Renker   dccp: Implement l...
187
  	DCCPF_DATA_CHECKSUM = 9,
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
188
189
  	/* 10-127 reserved */
  	DCCPF_MIN_CCID_SPECIFIC = 128,
7d43d1a0f   Gerrit Renker   dccp: Implement l...
190
  	DCCPF_SEND_LEV_RATE = 192,	/* RFC 4342, sec. 8.4 */
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
191
  	DCCPF_MAX_CCID_SPECIFIC = 255,
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
192
  };
871a2c16c   Tomasz Grobelny   dccp: Policy-base...
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  /* DCCP socket control message types for cmsg */
  enum dccp_cmsg_type {
  	DCCP_SCM_PRIORITY = 1,
  	DCCP_SCM_QPOLICY_MAX = 0xFFFF,
  	/* ^-- Up to here reserved exclusively for qpolicy parameters */
  	DCCP_SCM_MAX
  };
  
  /* DCCP priorities for outgoing/queued packets */
  enum dccp_packet_dequeueing_policy {
  	DCCPQ_POLICY_SIMPLE,
  	DCCPQ_POLICY_PRIO,
  	DCCPQ_POLICY_MAX
  };
a84ffe430   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
207
  /* DCCP socket options */
5aed32436   Gerrit Renker   [DCCP]: Tidy up u...
208
  #define DCCP_SOCKOPT_PACKET_SIZE	1 /* XXX deprecated, without effect */
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
209
  #define DCCP_SOCKOPT_SERVICE		2
afe00251d   Andrea Bittau   [DCCP]: Initial f...
210
211
  #define DCCP_SOCKOPT_CHANGE_L		3
  #define DCCP_SOCKOPT_CHANGE_R		4
7c559a9e4   Gerrit Renker   [DCCP]: Add socke...
212
  #define DCCP_SOCKOPT_GET_CUR_MPS	5
b8599d207   Gerrit Renker   [DCCP]: Support f...
213
  #define DCCP_SOCKOPT_SERVER_TIMEWAIT	6
6f4e5fff1   Gerrit Renker   [DCCP]: Support f...
214
215
  #define DCCP_SOCKOPT_SEND_CSCOV		10
  #define DCCP_SOCKOPT_RECV_CSCOV		11
d90ebcbfa   Gerrit Renker   dccp: Query suppo...
216
  #define DCCP_SOCKOPT_AVAILABLE_CCIDS	12
b20a9c24d   Gerrit Renker   dccp: Set per-con...
217
218
219
  #define DCCP_SOCKOPT_CCID		13
  #define DCCP_SOCKOPT_TX_CCID		14
  #define DCCP_SOCKOPT_RX_CCID		15
871a2c16c   Tomasz Grobelny   dccp: Policy-base...
220
221
  #define DCCP_SOCKOPT_QPOLICY_ID		16
  #define DCCP_SOCKOPT_QPOLICY_TXQLEN	17
88f964db6   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
222
223
  #define DCCP_SOCKOPT_CCID_RX_INFO	128
  #define DCCP_SOCKOPT_CCID_TX_INFO	192
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
224

09dbc3895   Gerrit Renker   [DCCP]: Miscellan...
225
  /* maximum number of services provided on the same listening port */
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
226
  #define DCCP_SERVICE_LIST_MAX_LEN      32
a84ffe430   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
227

5a47a470e   Harald Welte   [DCCP]: make <lin...
228
229
230
  #ifdef __KERNEL__
  
  #include <linux/in.h>
a6b7a4078   Alexey Dobriyan   net: remove inter...
231
  #include <linux/interrupt.h>
19ac21465   Arnaldo Carvalho de Melo   [DCCP]: Convert d...
232
  #include <linux/ktime.h>
5a47a470e   Harald Welte   [DCCP]: make <lin...
233
234
235
236
237
  #include <linux/list.h>
  #include <linux/uio.h>
  #include <linux/workqueue.h>
  
  #include <net/inet_connection_sock.h>
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
238
  #include <net/inet_sock.h>
64cf1e5d8   Arnaldo Carvalho de Melo   [DCCP]: Finish th...
239
  #include <net/inet_timewait_sock.h>
5a47a470e   Harald Welte   [DCCP]: make <lin...
240
  #include <net/tcp_states.h>
5a47a470e   Harald Welte   [DCCP]: make <lin...
241
242
  
  enum dccp_state {
f11135a34   Gerrit Renker   [DCCP]: Dedicated...
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  	DCCP_OPEN	     = TCP_ESTABLISHED,
  	DCCP_REQUESTING	     = TCP_SYN_SENT,
  	DCCP_LISTEN	     = TCP_LISTEN,
  	DCCP_RESPOND	     = TCP_SYN_RECV,
  	/*
  	 * States involved in closing a DCCP connection:
  	 * 1) ACTIVE_CLOSEREQ is entered by a server sending a CloseReq.
  	 *
  	 * 2) CLOSING can have three different meanings (RFC 4340, 8.3):
  	 *  a. Client has performed active-close, has sent a Close to the server
  	 *     from state OPEN or PARTOPEN, and is waiting for the final Reset
  	 *     (in this case, SOCK_DONE == 1).
  	 *  b. Client is asked to perform passive-close, by receiving a CloseReq
  	 *     in (PART)OPEN state. It sends a Close and waits for final Reset
  	 *     (in this case, SOCK_DONE == 0).
  	 *  c. Server performs an active-close as in (a), keeps TIMEWAIT state.
  	 *
  	 * 3) The following intermediate states are employed to give passively
  	 *    closing nodes a chance to process their unread data:
  	 *    - PASSIVE_CLOSE    (from OPEN => CLOSED) and
  	 *    - PASSIVE_CLOSEREQ (from (PART)OPEN to CLOSING; case (b) above).
  	 */
  	DCCP_ACTIVE_CLOSEREQ = TCP_FIN_WAIT1,
  	DCCP_PASSIVE_CLOSE   = TCP_CLOSE_WAIT,	/* any node receiving a Close */
  	DCCP_CLOSING	     = TCP_CLOSING,
  	DCCP_TIME_WAIT	     = TCP_TIME_WAIT,
  	DCCP_CLOSED	     = TCP_CLOSE,
  	DCCP_PARTOPEN	     = TCP_MAX_STATES,
  	DCCP_PASSIVE_CLOSEREQ,			/* clients receiving CloseReq */
9b91ad274   Gerrit Renker   [DCCP]: Make PART...
272
  	DCCP_MAX_STATES
5a47a470e   Harald Welte   [DCCP]: make <lin...
273
  };
5a47a470e   Harald Welte   [DCCP]: make <lin...
274
  enum {
f11135a34   Gerrit Renker   [DCCP]: Dedicated...
275
276
277
278
279
280
281
282
283
  	DCCPF_OPEN	      = TCPF_ESTABLISHED,
  	DCCPF_REQUESTING      = TCPF_SYN_SENT,
  	DCCPF_LISTEN	      = TCPF_LISTEN,
  	DCCPF_RESPOND	      = TCPF_SYN_RECV,
  	DCCPF_ACTIVE_CLOSEREQ = TCPF_FIN_WAIT1,
  	DCCPF_CLOSING	      = TCPF_CLOSING,
  	DCCPF_TIME_WAIT	      = TCPF_TIME_WAIT,
  	DCCPF_CLOSED	      = TCPF_CLOSE,
  	DCCPF_PARTOPEN	      = (1 << DCCP_PARTOPEN),
5a47a470e   Harald Welte   [DCCP]: make <lin...
284
285
286
287
  };
  
  static inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
288
  	return (struct dccp_hdr *)skb_transport_header(skb);
5a47a470e   Harald Welte   [DCCP]: make <lin...
289
  }
9b42078ed   Gerrit Renker   [DCCP]: Combine a...
290
291
  static inline struct dccp_hdr *dccp_zeroed_hdr(struct sk_buff *skb, int headlen)
  {
badff6d01   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
292
293
  	skb_push(skb, headlen);
  	skb_reset_transport_header(skb);
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
294
  	return memset(skb_transport_header(skb), 0, headlen);
9b42078ed   Gerrit Renker   [DCCP]: Combine a...
295
  }
fde20105f   Gerrit Renker   [DCCP]: Retrieve ...
296
  static inline struct dccp_hdr_ext *dccp_hdrx(const struct dccp_hdr *dh)
5a47a470e   Harald Welte   [DCCP]: make <lin...
297
  {
fde20105f   Gerrit Renker   [DCCP]: Retrieve ...
298
  	return (struct dccp_hdr_ext *)((unsigned char *)dh + sizeof(*dh));
5a47a470e   Harald Welte   [DCCP]: make <lin...
299
  }
1d3de414e   Harald Welte   [NETFILTER]: New ...
300
301
302
303
  static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh)
  {
  	return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0);
  }
5a47a470e   Harald Welte   [DCCP]: make <lin...
304
305
306
  static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
  {
  	const struct dccp_hdr *dh = dccp_hdr(skb);
1d3de414e   Harald Welte   [NETFILTER]: New ...
307
  	return __dccp_basic_hdr_len(dh);
5a47a470e   Harald Welte   [DCCP]: make <lin...
308
  }
fde20105f   Gerrit Renker   [DCCP]: Retrieve ...
309
  static inline __u64 dccp_hdr_seq(const struct dccp_hdr *dh)
5a47a470e   Harald Welte   [DCCP]: make <lin...
310
  {
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
311
  	__u64 seq_nr =  ntohs(dh->dccph_seq);
5a47a470e   Harald Welte   [DCCP]: make <lin...
312
313
  
  	if (dh->dccph_x != 0)
fde20105f   Gerrit Renker   [DCCP]: Retrieve ...
314
  		seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(dh)->dccph_seq_low);
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
315
316
  	else
  		seq_nr += (u32)dh->dccph_seq2 << 16;
5a47a470e   Harald Welte   [DCCP]: make <lin...
317
318
319
320
321
322
  
  	return seq_nr;
  }
  
  static inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
323
324
  	return (struct dccp_hdr_request *)(skb_transport_header(skb) +
  					   dccp_basic_hdr_len(skb));
5a47a470e   Harald Welte   [DCCP]: make <lin...
325
326
327
328
  }
  
  static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
329
330
  	return (struct dccp_hdr_ack_bits *)(skb_transport_header(skb) +
  					    dccp_basic_hdr_len(skb));
5a47a470e   Harald Welte   [DCCP]: make <lin...
331
332
333
334
335
  }
  
  static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb)
  {
  	const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb);
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
336
  	return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) + ntohl(dhack->dccph_ack_nr_low);
5a47a470e   Harald Welte   [DCCP]: make <lin...
337
338
339
340
  }
  
  static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
341
342
  	return (struct dccp_hdr_response *)(skb_transport_header(skb) +
  					    dccp_basic_hdr_len(skb));
5a47a470e   Harald Welte   [DCCP]: make <lin...
343
344
345
346
  }
  
  static inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
347
348
  	return (struct dccp_hdr_reset *)(skb_transport_header(skb) +
  					 dccp_basic_hdr_len(skb));
5a47a470e   Harald Welte   [DCCP]: make <lin...
349
  }
1d3de414e   Harald Welte   [NETFILTER]: New ...
350
351
352
353
354
  static inline unsigned int __dccp_hdr_len(const struct dccp_hdr *dh)
  {
  	return __dccp_basic_hdr_len(dh) +
  	       dccp_packet_hdr_len(dh->dccph_type);
  }
5a47a470e   Harald Welte   [DCCP]: make <lin...
355
356
  static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
  {
1d3de414e   Harald Welte   [NETFILTER]: New ...
357
  	return __dccp_hdr_len(dccp_hdr(skb));
5a47a470e   Harald Welte   [DCCP]: make <lin...
358
  }
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
359
  /**
b4d4f7c70   Gerrit Renker   [DCCP]: Handle ti...
360
361
362
363
364
   * struct dccp_request_sock  -  represent DCCP-specific connection request
   * @dreq_inet_rsk: structure inherited from
   * @dreq_iss: initial sequence number sent on the Response (RFC 4340, 7.1)
   * @dreq_isr: initial sequence number received on the Request
   * @dreq_service: service code present on the Request (there is just one)
ac75773c2   Gerrit Renker   dccp: Per-socket ...
365
   * @dreq_featneg: feature negotiation options for this connection
b4d4f7c70   Gerrit Renker   [DCCP]: Handle ti...
366
367
368
369
   * The following two fields are analogous to the ones in dccp_sock:
   * @dreq_timestamp_echo: last received timestamp to echo (13.1)
   * @dreq_timestamp_echo: the time of receiving the last @dreq_timestamp_echo
   */
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
370
371
372
373
  struct dccp_request_sock {
  	struct inet_request_sock dreq_inet_rsk;
  	__u64			 dreq_iss;
  	__u64			 dreq_isr;
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
374
  	__be32			 dreq_service;
ac75773c2   Gerrit Renker   dccp: Per-socket ...
375
  	struct list_head	 dreq_featneg;
b4d4f7c70   Gerrit Renker   [DCCP]: Handle ti...
376
377
  	__u32			 dreq_timestamp_echo;
  	__u32			 dreq_timestamp_time;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
378
379
380
381
382
383
  };
  
  static inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req)
  {
  	return (struct dccp_request_sock *)req;
  }
64cf1e5d8   Arnaldo Carvalho de Melo   [DCCP]: Finish th...
384
  extern struct inet_timewait_death_row dccp_death_row;
8b8194124   Gerrit Renker   [DCCP]: Allow to ...
385
386
  extern int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
  			      struct sk_buff *skb);
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
387
  struct dccp_options_received {
5b5d0e704   Gerrit Renker   dccp: Upgrade NDP...
388
  	u64	dccpor_ndp:48;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
389
390
391
392
393
394
395
396
397
398
399
400
401
  	u32	dccpor_timestamp;
  	u32	dccpor_timestamp_echo;
  	u32	dccpor_elapsed_time;
  };
  
  struct ccid;
  
  enum dccp_role {
  	DCCP_ROLE_UNDEFINED,
  	DCCP_ROLE_LISTEN,
  	DCCP_ROLE_CLIENT,
  	DCCP_ROLE_SERVER,
  };
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
402
403
  struct dccp_service_list {
  	__u32	dccpsl_nr;
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
404
  	__be32	dccpsl_list[0];
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
405
406
407
  };
  
  #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
408
  #define DCCP_SERVICE_CODE_IS_ABSENT		0
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
409
410
  
  static inline int dccp_list_has_service(const struct dccp_service_list *sl,
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
411
  					const __be32 service)
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
412
413
414
415
416
  {
  	if (likely(sl != NULL)) {
  		u32 i = sl->dccpsl_nr;
  		while (i--)
  			if (sl->dccpsl_list[i] == service)
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
417
  				return 1;
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
418
419
420
  	}
  	return 0;
  }
ae31c3399   Arnaldo Carvalho de Melo   [DCCP]: Move the ...
421
  struct dccp_ackvec;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
422
423
424
425
426
427
428
429
430
431
432
433
434
  /**
   * struct dccp_sock - DCCP socket state
   *
   * @dccps_swl - sequence number window low
   * @dccps_swh - sequence number window high
   * @dccps_awl - acknowledgement number window low
   * @dccps_awh - acknowledgement number window high
   * @dccps_iss - initial sequence number sent
   * @dccps_isr - initial sequence number received
   * @dccps_osr - first OPEN sequence number received
   * @dccps_gss - greatest sequence number sent
   * @dccps_gsr - greatest valid sequence number received
   * @dccps_gar - greatest valid ack number received on a non-Sync; initialized to %dccps_iss
09dbc3895   Gerrit Renker   [DCCP]: Miscellan...
435
436
   * @dccps_service - first (passive sock) or unique (active sock) service code
   * @dccps_service_list - second .. last service code on passive socket
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
437
   * @dccps_timestamp_echo - latest timestamp received on a TIMESTAMP option
b4d4f7c70   Gerrit Renker   [DCCP]: Handle ti...
438
   * @dccps_timestamp_time - time of receiving latest @dccps_timestamp_echo
91d73c15c   Gerrit Renker   [DCCP]: Complete ...
439
440
   * @dccps_l_ack_ratio - feature-local Ack Ratio
   * @dccps_r_ack_ratio - feature-remote Ack Ratio
792b48780   Gerrit Renker   dccp: Implement b...
441
442
   * @dccps_l_seq_win - local Sequence Window (influences ack number validity)
   * @dccps_r_seq_win - remote Sequence Window (influences seq number validity)
6f4e5fff1   Gerrit Renker   [DCCP]: Support f...
443
444
   * @dccps_pcslen - sender   partial checksum coverage (via sockopt)
   * @dccps_pcrlen - receiver partial checksum coverage (via sockopt)
4098dce5b   Gerrit Renker   dccp: Remove manu...
445
   * @dccps_send_ndp_count - local Send NDP Count feature (7.7.2)
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
446
   * @dccps_ndp_count - number of Non Data Packets since last data packet
91d73c15c   Gerrit Renker   [DCCP]: Complete ...
447
   * @dccps_mss_cache - current value of MSS (path MTU minus header sizes)
a94f0f970   Gerrit Renker   [DCCP]: Rate-limi...
448
   * @dccps_rate_last - timestamp for rate-limiting DCCP-Sync (RFC 4340, 7.5.4)
ac75773c2   Gerrit Renker   dccp: Per-socket ...
449
   * @dccps_featneg - tracks feature-negotiation state (mostly during handshake)
ae31c3399   Arnaldo Carvalho de Melo   [DCCP]: Move the ...
450
   * @dccps_hc_rx_ackvec - rx half connection ack vector
91d73c15c   Gerrit Renker   [DCCP]: Complete ...
451
452
453
   * @dccps_hc_rx_ccid - CCID used for the receiver (or receiving half-connection)
   * @dccps_hc_tx_ccid - CCID used for the sender (or sending half-connection)
   * @dccps_options_received - parsed set of retrieved options
871a2c16c   Tomasz Grobelny   dccp: Policy-base...
454
455
   * @dccps_qpolicy - TX dequeueing policy, one of %dccp_packet_dequeueing_policy
   * @dccps_tx_qlen - maximum length of the TX queue
91d73c15c   Gerrit Renker   [DCCP]: Complete ...
456
457
458
   * @dccps_role - role of this sock, one of %dccp_role
   * @dccps_hc_rx_insert_options - receiver wants to add options when acking
   * @dccps_hc_tx_insert_options - sender wants to add options when sending
b8599d207   Gerrit Renker   [DCCP]: Support f...
459
   * @dccps_server_timewait - server holds timewait state on close (RFC 4340, 8.3)
d83447f09   Gerrit Renker   dccp ccid-2: Sche...
460
   * @dccps_sync_scheduled - flag which signals "send out-of-band message soon"
dc841e30e   Gerrit Renker   dccp: Extend CCID...
461
462
   * @dccps_xmitlet - tasklet scheduled by the TX CCID to dequeue data packets
   * @dccps_xmit_timer - used by the TX CCID to delay sending (rate-based pacing)
89560b53b   Gerrit Renker   [DCCP]: Sample RT...
463
   * @dccps_syn_rtt - RTT sample from Request/Response exchange (in usecs)
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
464
465
466
467
   */
  struct dccp_sock {
  	/* inet_connection_sock has to be the first member of dccp_sock */
  	struct inet_connection_sock	dccps_inet_connection;
89560b53b   Gerrit Renker   [DCCP]: Sample RT...
468
  #define dccps_syn_rtt			dccps_inet_connection.icsk_ack.lrcvtime
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
469
470
471
472
473
474
475
476
477
478
  	__u64				dccps_swl;
  	__u64				dccps_swh;
  	__u64				dccps_awl;
  	__u64				dccps_awh;
  	__u64				dccps_iss;
  	__u64				dccps_isr;
  	__u64				dccps_osr;
  	__u64				dccps_gss;
  	__u64				dccps_gsr;
  	__u64				dccps_gar;
60fe62e78   Andrea Bittau   [DCCP]: sparse en...
479
  	__be32				dccps_service;
cf6b5fbe7   Arnaldo Carvalho de Melo   [DCCP]: Reorganiz...
480
  	__u32				dccps_mss_cache;
67e6b6292   Arnaldo Carvalho de Melo   [DCCP]: Introduce...
481
  	struct dccp_service_list	*dccps_service_list;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
482
  	__u32				dccps_timestamp_echo;
b4d4f7c70   Gerrit Renker   [DCCP]: Handle ti...
483
  	__u32				dccps_timestamp_time;
2a91aa396   Andrea Bittau   [DCCP] CCID2: Ini...
484
485
  	__u16				dccps_l_ack_ratio;
  	__u16				dccps_r_ack_ratio;
792b48780   Gerrit Renker   dccp: Implement b...
486
487
  	__u64				dccps_l_seq_win:48;
  	__u64				dccps_r_seq_win:48;
294505598   Gerrit Renker   dccp: Feature neg...
488
489
  	__u8				dccps_pcslen:4;
  	__u8				dccps_pcrlen:4;
4098dce5b   Gerrit Renker   dccp: Remove manu...
490
  	__u8				dccps_send_ndp_count:1;
5b5d0e704   Gerrit Renker   dccp: Upgrade NDP...
491
  	__u64				dccps_ndp_count:48;
a94f0f970   Gerrit Renker   [DCCP]: Rate-limi...
492
  	unsigned long			dccps_rate_last;
ac75773c2   Gerrit Renker   dccp: Per-socket ...
493
  	struct list_head		dccps_featneg;
ae31c3399   Arnaldo Carvalho de Melo   [DCCP]: Move the ...
494
  	struct dccp_ackvec		*dccps_hc_rx_ackvec;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
495
496
497
  	struct ccid			*dccps_hc_rx_ccid;
  	struct ccid			*dccps_hc_tx_ccid;
  	struct dccp_options_received	dccps_options_received;
871a2c16c   Tomasz Grobelny   dccp: Policy-base...
498
499
  	__u8				dccps_qpolicy;
  	__u32				dccps_tx_qlen;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
500
  	enum dccp_role			dccps_role:2;
507d37cf2   Arnaldo Carvalho de Melo   [CCID] Only call ...
501
502
  	__u8				dccps_hc_rx_insert_options:1;
  	__u8				dccps_hc_tx_insert_options:1;
b8599d207   Gerrit Renker   [DCCP]: Support f...
503
  	__u8				dccps_server_timewait:1;
d83447f09   Gerrit Renker   dccp ccid-2: Sche...
504
  	__u8				dccps_sync_scheduled:1;
dc841e30e   Gerrit Renker   dccp: Extend CCID...
505
  	struct tasklet_struct		dccps_xmitlet;
97e5848dd   Ian McDonald   [DCCP]: Introduce...
506
  	struct timer_list		dccps_xmit_timer;
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
507
  };
8109b02b5   Arnaldo Carvalho de Melo   [DCCP]: Whitespac...
508

7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
  static inline struct dccp_sock *dccp_sk(const struct sock *sk)
  {
  	return (struct dccp_sock *)sk;
  }
  
  static inline const char *dccp_role(const struct sock *sk)
  {
  	switch (dccp_sk(sk)->dccps_role) {
  	case DCCP_ROLE_UNDEFINED: return "undefined";
  	case DCCP_ROLE_LISTEN:	  return "listen";
  	case DCCP_ROLE_SERVER:	  return "server";
  	case DCCP_ROLE_CLIENT:	  return "client";
  	}
  	return NULL;
  }
5a47a470e   Harald Welte   [DCCP]: make <lin...
524
  #endif /* __KERNEL__ */
7c657876b   Arnaldo Carvalho de Melo   [DCCP]: Initial i...
525
  #endif /* _LINUX_DCCP_H */