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/config.h> 15 #include <linux/compiler.h> 16 #include <linux/time.h> 17 #include <linux/types.h> 18 19 /* Read about the ECN nonce to see why it is 253 */ 20 #define DCCP_MAX_ACKVEC_LEN 253 21 22 #define DCCP_ACKVEC_STATE_RECEIVED 0 23 #define DCCP_ACKVEC_STATE_ECN_MARKED (1 << 6) 24 #define DCCP_ACKVEC_STATE_NOT_RECEIVED (3 << 6) 25 26 #define DCCP_ACKVEC_STATE_MASK 0xC0 /* 11000000 */ 27 #define DCCP_ACKVEC_LEN_MASK 0x3F /* 00111111 */ 28 29 /** struct dccp_ackvec - ack vector 30 * 31 * This data structure is the one defined in the DCCP draft 32 * Appendix A. 33 * 34 * @dccpav_buf_head - circular buffer head 35 * @dccpav_buf_tail - circular buffer tail 36 * @dccpav_buf_ackno - ack # of the most recent packet acknowledgeable in the 37 * buffer (i.e. %dccpav_buf_head) 38 * @dccpav_buf_nonce - the one-bit sum of the ECN Nonces on all packets acked 39 * by the buffer with State 0 40 * 41 * Additionally, the HC-Receiver must keep some information about the 42 * Ack Vectors it has recently sent. For each packet sent carrying an 43 * Ack Vector, it remembers four variables: 44 * 45 * @dccpav_ack_seqno - the Sequence Number used for the packet 46 * (HC-Receiver seqno) 47 * @dccpav_ack_ptr - the value of buf_head at the time of acknowledgement. 48 * @dccpav_ack_ackno - the Acknowledgement Number used for the packet 49 * (HC-Sender seqno) 50 * @dccpav_ack_nonce - the one-bit sum of the ECN Nonces for all State 0. 51 * 52 * @dccpav_buf_len - circular buffer length 53 * @dccpav_time - the time in usecs 54 * @dccpav_buf - circular buffer of acknowledgeable packets 55 */ 56 struct dccp_ackvec { 57 unsigned int dccpav_buf_head; 58 unsigned int dccpav_buf_tail; 59 u64 dccpav_buf_ackno; 60 u64 dccpav_ack_seqno; 61 u64 dccpav_ack_ackno; 62 unsigned int dccpav_ack_ptr; 63 unsigned int dccpav_sent_len; 64 unsigned int dccpav_vec_len; 65 unsigned int dccpav_buf_len; 66 struct timeval dccpav_time; 67 u8 dccpav_buf_nonce; 68 u8 dccpav_ack_nonce; 69 u8 dccpav_buf[0]; 70 }; 71 72 struct sock; 73 struct sk_buff; 74 75 #ifdef CONFIG_IP_DCCP_ACKVEC 76 extern struct dccp_ackvec *dccp_ackvec_alloc(unsigned int len, 77 const gfp_t priority); 78 extern void dccp_ackvec_free(struct dccp_ackvec *av); 79 80 extern int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, 81 const u64 ackno, const u8 state); 82 83 extern void dccp_ackvec_check_rcv_ackno(struct dccp_ackvec *av, 84 struct sock *sk, const u64 ackno); 85 extern int dccp_ackvec_parse(struct sock *sk, const struct sk_buff *skb, 86 const u8 opt, const u8 *value, const u8 len); 87 88 extern int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb); 89 90 static inline int dccp_ackvec_pending(const struct dccp_ackvec *av) 91 { 92 return av->dccpav_sent_len != av->dccpav_vec_len; 93 } 94 #else /* CONFIG_IP_DCCP_ACKVEC */ 95 static inline struct dccp_ackvec *dccp_ackvec_alloc(unsigned int len, 96 const gfp_t priority) 97 { 98 return NULL; 99 } 100 101 static inline void dccp_ackvec_free(struct dccp_ackvec *av) 102 { 103 } 104 105 static inline int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, 106 const u64 ackno, const u8 state) 107 { 108 return -1; 109 } 110 111 static inline void dccp_ackvec_check_rcv_ackno(struct dccp_ackvec *av, 112 struct sock *sk, const u64 ackno) 113 { 114 } 115 116 static inline int dccp_ackvec_parse(struct sock *sk, const struct sk_buff *skb, 117 const u8 opt, const u8 *value, const u8 len) 118 { 119 return -1; 120 } 121 122 static inline int dccp_insert_option_ackvec(const struct sock *sk, 123 const struct sk_buff *skb) 124 { 125 return -1; 126 } 127 128 static inline int dccp_ackvec_pending(const struct dccp_ackvec *av) 129 { 130 return 0; 131 } 132 #endif /* CONFIG_IP_DCCP_ACKVEC */ 133 #endif /* _ACKVEC_H */ 134