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