Commit | Line | Data |
---|---|---|
7c657876 ACM |
1 | #ifndef _CCID_H |
2 | #define _CCID_H | |
3 | /* | |
4 | * net/dccp/ccid.h | |
5 | * | |
6 | * An implementation of the DCCP protocol | |
7 | * Arnaldo Carvalho de Melo <acme@conectiva.com.br> | |
8 | * | |
9 | * CCID infrastructure | |
10 | * | |
11 | * This program is free software; you can redistribute it and/or modify it | |
12 | * under the terms of the GNU General Public License version 2 as | |
13 | * published by the Free Software Foundation. | |
14 | */ | |
15 | ||
16 | #include <net/sock.h> | |
88f964db | 17 | #include <linux/compiler.h> |
7c657876 ACM |
18 | #include <linux/dccp.h> |
19 | #include <linux/list.h> | |
20 | #include <linux/module.h> | |
21 | ||
22 | #define CCID_MAX 255 | |
23 | ||
14c85021 ACM |
24 | struct tcp_info; |
25 | ||
91f0ebf7 | 26 | struct ccid_operations { |
7c657876 ACM |
27 | unsigned char ccid_id; |
28 | const char *ccid_name; | |
29 | struct module *ccid_owner; | |
e18b890b | 30 | struct kmem_cache *ccid_hc_rx_slab; |
91f0ebf7 | 31 | __u32 ccid_hc_rx_obj_size; |
e18b890b | 32 | struct kmem_cache *ccid_hc_tx_slab; |
91f0ebf7 ACM |
33 | __u32 ccid_hc_tx_obj_size; |
34 | int (*ccid_hc_rx_init)(struct ccid *ccid, struct sock *sk); | |
35 | int (*ccid_hc_tx_init)(struct ccid *ccid, struct sock *sk); | |
7c657876 ACM |
36 | void (*ccid_hc_rx_exit)(struct sock *sk); |
37 | void (*ccid_hc_tx_exit)(struct sock *sk); | |
7690af3f ACM |
38 | void (*ccid_hc_rx_packet_recv)(struct sock *sk, |
39 | struct sk_buff *skb); | |
7c657876 ACM |
40 | int (*ccid_hc_rx_parse_options)(struct sock *sk, |
41 | unsigned char option, | |
42 | unsigned char len, u16 idx, | |
43 | unsigned char* value); | |
2d0817d1 | 44 | int (*ccid_hc_rx_insert_options)(struct sock *sk, |
7690af3f | 45 | struct sk_buff *skb); |
7690af3f ACM |
46 | void (*ccid_hc_tx_packet_recv)(struct sock *sk, |
47 | struct sk_buff *skb); | |
7c657876 ACM |
48 | int (*ccid_hc_tx_parse_options)(struct sock *sk, |
49 | unsigned char option, | |
50 | unsigned char len, u16 idx, | |
51 | unsigned char* value); | |
52 | int (*ccid_hc_tx_send_packet)(struct sock *sk, | |
6b57c93d GR |
53 | struct sk_buff *skb); |
54 | void (*ccid_hc_tx_packet_sent)(struct sock *sk, | |
55 | int more, unsigned int len); | |
2babe1f6 ACM |
56 | void (*ccid_hc_rx_get_info)(struct sock *sk, |
57 | struct tcp_info *info); | |
58 | void (*ccid_hc_tx_get_info)(struct sock *sk, | |
59 | struct tcp_info *info); | |
88f964db ACM |
60 | int (*ccid_hc_rx_getsockopt)(struct sock *sk, |
61 | const int optname, int len, | |
62 | u32 __user *optval, | |
63 | int __user *optlen); | |
64 | int (*ccid_hc_tx_getsockopt)(struct sock *sk, | |
65 | const int optname, int len, | |
66 | u32 __user *optval, | |
67 | int __user *optlen); | |
7c657876 ACM |
68 | }; |
69 | ||
91f0ebf7 ACM |
70 | extern int ccid_register(struct ccid_operations *ccid_ops); |
71 | extern int ccid_unregister(struct ccid_operations *ccid_ops); | |
7c657876 | 72 | |
91f0ebf7 ACM |
73 | struct ccid { |
74 | struct ccid_operations *ccid_ops; | |
75 | char ccid_priv[0]; | |
76 | }; | |
7c657876 | 77 | |
91f0ebf7 | 78 | static inline void *ccid_priv(const struct ccid *ccid) |
7c657876 | 79 | { |
91f0ebf7 | 80 | return (void *)ccid->ccid_priv; |
7c657876 ACM |
81 | } |
82 | ||
91f0ebf7 ACM |
83 | extern struct ccid *ccid_new(unsigned char id, struct sock *sk, int rx, |
84 | gfp_t gfp); | |
85 | ||
86 | extern struct ccid *ccid_hc_rx_new(unsigned char id, struct sock *sk, | |
87 | gfp_t gfp); | |
88 | extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk, | |
89 | gfp_t gfp); | |
90 | ||
91 | extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk); | |
92 | extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk); | |
93 | ||
7c657876 | 94 | static inline int ccid_hc_tx_send_packet(struct ccid *ccid, struct sock *sk, |
6b57c93d | 95 | struct sk_buff *skb) |
7c657876 ACM |
96 | { |
97 | int rc = 0; | |
91f0ebf7 | 98 | if (ccid->ccid_ops->ccid_hc_tx_send_packet != NULL) |
6b57c93d | 99 | rc = ccid->ccid_ops->ccid_hc_tx_send_packet(sk, skb); |
7c657876 ACM |
100 | return rc; |
101 | } | |
102 | ||
103 | static inline void ccid_hc_tx_packet_sent(struct ccid *ccid, struct sock *sk, | |
6b57c93d | 104 | int more, unsigned int len) |
7c657876 | 105 | { |
91f0ebf7 ACM |
106 | if (ccid->ccid_ops->ccid_hc_tx_packet_sent != NULL) |
107 | ccid->ccid_ops->ccid_hc_tx_packet_sent(sk, more, len); | |
7c657876 ACM |
108 | } |
109 | ||
110 | static inline void ccid_hc_rx_packet_recv(struct ccid *ccid, struct sock *sk, | |
111 | struct sk_buff *skb) | |
112 | { | |
91f0ebf7 ACM |
113 | if (ccid->ccid_ops->ccid_hc_rx_packet_recv != NULL) |
114 | ccid->ccid_ops->ccid_hc_rx_packet_recv(sk, skb); | |
7c657876 ACM |
115 | } |
116 | ||
117 | static inline void ccid_hc_tx_packet_recv(struct ccid *ccid, struct sock *sk, | |
118 | struct sk_buff *skb) | |
119 | { | |
91f0ebf7 ACM |
120 | if (ccid->ccid_ops->ccid_hc_tx_packet_recv != NULL) |
121 | ccid->ccid_ops->ccid_hc_tx_packet_recv(sk, skb); | |
7c657876 ACM |
122 | } |
123 | ||
124 | static inline int ccid_hc_tx_parse_options(struct ccid *ccid, struct sock *sk, | |
125 | unsigned char option, | |
126 | unsigned char len, u16 idx, | |
127 | unsigned char* value) | |
128 | { | |
129 | int rc = 0; | |
91f0ebf7 ACM |
130 | if (ccid->ccid_ops->ccid_hc_tx_parse_options != NULL) |
131 | rc = ccid->ccid_ops->ccid_hc_tx_parse_options(sk, option, len, idx, | |
7690af3f | 132 | value); |
7c657876 ACM |
133 | return rc; |
134 | } | |
135 | ||
136 | static inline int ccid_hc_rx_parse_options(struct ccid *ccid, struct sock *sk, | |
137 | unsigned char option, | |
138 | unsigned char len, u16 idx, | |
139 | unsigned char* value) | |
140 | { | |
141 | int rc = 0; | |
91f0ebf7 ACM |
142 | if (ccid->ccid_ops->ccid_hc_rx_parse_options != NULL) |
143 | rc = ccid->ccid_ops->ccid_hc_rx_parse_options(sk, option, len, idx, value); | |
7c657876 ACM |
144 | return rc; |
145 | } | |
146 | ||
2d0817d1 ACM |
147 | static inline int ccid_hc_rx_insert_options(struct ccid *ccid, struct sock *sk, |
148 | struct sk_buff *skb) | |
7c657876 | 149 | { |
91f0ebf7 | 150 | if (ccid->ccid_ops->ccid_hc_rx_insert_options != NULL) |
2d0817d1 ACM |
151 | return ccid->ccid_ops->ccid_hc_rx_insert_options(sk, skb); |
152 | return 0; | |
7c657876 | 153 | } |
2babe1f6 ACM |
154 | |
155 | static inline void ccid_hc_rx_get_info(struct ccid *ccid, struct sock *sk, | |
156 | struct tcp_info *info) | |
157 | { | |
91f0ebf7 ACM |
158 | if (ccid->ccid_ops->ccid_hc_rx_get_info != NULL) |
159 | ccid->ccid_ops->ccid_hc_rx_get_info(sk, info); | |
2babe1f6 ACM |
160 | } |
161 | ||
162 | static inline void ccid_hc_tx_get_info(struct ccid *ccid, struct sock *sk, | |
163 | struct tcp_info *info) | |
164 | { | |
91f0ebf7 ACM |
165 | if (ccid->ccid_ops->ccid_hc_tx_get_info != NULL) |
166 | ccid->ccid_ops->ccid_hc_tx_get_info(sk, info); | |
2babe1f6 | 167 | } |
88f964db ACM |
168 | |
169 | static inline int ccid_hc_rx_getsockopt(struct ccid *ccid, struct sock *sk, | |
170 | const int optname, int len, | |
171 | u32 __user *optval, int __user *optlen) | |
172 | { | |
173 | int rc = -ENOPROTOOPT; | |
91f0ebf7 ACM |
174 | if (ccid->ccid_ops->ccid_hc_rx_getsockopt != NULL) |
175 | rc = ccid->ccid_ops->ccid_hc_rx_getsockopt(sk, optname, len, | |
88f964db ACM |
176 | optval, optlen); |
177 | return rc; | |
178 | } | |
179 | ||
180 | static inline int ccid_hc_tx_getsockopt(struct ccid *ccid, struct sock *sk, | |
181 | const int optname, int len, | |
182 | u32 __user *optval, int __user *optlen) | |
183 | { | |
184 | int rc = -ENOPROTOOPT; | |
91f0ebf7 ACM |
185 | if (ccid->ccid_ops->ccid_hc_tx_getsockopt != NULL) |
186 | rc = ccid->ccid_ops->ccid_hc_tx_getsockopt(sk, optname, len, | |
88f964db ACM |
187 | optval, optlen); |
188 | return rc; | |
189 | } | |
7c657876 | 190 | #endif /* _CCID_H */ |