1#ifndef _CCID_H
2#define _CCID_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <net/sock.h>
17#include <linux/compiler.h>
18#include <linux/dccp.h>
19#include <linux/list.h>
20#include <linux/module.h>
21
22#define CCID_MAX 255
23
24struct tcp_info;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47struct ccid_operations {
48 unsigned char ccid_id;
49 __u32 ccid_ccmps;
50 const char *ccid_name;
51 struct module *ccid_owner;
52 struct kmem_cache *ccid_hc_rx_slab,
53 *ccid_hc_tx_slab;
54 __u32 ccid_hc_rx_obj_size,
55 ccid_hc_tx_obj_size;
56
57 int (*ccid_hc_rx_init)(struct ccid *ccid, struct sock *sk);
58 int (*ccid_hc_tx_init)(struct ccid *ccid, struct sock *sk);
59 void (*ccid_hc_rx_exit)(struct sock *sk);
60 void (*ccid_hc_tx_exit)(struct sock *sk);
61 void (*ccid_hc_rx_packet_recv)(struct sock *sk,
62 struct sk_buff *skb);
63 int (*ccid_hc_rx_parse_options)(struct sock *sk,
64 unsigned char option,
65 unsigned char len, u16 idx,
66 unsigned char* value);
67 int (*ccid_hc_rx_insert_options)(struct sock *sk,
68 struct sk_buff *skb);
69 void (*ccid_hc_tx_packet_recv)(struct sock *sk,
70 struct sk_buff *skb);
71 int (*ccid_hc_tx_parse_options)(struct sock *sk,
72 unsigned char option,
73 unsigned char len, u16 idx,
74 unsigned char* value);
75 int (*ccid_hc_tx_send_packet)(struct sock *sk,
76 struct sk_buff *skb);
77 void (*ccid_hc_tx_packet_sent)(struct sock *sk,
78 int more, unsigned int len);
79 void (*ccid_hc_rx_get_info)(struct sock *sk,
80 struct tcp_info *info);
81 void (*ccid_hc_tx_get_info)(struct sock *sk,
82 struct tcp_info *info);
83 int (*ccid_hc_rx_getsockopt)(struct sock *sk,
84 const int optname, int len,
85 u32 __user *optval,
86 int __user *optlen);
87 int (*ccid_hc_tx_getsockopt)(struct sock *sk,
88 const int optname, int len,
89 u32 __user *optval,
90 int __user *optlen);
91};
92
93extern int ccid_register(struct ccid_operations *ccid_ops);
94extern int ccid_unregister(struct ccid_operations *ccid_ops);
95
96struct ccid {
97 struct ccid_operations *ccid_ops;
98 char ccid_priv[0];
99};
100
101static inline void *ccid_priv(const struct ccid *ccid)
102{
103 return (void *)ccid->ccid_priv;
104}
105
106extern struct ccid *ccid_new(unsigned char id, struct sock *sk, int rx,
107 gfp_t gfp);
108
109extern struct ccid *ccid_hc_rx_new(unsigned char id, struct sock *sk,
110 gfp_t gfp);
111extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk,
112 gfp_t gfp);
113
114extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk);
115extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk);
116
117static inline int ccid_hc_tx_send_packet(struct ccid *ccid, struct sock *sk,
118 struct sk_buff *skb)
119{
120 int rc = 0;
121 if (ccid->ccid_ops->ccid_hc_tx_send_packet != NULL)
122 rc = ccid->ccid_ops->ccid_hc_tx_send_packet(sk, skb);
123 return rc;
124}
125
126static inline void ccid_hc_tx_packet_sent(struct ccid *ccid, struct sock *sk,
127 int more, unsigned int len)
128{
129 if (ccid->ccid_ops->ccid_hc_tx_packet_sent != NULL)
130 ccid->ccid_ops->ccid_hc_tx_packet_sent(sk, more, len);
131}
132
133static inline void ccid_hc_rx_packet_recv(struct ccid *ccid, struct sock *sk,
134 struct sk_buff *skb)
135{
136 if (ccid->ccid_ops->ccid_hc_rx_packet_recv != NULL)
137 ccid->ccid_ops->ccid_hc_rx_packet_recv(sk, skb);
138}
139
140static inline void ccid_hc_tx_packet_recv(struct ccid *ccid, struct sock *sk,
141 struct sk_buff *skb)
142{
143 if (ccid->ccid_ops->ccid_hc_tx_packet_recv != NULL)
144 ccid->ccid_ops->ccid_hc_tx_packet_recv(sk, skb);
145}
146
147static inline int ccid_hc_tx_parse_options(struct ccid *ccid, struct sock *sk,
148 unsigned char option,
149 unsigned char len, u16 idx,
150 unsigned char* value)
151{
152 int rc = 0;
153 if (ccid->ccid_ops->ccid_hc_tx_parse_options != NULL)
154 rc = ccid->ccid_ops->ccid_hc_tx_parse_options(sk, option, len, idx,
155 value);
156 return rc;
157}
158
159static inline int ccid_hc_rx_parse_options(struct ccid *ccid, struct sock *sk,
160 unsigned char option,
161 unsigned char len, u16 idx,
162 unsigned char* value)
163{
164 int rc = 0;
165 if (ccid->ccid_ops->ccid_hc_rx_parse_options != NULL)
166 rc = ccid->ccid_ops->ccid_hc_rx_parse_options(sk, option, len, idx, value);
167 return rc;
168}
169
170static inline int ccid_hc_rx_insert_options(struct ccid *ccid, struct sock *sk,
171 struct sk_buff *skb)
172{
173 if (ccid->ccid_ops->ccid_hc_rx_insert_options != NULL)
174 return ccid->ccid_ops->ccid_hc_rx_insert_options(sk, skb);
175 return 0;
176}
177
178static inline void ccid_hc_rx_get_info(struct ccid *ccid, struct sock *sk,
179 struct tcp_info *info)
180{
181 if (ccid->ccid_ops->ccid_hc_rx_get_info != NULL)
182 ccid->ccid_ops->ccid_hc_rx_get_info(sk, info);
183}
184
185static inline void ccid_hc_tx_get_info(struct ccid *ccid, struct sock *sk,
186 struct tcp_info *info)
187{
188 if (ccid->ccid_ops->ccid_hc_tx_get_info != NULL)
189 ccid->ccid_ops->ccid_hc_tx_get_info(sk, info);
190}
191
192static inline int ccid_hc_rx_getsockopt(struct ccid *ccid, struct sock *sk,
193 const int optname, int len,
194 u32 __user *optval, int __user *optlen)
195{
196 int rc = -ENOPROTOOPT;
197 if (ccid->ccid_ops->ccid_hc_rx_getsockopt != NULL)
198 rc = ccid->ccid_ops->ccid_hc_rx_getsockopt(sk, optname, len,
199 optval, optlen);
200 return rc;
201}
202
203static inline int ccid_hc_tx_getsockopt(struct ccid *ccid, struct sock *sk,
204 const int optname, int len,
205 u32 __user *optval, int __user *optlen)
206{
207 int rc = -ENOPROTOOPT;
208 if (ccid->ccid_ops->ccid_hc_tx_getsockopt != NULL)
209 rc = ccid->ccid_ops->ccid_hc_tx_getsockopt(sk, optname, len,
210 optval, optlen);
211 return rc;
212}
213#endif
214