1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_DCCP_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_DCCP_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/byteorder.h>
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr - generic part of DCCP packet header
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_sport - Relevant port on the endpoint that sent this packet
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_dport - Relevant port on the other endpoint
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_ccval - Used by the HC-Sender CCID
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_cscov - Parts of the packet that are covered by the Checksum field
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_checksum - Internet checksum, depends on dccph_cscov
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_x - 0 = 24 bit sequence number, 1 = 48
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_type - packet type, see DCCP_PKT_ prefixed macros
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr {
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be16	dccph_sport,
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dccph_dport;
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	dccph_doff;
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(__LITTLE_ENDIAN_BITFIELD)
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	dccph_cscov:4,
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dccph_ccval:4;
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#elif defined(__BIG_ENDIAN_BITFIELD)
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	dccph_ccval:4,
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dccph_cscov:4;
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error  "Adjust your <asm/byteorder.h> defines"
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u16	dccph_checksum;
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(__LITTLE_ENDIAN_BITFIELD)
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	dccph_x:1,
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dccph_type:4,
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dccph_reserved:3;
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#elif defined(__BIG_ENDIAN_BITFIELD)
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	dccph_reserved:3,
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dccph_type:4,
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dccph_x:1;
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error  "Adjust your <asm/byteorder.h> defines"
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	dccph_seq2;
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be16	dccph_seq;
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_ext - the low bits of a 48 bit seq packet
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_seq_low - low 24 bits of a 48 bit seq packet
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_ext {
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be32	dccph_seq_low;
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_request - Conection initiation request header
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_req_service - Service to which the client app wants to connect
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_req_options - list of options (must be a multiple of 32 bits
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_request {
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be32	dccph_req_service;
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_ack_bits {
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be16	dccph_reserved1;
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be16	dccph_ack_nr_high;
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be32	dccph_ack_nr_low;
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_response - Conection initiation response header
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_options - list of options (must be a multiple of 32 bits
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_response {
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct dccp_hdr_ack_bits	dccph_resp_ack;
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be32				dccph_resp_service;
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_reset - Unconditionally shut down a connection
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_reset_service - Echoes the Service Code on a received DCCP-Request
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_reset_options - list of options (must be a multiple of 32 bits
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_reset {
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct dccp_hdr_ack_bits	dccph_reset_ack;
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8				dccph_reset_code,
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					dccph_reset_data[3];
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_pkt_type {
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_REQUEST = 0,
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_RESPONSE,
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_DATA,
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_ACK,
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_DATAACK,
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_CLOSEREQ,
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_CLOSE,
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_RESET,
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_SYNC,
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_SYNCACK,
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PKT_INVALID,
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_NR_PKT_TYPES DCCP_PKT_INVALID
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int dccp_packet_hdr_len(const __u8 type)
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (type == DCCP_PKT_DATA)
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		return 0;
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (type == DCCP_PKT_DATAACK	||
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	    type == DCCP_PKT_ACK	||
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	    type == DCCP_PKT_SYNC	||
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	    type == DCCP_PKT_SYNCACK	||
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	    type == DCCP_PKT_CLOSE	||
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	    type == DCCP_PKT_CLOSEREQ)
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		return sizeof(struct dccp_hdr_ack_bits);
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (type == DCCP_PKT_REQUEST)
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		return sizeof(struct dccp_hdr_request);
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (type == DCCP_PKT_RESPONSE)
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		return sizeof(struct dccp_hdr_response);
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return sizeof(struct dccp_hdr_reset);
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_reset_codes {
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_UNSPECIFIED = 0,
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_CLOSED,
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_ABORTED,
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_NO_CONNECTION,
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_PACKET_ERROR,
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_OPTION_ERROR,
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_MANDATORY_ERROR,
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_CONNECTION_REFUSED,
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_BAD_SERVICE_CODE,
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_TOO_BUSY,
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_BAD_INIT_COOKIE,
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESET_CODE_AGGRESSION_PENALTY,
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* DCCP options */
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum {
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_PADDING = 0,
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_MANDATORY = 1,
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_MIN_RESERVED = 3,
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_MAX_RESERVED = 31,
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_CHANGE_L = 32,
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_CONFIRM_L = 33,
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_CHANGE_R = 34,
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_CONFIRM_R = 35,
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_NDP_COUNT = 37,
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_ACK_VECTOR_0 = 38,
163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_ACK_VECTOR_1 = 39,
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_TIMESTAMP = 41,
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_TIMESTAMP_ECHO = 42,
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_ELAPSED_TIME = 43,
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_MAX = 45,
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_MIN_CCID_SPECIFIC = 128,
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPO_MAX_CCID_SPECIFIC = 255,
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* DCCP features */
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum {
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_RESERVED = 0,
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_CCID = 1,
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_SEQUENCE_WINDOW = 3,
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_ACK_RATIO = 5,
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_SEND_ACK_VECTOR = 6,
179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_SEND_NDP_COUNT = 7,
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* 10-127 reserved */
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_MIN_CCID_SPECIFIC = 128,
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_MAX_CCID_SPECIFIC = 255,
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* this structure is argument to DCCP_SOCKOPT_CHANGE_X */
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_so_feat {
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8 dccpsf_feat;
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8 *dccpsf_val;
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8 dccpsf_len;
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* DCCP socket options */
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_PACKET_SIZE	1
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_SERVICE		2
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CHANGE_L		3
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CHANGE_R		4
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CCID_RX_INFO	128
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CCID_TX_INFO	192
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SERVICE_LIST_MAX_LEN      32
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__
203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/in.h>
205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h>
206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/uio.h>
207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/workqueue.h>
208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/inet_connection_sock.h>
210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/inet_sock.h>
211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/inet_timewait_sock.h>
212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/tcp_states.h>
213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_state {
215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_OPEN	= TCP_ESTABLISHED,
216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_REQUESTING	= TCP_SYN_SENT,
217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_PARTOPEN	= TCP_FIN_WAIT1, /* FIXME:
218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    This mapping is horrible, but TCP has
219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    no matching state for DCCP_PARTOPEN,
220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    as TCP_SYN_RECV is already used by
221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    DCCP_RESPOND, why don't stop using TCP
222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    mapping of states? OK, now we don't use
223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    sk_stream_sendmsg anymore, so doesn't
224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    seem to exist any reason for us to
225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    do the TCP mapping here */
226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_LISTEN	= TCP_LISTEN,
227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_RESPOND	= TCP_SYN_RECV,
228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_CLOSING	= TCP_CLOSING,
229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_TIME_WAIT	= TCP_TIME_WAIT,
230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_CLOSED	= TCP_CLOSE,
231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_MAX_STATES = TCP_MAX_STATES,
232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_STATE_MASK 0xf
235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_ACTION_FIN (1<<7)
236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum {
238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_OPEN	 = TCPF_ESTABLISHED,
239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_REQUESTING = TCPF_SYN_SENT,
240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_PARTOPEN	 = TCPF_FIN_WAIT1,
241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_LISTEN	 = TCPF_LISTEN,
242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_RESPOND	 = TCPF_SYN_RECV,
243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_CLOSING	 = TCPF_CLOSING,
244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_TIME_WAIT	 = TCPF_TIME_WAIT,
245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCPF_CLOSED	 = TCPF_CLOSE,
246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb)
249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_hdr *)skb->h.raw;
251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb)
254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_hdr_ext *)(skb->h.raw + sizeof(struct dccp_hdr));
256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh)
259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0);
261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	const struct dccp_hdr *dh = dccp_hdr(skb);
266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return __dccp_basic_hdr_len(dh);
267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __u64 dccp_hdr_seq(const struct sk_buff *skb)
270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	const struct dccp_hdr *dh = dccp_hdr(skb);
272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64 seq_nr =  ntohs(dh->dccph_seq);
273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (dh->dccph_x != 0)
275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low);
276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	else
277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		seq_nr += (u32)dh->dccph_seq2 << 16;
278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return seq_nr;
280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb)
283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_hdr_request *)(skb->h.raw + dccp_basic_hdr_len(skb));
285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb)
288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_hdr_ack_bits *)(skb->h.raw + dccp_basic_hdr_len(skb));
290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb)
293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb);
295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) + ntohl(dhack->dccph_ack_nr_low);
296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb)
299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_hdr_response *)(skb->h.raw + dccp_basic_hdr_len(skb));
301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb)
304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_hdr_reset *)(skb->h.raw + dccp_basic_hdr_len(skb));
306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int __dccp_hdr_len(const struct dccp_hdr *dh)
309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return __dccp_basic_hdr_len(dh) +
311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	       dccp_packet_hdr_len(dh->dccph_type);
312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return __dccp_hdr_len(dccp_hdr(skb));
317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* initial values for each feature */
321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_SEQUENCE_WINDOW		100
322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_ACK_RATIO			2
323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_CCID			2
324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_SEND_ACK_VECTOR		1
325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* FIXME: for now we're default to 1 but it should really be 0 */
326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_SEND_NDP_COUNT		1
327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_NDP_LIMIT 0xFFFFFF
329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  * struct dccp_minisock - Minimal DCCP connection representation
332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  *
333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  * Will be used to pass the state from dccp_request_sock to dccp_sock.
334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  *
335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  * @dccpms_sequence_window - Sequence Window Feature (section 7.5.2)
336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  * @dccpms_ccid - Congestion Control Id (CCID) (section 10)
337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  * @dccpms_send_ack_vector - Send Ack Vector Feature (section 11.5)
338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  * @dccpms_send_ndp_count - Send NDP Count Feature (7.7.2)
339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  */
340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_minisock {
341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64			dccpms_sequence_window;
342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpms_rx_ccid;
343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpms_tx_ccid;
344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpms_send_ack_vector;
345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpms_send_ndp_count;
346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpms_ack_ratio;
347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head	dccpms_pending;
348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head	dccpms_conf;
349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_opt_conf {
352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			*dccpoc_val;
353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpoc_len;
354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_opt_pend {
357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head	dccpop_node;
358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpop_type;
359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpop_feat;
360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8		        *dccpop_val;
361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8			dccpop_len;
362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int			dccpop_conf;
363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct dccp_opt_conf    *dccpop_sc;
364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __dccp_minisock_init(struct dccp_minisock *dmsk);
367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dccp_minisock_init(struct dccp_minisock *dmsk);
368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dccp_parse_options(struct sock *sk, struct sk_buff *skb);
370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_request_sock {
372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct inet_request_sock dreq_inet_rsk;
373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64			 dreq_iss;
374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64			 dreq_isr;
375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be32			 dreq_service;
376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req)
379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_request_sock *)req;
381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct inet_timewait_death_row dccp_death_row;
384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_options_received {
386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32	dccpor_ndp; /* only 24 bits */
387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32	dccpor_timestamp;
388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32	dccpor_timestamp_echo;
389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32	dccpor_elapsed_time;
390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct ccid;
393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_role {
395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_ROLE_UNDEFINED,
396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_ROLE_LISTEN,
397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_ROLE_CLIENT,
398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	DCCP_ROLE_SERVER,
399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_service_list {
402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	dccpsl_nr;
403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be32	dccpsl_list[0];
404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int dccp_list_has_service(const struct dccp_service_list *sl,
409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					const __be32 service)
410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (likely(sl != NULL)) {
412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		u32 i = sl->dccpsl_nr;
413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		while (i--)
414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			if (sl->dccpsl_list[i] == service)
415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				return 1;
416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	}
417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return 0;
418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_ackvec;
421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_sock - DCCP socket state
424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_swl - sequence number window low
426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_swh - sequence number window high
427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_awl - acknowledgement number window low
428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_awh - acknowledgement number window high
429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_iss - initial sequence number sent
430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_isr - initial sequence number received
431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_osr - first OPEN sequence number received
432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_gss - greatest sequence number sent
433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_gsr - greatest valid sequence number received
434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_gar - greatest valid ack number received on a non-Sync; initialized to %dccps_iss
435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_timestamp_time - time of latest TIMESTAMP option
436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_timestamp_echo - latest timestamp received on a TIMESTAMP option
437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_packet_size - Set thru setsockopt
438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_role - Role of this sock, one of %dccp_role
439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_ndp_count - number of Non Data Packets since last data packet
440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_hc_rx_ackvec - rx half connection ack vector
441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_sock {
443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* inet_connection_sock has to be the first member of dccp_sock */
444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct inet_connection_sock	dccps_inet_connection;
445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_swl;
446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_swh;
447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_awl;
448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_awh;
449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_iss;
450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_isr;
451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_osr;
452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_gss;
453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_gsr;
454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u64				dccps_gar;
455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__be32				dccps_service;
456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct dccp_service_list	*dccps_service_list;
457c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct timeval			dccps_timestamp_time;
458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32				dccps_timestamp_echo;
459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32				dccps_packet_size;
460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u16				dccps_l_ack_ratio;
461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u16				dccps_r_ack_ratio;
462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long			dccps_ndp_count;
463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32				dccps_mss_cache;
464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct dccp_minisock		dccps_minisock;
465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct dccp_ackvec		*dccps_hc_rx_ackvec;
466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct ccid			*dccps_hc_rx_ccid;
467c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct ccid			*dccps_hc_tx_ccid;
468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct dccp_options_received	dccps_options_received;
469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct timeval			dccps_epoch;
470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	enum dccp_role			dccps_role:2;
471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8				dccps_hc_rx_insert_options:1;
472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8				dccps_hc_tx_insert_options:1;
473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_sock *dccp_sk(const struct sock *sk)
476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
477c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_sock *)sk;
478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_minisock *dccp_msk(const struct sock *sk)
481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct dccp_minisock *)&dccp_sk(sk)->dccps_minisock;
483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int dccp_service_not_initialized(const struct sock *sk)
486c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return dccp_sk(sk)->dccps_service == DCCP_SERVICE_INVALID_VALUE;
488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline const char *dccp_role(const struct sock *sk)
491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	switch (dccp_sk(sk)->dccps_role) {
493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	case DCCP_ROLE_UNDEFINED: return "undefined";
494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	case DCCP_ROLE_LISTEN:	  return "listen";
495c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	case DCCP_ROLE_SERVER:	  return "server";
496c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	case DCCP_ROLE_CLIENT:	  return "client";
497c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	}
498c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return NULL;
499c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
500c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
501c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */
502c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
503c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_DCCP_H */
504