aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorHarald Welte <laforge@netfilter.org>2005-08-09 23:26:03 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2005-08-29 18:54:18 -0400
commit5a47a470e602eecb168ddd3b78841b84ceddd319 (patch)
tree9b2408cd295189662f4909522a15d24101bf3fdc /include
parentbb435b8d816582064ee0ddb1e2a6fbca67f34108 (diff)
[DCCP]: make <linux/dccp.h> include-able from userspace
The protocol header files in <linux/foo.h> are usually structured in a way to be included by userspace code. The top section consists of general protocol structure definitions, typedefs, enums - followed by an #ifdef __KERNEL__ section. Currently <linux/dccp.h> doesn't follow that convention and can therefore not be used from userspace. However, for example iptables' libipt_dccp.c actually needs various definitions from there. Signed-off-by: Harald Welte <laforge@netfilter.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/linux/dccp.h238
1 files changed, 121 insertions, 117 deletions
diff --git a/include/linux/dccp.h b/include/linux/dccp.h
index e3b4bf7346bb..add4908b8e57 100644
--- a/include/linux/dccp.h
+++ b/include/linux/dccp.h
@@ -1,16 +1,8 @@
1#ifndef _LINUX_DCCP_H 1#ifndef _LINUX_DCCP_H
2#define _LINUX_DCCP_H 2#define _LINUX_DCCP_H
3 3
4#include <linux/in.h>
5#include <linux/list.h>
6#include <linux/types.h> 4#include <linux/types.h>
7#include <linux/uio.h> 5#include <asm/byteorder.h>
8#include <linux/workqueue.h>
9
10#include <net/inet_connection_sock.h>
11#include <net/sock.h>
12#include <net/tcp_states.h>
13#include <net/tcp.h>
14 6
15/* FIXME: this is utterly wrong */ 7/* FIXME: this is utterly wrong */
16struct sockaddr_dccp { 8struct sockaddr_dccp {
@@ -18,40 +10,6 @@ struct sockaddr_dccp {
18 unsigned int service; 10 unsigned int service;
19}; 11};
20 12
21enum dccp_state {
22 DCCP_OPEN = TCP_ESTABLISHED,
23 DCCP_REQUESTING = TCP_SYN_SENT,
24 DCCP_PARTOPEN = TCP_FIN_WAIT1, /* FIXME:
25 This mapping is horrible, but TCP has
26 no matching state for DCCP_PARTOPEN,
27 as TCP_SYN_RECV is already used by
28 DCCP_RESPOND, why don't stop using TCP
29 mapping of states? OK, now we don't use
30 sk_stream_sendmsg anymore, so doesn't
31 seem to exist any reason for us to
32 do the TCP mapping here */
33 DCCP_LISTEN = TCP_LISTEN,
34 DCCP_RESPOND = TCP_SYN_RECV,
35 DCCP_CLOSING = TCP_CLOSING,
36 DCCP_TIME_WAIT = TCP_TIME_WAIT,
37 DCCP_CLOSED = TCP_CLOSE,
38 DCCP_MAX_STATES = TCP_MAX_STATES,
39};
40
41#define DCCP_STATE_MASK 0xf
42#define DCCP_ACTION_FIN (1<<7)
43
44enum {
45 DCCPF_OPEN = TCPF_ESTABLISHED,
46 DCCPF_REQUESTING = TCPF_SYN_SENT,
47 DCCPF_PARTOPEN = TCPF_FIN_WAIT1,
48 DCCPF_LISTEN = TCPF_LISTEN,
49 DCCPF_RESPOND = TCPF_SYN_RECV,
50 DCCPF_CLOSING = TCPF_CLOSING,
51 DCCPF_TIME_WAIT = TCPF_TIME_WAIT,
52 DCCPF_CLOSED = TCPF_CLOSE,
53};
54
55/** 13/**
56 * struct dccp_hdr - generic part of DCCP packet header 14 * struct dccp_hdr - generic part of DCCP packet header
57 * 15 *
@@ -94,11 +52,6 @@ struct dccp_hdr {
94#endif 52#endif
95}; 53};
96 54
97static inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb)
98{
99 return (struct dccp_hdr *)skb->h.raw;
100}
101
102/** 55/**
103 * struct dccp_hdr_ext - the low bits of a 48 bit seq packet 56 * struct dccp_hdr_ext - the low bits of a 48 bit seq packet
104 * 57 *
@@ -108,34 +61,6 @@ struct dccp_hdr_ext {
108 __u32 dccph_seq_low; 61 __u32 dccph_seq_low;
109}; 62};
110 63
111static inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb)
112{
113 return (struct dccp_hdr_ext *)(skb->h.raw + sizeof(struct dccp_hdr));
114}
115
116static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
117{
118 const struct dccp_hdr *dh = dccp_hdr(skb);
119 return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0);
120}
121
122static inline __u64 dccp_hdr_seq(const struct sk_buff *skb)
123{
124 const struct dccp_hdr *dh = dccp_hdr(skb);
125#if defined(__LITTLE_ENDIAN_BITFIELD)
126 __u64 seq_nr = ntohl(dh->dccph_seq << 8);
127#elif defined(__BIG_ENDIAN_BITFIELD)
128 __u64 seq_nr = ntohl(dh->dccph_seq);
129#else
130#error "Adjust your <asm/byteorder.h> defines"
131#endif
132
133 if (dh->dccph_x != 0)
134 seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low);
135
136 return seq_nr;
137}
138
139/** 64/**
140 * struct dccp_hdr_request - Conection initiation request header 65 * struct dccp_hdr_request - Conection initiation request header
141 * 66 *
@@ -145,12 +70,6 @@ static inline __u64 dccp_hdr_seq(const struct sk_buff *skb)
145struct dccp_hdr_request { 70struct dccp_hdr_request {
146 __u32 dccph_req_service; 71 __u32 dccph_req_service;
147}; 72};
148
149static inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb)
150{
151 return (struct dccp_hdr_request *)(skb->h.raw + dccp_basic_hdr_len(skb));
152}
153
154/** 73/**
155 * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets 74 * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets
156 * 75 *
@@ -162,24 +81,6 @@ struct dccp_hdr_ack_bits {
162 dccph_ack_nr_high:24; 81 dccph_ack_nr_high:24;
163 __u32 dccph_ack_nr_low; 82 __u32 dccph_ack_nr_low;
164}; 83};
165
166static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb)
167{
168 return (struct dccp_hdr_ack_bits *)(skb->h.raw + dccp_basic_hdr_len(skb));
169}
170
171static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb)
172{
173 const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb);
174#if defined(__LITTLE_ENDIAN_BITFIELD)
175 return (((u64)ntohl(dhack->dccph_ack_nr_high << 8)) << 32) + ntohl(dhack->dccph_ack_nr_low);
176#elif defined(__BIG_ENDIAN_BITFIELD)
177 return (((u64)ntohl(dhack->dccph_ack_nr_high)) << 32) + ntohl(dhack->dccph_ack_nr_low);
178#else
179#error "Adjust your <asm/byteorder.h> defines"
180#endif
181}
182
183/** 84/**
184 * struct dccp_hdr_response - Conection initiation response header 85 * struct dccp_hdr_response - Conection initiation response header
185 * 86 *
@@ -193,11 +94,6 @@ struct dccp_hdr_response {
193 __u32 dccph_resp_service; 94 __u32 dccph_resp_service;
194}; 95};
195 96
196static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb)
197{
198 return (struct dccp_hdr_response *)(skb->h.raw + dccp_basic_hdr_len(skb));
199}
200
201/** 97/**
202 * struct dccp_hdr_reset - Unconditionally shut down a connection 98 * struct dccp_hdr_reset - Unconditionally shut down a connection
203 * 99 *
@@ -210,11 +106,6 @@ struct dccp_hdr_reset {
210 dccph_reset_data[3]; 106 dccph_reset_data[3];
211}; 107};
212 108
213static inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb)
214{
215 return (struct dccp_hdr_reset *)(skb->h.raw + dccp_basic_hdr_len(skb));
216}
217
218enum dccp_pkt_type { 109enum dccp_pkt_type {
219 DCCP_PKT_REQUEST = 0, 110 DCCP_PKT_REQUEST = 0,
220 DCCP_PKT_RESPONSE, 111 DCCP_PKT_RESPONSE,
@@ -248,13 +139,6 @@ static inline unsigned int dccp_packet_hdr_len(const __u8 type)
248 return sizeof(struct dccp_hdr_response); 139 return sizeof(struct dccp_hdr_response);
249 return sizeof(struct dccp_hdr_reset); 140 return sizeof(struct dccp_hdr_reset);
250} 141}
251
252static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
253{
254 return dccp_basic_hdr_len(skb) +
255 dccp_packet_hdr_len(dccp_hdr(skb)->dccph_type);
256}
257
258enum dccp_reset_codes { 142enum dccp_reset_codes {
259 DCCP_RESET_CODE_UNSPECIFIED = 0, 143 DCCP_RESET_CODE_UNSPECIFIED = 0,
260 DCCP_RESET_CODE_CLOSED, 144 DCCP_RESET_CODE_CLOSED,
@@ -298,6 +182,124 @@ enum {
298 DCCPF_MAX_CCID_SPECIFIC = 255, 182 DCCPF_MAX_CCID_SPECIFIC = 255,
299}; 183};
300 184
185#ifdef __KERNEL__
186
187#include <linux/in.h>
188#include <linux/list.h>
189#include <linux/uio.h>
190#include <linux/workqueue.h>
191
192#include <net/inet_connection_sock.h>
193#include <net/sock.h>
194#include <net/tcp_states.h>
195#include <net/tcp.h>
196
197enum dccp_state {
198 DCCP_OPEN = TCP_ESTABLISHED,
199 DCCP_REQUESTING = TCP_SYN_SENT,
200 DCCP_PARTOPEN = TCP_FIN_WAIT1, /* FIXME:
201 This mapping is horrible, but TCP has
202 no matching state for DCCP_PARTOPEN,
203 as TCP_SYN_RECV is already used by
204 DCCP_RESPOND, why don't stop using TCP
205 mapping of states? OK, now we don't use
206 sk_stream_sendmsg anymore, so doesn't
207 seem to exist any reason for us to
208 do the TCP mapping here */
209 DCCP_LISTEN = TCP_LISTEN,
210 DCCP_RESPOND = TCP_SYN_RECV,
211 DCCP_CLOSING = TCP_CLOSING,
212 DCCP_TIME_WAIT = TCP_TIME_WAIT,
213 DCCP_CLOSED = TCP_CLOSE,
214 DCCP_MAX_STATES = TCP_MAX_STATES,
215};
216
217#define DCCP_STATE_MASK 0xf
218#define DCCP_ACTION_FIN (1<<7)
219
220enum {
221 DCCPF_OPEN = TCPF_ESTABLISHED,
222 DCCPF_REQUESTING = TCPF_SYN_SENT,
223 DCCPF_PARTOPEN = TCPF_FIN_WAIT1,
224 DCCPF_LISTEN = TCPF_LISTEN,
225 DCCPF_RESPOND = TCPF_SYN_RECV,
226 DCCPF_CLOSING = TCPF_CLOSING,
227 DCCPF_TIME_WAIT = TCPF_TIME_WAIT,
228 DCCPF_CLOSED = TCPF_CLOSE,
229};
230
231static inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb)
232{
233 return (struct dccp_hdr *)skb->h.raw;
234}
235
236static inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb)
237{
238 return (struct dccp_hdr_ext *)(skb->h.raw + sizeof(struct dccp_hdr));
239}
240
241static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
242{
243 const struct dccp_hdr *dh = dccp_hdr(skb);
244 return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0);
245}
246
247static inline __u64 dccp_hdr_seq(const struct sk_buff *skb)
248{
249 const struct dccp_hdr *dh = dccp_hdr(skb);
250#if defined(__LITTLE_ENDIAN_BITFIELD)
251 __u64 seq_nr = ntohl(dh->dccph_seq << 8);
252#elif defined(__BIG_ENDIAN_BITFIELD)
253 __u64 seq_nr = ntohl(dh->dccph_seq);
254#else
255#error "Adjust your <asm/byteorder.h> defines"
256#endif
257
258 if (dh->dccph_x != 0)
259 seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low);
260
261 return seq_nr;
262}
263
264static inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb)
265{
266 return (struct dccp_hdr_request *)(skb->h.raw + dccp_basic_hdr_len(skb));
267}
268
269static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb)
270{
271 return (struct dccp_hdr_ack_bits *)(skb->h.raw + dccp_basic_hdr_len(skb));
272}
273
274static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb)
275{
276 const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb);
277#if defined(__LITTLE_ENDIAN_BITFIELD)
278 return (((u64)ntohl(dhack->dccph_ack_nr_high << 8)) << 32) + ntohl(dhack->dccph_ack_nr_low);
279#elif defined(__BIG_ENDIAN_BITFIELD)
280 return (((u64)ntohl(dhack->dccph_ack_nr_high)) << 32) + ntohl(dhack->dccph_ack_nr_low);
281#else
282#error "Adjust your <asm/byteorder.h> defines"
283#endif
284}
285
286static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb)
287{
288 return (struct dccp_hdr_response *)(skb->h.raw + dccp_basic_hdr_len(skb));
289}
290
291static inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb)
292{
293 return (struct dccp_hdr_reset *)(skb->h.raw + dccp_basic_hdr_len(skb));
294}
295
296static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
297{
298 return dccp_basic_hdr_len(skb) +
299 dccp_packet_hdr_len(dccp_hdr(skb)->dccph_type);
300}
301
302
301/* initial values for each feature */ 303/* initial values for each feature */
302#define DCCPF_INITIAL_SEQUENCE_WINDOW 100 304#define DCCPF_INITIAL_SEQUENCE_WINDOW 100
303/* FIXME: for now we're using CCID 3 (TFRC) */ 305/* FIXME: for now we're using CCID 3 (TFRC) */
@@ -429,4 +431,6 @@ static inline const char *dccp_role(const struct sock *sk)
429 return NULL; 431 return NULL;
430} 432}
431 433
434#endif /* __KERNEL__ */
435
432#endif /* _LINUX_DCCP_H */ 436#endif /* _LINUX_DCCP_H */