This source file includes following definitions.
- dccp_zeroed_hdr
- dccp_hdrx
- __dccp_basic_hdr_len
- dccp_basic_hdr_len
- dccp_hdr_seq
- dccp_hdr_ack_seq
- __dccp_hdr_len
- dccp_hdr_len
- dccp_rsk
- dccp_list_has_service
- dccp_sk
- dccp_role
1
2 #ifndef _LINUX_DCCP_H
3 #define _LINUX_DCCP_H
4
5
6 #include <linux/in.h>
7 #include <linux/interrupt.h>
8 #include <linux/ktime.h>
9 #include <linux/list.h>
10 #include <linux/uio.h>
11 #include <linux/workqueue.h>
12
13 #include <net/inet_connection_sock.h>
14 #include <net/inet_sock.h>
15 #include <net/inet_timewait_sock.h>
16 #include <net/tcp_states.h>
17 #include <uapi/linux/dccp.h>
18
19 enum dccp_state {
20 DCCP_OPEN = TCP_ESTABLISHED,
21 DCCP_REQUESTING = TCP_SYN_SENT,
22 DCCP_LISTEN = TCP_LISTEN,
23 DCCP_RESPOND = TCP_SYN_RECV,
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 DCCP_ACTIVE_CLOSEREQ = TCP_FIN_WAIT1,
43 DCCP_PASSIVE_CLOSE = TCP_CLOSE_WAIT,
44 DCCP_CLOSING = TCP_CLOSING,
45 DCCP_TIME_WAIT = TCP_TIME_WAIT,
46 DCCP_CLOSED = TCP_CLOSE,
47 DCCP_NEW_SYN_RECV = TCP_NEW_SYN_RECV,
48 DCCP_PARTOPEN = TCP_MAX_STATES,
49 DCCP_PASSIVE_CLOSEREQ,
50 DCCP_MAX_STATES
51 };
52
53 enum {
54 DCCPF_OPEN = TCPF_ESTABLISHED,
55 DCCPF_REQUESTING = TCPF_SYN_SENT,
56 DCCPF_LISTEN = TCPF_LISTEN,
57 DCCPF_RESPOND = TCPF_SYN_RECV,
58 DCCPF_ACTIVE_CLOSEREQ = TCPF_FIN_WAIT1,
59 DCCPF_CLOSING = TCPF_CLOSING,
60 DCCPF_TIME_WAIT = TCPF_TIME_WAIT,
61 DCCPF_CLOSED = TCPF_CLOSE,
62 DCCPF_NEW_SYN_RECV = TCPF_NEW_SYN_RECV,
63 DCCPF_PARTOPEN = (1 << DCCP_PARTOPEN),
64 };
65
66 static inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb)
67 {
68 return (struct dccp_hdr *)skb_transport_header(skb);
69 }
70
71 static inline struct dccp_hdr *dccp_zeroed_hdr(struct sk_buff *skb, int headlen)
72 {
73 skb_push(skb, headlen);
74 skb_reset_transport_header(skb);
75 return memset(skb_transport_header(skb), 0, headlen);
76 }
77
78 static inline struct dccp_hdr_ext *dccp_hdrx(const struct dccp_hdr *dh)
79 {
80 return (struct dccp_hdr_ext *)((unsigned char *)dh + sizeof(*dh));
81 }
82
83 static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh)
84 {
85 return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0);
86 }
87
88 static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
89 {
90 const struct dccp_hdr *dh = dccp_hdr(skb);
91 return __dccp_basic_hdr_len(dh);
92 }
93
94 static inline __u64 dccp_hdr_seq(const struct dccp_hdr *dh)
95 {
96 __u64 seq_nr = ntohs(dh->dccph_seq);
97
98 if (dh->dccph_x != 0)
99 seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(dh)->dccph_seq_low);
100 else
101 seq_nr += (u32)dh->dccph_seq2 << 16;
102
103 return seq_nr;
104 }
105
106 static inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb)
107 {
108 return (struct dccp_hdr_request *)(skb_transport_header(skb) +
109 dccp_basic_hdr_len(skb));
110 }
111
112 static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb)
113 {
114 return (struct dccp_hdr_ack_bits *)(skb_transport_header(skb) +
115 dccp_basic_hdr_len(skb));
116 }
117
118 static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb)
119 {
120 const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb);
121 return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) + ntohl(dhack->dccph_ack_nr_low);
122 }
123
124 static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb)
125 {
126 return (struct dccp_hdr_response *)(skb_transport_header(skb) +
127 dccp_basic_hdr_len(skb));
128 }
129
130 static inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb)
131 {
132 return (struct dccp_hdr_reset *)(skb_transport_header(skb) +
133 dccp_basic_hdr_len(skb));
134 }
135
136 static inline unsigned int __dccp_hdr_len(const struct dccp_hdr *dh)
137 {
138 return __dccp_basic_hdr_len(dh) +
139 dccp_packet_hdr_len(dh->dccph_type);
140 }
141
142 static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
143 {
144 return __dccp_hdr_len(dccp_hdr(skb));
145 }
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 struct dccp_request_sock {
161 struct inet_request_sock dreq_inet_rsk;
162 __u64 dreq_iss;
163 __u64 dreq_gss;
164 __u64 dreq_isr;
165 __u64 dreq_gsr;
166 __be32 dreq_service;
167 spinlock_t dreq_lock;
168 struct list_head dreq_featneg;
169 __u32 dreq_timestamp_echo;
170 __u32 dreq_timestamp_time;
171 };
172
173 static inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req)
174 {
175 return (struct dccp_request_sock *)req;
176 }
177
178 extern struct inet_timewait_death_row dccp_death_row;
179
180 extern int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
181 struct sk_buff *skb);
182
183 struct dccp_options_received {
184 u64 dccpor_ndp:48;
185 u32 dccpor_timestamp;
186 u32 dccpor_timestamp_echo;
187 u32 dccpor_elapsed_time;
188 };
189
190 struct ccid;
191
192 enum dccp_role {
193 DCCP_ROLE_UNDEFINED,
194 DCCP_ROLE_LISTEN,
195 DCCP_ROLE_CLIENT,
196 DCCP_ROLE_SERVER,
197 };
198
199 struct dccp_service_list {
200 __u32 dccpsl_nr;
201 __be32 dccpsl_list[0];
202 };
203
204 #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
205 #define DCCP_SERVICE_CODE_IS_ABSENT 0
206
207 static inline bool dccp_list_has_service(const struct dccp_service_list *sl,
208 const __be32 service)
209 {
210 if (likely(sl != NULL)) {
211 u32 i = sl->dccpsl_nr;
212 while (i--)
213 if (sl->dccpsl_list[i] == service)
214 return true;
215 }
216 return false;
217 }
218
219 struct dccp_ackvec;
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264 struct dccp_sock {
265
266 struct inet_connection_sock dccps_inet_connection;
267 #define dccps_syn_rtt dccps_inet_connection.icsk_ack.lrcvtime
268 __u64 dccps_swl;
269 __u64 dccps_swh;
270 __u64 dccps_awl;
271 __u64 dccps_awh;
272 __u64 dccps_iss;
273 __u64 dccps_isr;
274 __u64 dccps_osr;
275 __u64 dccps_gss;
276 __u64 dccps_gsr;
277 __u64 dccps_gar;
278 __be32 dccps_service;
279 __u32 dccps_mss_cache;
280 struct dccp_service_list *dccps_service_list;
281 __u32 dccps_timestamp_echo;
282 __u32 dccps_timestamp_time;
283 __u16 dccps_l_ack_ratio;
284 __u16 dccps_r_ack_ratio;
285 __u64 dccps_l_seq_win:48;
286 __u64 dccps_r_seq_win:48;
287 __u8 dccps_pcslen:4;
288 __u8 dccps_pcrlen:4;
289 __u8 dccps_send_ndp_count:1;
290 __u64 dccps_ndp_count:48;
291 unsigned long dccps_rate_last;
292 struct list_head dccps_featneg;
293 struct dccp_ackvec *dccps_hc_rx_ackvec;
294 struct ccid *dccps_hc_rx_ccid;
295 struct ccid *dccps_hc_tx_ccid;
296 struct dccp_options_received dccps_options_received;
297 __u8 dccps_qpolicy;
298 __u32 dccps_tx_qlen;
299 enum dccp_role dccps_role:2;
300 __u8 dccps_hc_rx_insert_options:1;
301 __u8 dccps_hc_tx_insert_options:1;
302 __u8 dccps_server_timewait:1;
303 __u8 dccps_sync_scheduled:1;
304 struct tasklet_struct dccps_xmitlet;
305 struct timer_list dccps_xmit_timer;
306 };
307
308 static inline struct dccp_sock *dccp_sk(const struct sock *sk)
309 {
310 return (struct dccp_sock *)sk;
311 }
312
313 static inline const char *dccp_role(const struct sock *sk)
314 {
315 switch (dccp_sk(sk)->dccps_role) {
316 case DCCP_ROLE_UNDEFINED: return "undefined";
317 case DCCP_ROLE_LISTEN: return "listen";
318 case DCCP_ROLE_SERVER: return "server";
319 case DCCP_ROLE_CLIENT: return "client";
320 }
321 return NULL;
322 }
323
324 extern void dccp_syn_ack_timeout(const struct request_sock *req);
325
326 #endif