linux/net/dccp/ccid.h
<<
>>
Prefs
   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
  26/**
  27 *  struct ccid_operations  -  Interface to Congestion-Control Infrastructure
  28 *
  29 *  @ccid_id: numerical CCID ID (up to %CCID_MAX, cf. table 5 in RFC 4340, 10.)
  30 *  @ccid_ccmps: the CCMPS including network/transport headers (0 when disabled)
  31 *  @ccid_name: alphabetical identifier string for @ccid_id
  32 *  @ccid_hc_{r,t}x_slab: memory pool for the receiver/sender half-connection
  33 *  @ccid_hc_{r,t}x_obj_size: size of the receiver/sender half-connection socket
  34 *
  35 *  @ccid_hc_{r,t}x_init: CCID-specific initialisation routine (before startup)
  36 *  @ccid_hc_{r,t}x_exit: CCID-specific cleanup routine (before destruction)
  37 *  @ccid_hc_rx_packet_recv: implements the HC-receiver side
  38 *  @ccid_hc_{r,t}x_parse_options: parsing routine for CCID/HC-specific options
  39 *  @ccid_hc_{r,t}x_insert_options: insert routine for CCID/HC-specific options
  40 *  @ccid_hc_tx_packet_recv: implements feedback processing for the HC-sender
  41 *  @ccid_hc_tx_send_packet: implements the sending part of the HC-sender
  42 *  @ccid_hc_tx_packet_sent: does accounting for packets in flight by HC-sender
  43 *  @ccid_hc_{r,t}x_get_info: INET_DIAG information for HC-receiver/sender
  44 *  @ccid_hc_{r,t}x_getsockopt: socket options specific to HC-receiver/sender
  45 */
  46struct ccid_operations {
  47        unsigned char           ccid_id;
  48        __u32                   ccid_ccmps;
  49        const char              *ccid_name;
  50        struct kmem_cache       *ccid_hc_rx_slab,
  51                                *ccid_hc_tx_slab;
  52        __u32                   ccid_hc_rx_obj_size,
  53                                ccid_hc_tx_obj_size;
  54        /* Interface Routines */
  55        int             (*ccid_hc_rx_init)(struct ccid *ccid, struct sock *sk);
  56        int             (*ccid_hc_tx_init)(struct ccid *ccid, struct sock *sk);
  57        void            (*ccid_hc_rx_exit)(struct sock *sk);
  58        void            (*ccid_hc_tx_exit)(struct sock *sk);
  59        void            (*ccid_hc_rx_packet_recv)(struct sock *sk,
  60                                                  struct sk_buff *skb);
  61        int             (*ccid_hc_rx_parse_options)(struct sock *sk,
  62                                                    unsigned char option,
  63                                                    unsigned char len, u16 idx,
  64                                                    unsigned char* value);
  65        int             (*ccid_hc_rx_insert_options)(struct sock *sk,
  66                                                     struct sk_buff *skb);
  67        void            (*ccid_hc_tx_packet_recv)(struct sock *sk,
  68                                                  struct sk_buff *skb);
  69        int             (*ccid_hc_tx_parse_options)(struct sock *sk,
  70                                                    unsigned char option,
  71                                                    unsigned char len, u16 idx,
  72                                                    unsigned char* value);
  73        int             (*ccid_hc_tx_send_packet)(struct sock *sk,
  74                                                  struct sk_buff *skb);
  75        void            (*ccid_hc_tx_packet_sent)(struct sock *sk,
  76                                                  int more, unsigned int len);
  77        void            (*ccid_hc_rx_get_info)(struct sock *sk,
  78                                               struct tcp_info *info);
  79        void            (*ccid_hc_tx_get_info)(struct sock *sk,
  80                                               struct tcp_info *info);
  81        int             (*ccid_hc_rx_getsockopt)(struct sock *sk,
  82                                                 const int optname, int len,
  83                                                 u32 __user *optval,
  84                                                 int __user *optlen);
  85        int             (*ccid_hc_tx_getsockopt)(struct sock *sk,
  86                                                 const int optname, int len,
  87                                                 u32 __user *optval,
  88                                                 int __user *optlen);
  89};
  90
  91extern struct ccid_operations ccid2_ops;
  92#ifdef CONFIG_IP_DCCP_CCID3
  93extern struct ccid_operations ccid3_ops;
  94#endif
  95
  96extern int  ccid_initialize_builtins(void);
  97extern void ccid_cleanup_builtins(void);
  98
  99struct ccid {
 100        struct ccid_operations *ccid_ops;
 101        char                   ccid_priv[0];
 102};
 103
 104static inline void *ccid_priv(const struct ccid *ccid)
 105{
 106        return (void *)ccid->ccid_priv;
 107}
 108
 109extern bool ccid_support_check(u8 const *ccid_array, u8 array_len);
 110extern int  ccid_get_builtin_ccids(u8 **ccid_array, u8 *array_len);
 111extern int  ccid_getsockopt_builtin_ccids(struct sock *sk, int len,
 112                                          char __user *, int __user *);
 113
 114extern struct ccid *ccid_new(const u8 id, struct sock *sk, bool rx);
 115
 116static inline int ccid_get_current_rx_ccid(struct dccp_sock *dp)
 117{
 118        struct ccid *ccid = dp->dccps_hc_rx_ccid;
 119
 120        if (ccid == NULL || ccid->ccid_ops == NULL)
 121                return -1;
 122        return ccid->ccid_ops->ccid_id;
 123}
 124
 125static inline int ccid_get_current_tx_ccid(struct dccp_sock *dp)
 126{
 127        struct ccid *ccid = dp->dccps_hc_tx_ccid;
 128
 129        if (ccid == NULL || ccid->ccid_ops == NULL)
 130                return -1;
 131        return ccid->ccid_ops->ccid_id;
 132}
 133
 134extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk);
 135extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk);
 136
 137static inline int ccid_hc_tx_send_packet(struct ccid *ccid, struct sock *sk,
 138                                         struct sk_buff *skb)
 139{
 140        int rc = 0;
 141        if (ccid->ccid_ops->ccid_hc_tx_send_packet != NULL)
 142                rc = ccid->ccid_ops->ccid_hc_tx_send_packet(sk, skb);
 143        return rc;
 144}
 145
 146static inline void ccid_hc_tx_packet_sent(struct ccid *ccid, struct sock *sk,
 147                                          int more, unsigned int len)
 148{
 149        if (ccid->ccid_ops->ccid_hc_tx_packet_sent != NULL)
 150                ccid->ccid_ops->ccid_hc_tx_packet_sent(sk, more, len);
 151}
 152
 153static inline void ccid_hc_rx_packet_recv(struct ccid *ccid, struct sock *sk,
 154                                          struct sk_buff *skb)
 155{
 156        if (ccid->ccid_ops->ccid_hc_rx_packet_recv != NULL)
 157                ccid->ccid_ops->ccid_hc_rx_packet_recv(sk, skb);
 158}
 159
 160static inline void ccid_hc_tx_packet_recv(struct ccid *ccid, struct sock *sk,
 161                                          struct sk_buff *skb)
 162{
 163        if (ccid->ccid_ops->ccid_hc_tx_packet_recv != NULL)
 164                ccid->ccid_ops->ccid_hc_tx_packet_recv(sk, skb);
 165}
 166
 167static inline int ccid_hc_tx_parse_options(struct ccid *ccid, struct sock *sk,
 168                                           unsigned char option,
 169                                           unsigned char len, u16 idx,
 170                                           unsigned char* value)
 171{
 172        int rc = 0;
 173        if (ccid->ccid_ops->ccid_hc_tx_parse_options != NULL)
 174                rc = ccid->ccid_ops->ccid_hc_tx_parse_options(sk, option, len, idx,
 175                                                    value);
 176        return rc;
 177}
 178
 179static inline int ccid_hc_rx_parse_options(struct ccid *ccid, struct sock *sk,
 180                                           unsigned char option,
 181                                           unsigned char len, u16 idx,
 182                                           unsigned char* value)
 183{
 184        int rc = 0;
 185        if (ccid->ccid_ops->ccid_hc_rx_parse_options != NULL)
 186                rc = ccid->ccid_ops->ccid_hc_rx_parse_options(sk, option, len, idx, value);
 187        return rc;
 188}
 189
 190static inline int ccid_hc_rx_insert_options(struct ccid *ccid, struct sock *sk,
 191                                            struct sk_buff *skb)
 192{
 193        if (ccid->ccid_ops->ccid_hc_rx_insert_options != NULL)
 194                return ccid->ccid_ops->ccid_hc_rx_insert_options(sk, skb);
 195        return 0;
 196}
 197
 198static inline void ccid_hc_rx_get_info(struct ccid *ccid, struct sock *sk,
 199                                       struct tcp_info *info)
 200{
 201        if (ccid->ccid_ops->ccid_hc_rx_get_info != NULL)
 202                ccid->ccid_ops->ccid_hc_rx_get_info(sk, info);
 203}
 204
 205static inline void ccid_hc_tx_get_info(struct ccid *ccid, struct sock *sk,
 206                                       struct tcp_info *info)
 207{
 208        if (ccid->ccid_ops->ccid_hc_tx_get_info != NULL)
 209                ccid->ccid_ops->ccid_hc_tx_get_info(sk, info);
 210}
 211
 212static inline int ccid_hc_rx_getsockopt(struct ccid *ccid, struct sock *sk,
 213                                        const int optname, int len,
 214                                        u32 __user *optval, int __user *optlen)
 215{
 216        int rc = -ENOPROTOOPT;
 217        if (ccid->ccid_ops->ccid_hc_rx_getsockopt != NULL)
 218                rc = ccid->ccid_ops->ccid_hc_rx_getsockopt(sk, optname, len,
 219                                                 optval, optlen);
 220        return rc;
 221}
 222
 223static inline int ccid_hc_tx_getsockopt(struct ccid *ccid, struct sock *sk,
 224                                        const int optname, int len,
 225                                        u32 __user *optval, int __user *optlen)
 226{
 227        int rc = -ENOPROTOOPT;
 228        if (ccid->ccid_ops->ccid_hc_tx_getsockopt != NULL)
 229                rc = ccid->ccid_ops->ccid_hc_tx_getsockopt(sk, optname, len,
 230                                                 optval, optlen);
 231        return rc;
 232}
 233#endif /* _CCID_H */
 234
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.