This source file includes following definitions.
- dccp_zeroed_hdr
 
- dccp_hdrx
 
- __dccp_basic_hdr_len
 
- dccp_basic_hdr_len
 
- dccp_hdr_seq
 
- dccp_hdr_ack_seq
 
- __dccp_hdr_len
 
- dccp_hdr_len
 
- dccp_rsk
 
- dccp_list_has_service
 
- dccp_sk
 
- dccp_role
 
   1 
   2 #ifndef _LINUX_DCCP_H
   3 #define _LINUX_DCCP_H
   4 
   5 
   6 #include <linux/in.h>
   7 #include <linux/interrupt.h>
   8 #include <linux/ktime.h>
   9 #include <linux/list.h>
  10 #include <linux/uio.h>
  11 #include <linux/workqueue.h>
  12 
  13 #include <net/inet_connection_sock.h>
  14 #include <net/inet_sock.h>
  15 #include <net/inet_timewait_sock.h>
  16 #include <net/tcp_states.h>
  17 #include <uapi/linux/dccp.h>
  18 
  19 enum dccp_state {
  20         DCCP_OPEN            = TCP_ESTABLISHED,
  21         DCCP_REQUESTING      = TCP_SYN_SENT,
  22         DCCP_LISTEN          = TCP_LISTEN,
  23         DCCP_RESPOND         = TCP_SYN_RECV,
  24         
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42         DCCP_ACTIVE_CLOSEREQ = TCP_FIN_WAIT1,
  43         DCCP_PASSIVE_CLOSE   = TCP_CLOSE_WAIT,  
  44         DCCP_CLOSING         = TCP_CLOSING,
  45         DCCP_TIME_WAIT       = TCP_TIME_WAIT,
  46         DCCP_CLOSED          = TCP_CLOSE,
  47         DCCP_NEW_SYN_RECV    = TCP_NEW_SYN_RECV,
  48         DCCP_PARTOPEN        = TCP_MAX_STATES,
  49         DCCP_PASSIVE_CLOSEREQ,                  
  50         DCCP_MAX_STATES
  51 };
  52 
  53 enum {
  54         DCCPF_OPEN            = TCPF_ESTABLISHED,
  55         DCCPF_REQUESTING      = TCPF_SYN_SENT,
  56         DCCPF_LISTEN          = TCPF_LISTEN,
  57         DCCPF_RESPOND         = TCPF_SYN_RECV,
  58         DCCPF_ACTIVE_CLOSEREQ = TCPF_FIN_WAIT1,
  59         DCCPF_CLOSING         = TCPF_CLOSING,
  60         DCCPF_TIME_WAIT       = TCPF_TIME_WAIT,
  61         DCCPF_CLOSED          = TCPF_CLOSE,
  62         DCCPF_NEW_SYN_RECV    = TCPF_NEW_SYN_RECV,
  63         DCCPF_PARTOPEN        = (1 << DCCP_PARTOPEN),
  64 };
  65 
  66 static inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb)
  67 {
  68         return (struct dccp_hdr *)skb_transport_header(skb);
  69 }
  70 
  71 static inline struct dccp_hdr *dccp_zeroed_hdr(struct sk_buff *skb, int headlen)
  72 {
  73         skb_push(skb, headlen);
  74         skb_reset_transport_header(skb);
  75         return memset(skb_transport_header(skb), 0, headlen);
  76 }
  77 
  78 static inline struct dccp_hdr_ext *dccp_hdrx(const struct dccp_hdr *dh)
  79 {
  80         return (struct dccp_hdr_ext *)((unsigned char *)dh + sizeof(*dh));
  81 }
  82 
  83 static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh)
  84 {
  85         return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0);
  86 }
  87 
  88 static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
  89 {
  90         const struct dccp_hdr *dh = dccp_hdr(skb);
  91         return __dccp_basic_hdr_len(dh);
  92 }
  93 
  94 static inline __u64 dccp_hdr_seq(const struct dccp_hdr *dh)
  95 {
  96         __u64 seq_nr =  ntohs(dh->dccph_seq);
  97 
  98         if (dh->dccph_x != 0)
  99                 seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(dh)->dccph_seq_low);
 100         else
 101                 seq_nr += (u32)dh->dccph_seq2 << 16;
 102 
 103         return seq_nr;
 104 }
 105 
 106 static inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb)
 107 {
 108         return (struct dccp_hdr_request *)(skb_transport_header(skb) +
 109                                            dccp_basic_hdr_len(skb));
 110 }
 111 
 112 static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb)
 113 {
 114         return (struct dccp_hdr_ack_bits *)(skb_transport_header(skb) +
 115                                             dccp_basic_hdr_len(skb));
 116 }
 117 
 118 static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb)
 119 {
 120         const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb);
 121         return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) + ntohl(dhack->dccph_ack_nr_low);
 122 }
 123 
 124 static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb)
 125 {
 126         return (struct dccp_hdr_response *)(skb_transport_header(skb) +
 127                                             dccp_basic_hdr_len(skb));
 128 }
 129 
 130 static inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb)
 131 {
 132         return (struct dccp_hdr_reset *)(skb_transport_header(skb) +
 133                                          dccp_basic_hdr_len(skb));
 134 }
 135 
 136 static inline unsigned int __dccp_hdr_len(const struct dccp_hdr *dh)
 137 {
 138         return __dccp_basic_hdr_len(dh) +
 139                dccp_packet_hdr_len(dh->dccph_type);
 140 }
 141 
 142 static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
 143 {
 144         return __dccp_hdr_len(dccp_hdr(skb));
 145 }
 146 
 147 
 148 
 149 
 150 
 151 
 152 
 153 
 154 
 155 
 156 
 157 
 158 
 159 
 160 struct dccp_request_sock {
 161         struct inet_request_sock dreq_inet_rsk;
 162         __u64                    dreq_iss;
 163         __u64                    dreq_gss;
 164         __u64                    dreq_isr;
 165         __u64                    dreq_gsr;
 166         __be32                   dreq_service;
 167         spinlock_t               dreq_lock;
 168         struct list_head         dreq_featneg;
 169         __u32                    dreq_timestamp_echo;
 170         __u32                    dreq_timestamp_time;
 171 };
 172 
 173 static inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req)
 174 {
 175         return (struct dccp_request_sock *)req;
 176 }
 177 
 178 extern struct inet_timewait_death_row dccp_death_row;
 179 
 180 extern int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
 181                               struct sk_buff *skb);
 182 
 183 struct dccp_options_received {
 184         u64     dccpor_ndp:48;
 185         u32     dccpor_timestamp;
 186         u32     dccpor_timestamp_echo;
 187         u32     dccpor_elapsed_time;
 188 };
 189 
 190 struct ccid;
 191 
 192 enum dccp_role {
 193         DCCP_ROLE_UNDEFINED,
 194         DCCP_ROLE_LISTEN,
 195         DCCP_ROLE_CLIENT,
 196         DCCP_ROLE_SERVER,
 197 };
 198 
 199 struct dccp_service_list {
 200         __u32   dccpsl_nr;
 201         __be32  dccpsl_list[0];
 202 };
 203 
 204 #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
 205 #define DCCP_SERVICE_CODE_IS_ABSENT             0
 206 
 207 static inline bool dccp_list_has_service(const struct dccp_service_list *sl,
 208                                         const __be32 service)
 209 {
 210         if (likely(sl != NULL)) {
 211                 u32 i = sl->dccpsl_nr;
 212                 while (i--)
 213                         if (sl->dccpsl_list[i] == service)
 214                                 return true;
 215         }
 216         return false;
 217 }
 218 
 219 struct dccp_ackvec;
 220 
 221 
 222 
 223 
 224 
 225 
 226 
 227 
 228 
 229 
 230 
 231 
 232 
 233 
 234 
 235 
 236 
 237 
 238 
 239 
 240 
 241 
 242 
 243 
 244 
 245 
 246 
 247 
 248 
 249 
 250 
 251 
 252 
 253 
 254 
 255 
 256 
 257 
 258 
 259 
 260 
 261 
 262 
 263 
 264 struct dccp_sock {
 265         
 266         struct inet_connection_sock     dccps_inet_connection;
 267 #define dccps_syn_rtt                   dccps_inet_connection.icsk_ack.lrcvtime
 268         __u64                           dccps_swl;
 269         __u64                           dccps_swh;
 270         __u64                           dccps_awl;
 271         __u64                           dccps_awh;
 272         __u64                           dccps_iss;
 273         __u64                           dccps_isr;
 274         __u64                           dccps_osr;
 275         __u64                           dccps_gss;
 276         __u64                           dccps_gsr;
 277         __u64                           dccps_gar;
 278         __be32                          dccps_service;
 279         __u32                           dccps_mss_cache;
 280         struct dccp_service_list        *dccps_service_list;
 281         __u32                           dccps_timestamp_echo;
 282         __u32                           dccps_timestamp_time;
 283         __u16                           dccps_l_ack_ratio;
 284         __u16                           dccps_r_ack_ratio;
 285         __u64                           dccps_l_seq_win:48;
 286         __u64                           dccps_r_seq_win:48;
 287         __u8                            dccps_pcslen:4;
 288         __u8                            dccps_pcrlen:4;
 289         __u8                            dccps_send_ndp_count:1;
 290         __u64                           dccps_ndp_count:48;
 291         unsigned long                   dccps_rate_last;
 292         struct list_head                dccps_featneg;
 293         struct dccp_ackvec              *dccps_hc_rx_ackvec;
 294         struct ccid                     *dccps_hc_rx_ccid;
 295         struct ccid                     *dccps_hc_tx_ccid;
 296         struct dccp_options_received    dccps_options_received;
 297         __u8                            dccps_qpolicy;
 298         __u32                           dccps_tx_qlen;
 299         enum dccp_role                  dccps_role:2;
 300         __u8                            dccps_hc_rx_insert_options:1;
 301         __u8                            dccps_hc_tx_insert_options:1;
 302         __u8                            dccps_server_timewait:1;
 303         __u8                            dccps_sync_scheduled:1;
 304         struct tasklet_struct           dccps_xmitlet;
 305         struct timer_list               dccps_xmit_timer;
 306 };
 307 
 308 static inline struct dccp_sock *dccp_sk(const struct sock *sk)
 309 {
 310         return (struct dccp_sock *)sk;
 311 }
 312 
 313 static inline const char *dccp_role(const struct sock *sk)
 314 {
 315         switch (dccp_sk(sk)->dccps_role) {
 316         case DCCP_ROLE_UNDEFINED: return "undefined";
 317         case DCCP_ROLE_LISTEN:    return "listen";
 318         case DCCP_ROLE_SERVER:    return "server";
 319         case DCCP_ROLE_CLIENT:    return "client";
 320         }
 321         return NULL;
 322 }
 323 
 324 extern void dccp_syn_ack_timeout(const struct request_sock *req);
 325 
 326 #endif