1 /*
2  * DCCP connection tracking protocol helper
3  *
4  * Copyright (c) 2005, 2006, 2008 Patrick McHardy <kaber@trash.net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  */
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/sysctl.h>
14 #include <linux/spinlock.h>
15 #include <linux/skbuff.h>
16 #include <linux/dccp.h>
17 #include <linux/slab.h>
18 
19 #include <net/net_namespace.h>
20 #include <net/netns/generic.h>
21 
22 #include <linux/netfilter/nfnetlink_conntrack.h>
23 #include <net/netfilter/nf_conntrack.h>
24 #include <net/netfilter/nf_conntrack_l4proto.h>
25 #include <net/netfilter/nf_conntrack_ecache.h>
26 #include <net/netfilter/nf_conntrack_timeout.h>
27 #include <net/netfilter/nf_log.h>
28 
29 /* Timeouts are based on values from RFC4340:
30  *
31  * - REQUEST:
32  *
33  *   8.1.2. Client Request
34  *
35  *   A client MAY give up on its DCCP-Requests after some time
36  *   (3 minutes, for example).
37  *
38  * - RESPOND:
39  *
40  *   8.1.3. Server Response
41  *
42  *   It MAY also leave the RESPOND state for CLOSED after a timeout of
43  *   not less than 4MSL (8 minutes);
44  *
45  * - PARTOPEN:
46  *
47  *   8.1.5. Handshake Completion
48  *
49  *   If the client remains in PARTOPEN for more than 4MSL (8 minutes),
50  *   it SHOULD reset the connection with Reset Code 2, "Aborted".
51  *
52  * - OPEN:
53  *
54  *   The DCCP timestamp overflows after 11.9 hours. If the connection
55  *   stays idle this long the sequence number won't be recognized
56  *   as valid anymore.
57  *
58  * - CLOSEREQ/CLOSING:
59  *
60  *   8.3. Termination
61  *
62  *   The retransmission timer should initially be set to go off in two
63  *   round-trip times and should back off to not less than once every
64  *   64 seconds ...
65  *
66  * - TIMEWAIT:
67  *
68  *   4.3. States
69  *
70  *   A server or client socket remains in this state for 2MSL (4 minutes)
71  *   after the connection has been town down, ...
72  */
73 
74 #define DCCP_MSL (2 * 60 * HZ)
75 
76 static const char * const dccp_state_names[] = {
77 	[CT_DCCP_NONE]		= "NONE",
78 	[CT_DCCP_REQUEST]	= "REQUEST",
79 	[CT_DCCP_RESPOND]	= "RESPOND",
80 	[CT_DCCP_PARTOPEN]	= "PARTOPEN",
81 	[CT_DCCP_OPEN]		= "OPEN",
82 	[CT_DCCP_CLOSEREQ]	= "CLOSEREQ",
83 	[CT_DCCP_CLOSING]	= "CLOSING",
84 	[CT_DCCP_TIMEWAIT]	= "TIMEWAIT",
85 	[CT_DCCP_IGNORE]	= "IGNORE",
86 	[CT_DCCP_INVALID]	= "INVALID",
87 };
88 
89 #define sNO	CT_DCCP_NONE
90 #define sRQ	CT_DCCP_REQUEST
91 #define sRS	CT_DCCP_RESPOND
92 #define sPO	CT_DCCP_PARTOPEN
93 #define sOP	CT_DCCP_OPEN
94 #define sCR	CT_DCCP_CLOSEREQ
95 #define sCG	CT_DCCP_CLOSING
96 #define sTW	CT_DCCP_TIMEWAIT
97 #define sIG	CT_DCCP_IGNORE
98 #define sIV	CT_DCCP_INVALID
99 
100 /*
101  * DCCP state transition table
102  *
103  * The assumption is the same as for TCP tracking:
104  *
105  * We are the man in the middle. All the packets go through us but might
106  * get lost in transit to the destination. It is assumed that the destination
107  * can't receive segments we haven't seen.
108  *
109  * The following states exist:
110  *
111  * NONE:	Initial state, expecting Request
112  * REQUEST:	Request seen, waiting for Response from server
113  * RESPOND:	Response from server seen, waiting for Ack from client
114  * PARTOPEN:	Ack after Response seen, waiting for packet other than Response,
115  * 		Reset or Sync from server
116  * OPEN:	Packet other than Response, Reset or Sync seen
117  * CLOSEREQ:	CloseReq from server seen, expecting Close from client
118  * CLOSING:	Close seen, expecting Reset
119  * TIMEWAIT:	Reset seen
120  * IGNORE:	Not determinable whether packet is valid
121  *
122  * Some states exist only on one side of the connection: REQUEST, RESPOND,
123  * PARTOPEN, CLOSEREQ. For the other side these states are equivalent to
124  * the one it was in before.
125  *
126  * Packets are marked as ignored (sIG) if we don't know if they're valid
127  * (for example a reincarnation of a connection we didn't notice is dead
128  * already) and the server may send back a connection closing Reset or a
129  * Response. They're also used for Sync/SyncAck packets, which we don't
130  * care about.
131  */
132 static const u_int8_t
133 dccp_state_table[CT_DCCP_ROLE_MAX + 1][DCCP_PKT_SYNCACK + 1][CT_DCCP_MAX + 1] = {
134 	[CT_DCCP_ROLE_CLIENT] = {
135 		[DCCP_PKT_REQUEST] = {
136 		/*
137 		 * sNO -> sRQ		Regular Request
138 		 * sRQ -> sRQ		Retransmitted Request or reincarnation
139 		 * sRS -> sRS		Retransmitted Request (apparently Response
140 		 * 			got lost after we saw it) or reincarnation
141 		 * sPO -> sIG		Ignore, conntrack might be out of sync
142 		 * sOP -> sIG		Ignore, conntrack might be out of sync
143 		 * sCR -> sIG		Ignore, conntrack might be out of sync
144 		 * sCG -> sIG		Ignore, conntrack might be out of sync
145 		 * sTW -> sRQ		Reincarnation
146 		 *
147 		 *	sNO, sRQ, sRS, sPO. sOP, sCR, sCG, sTW, */
148 			sRQ, sRQ, sRS, sIG, sIG, sIG, sIG, sRQ,
149 		},
150 		[DCCP_PKT_RESPONSE] = {
151 		/*
152 		 * sNO -> sIV		Invalid
153 		 * sRQ -> sIG		Ignore, might be response to ignored Request
154 		 * sRS -> sIG		Ignore, might be response to ignored Request
155 		 * sPO -> sIG		Ignore, might be response to ignored Request
156 		 * sOP -> sIG		Ignore, might be response to ignored Request
157 		 * sCR -> sIG		Ignore, might be response to ignored Request
158 		 * sCG -> sIG		Ignore, might be response to ignored Request
159 		 * sTW -> sIV		Invalid, reincarnation in reverse direction
160 		 *			goes through sRQ
161 		 *
162 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
163 			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIV,
164 		},
165 		[DCCP_PKT_ACK] = {
166 		/*
167 		 * sNO -> sIV		No connection
168 		 * sRQ -> sIV		No connection
169 		 * sRS -> sPO		Ack for Response, move to PARTOPEN (8.1.5.)
170 		 * sPO -> sPO		Retransmitted Ack for Response, remain in PARTOPEN
171 		 * sOP -> sOP		Regular ACK, remain in OPEN
172 		 * sCR -> sCR		Ack in CLOSEREQ MAY be processed (8.3.)
173 		 * sCG -> sCG		Ack in CLOSING MAY be processed (8.3.)
174 		 * sTW -> sIV
175 		 *
176 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
177 			sIV, sIV, sPO, sPO, sOP, sCR, sCG, sIV
178 		},
179 		[DCCP_PKT_DATA] = {
180 		/*
181 		 * sNO -> sIV		No connection
182 		 * sRQ -> sIV		No connection
183 		 * sRS -> sIV		No connection
184 		 * sPO -> sIV		MUST use DataAck in PARTOPEN state (8.1.5.)
185 		 * sOP -> sOP		Regular Data packet
186 		 * sCR -> sCR		Data in CLOSEREQ MAY be processed (8.3.)
187 		 * sCG -> sCG		Data in CLOSING MAY be processed (8.3.)
188 		 * sTW -> sIV
189 		 *
190 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
191 			sIV, sIV, sIV, sIV, sOP, sCR, sCG, sIV,
192 		},
193 		[DCCP_PKT_DATAACK] = {
194 		/*
195 		 * sNO -> sIV		No connection
196 		 * sRQ -> sIV		No connection
197 		 * sRS -> sPO		Ack for Response, move to PARTOPEN (8.1.5.)
198 		 * sPO -> sPO		Remain in PARTOPEN state
199 		 * sOP -> sOP		Regular DataAck packet in OPEN state
200 		 * sCR -> sCR		DataAck in CLOSEREQ MAY be processed (8.3.)
201 		 * sCG -> sCG		DataAck in CLOSING MAY be processed (8.3.)
202 		 * sTW -> sIV
203 		 *
204 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
205 			sIV, sIV, sPO, sPO, sOP, sCR, sCG, sIV
206 		},
207 		[DCCP_PKT_CLOSEREQ] = {
208 		/*
209 		 * CLOSEREQ may only be sent by the server.
210 		 *
211 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
212 			sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV
213 		},
214 		[DCCP_PKT_CLOSE] = {
215 		/*
216 		 * sNO -> sIV		No connection
217 		 * sRQ -> sIV		No connection
218 		 * sRS -> sIV		No connection
219 		 * sPO -> sCG		Client-initiated close
220 		 * sOP -> sCG		Client-initiated close
221 		 * sCR -> sCG		Close in response to CloseReq (8.3.)
222 		 * sCG -> sCG		Retransmit
223 		 * sTW -> sIV		Late retransmit, already in TIME_WAIT
224 		 *
225 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
226 			sIV, sIV, sIV, sCG, sCG, sCG, sIV, sIV
227 		},
228 		[DCCP_PKT_RESET] = {
229 		/*
230 		 * sNO -> sIV		No connection
231 		 * sRQ -> sTW		Sync received or timeout, SHOULD send Reset (8.1.1.)
232 		 * sRS -> sTW		Response received without Request
233 		 * sPO -> sTW		Timeout, SHOULD send Reset (8.1.5.)
234 		 * sOP -> sTW		Connection reset
235 		 * sCR -> sTW		Connection reset
236 		 * sCG -> sTW		Connection reset
237 		 * sTW -> sIG		Ignore (don't refresh timer)
238 		 *
239 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
240 			sIV, sTW, sTW, sTW, sTW, sTW, sTW, sIG
241 		},
242 		[DCCP_PKT_SYNC] = {
243 		/*
244 		 * We currently ignore Sync packets
245 		 *
246 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
247 			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
248 		},
249 		[DCCP_PKT_SYNCACK] = {
250 		/*
251 		 * We currently ignore SyncAck packets
252 		 *
253 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
254 			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
255 		},
256 	},
257 	[CT_DCCP_ROLE_SERVER] = {
258 		[DCCP_PKT_REQUEST] = {
259 		/*
260 		 * sNO -> sIV		Invalid
261 		 * sRQ -> sIG		Ignore, conntrack might be out of sync
262 		 * sRS -> sIG		Ignore, conntrack might be out of sync
263 		 * sPO -> sIG		Ignore, conntrack might be out of sync
264 		 * sOP -> sIG		Ignore, conntrack might be out of sync
265 		 * sCR -> sIG		Ignore, conntrack might be out of sync
266 		 * sCG -> sIG		Ignore, conntrack might be out of sync
267 		 * sTW -> sRQ		Reincarnation, must reverse roles
268 		 *
269 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
270 			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sRQ
271 		},
272 		[DCCP_PKT_RESPONSE] = {
273 		/*
274 		 * sNO -> sIV		Response without Request
275 		 * sRQ -> sRS		Response to clients Request
276 		 * sRS -> sRS		Retransmitted Response (8.1.3. SHOULD NOT)
277 		 * sPO -> sIG		Response to an ignored Request or late retransmit
278 		 * sOP -> sIG		Ignore, might be response to ignored Request
279 		 * sCR -> sIG		Ignore, might be response to ignored Request
280 		 * sCG -> sIG		Ignore, might be response to ignored Request
281 		 * sTW -> sIV		Invalid, Request from client in sTW moves to sRQ
282 		 *
283 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
284 			sIV, sRS, sRS, sIG, sIG, sIG, sIG, sIV
285 		},
286 		[DCCP_PKT_ACK] = {
287 		/*
288 		 * sNO -> sIV		No connection
289 		 * sRQ -> sIV		No connection
290 		 * sRS -> sIV		No connection
291 		 * sPO -> sOP		Enter OPEN state (8.1.5.)
292 		 * sOP -> sOP		Regular Ack in OPEN state
293 		 * sCR -> sIV		Waiting for Close from client
294 		 * sCG -> sCG		Ack in CLOSING MAY be processed (8.3.)
295 		 * sTW -> sIV
296 		 *
297 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
298 			sIV, sIV, sIV, sOP, sOP, sIV, sCG, sIV
299 		},
300 		[DCCP_PKT_DATA] = {
301 		/*
302 		 * sNO -> sIV		No connection
303 		 * sRQ -> sIV		No connection
304 		 * sRS -> sIV		No connection
305 		 * sPO -> sOP		Enter OPEN state (8.1.5.)
306 		 * sOP -> sOP		Regular Data packet in OPEN state
307 		 * sCR -> sIV		Waiting for Close from client
308 		 * sCG -> sCG		Data in CLOSING MAY be processed (8.3.)
309 		 * sTW -> sIV
310 		 *
311 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
312 			sIV, sIV, sIV, sOP, sOP, sIV, sCG, sIV
313 		},
314 		[DCCP_PKT_DATAACK] = {
315 		/*
316 		 * sNO -> sIV		No connection
317 		 * sRQ -> sIV		No connection
318 		 * sRS -> sIV		No connection
319 		 * sPO -> sOP		Enter OPEN state (8.1.5.)
320 		 * sOP -> sOP		Regular DataAck in OPEN state
321 		 * sCR -> sIV		Waiting for Close from client
322 		 * sCG -> sCG		Data in CLOSING MAY be processed (8.3.)
323 		 * sTW -> sIV
324 		 *
325 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
326 			sIV, sIV, sIV, sOP, sOP, sIV, sCG, sIV
327 		},
328 		[DCCP_PKT_CLOSEREQ] = {
329 		/*
330 		 * sNO -> sIV		No connection
331 		 * sRQ -> sIV		No connection
332 		 * sRS -> sIV		No connection
333 		 * sPO -> sOP -> sCR	Move directly to CLOSEREQ (8.1.5.)
334 		 * sOP -> sCR		CloseReq in OPEN state
335 		 * sCR -> sCR		Retransmit
336 		 * sCG -> sCR		Simultaneous close, client sends another Close
337 		 * sTW -> sIV		Already closed
338 		 *
339 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
340 			sIV, sIV, sIV, sCR, sCR, sCR, sCR, sIV
341 		},
342 		[DCCP_PKT_CLOSE] = {
343 		/*
344 		 * sNO -> sIV		No connection
345 		 * sRQ -> sIV		No connection
346 		 * sRS -> sIV		No connection
347 		 * sPO -> sOP -> sCG	Move direcly to CLOSING
348 		 * sOP -> sCG		Move to CLOSING
349 		 * sCR -> sIV		Close after CloseReq is invalid
350 		 * sCG -> sCG		Retransmit
351 		 * sTW -> sIV		Already closed
352 		 *
353 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
354 			sIV, sIV, sIV, sCG, sCG, sIV, sCG, sIV
355 		},
356 		[DCCP_PKT_RESET] = {
357 		/*
358 		 * sNO -> sIV		No connection
359 		 * sRQ -> sTW		Reset in response to Request
360 		 * sRS -> sTW		Timeout, SHOULD send Reset (8.1.3.)
361 		 * sPO -> sTW		Timeout, SHOULD send Reset (8.1.3.)
362 		 * sOP -> sTW
363 		 * sCR -> sTW
364 		 * sCG -> sTW
365 		 * sTW -> sIG		Ignore (don't refresh timer)
366 		 *
367 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW, sTW */
368 			sIV, sTW, sTW, sTW, sTW, sTW, sTW, sTW, sIG
369 		},
370 		[DCCP_PKT_SYNC] = {
371 		/*
372 		 * We currently ignore Sync packets
373 		 *
374 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
375 			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
376 		},
377 		[DCCP_PKT_SYNCACK] = {
378 		/*
379 		 * We currently ignore SyncAck packets
380 		 *
381 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
382 			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
383 		},
384 	},
385 };
386 
387 static inline struct nf_dccp_net *dccp_pernet(struct net *net)
388 {
389 	return &net->ct.nf_ct_proto.dccp;
390 }
391 
392 static bool dccp_new(struct nf_conn *ct, const struct sk_buff *skb,
393 		     unsigned int dataoff)
394 {
395 	struct net *net = nf_ct_net(ct);
396 	struct nf_dccp_net *dn;
397 	struct dccp_hdr _dh, *dh;
398 	const char *msg;
399 	u_int8_t state;
400 
401 	dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh);
402 	BUG_ON(dh == NULL);
403 
404 	state = dccp_state_table[CT_DCCP_ROLE_CLIENT][dh->dccph_type][CT_DCCP_NONE];
405 	switch (state) {
406 	default:
407 		dn = dccp_pernet(net);
408 		if (dn->dccp_loose == 0) {
409 			msg = "not picking up existing connection ";
410 			goto out_invalid;
411 		}
412 	case CT_DCCP_REQUEST:
413 		break;
414 	case CT_DCCP_INVALID:
415 		msg = "invalid state transition ";
416 		goto out_invalid;
417 	}
418 
419 	ct->proto.dccp.role[IP_CT_DIR_ORIGINAL] = CT_DCCP_ROLE_CLIENT;
420 	ct->proto.dccp.role[IP_CT_DIR_REPLY] = CT_DCCP_ROLE_SERVER;
421 	ct->proto.dccp.state = CT_DCCP_NONE;
422 	ct->proto.dccp.last_pkt = DCCP_PKT_REQUEST;
423 	ct->proto.dccp.last_dir = IP_CT_DIR_ORIGINAL;
424 	ct->proto.dccp.handshake_seq = 0;
425 	return true;
426 
427 out_invalid:
428 	nf_ct_l4proto_log_invalid(skb, ct, "%s", msg);
429 	return false;
430 }
431 
432 static u64 dccp_ack_seq(const struct dccp_hdr *dh)
433 {
434 	const struct dccp_hdr_ack_bits *dhack;
435 
436 	dhack = (void *)dh + __dccp_basic_hdr_len(dh);
437 	return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) +
438 		     ntohl(dhack->dccph_ack_nr_low);
439 }
440 
441 static int dccp_packet(struct nf_conn *ct, const struct sk_buff *skb,
442 		       unsigned int dataoff, enum ip_conntrack_info ctinfo)
443 {
444 	enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
445 	struct dccp_hdr _dh, *dh;
446 	u_int8_t type, old_state, new_state;
447 	enum ct_dccp_roles role;
448 	unsigned int *timeouts;
449 
450 	dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh);
451 	BUG_ON(dh == NULL);
452 	type = dh->dccph_type;
453 
454 	if (type == DCCP_PKT_RESET &&
455 	    !test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) {
456 		/* Tear down connection immediately if only reply is a RESET */
457 		nf_ct_kill_acct(ct, ctinfo, skb);
458 		return NF_ACCEPT;
459 	}
460 
461 	spin_lock_bh(&ct->lock);
462 
463 	role = ct->proto.dccp.role[dir];
464 	old_state = ct->proto.dccp.state;
465 	new_state = dccp_state_table[role][type][old_state];
466 
467 	switch (new_state) {
468 	case CT_DCCP_REQUEST:
469 		if (old_state == CT_DCCP_TIMEWAIT &&
470 		    role == CT_DCCP_ROLE_SERVER) {
471 			/* Reincarnation in the reverse direction: reopen and
472 			 * reverse client/server roles. */
473 			ct->proto.dccp.role[dir] = CT_DCCP_ROLE_CLIENT;
474 			ct->proto.dccp.role[!dir] = CT_DCCP_ROLE_SERVER;
475 		}
476 		break;
477 	case CT_DCCP_RESPOND:
478 		if (old_state == CT_DCCP_REQUEST)
479 			ct->proto.dccp.handshake_seq = dccp_hdr_seq(dh);
480 		break;
481 	case CT_DCCP_PARTOPEN:
482 		if (old_state == CT_DCCP_RESPOND &&
483 		    type == DCCP_PKT_ACK &&
484 		    dccp_ack_seq(dh) == ct->proto.dccp.handshake_seq)
485 			set_bit(IPS_ASSURED_BIT, &ct->status);
486 		break;
487 	case CT_DCCP_IGNORE:
488 		/*
489 		 * Connection tracking might be out of sync, so we ignore
490 		 * packets that might establish a new connection and resync
491 		 * if the server responds with a valid Response.
492 		 */
493 		if (ct->proto.dccp.last_dir == !dir &&
494 		    ct->proto.dccp.last_pkt == DCCP_PKT_REQUEST &&
495 		    type == DCCP_PKT_RESPONSE) {
496 			ct->proto.dccp.role[!dir] = CT_DCCP_ROLE_CLIENT;
497 			ct->proto.dccp.role[dir] = CT_DCCP_ROLE_SERVER;
498 			ct->proto.dccp.handshake_seq = dccp_hdr_seq(dh);
499 			new_state = CT_DCCP_RESPOND;
500 			break;
501 		}
502 		ct->proto.dccp.last_dir = dir;
503 		ct->proto.dccp.last_pkt = type;
504 
505 		spin_unlock_bh(&ct->lock);
506 		nf_ct_l4proto_log_invalid(skb, ct, "%s", "invalid packet");
507 		return NF_ACCEPT;
508 	case CT_DCCP_INVALID:
509 		spin_unlock_bh(&ct->lock);
510 		nf_ct_l4proto_log_invalid(skb, ct, "%s", "invalid state transition");
511 		return -NF_ACCEPT;
512 	}
513 
514 	ct->proto.dccp.last_dir = dir;
515 	ct->proto.dccp.last_pkt = type;
516 	ct->proto.dccp.state = new_state;
517 	spin_unlock_bh(&ct->lock);
518 
519 	if (new_state != old_state)
520 		nf_conntrack_event_cache(IPCT_PROTOINFO, ct);
521 
522 	timeouts = nf_ct_timeout_lookup(ct);
523 	if (!timeouts)
524 		timeouts = dccp_pernet(nf_ct_net(ct))->dccp_timeout;
525 	nf_ct_refresh_acct(ct, ctinfo, skb, timeouts[new_state]);
526 
527 	return NF_ACCEPT;
528 }
529 
530 static int dccp_error(struct net *net, struct nf_conn *tmpl,
531 		      struct sk_buff *skb, unsigned int dataoff,
532 		      u_int8_t pf, unsigned int hooknum)
533 {
534 	struct dccp_hdr _dh, *dh;
535 	unsigned int dccp_len = skb->len - dataoff;
536 	unsigned int cscov;
537 	const char *msg;
538 
539 	dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh);
540 	if (dh == NULL) {
541 		msg = "nf_ct_dccp: short packet ";
542 		goto out_invalid;
543 	}
544 
545 	if (dh->dccph_doff * 4 < sizeof(struct dccp_hdr) ||
546 	    dh->dccph_doff * 4 > dccp_len) {
547 		msg = "nf_ct_dccp: truncated/malformed packet ";
548 		goto out_invalid;
549 	}
550 
551 	cscov = dccp_len;
552 	if (dh->dccph_cscov) {
553 		cscov = (dh->dccph_cscov - 1) * 4;
554 		if (cscov > dccp_len) {
555 			msg = "nf_ct_dccp: bad checksum coverage ";
556 			goto out_invalid;
557 		}
558 	}
559 
560 	if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING &&
561 	    nf_checksum_partial(skb, hooknum, dataoff, cscov, IPPROTO_DCCP,
562 				pf)) {
563 		msg = "nf_ct_dccp: bad checksum ";
564 		goto out_invalid;
565 	}
566 
567 	if (dh->dccph_type >= DCCP_PKT_INVALID) {
568 		msg = "nf_ct_dccp: reserved packet type ";
569 		goto out_invalid;
570 	}
571 
572 	return NF_ACCEPT;
573 
574 out_invalid:
575 	nf_l4proto_log_invalid(skb, net, pf, IPPROTO_DCCP, "%s", msg);
576 	return -NF_ACCEPT;
577 }
578 
579 static bool dccp_can_early_drop(const struct nf_conn *ct)
580 {
581 	switch (ct->proto.dccp.state) {
582 	case CT_DCCP_CLOSEREQ:
583 	case CT_DCCP_CLOSING:
584 	case CT_DCCP_TIMEWAIT:
585 		return true;
586 	default:
587 		break;
588 	}
589 
590 	return false;
591 }
592 
593 #ifdef CONFIG_NF_CONNTRACK_PROCFS
594 static void dccp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
595 {
596 	seq_printf(s, "%s ", dccp_state_names[ct->proto.dccp.state]);
597 }
598 #endif
599 
600 #if IS_ENABLED(CONFIG_NF_CT_NETLINK)
601 static int dccp_to_nlattr(struct sk_buff *skb, struct nlattr *nla,
602 			  struct nf_conn *ct)
603 {
604 	struct nlattr *nest_parms;
605 
606 	spin_lock_bh(&ct->lock);
607 	nest_parms = nla_nest_start(skb, CTA_PROTOINFO_DCCP | NLA_F_NESTED);
608 	if (!nest_parms)
609 		goto nla_put_failure;
610 	if (nla_put_u8(skb, CTA_PROTOINFO_DCCP_STATE, ct->proto.dccp.state) ||
611 	    nla_put_u8(skb, CTA_PROTOINFO_DCCP_ROLE,
612 		       ct->proto.dccp.role[IP_CT_DIR_ORIGINAL]) ||
613 	    nla_put_be64(skb, CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ,
614 			 cpu_to_be64(ct->proto.dccp.handshake_seq),
615 			 CTA_PROTOINFO_DCCP_PAD))
616 		goto nla_put_failure;
617 	nla_nest_end(skb, nest_parms);
618 	spin_unlock_bh(&ct->lock);
619 	return 0;
620 
621 nla_put_failure:
622 	spin_unlock_bh(&ct->lock);
623 	return -1;
624 }
625 
626 static const struct nla_policy dccp_nla_policy[CTA_PROTOINFO_DCCP_MAX + 1] = {
627 	[CTA_PROTOINFO_DCCP_STATE]	= { .type = NLA_U8 },
628 	[CTA_PROTOINFO_DCCP_ROLE]	= { .type = NLA_U8 },
629 	[CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ] = { .type = NLA_U64 },
630 	[CTA_PROTOINFO_DCCP_PAD]	= { .type = NLA_UNSPEC },
631 };
632 
633 #define DCCP_NLATTR_SIZE ( \
634 	NLA_ALIGN(NLA_HDRLEN + 1) + \
635 	NLA_ALIGN(NLA_HDRLEN + 1) + \
636 	NLA_ALIGN(NLA_HDRLEN + sizeof(u64)) + \
637 	NLA_ALIGN(NLA_HDRLEN + 0))
638 
639 static int nlattr_to_dccp(struct nlattr *cda[], struct nf_conn *ct)
640 {
641 	struct nlattr *attr = cda[CTA_PROTOINFO_DCCP];
642 	struct nlattr *tb[CTA_PROTOINFO_DCCP_MAX + 1];
643 	int err;
644 
645 	if (!attr)
646 		return 0;
647 
648 	err = nla_parse_nested(tb, CTA_PROTOINFO_DCCP_MAX, attr,
649 			       dccp_nla_policy, NULL);
650 	if (err < 0)
651 		return err;
652 
653 	if (!tb[CTA_PROTOINFO_DCCP_STATE] ||
654 	    !tb[CTA_PROTOINFO_DCCP_ROLE] ||
655 	    nla_get_u8(tb[CTA_PROTOINFO_DCCP_ROLE]) > CT_DCCP_ROLE_MAX ||
656 	    nla_get_u8(tb[CTA_PROTOINFO_DCCP_STATE]) >= CT_DCCP_IGNORE) {
657 		return -EINVAL;
658 	}
659 
660 	spin_lock_bh(&ct->lock);
661 	ct->proto.dccp.state = nla_get_u8(tb[CTA_PROTOINFO_DCCP_STATE]);
662 	if (nla_get_u8(tb[CTA_PROTOINFO_DCCP_ROLE]) == CT_DCCP_ROLE_CLIENT) {
663 		ct->proto.dccp.role[IP_CT_DIR_ORIGINAL] = CT_DCCP_ROLE_CLIENT;
664 		ct->proto.dccp.role[IP_CT_DIR_REPLY] = CT_DCCP_ROLE_SERVER;
665 	} else {
666 		ct->proto.dccp.role[IP_CT_DIR_ORIGINAL] = CT_DCCP_ROLE_SERVER;
667 		ct->proto.dccp.role[IP_CT_DIR_REPLY] = CT_DCCP_ROLE_CLIENT;
668 	}
669 	if (tb[CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ]) {
670 		ct->proto.dccp.handshake_seq =
671 		be64_to_cpu(nla_get_be64(tb[CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ]));
672 	}
673 	spin_unlock_bh(&ct->lock);
674 	return 0;
675 }
676 #endif
677 
678 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT
679 
680 #include <linux/netfilter/nfnetlink.h>
681 #include <linux/netfilter/nfnetlink_cttimeout.h>
682 
683 static int dccp_timeout_nlattr_to_obj(struct nlattr *tb[],
684 				      struct net *net, void *data)
685 {
686 	struct nf_dccp_net *dn = dccp_pernet(net);
687 	unsigned int *timeouts = data;
688 	int i;
689 
690 	/* set default DCCP timeouts. */
691 	for (i=0; i<CT_DCCP_MAX; i++)
692 		timeouts[i] = dn->dccp_timeout[i];
693 
694 	/* there's a 1:1 mapping between attributes and protocol states. */
695 	for (i=CTA_TIMEOUT_DCCP_UNSPEC+1; i<CTA_TIMEOUT_DCCP_MAX+1; i++) {
696 		if (tb[i]) {
697 			timeouts[i] = ntohl(nla_get_be32(tb[i])) * HZ;
698 		}
699 	}
700 
701 	timeouts[CTA_TIMEOUT_DCCP_UNSPEC] = timeouts[CTA_TIMEOUT_DCCP_REQUEST];
702 	return 0;
703 }
704 
705 static int
706 dccp_timeout_obj_to_nlattr(struct sk_buff *skb, const void *data)
707 {
708         const unsigned int *timeouts = data;
709 	int i;
710 
711 	for (i=CTA_TIMEOUT_DCCP_UNSPEC+1; i<CTA_TIMEOUT_DCCP_MAX+1; i++) {
712 		if (nla_put_be32(skb, i, htonl(timeouts[i] / HZ)))
713 			goto nla_put_failure;
714 	}
715 	return 0;
716 
717 nla_put_failure:
718 	return -ENOSPC;
719 }
720 
721 static const struct nla_policy
722 dccp_timeout_nla_policy[CTA_TIMEOUT_DCCP_MAX+1] = {
723 	[CTA_TIMEOUT_DCCP_REQUEST]	= { .type = NLA_U32 },
724 	[CTA_TIMEOUT_DCCP_RESPOND]	= { .type = NLA_U32 },
725 	[CTA_TIMEOUT_DCCP_PARTOPEN]	= { .type = NLA_U32 },
726 	[CTA_TIMEOUT_DCCP_OPEN]		= { .type = NLA_U32 },
727 	[CTA_TIMEOUT_DCCP_CLOSEREQ]	= { .type = NLA_U32 },
728 	[CTA_TIMEOUT_DCCP_CLOSING]	= { .type = NLA_U32 },
729 	[CTA_TIMEOUT_DCCP_TIMEWAIT]	= { .type = NLA_U32 },
730 };
731 #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
732 
733 #ifdef CONFIG_SYSCTL
734 /* template, data assigned later */
735 static struct ctl_table dccp_sysctl_table[] = {
736 	{
737 		.procname	= "nf_conntrack_dccp_timeout_request",
738 		.maxlen		= sizeof(unsigned int),
739 		.mode		= 0644,
740 		.proc_handler	= proc_dointvec_jiffies,
741 	},
742 	{
743 		.procname	= "nf_conntrack_dccp_timeout_respond",
744 		.maxlen		= sizeof(unsigned int),
745 		.mode		= 0644,
746 		.proc_handler	= proc_dointvec_jiffies,
747 	},
748 	{
749 		.procname	= "nf_conntrack_dccp_timeout_partopen",
750 		.maxlen		= sizeof(unsigned int),
751 		.mode		= 0644,
752 		.proc_handler	= proc_dointvec_jiffies,
753 	},
754 	{
755 		.procname	= "nf_conntrack_dccp_timeout_open",
756 		.maxlen		= sizeof(unsigned int),
757 		.mode		= 0644,
758 		.proc_handler	= proc_dointvec_jiffies,
759 	},
760 	{
761 		.procname	= "nf_conntrack_dccp_timeout_closereq",
762 		.maxlen		= sizeof(unsigned int),
763 		.mode		= 0644,
764 		.proc_handler	= proc_dointvec_jiffies,
765 	},
766 	{
767 		.procname	= "nf_conntrack_dccp_timeout_closing",
768 		.maxlen		= sizeof(unsigned int),
769 		.mode		= 0644,
770 		.proc_handler	= proc_dointvec_jiffies,
771 	},
772 	{
773 		.procname	= "nf_conntrack_dccp_timeout_timewait",
774 		.maxlen		= sizeof(unsigned int),
775 		.mode		= 0644,
776 		.proc_handler	= proc_dointvec_jiffies,
777 	},
778 	{
779 		.procname	= "nf_conntrack_dccp_loose",
780 		.maxlen		= sizeof(int),
781 		.mode		= 0644,
782 		.proc_handler	= proc_dointvec,
783 	},
784 	{ }
785 };
786 #endif /* CONFIG_SYSCTL */
787 
788 static int dccp_kmemdup_sysctl_table(struct net *net, struct nf_proto_net *pn,
789 				     struct nf_dccp_net *dn)
790 {
791 #ifdef CONFIG_SYSCTL
792 	if (pn->ctl_table)
793 		return 0;
794 
795 	pn->ctl_table = kmemdup(dccp_sysctl_table,
796 				sizeof(dccp_sysctl_table),
797 				GFP_KERNEL);
798 	if (!pn->ctl_table)
799 		return -ENOMEM;
800 
801 	pn->ctl_table[0].data = &dn->dccp_timeout[CT_DCCP_REQUEST];
802 	pn->ctl_table[1].data = &dn->dccp_timeout[CT_DCCP_RESPOND];
803 	pn->ctl_table[2].data = &dn->dccp_timeout[CT_DCCP_PARTOPEN];
804 	pn->ctl_table[3].data = &dn->dccp_timeout[CT_DCCP_OPEN];
805 	pn->ctl_table[4].data = &dn->dccp_timeout[CT_DCCP_CLOSEREQ];
806 	pn->ctl_table[5].data = &dn->dccp_timeout[CT_DCCP_CLOSING];
807 	pn->ctl_table[6].data = &dn->dccp_timeout[CT_DCCP_TIMEWAIT];
808 	pn->ctl_table[7].data = &dn->dccp_loose;
809 
810 	/* Don't export sysctls to unprivileged users */
811 	if (net->user_ns != &init_user_ns)
812 		pn->ctl_table[0].procname = NULL;
813 #endif
814 	return 0;
815 }
816 
817 static int dccp_init_net(struct net *net, u_int16_t proto)
818 {
819 	struct nf_dccp_net *dn = dccp_pernet(net);
820 	struct nf_proto_net *pn = &dn->pn;
821 
822 	if (!pn->users) {
823 		/* default values */
824 		dn->dccp_loose = 1;
825 		dn->dccp_timeout[CT_DCCP_REQUEST]	= 2 * DCCP_MSL;
826 		dn->dccp_timeout[CT_DCCP_RESPOND]	= 4 * DCCP_MSL;
827 		dn->dccp_timeout[CT_DCCP_PARTOPEN]	= 4 * DCCP_MSL;
828 		dn->dccp_timeout[CT_DCCP_OPEN]		= 12 * 3600 * HZ;
829 		dn->dccp_timeout[CT_DCCP_CLOSEREQ]	= 64 * HZ;
830 		dn->dccp_timeout[CT_DCCP_CLOSING]	= 64 * HZ;
831 		dn->dccp_timeout[CT_DCCP_TIMEWAIT]	= 2 * DCCP_MSL;
832 
833 		/* timeouts[0] is unused, make it same as SYN_SENT so
834 		 * ->timeouts[0] contains 'new' timeout, like udp or icmp.
835 		 */
836 		dn->dccp_timeout[CT_DCCP_NONE] = dn->dccp_timeout[CT_DCCP_REQUEST];
837 	}
838 
839 	return dccp_kmemdup_sysctl_table(net, pn, dn);
840 }
841 
842 static struct nf_proto_net *dccp_get_net_proto(struct net *net)
843 {
844 	return &net->ct.nf_ct_proto.dccp.pn;
845 }
846 
847 const struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 = {
848 	.l3proto		= AF_INET,
849 	.l4proto		= IPPROTO_DCCP,
850 	.new			= dccp_new,
851 	.packet			= dccp_packet,
852 	.error			= dccp_error,
853 	.can_early_drop		= dccp_can_early_drop,
854 #ifdef CONFIG_NF_CONNTRACK_PROCFS
855 	.print_conntrack	= dccp_print_conntrack,
856 #endif
857 #if IS_ENABLED(CONFIG_NF_CT_NETLINK)
858 	.nlattr_size		= DCCP_NLATTR_SIZE,
859 	.to_nlattr		= dccp_to_nlattr,
860 	.from_nlattr		= nlattr_to_dccp,
861 	.tuple_to_nlattr	= nf_ct_port_tuple_to_nlattr,
862 	.nlattr_tuple_size	= nf_ct_port_nlattr_tuple_size,
863 	.nlattr_to_tuple	= nf_ct_port_nlattr_to_tuple,
864 	.nla_policy		= nf_ct_port_nla_policy,
865 #endif
866 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT
867 	.ctnl_timeout		= {
868 		.nlattr_to_obj	= dccp_timeout_nlattr_to_obj,
869 		.obj_to_nlattr	= dccp_timeout_obj_to_nlattr,
870 		.nlattr_max	= CTA_TIMEOUT_DCCP_MAX,
871 		.obj_size	= sizeof(unsigned int) * CT_DCCP_MAX,
872 		.nla_policy	= dccp_timeout_nla_policy,
873 	},
874 #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
875 	.init_net		= dccp_init_net,
876 	.get_net_proto		= dccp_get_net_proto,
877 };
878 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp4);
879 
880 const struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp6 = {
881 	.l3proto		= AF_INET6,
882 	.l4proto		= IPPROTO_DCCP,
883 	.new			= dccp_new,
884 	.packet			= dccp_packet,
885 	.error			= dccp_error,
886 	.can_early_drop		= dccp_can_early_drop,
887 #ifdef CONFIG_NF_CONNTRACK_PROCFS
888 	.print_conntrack	= dccp_print_conntrack,
889 #endif
890 #if IS_ENABLED(CONFIG_NF_CT_NETLINK)
891 	.nlattr_size		= DCCP_NLATTR_SIZE,
892 	.to_nlattr		= dccp_to_nlattr,
893 	.from_nlattr		= nlattr_to_dccp,
894 	.tuple_to_nlattr	= nf_ct_port_tuple_to_nlattr,
895 	.nlattr_tuple_size	= nf_ct_port_nlattr_tuple_size,
896 	.nlattr_to_tuple	= nf_ct_port_nlattr_to_tuple,
897 	.nla_policy		= nf_ct_port_nla_policy,
898 #endif
899 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT
900 	.ctnl_timeout		= {
901 		.nlattr_to_obj	= dccp_timeout_nlattr_to_obj,
902 		.obj_to_nlattr	= dccp_timeout_obj_to_nlattr,
903 		.nlattr_max	= CTA_TIMEOUT_DCCP_MAX,
904 		.obj_size	= sizeof(unsigned int) * CT_DCCP_MAX,
905 		.nla_policy	= dccp_timeout_nla_policy,
906 	},
907 #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
908 	.init_net		= dccp_init_net,
909 	.get_net_proto		= dccp_get_net_proto,
910 };
911 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp6);
912