linux/net/dccp/ackvec.h
<<
>>
Prefs
   1#ifndef _ACKVEC_H
   2#define _ACKVEC_H
   3/*
   4 *  net/dccp/ackvec.h
   5 *
   6 *  An implementation of the DCCP protocol
   7 *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@mandriva.com>
   8 *
   9 *      This program is free software; you can redistribute it and/or modify it
  10 *      under the terms of the GNU General Public License version 2 as
  11 *      published by the Free Software Foundation.
  12 */
  13
  14#include <linux/compiler.h>
  15#include <linux/ktime.h>
  16#include <linux/list.h>
  17#include <linux/types.h>
  18
  19/* Read about the ECN nonce to see why it is 253 */
  20#define DCCP_MAX_ACKVEC_OPT_LEN 253
  21/* We can spread an ack vector across multiple options */
  22#define DCCP_MAX_ACKVEC_LEN (DCCP_MAX_ACKVEC_OPT_LEN * 2)
  23
  24#define DCCP_ACKVEC_STATE_RECEIVED      0
  25#define DCCP_ACKVEC_STATE_ECN_MARKED    (1 << 6)
  26#define DCCP_ACKVEC_STATE_NOT_RECEIVED  (3 << 6)
  27
  28#define DCCP_ACKVEC_STATE_MASK          0xC0 /* 11000000 */
  29#define DCCP_ACKVEC_LEN_MASK            0x3F /* 00111111 */
  30
  31/** struct dccp_ackvec - ack vector
  32 *
  33 * This data structure is the one defined in RFC 4340, Appendix A.
  34 *
  35 * @dccpav_buf_head - circular buffer head
  36 * @dccpav_buf_tail - circular buffer tail
  37 * @dccpav_buf_ackno - ack # of the most recent packet acknowledgeable in the
  38 *                     buffer (i.e. %dccpav_buf_head)
  39 * @dccpav_buf_nonce - the one-bit sum of the ECN Nonces on all packets acked
  40 *                     by the buffer with State 0
  41 *
  42 * Additionally, the HC-Receiver must keep some information about the
  43 * Ack Vectors it has recently sent. For each packet sent carrying an
  44 * Ack Vector, it remembers four variables:
  45 *
  46 * @dccpav_records - list of dccp_ackvec_record
  47 * @dccpav_ack_nonce - the one-bit sum of the ECN Nonces for all State 0.
  48 *
  49 * @dccpav_time         - the time in usecs
  50 * @dccpav_buf - circular buffer of acknowledgeable packets
  51 */
  52struct dccp_ackvec {
  53        u64             dccpav_buf_ackno;
  54        struct list_head dccpav_records;
  55        ktime_t         dccpav_time;
  56        u16             dccpav_buf_head;
  57        u16             dccpav_vec_len;
  58        u8              dccpav_buf_nonce;
  59        u8              dccpav_ack_nonce;
  60        u8              dccpav_buf[DCCP_MAX_ACKVEC_LEN];
  61};
  62
  63/** struct dccp_ackvec_record - ack vector record
  64 *
  65 * ACK vector record as defined in Appendix A of spec.
  66 *
  67 * The list is sorted by dccpavr_ack_seqno
  68 *
  69 * @dccpavr_node - node in dccpav_records
  70 * @dccpavr_ack_seqno - sequence number of the packet this record was sent on
  71 * @dccpavr_ack_ackno - sequence number being acknowledged
  72 * @dccpavr_ack_ptr - pointer into dccpav_buf where this record starts
  73 * @dccpavr_ack_nonce - dccpav_ack_nonce at the time this record was sent
  74 * @dccpavr_sent_len - length of the record in dccpav_buf
  75 */
  76struct dccp_ackvec_record {
  77        struct list_head dccpavr_node;
  78        u64              dccpavr_ack_seqno;
  79        u64              dccpavr_ack_ackno;
  80        u16              dccpavr_ack_ptr;
  81        u16              dccpavr_sent_len;
  82        u8               dccpavr_ack_nonce;
  83};
  84
  85struct sock;
  86struct sk_buff;
  87
  88#ifdef CONFIG_IP_DCCP_ACKVEC
  89extern int dccp_ackvec_init(void);
  90extern void dccp_ackvec_exit(void);
  91
  92extern struct dccp_ackvec *dccp_ackvec_alloc(const gfp_t priority);
  93extern void dccp_ackvec_free(struct dccp_ackvec *av);
  94
  95extern int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk,
  96                           const u64 ackno, const u8 state);
  97
  98extern void dccp_ackvec_check_rcv_ackno(struct dccp_ackvec *av,
  99                                        struct sock *sk, const u64 ackno);
 100extern int dccp_ackvec_parse(struct sock *sk, const struct sk_buff *skb,
 101                             u64 *ackno, const u8 opt,
 102                             const u8 *value, const u8 len);
 103
 104extern int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb);
 105
 106static inline int dccp_ackvec_pending(const struct dccp_ackvec *av)
 107{
 108        return av->dccpav_vec_len;
 109}
 110#else /* CONFIG_IP_DCCP_ACKVEC */
 111static inline int dccp_ackvec_init(void)
 112{
 113        return 0;
 114}
 115
 116static inline void dccp_ackvec_exit(void)
 117{
 118}
 119
 120static inline struct dccp_ackvec *dccp_ackvec_alloc(const gfp_t priority)
 121{
 122        return NULL;
 123}
 124
 125static inline void dccp_ackvec_free(struct dccp_ackvec *av)
 126{
 127}
 128
 129static inline int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk,
 130                                  const u64 ackno, const u8 state)
 131{
 132        return -1;
 133}
 134
 135static inline void dccp_ackvec_check_rcv_ackno(struct dccp_ackvec *av,
 136                                               struct sock *sk, const u64 ackno)
 137{
 138}
 139
 140static inline int dccp_ackvec_parse(struct sock *sk, const struct sk_buff *skb,
 141                                    const u64 *ackno, const u8 opt,
 142                                    const u8 *value, const u8 len)
 143{
 144        return -1;
 145}
 146
 147static inline int dccp_insert_option_ackvec(const struct sock *sk,
 148                                            const struct sk_buff *skb)
 149{
 150        return -1;
 151}
 152
 153static inline int dccp_ackvec_pending(const struct dccp_ackvec *av)
 154{
 155        return 0;
 156}
 157#endif /* CONFIG_IP_DCCP_ACKVEC */
 158#endif /* _ACKVEC_H */
 159