aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/ackvec.h
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2008-09-04 01:30:19 -0400
committerGerrit Renker <gerrit@erg.abdn.ac.uk>2008-09-04 01:45:36 -0400
commitff49e27089ec363b7fc3849504e0435d447ab18a (patch)
treeeb6f7d4ec829f2c0ca206c0769c15c08e592743c /net/dccp/ackvec.h
parentb8c6bcee1dbc1aadcd67af998e414e73fa166a7d (diff)
dccp ccid-2: Ack Vector interface clean-up
This patch brings the Ack Vector interface up to date. Its main purpose is to lay the basis for the subsequent patches of this set, which will use the new data structure fields and routines. There are no real algorithmic changes, rather an adaptation: (1) Replaced the static Ack Vector size (2) with a #define so that it can be adapted (with low loss / Ack Ratio, a value of 1 works, so 2 seems to be sufficient for the moment) and added a solution so that computing the ECN nonce will continue to work - even with larger Ack Vectors. (2) Replaced the #defines for Ack Vector states with a complete enum. (3) Replaced #defines to compute Ack Vector length and state with general purpose routines (inlines), and updated code to use these. (4) Added a `tail' field (conversion to circular buffer in subsequent patch). (5) Updated the (outdated) documentation for Ack Vector struct. (6) All sequence number containers now trimmed to 48 bits. (7) Removal of unused bits: * removed dccpav_ack_nonce from struct dccp_ackvec, since this is already redundantly stored in the `dccpavr_ack_nonce' (of Ack Vector record); * removed Elapsed Time for Ack Vectors (it was nowhere used); * replaced semantics of dccpavr_sent_len with dccpavr_ack_runlen, since the code needs to be able to remember the old run length; * reduced the de-/allocation routines (redundant / duplicate tests). Justification for removing Elapsed Time information [can be removed]: --------------------------------------------------------------------- 1. The Elapsed Time information for Ack Vectors was nowhere used in the code. 2. DCCP does not implement rate-based pacing of acknowledgments. The only recommendation for always including Elapsed Time is in section 11.3 of RFC 4340: "Receivers that rate-pace acknowledgements SHOULD [...] include Elapsed Time options". But such is not the case here. 3. It does not really improve estimation accuracy. The Elapsed Time field only records the time between the arrival of the last acknowledgeable packet and the time the Ack Vector is sent out. Since Linux does not (yet) implement delayed Acks, the time difference will typically be small, since often the arrival of a data packet triggers sending feedback at the HC-receiver. Justification for changes in de-/allocation routines [can be removed]: ---------------------------------------------------------------------- * INIT_LIST_HEAD in dccp_ackvec_record_new was redundant, since the list pointers were later overwritten when the node was added via list_add(); * dccp_ackvec_record_new() was called in a single place only; * calls to list_del_init() before calling dccp_ackvec_record_delete() were redundant, since subsequently the entire element was k-freed; * since all calls to dccp_ackvec_record_delete() were preceded to a call to list_del_init(), the WARN_ON test would never evaluate to true; * since all calls to dccp_ackvec_record_delete() were made from within list_for_each_entry_safe(), the test for avr == NULL was redundant; * list_empty() in ackvec_free was redundant, since the same condition is embedded in the loop condition of the subsequent list_for_each_entry_safe(). Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Diffstat (limited to 'net/dccp/ackvec.h')
-rw-r--r--net/dccp/ackvec.h103
1 files changed, 56 insertions, 47 deletions
diff --git a/net/dccp/ackvec.h b/net/dccp/ackvec.h
index 1c10814fdf72..df18f9030dbb 100644
--- a/net/dccp/ackvec.h
+++ b/net/dccp/ackvec.h
@@ -3,9 +3,9 @@
3/* 3/*
4 * net/dccp/ackvec.h 4 * net/dccp/ackvec.h
5 * 5 *
6 * An implementation of the DCCP protocol 6 * An implementation of Ack Vectors for the DCCP protocol
7 * Copyright (c) 2007 University of Aberdeen, Scotland, UK
7 * Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@mandriva.com> 8 * 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 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 10 * under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation. 11 * published by the Free Software Foundation.
@@ -13,75 +13,84 @@
13 13
14#include <linux/dccp.h> 14#include <linux/dccp.h>
15#include <linux/compiler.h> 15#include <linux/compiler.h>
16#include <linux/ktime.h>
17#include <linux/list.h> 16#include <linux/list.h>
18#include <linux/types.h> 17#include <linux/types.h>
19 18
20/* We can spread an ack vector across multiple options */ 19/*
21#define DCCP_MAX_ACKVEC_LEN (DCCP_SINGLE_OPT_MAXLEN * 2) 20 * Ack Vector buffer space is static, in multiples of %DCCP_SINGLE_OPT_MAXLEN,
21 * the maximum size of a single Ack Vector. Setting %DCCPAV_NUM_ACKVECS to 1
22 * will be sufficient for most cases of low Ack Ratios, using a value of 2 gives
23 * more headroom if Ack Ratio is higher or when the sender acknowledges slowly.
24 */
25#define DCCPAV_NUM_ACKVECS 2
26#define DCCPAV_MAX_ACKVEC_LEN (DCCP_SINGLE_OPT_MAXLEN * DCCPAV_NUM_ACKVECS)
22 27
23/* Estimated minimum average Ack Vector length - used for updating MPS */ 28/* Estimated minimum average Ack Vector length - used for updating MPS */
24#define DCCPAV_MIN_OPTLEN 16 29#define DCCPAV_MIN_OPTLEN 16
25 30
26#define DCCP_ACKVEC_STATE_RECEIVED 0 31enum dccp_ackvec_states {
27#define DCCP_ACKVEC_STATE_ECN_MARKED (1 << 6) 32 DCCPAV_RECEIVED = 0x00,
28#define DCCP_ACKVEC_STATE_NOT_RECEIVED (3 << 6) 33 DCCPAV_ECN_MARKED = 0x40,
34 DCCPAV_RESERVED = 0x80,
35 DCCPAV_NOT_RECEIVED = 0xC0
36};
37#define DCCPAV_MAX_RUNLEN 0x3F
29 38
30#define DCCP_ACKVEC_STATE_MASK 0xC0 /* 11000000 */ 39static inline u8 dccp_ackvec_runlen(const u8 *cell)
31#define DCCP_ACKVEC_LEN_MASK 0x3F /* 00111111 */ 40{
41 return *cell & DCCPAV_MAX_RUNLEN;
42}
32 43
33/** struct dccp_ackvec - ack vector 44static inline u8 dccp_ackvec_state(const u8 *cell)
34 * 45{
35 * This data structure is the one defined in RFC 4340, Appendix A. 46 return *cell & ~DCCPAV_MAX_RUNLEN;
36 * 47}
37 * @av_buf_head - circular buffer head 48
38 * @av_buf_tail - circular buffer tail 49/** struct dccp_ackvec - Ack Vector main data structure
39 * @av_buf_ackno - ack # of the most recent packet acknowledgeable in the
40 * buffer (i.e. %av_buf_head)
41 * @av_buf_nonce - the one-bit sum of the ECN Nonces on all packets acked
42 * by the buffer with State 0
43 *
44 * Additionally, the HC-Receiver must keep some information about the
45 * Ack Vectors it has recently sent. For each packet sent carrying an
46 * Ack Vector, it remembers four variables:
47 * 50 *
48 * @av_records - list of dccp_ackvec_record 51 * This implements a fixed-size circular buffer within an array and is largely
49 * @av_ack_nonce - the one-bit sum of the ECN Nonces for all State 0. 52 * based on Appendix A of RFC 4340.
50 * 53 *
51 * @av_time - the time in usecs 54 * @av_buf: circular buffer storage area
52 * @av_buf - circular buffer of acknowledgeable packets 55 * @av_buf_head: head index; begin of live portion in @av_buf
56 * @av_buf_tail: tail index; first index _after_ the live portion in @av_buf
57 * @av_buf_ackno: highest seqno of acknowledgeable packet recorded in @av_buf
58 * @av_buf_nonce: ECN nonce sums, each covering subsequent segments of up to
59 * %DCCP_SINGLE_OPT_MAXLEN cells in the live portion of @av_buf
60 * @av_records: list of %dccp_ackvec_record (Ack Vectors sent previously)
61 * @av_veclen: length of the live portion of @av_buf
53 */ 62 */
54struct dccp_ackvec { 63struct dccp_ackvec {
55 u64 av_buf_ackno; 64 u8 av_buf[DCCPAV_MAX_ACKVEC_LEN];
56 struct list_head av_records;
57 ktime_t av_time;
58 u16 av_buf_head; 65 u16 av_buf_head;
66 u16 av_buf_tail;
67 u64 av_buf_ackno:48;
68 bool av_buf_nonce[DCCPAV_NUM_ACKVECS];
69 struct list_head av_records;
59 u16 av_vec_len; 70 u16 av_vec_len;
60 u8 av_buf_nonce;
61 u8 av_ack_nonce;
62 u8 av_buf[DCCP_MAX_ACKVEC_LEN];
63}; 71};
64 72
65/** struct dccp_ackvec_record - ack vector record 73/** struct dccp_ackvec_record - Records information about sent Ack Vectors
66 * 74 *
67 * ACK vector record as defined in Appendix A of spec. 75 * These list entries define the additional information which the HC-Receiver
76 * keeps about recently-sent Ack Vectors; again refer to RFC 4340, Appendix A.
68 * 77 *
69 * The list is sorted by avr_ack_seqno 78 * @avr_node: the list node in @av_records
79 * @avr_ack_seqno: sequence number of the packet the Ack Vector was sent on
80 * @avr_ack_ackno: the Ack number that this record/Ack Vector refers to
81 * @avr_ack_ptr: pointer into @av_buf where this record starts
82 * @avr_ack_runlen: run length of @avr_ack_ptr at the time of sending
83 * @avr_ack_nonce: the sum of @av_buf_nonce's at the time this record was sent
70 * 84 *
71 * @avr_node - node in av_records 85 * The list as a whole is sorted in descending order by @avr_ack_seqno.
72 * @avr_ack_seqno - sequence number of the packet this record was sent on
73 * @avr_ack_ackno - sequence number being acknowledged
74 * @avr_ack_ptr - pointer into av_buf where this record starts
75 * @avr_ack_nonce - av_ack_nonce at the time this record was sent
76 * @avr_sent_len - lenght of the record in av_buf
77 */ 86 */
78struct dccp_ackvec_record { 87struct dccp_ackvec_record {
79 struct list_head avr_node; 88 struct list_head avr_node;
80 u64 avr_ack_seqno; 89 u64 avr_ack_seqno:48;
81 u64 avr_ack_ackno; 90 u64 avr_ack_ackno:48;
82 u16 avr_ack_ptr; 91 u16 avr_ack_ptr;
83 u16 avr_sent_len; 92 u8 avr_ack_runlen;
84 u8 avr_ack_nonce; 93 u8 avr_ack_nonce:1;
85}; 94};
86 95
87struct sock; 96struct sock;