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> 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 26struct ccid_operations { 27 unsigned char ccid_id; 28 const char *ccid_name; 29 struct module *ccid_owner; 30 struct kmem_cache *ccid_hc_rx_slab; 31 __u32 ccid_hc_rx_obj_size; 32 struct kmem_cache *ccid_hc_tx_slab; 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); 36 void (*ccid_hc_rx_exit)(struct sock *sk); 37 void (*ccid_hc_tx_exit)(struct sock *sk); 38 void (*ccid_hc_rx_packet_recv)(struct sock *sk, 39 struct sk_buff *skb); 40 int (*ccid_hc_rx_parse_options)(struct sock *sk, 41 unsigned char option, 42 unsigned char len, u16 idx, 43 unsigned char* value); 44 int (*ccid_hc_rx_insert_options)(struct sock *sk, 45 struct sk_buff *skb); 46 void (*ccid_hc_tx_packet_recv)(struct sock *sk, 47 struct sk_buff *skb); 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, 53 struct sk_buff *skb); 54 void (*ccid_hc_tx_packet_sent)(struct sock *sk, 55 int more, unsigned int len); 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); 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); 68}; 69 70extern int ccid_register(struct ccid_operations *ccid_ops); 71extern int ccid_unregister(struct ccid_operations *ccid_ops); 72 73struct ccid { 74 struct ccid_operations *ccid_ops; 75 char ccid_priv[0]; 76}; 77 78static inline void *ccid_priv(const struct ccid *ccid) 79{ 80 return (void *)ccid->ccid_priv; 81} 82 83extern struct ccid *ccid_new(unsigned char id, struct sock *sk, int rx, 84 gfp_t gfp); 85 86extern struct ccid *ccid_hc_rx_new(unsigned char id, struct sock *sk, 87 gfp_t gfp); 88extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk, 89 gfp_t gfp); 90 91extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk); 92extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk); 93 94static inline int ccid_hc_tx_send_packet(struct ccid *ccid, struct sock *sk, 95 struct sk_buff *skb) 96{ 97 int rc = 0; 98 if (ccid->ccid_ops->ccid_hc_tx_send_packet != NULL) 99 rc = ccid->ccid_ops->ccid_hc_tx_send_packet(sk, skb); 100 return rc; 101} 102 103static inline void ccid_hc_tx_packet_sent(struct ccid *ccid, struct sock *sk, 104 int more, unsigned int len) 105{ 106 if (ccid->ccid_ops->ccid_hc_tx_packet_sent != NULL) 107 ccid->ccid_ops->ccid_hc_tx_packet_sent(sk, more, len); 108} 109 110static inline void ccid_hc_rx_packet_recv(struct ccid *ccid, struct sock *sk, 111 struct sk_buff *skb) 112{ 113 if (ccid->ccid_ops->ccid_hc_rx_packet_recv != NULL) 114 ccid->ccid_ops->ccid_hc_rx_packet_recv(sk, skb); 115} 116 117static inline void ccid_hc_tx_packet_recv(struct ccid *ccid, struct sock *sk, 118 struct sk_buff *skb) 119{ 120 if (ccid->ccid_ops->ccid_hc_tx_packet_recv != NULL) 121 ccid->ccid_ops->ccid_hc_tx_packet_recv(sk, skb); 122} 123 124static 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; 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, 132 value); 133 return rc; 134} 135 136static 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; 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); 144 return rc; 145} 146 147static inline int ccid_hc_rx_insert_options(struct ccid *ccid, struct sock *sk, 148 struct sk_buff *skb) 149{ 150 if (ccid->ccid_ops->ccid_hc_rx_insert_options != NULL) 151 return ccid->ccid_ops->ccid_hc_rx_insert_options(sk, skb); 152 return 0; 153} 154 155static inline void ccid_hc_rx_get_info(struct ccid *ccid, struct sock *sk, 156 struct tcp_info *info) 157{ 158 if (ccid->ccid_ops->ccid_hc_rx_get_info != NULL) 159 ccid->ccid_ops->ccid_hc_rx_get_info(sk, info); 160} 161 162static inline void ccid_hc_tx_get_info(struct ccid *ccid, struct sock *sk, 163 struct tcp_info *info) 164{ 165 if (ccid->ccid_ops->ccid_hc_tx_get_info != NULL) 166 ccid->ccid_ops->ccid_hc_tx_get_info(sk, info); 167} 168 169static 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; 174 if (ccid->ccid_ops->ccid_hc_rx_getsockopt != NULL) 175 rc = ccid->ccid_ops->ccid_hc_rx_getsockopt(sk, optname, len, 176 optval, optlen); 177 return rc; 178} 179 180static 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; 185 if (ccid->ccid_ops->ccid_hc_tx_getsockopt != NULL) 186 rc = ccid->ccid_ops->ccid_hc_tx_getsockopt(sk, optname, len, 187 optval, optlen); 188 return rc; 189} 190#endif /* _CCID_H */ 191