03 May, 2016

1 commit


28 Apr, 2016

1 commit


05 Jan, 2014

1 commit


11 Jul, 2012

1 commit


20 Dec, 2011

1 commit

  • DaveM said:
    Please, this kind of stuff rots forever and not using bool properly
    drives me crazy.

    Joe Perches gave me the spatch script:

    @@
    bool b;
    @@
    -b = 0
    +b = false
    @@
    bool b;
    @@
    -b = 1
    +b = true

    I merely installed coccinelle, read the documentation and took credit.

    Signed-off-by: Rusty Russell
    Signed-off-by: David S. Miller

    Rusty Russell
     

07 May, 2011

1 commit

  • A length of zero (after subtracting two for the type and len fields) for
    the DCCPO_{CHANGE,CONFIRM}_{L,R} options will cause an underflow due to
    the subtraction. The subsequent code may read past the end of the
    options value buffer when parsing. I'm unsure of what the consequences
    of this might be, but it's probably not good.

    Signed-off-by: Dan Rosenberg
    Cc: stable@kernel.org
    Acked-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Dan Rosenberg
     

15 Nov, 2010

3 commits

  • This patch replaces an almost identical replication of code: large parts
    of dccp_parse_options() re-appeared as ccid2_ackvector() in ccid2.c.

    Apart from the duplication, this caused two more problems:
    1. CCIDs should not need to be concerned with parsing header options;
    2. one can not assume that Ack Vectors appear as a contiguous area within an
    skb, it is legal to insert other options and/or padding in between. The
    current code would throw an error and stop reading in such a case.

    Since Ack Vectors provide CCID-specific information, they are now processed
    by the CCID directly, separating this functionality from the main DCCP code.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • The problem with Ack Vectors is that
    i) their length is variable and can in principle grow quite large,
    ii) it is hard to predict exactly how large they will be.

    Due to the second point it seems not a good idea to reduce the MPS; in
    particular when on average there is enough room for the Ack Vector and an
    increase in length is momentarily due to some burst loss, after which the
    Ack Vector returns to its normal/average length.

    The solution taken by this patch is to subtract a minimum-expected Ack Vector
    length from the MPS, and to defer any larger Ack Vectors onto a separate
    Sync - but only if indeed there is no space left on the skb.

    This patch provides the infrastructure to schedule Sync-packets for transporting
    (urgent) out-of-band data. Its signalling is quicker than scheduling an Ack, since
    it does not need to wait for new application data.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This provides a routine to consistently update the buffer state when the
    peer acknowledges receipt of Ack Vectors; updating state in the list of Ack
    Vectors as well as in the circular buffer.

    While based on RFC 4340, several additional (and necessary) precautions were
    added to protect the consistency of the buffer state. These additions are
    essential, since analysis and experience showed that the basic algorithm was
    insufficient for this task (which lead to problems that were hard to debug).

    The algorithm now
    * deals with HC-sender acknowledging to HC-receiver and vice versa,
    * keeps track of the last unacknowledged but received seqno in tail_ackno,
    * has special cases to reset the overflow condition when appropriate,
    * is protected against receiving older information (would mess up buffer state).

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

11 Nov, 2010

3 commits

  • This completes the implementation of a circular buffer for Ack Vectors, by
    extending the current (linear array-based) implementation. The changes are:

    (a) An `overflow' flag to deal with the case of overflow. As before, dynamic
    growth of the buffer will not be supported; but code will be added to deal
    robustly with overflowing Ack Vector buffers.

    (b) A `tail_seqno' field. When naively implementing the algorithm of Appendix A
    in RFC 4340, problems arise whenever subsequent Ack Vector records overlap,
    which can bring the entire run length calculation completely out of synch.
    (This is documented on http://www.erg.abdn.ac.uk/users/gerrit/dccp/notes/\
    ack_vectors/tracking_tail_ackno/ .)
    (c) The buffer length is now computed dynamically (i.e. current fill level),
    as the span between head to tail.

    As a result, dccp_ackvec_pending() is now simpler - the #ifdef is no longer
    necessary since buf_empty is always true when IP_DCCP_ACKVEC is not configured.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This patch
    * separates Ack Vector housekeeping code from option-insertion code;
    * shifts option-specific code from ackvec.c into options.c;
    * introduces a dedicated routine to take care of the Ack Vector records;
    * simplifies the dccp_ackvec_insert_avr() routine: the BUG_ON was redundant,
    since the list is automatically arranged in descending order of ack_seqno.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • 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).

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

12 Oct, 2010

1 commit


07 Oct, 2010

1 commit


21 Sep, 2010

2 commits

  • The constants DCCPO_{MIN,MAX}_CCID_SPECIFIC are nowhere used in the code, but
    instead for the CCID-specific options numbers are used.

    This patch unifies the use of CCID-specific option numbers, by adding symbolic
    names reflecting the definitions in RFC 4340, 10.3.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This
    1. adds packet type information to ccid_hc_{rx,tx}_parse_options(). This is
    necessary, since table 3 in RFC 4340, 5.8 leaves it to the CCIDs to state
    which options may (not) appear on what packet type.

    2. adds such a check for CCID-3's {Loss Event, Receive} Rate as specified in
    RFC 4340 8.3 ("Receive Rate options MUST NOT be sent on DCCP-Data packets")
    and 8.5 ("Loss Event Rate options MUST NOT be sent on DCCP-Data packets").

    3. removes an unused argument `idx' from ccid_hc_{rx,tx}_parse_options(). This
    is also no longer necessary, since the CCID-specific option-parsing routines
    are passed every single parameter of the type-length-value option encoding.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

26 Jun, 2010

2 commits

  • This patch is thanks to Andre Noll who reported the issue and helped testing.

    The Syn-RTT sampled during the initial handshake currently only works for
    the client sending the DCCP-Request. TFRC penalizes the absence of an RTT
    sample with a very slow initial speed (1 packet per second), which delays
    slow-start significantly, resulting in sluggish performance.

    This patch mirrors the "Syn RTT" principle by adding a timestamp also onto
    the DCCP-Response, producing an RTT sample when the (Data)Ack completing
    the handshake arrives.

    Also changed the documentation to 'TFRC' since Syn RTTs are also used by CCID-4.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This removes an unused 'sk' argument from several option-inserting functions.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     

25 May, 2010

1 commit


22 Jan, 2009

2 commits

  • Since all feature-negotiation processing now takes place in feat.c,
    functions for producing verbose debugging output are concentrated
    there.

    New functions to print out values, entry records, and options are
    provided, and also a macro is defined to not always have the function
    name in the output line.

    Thanks a lot to Wei Yongjun and Giuseppe Galeota for help and
    discussion with an earlier revision of this patch.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This patch takes care of initialising and type-checking sysctls
    related to feature negotiation. Type checking is important since some
    of the sysctls now directly impact the feature-negotiation process.

    The sysctls are initialised with the known default values for each
    feature. For the type-checking the value constraints from RFC 4340
    are used:

    * Sequence Window uses the specified Wmin=32, the maximum is ulong (4 bytes),
    tested and confirmed that it works up to 4294967295 - for Gbps speed;
    * Ack Ratio is between 0 .. 0xffff (2-byte unsigned integer);
    * CCIDs are between 0 .. 255;
    * request_retries, retries1, retries2 also between 0..255 for good measure;
    * tx_qlen is checked to be non-negative;
    * sync_ratelimit remains as before.

    Notes:
    ------
    1. Die s@sysctl_dccp_feat@sysctl_dccp@g since the sysctls are now in feat.c.
    2. As pointed out by Arnaldo, the pattern of type-checking repeats itself in
    other places, sometimes with exactly the same kind of definitions (e.g.
    "static int zero;"). It may be a good idea (kernel janitors?) to consolidate
    type checking. For the sake of keeping the changeset small and in order not
    to affect other subsystems, I have not strived to generalise here.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker
     

08 Dec, 2008

2 commits

  • This removes the use of the sysctl and the minisock variable for the Send Ack
    Vector feature, as it now is handled fully dynamically via feature negotiation
    (i.e. when CCID-2 is enabled, Ack Vectors are automatically enabled as per
    RFC 4341, 4.).

    Using a sysctl in parallel to this implementation would open the door to
    crashes, since much of the code relies on tests of the boolean minisock /
    sysctl variable. Thus, this patch replaces all tests of type

    if (dccp_msk(sk)->dccpms_send_ack_vector)
    /* ... */
    with
    if (dp->dccps_hc_rx_ackvec != NULL)
    /* ... */

    The dccps_hc_rx_ackvec is allocated by the dccp_hdlr_ackvec() when feature
    negotiation concluded that Ack Vectors are to be used on the half-connection.
    Otherwise, it is NULL (due to dccp_init_sock/dccp_create_openreq_child),
    so that the test is a valid one.

    The activation handler for Ack Vectors is called as soon as the feature
    negotiation has concluded at the
    * server when the Ack marking the transition RESPOND => OPEN arrives;
    * client after it has sent its ACK, marking the transition REQUEST => PARTOPEN.

    Adding the sequence number of the Response packet to the Ack Vector has been
    removed, since
    (a) connection establishment implies that the Response has been received;
    (b) the CCIDs only look at packets received in the (PART)OPEN state, i.e.
    this entry will always be ignored;
    (c) it can not be used for anything useful - to detect loss for instance, only
    packets received after the loss can serve as pseudo-dupacks.

    There was a FIXME to change the error code when dccp_ackvec_add() fails.
    I removed this after finding out that:
    * the check whether ackno < ISN is already made earlier,
    * this Response is likely the 1st packet with an Ackno that the client gets,
    * so when dccp_ackvec_add() fails, the reason is likely not a packet error.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • Updating the NDP count feature is handled automatically now:
    * for CCID-2 it is disabled, since the code does not use NDP counts;
    * for CCID-3 it is enabled, as NDP counts are used to determine loss lengths.

    Allowing the user to change NDP values leads to unpredictable and failing
    behaviour, since it is then possible to disable NDP counts even when they
    are needed (e.g. in CCID-3).

    This means that only those user settings are sensible that agree with the
    values for Send NDP Count implied by the choice of CCID. But those settings
    are already activated by the feature negotiation (CCID dependency tracking),
    hence this form of support is redundant.

    At startup the initialisation of the NDP count feature uses the default
    value of 0, which is done implicitly by the zeroing-out of the socket when
    it is allocated. If the choice of CCID or feature negotiation enables NDP
    count, this will then be updated via the NDP activation handler.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker
     

02 Dec, 2008

3 commits

  • Analogous to the previous patch, this adds code to interpret incoming Confirm
    feature-negotiation options. Both functions operate on the feature-negotiation
    list of either the request_sock (server) or the dccp_sock (client).

    Thanks to Wei Yongjun for pointing out that it is overly restrictive to check
    the entire list of confirmed SP values.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This adds/replaces code for processing incoming ChangeL/R options.
    The main difference is that:
    * mandatory FN options are now interpreted inside the function
    (there are too many individual cases to do this externally);
    * the function returns an appropriate Reset code or 0,
    which is then used to fill in the data for the Reset packet.

    Old code, which is no longer used or referenced, has been removed.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • The patch implements insertion of feature negotiation at the server (listening
    and request socket) and the client (connecting socket).

    In dccp_insert_options(), several statements have been grouped together now
    to achieve (it is hoped) better efficiency by reducing the number of tests
    each packet has to go through:
    - Ack Vectors are sent if the packet is neither a Data or a Request packet;
    - a previous issue is corrected - feature negotiation options are allowed
    on DataAck packets (5.8).

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker
     

26 Nov, 2008

1 commit

  • this warning:

    net/dccp/options.c: In function ‘dccp_parse_options’:
    net/dccp/options.c:67: warning: ‘value’ may be used uninitialized in this function

    is a bogus GCC warning. The compiler does not recognize the relation
    between "value" and "mandatory" variables: the code flow can ever reach
    the "out_invalid_option:" label if 'mandatory' is set to 1, and when
    'mandatory' is non-zero, we'll always have 'value' initialized.

    Help out the compiler by annotating the variable.

    Signed-off-by: Ingo Molnar
    Signed-off-by: David S. Miller

    Ingo Molnar
     

24 Nov, 2008

3 commits

  • The patch extends existing code:
    * Confirm options divide into the confirmed value plus an optional preference
    list for SP values. Previously only the preference list was echoed for SP
    values, now the confirmed value is added as per RFC 4340, 6.1;
    * length and sanity checks are added to avoid illegal memory (or NULL) access.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • Support for Mandatory options is provided by this patch, which will
    be used by subsequent feature-negotiation patches.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Acked-by: Arnaldo Carvalho de Melo
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This extends the scope of two available functions,
    encode|decode_value_var, to work up to 6 (8) bytes, to match maximum
    requirements in the RFC.

    These functions are going to be used both by general option processing
    and feature negotiation code, hence declarations have been put into
    feat.h.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Acked-by: Arnaldo Carvalho de Melo
    Signed-off-by: David S. Miller

    Gerrit Renker
     

17 Nov, 2008

1 commit

  • This patch deprecates the Ack Ratio sysctl, since
    * Ack Ratio is entirely ignored by CCID-3 and CCID-4,
    * Ack Ratio currently doesn't work in CCID-2 (i.e. is always set to 1);
    * even if it would work in CCID-2, there is no point for a user to change it:
    - Ack Ratio is constrained by cwnd (RFC 4341, 6.1.2),
    - if Ack Ratio > cwnd, the system resorts to spurious RTO timeouts
    (since waiting for Acks which will never arrive in this window),
    - cwnd is not a user-configurable value.

    The only reasonable place for Ack Ratio is to print it for debugging. It is
    planned to do this later on, as part of e.g. dccp_probe.

    With this patch Ack Ratio is now under full control of feature negotiation:
    * Ack Ratio is resolved as a dependency of the selected CCID;
    * if the chosen CCID supports it (i.e. CCID == CCID-2), Ack Ratio is set to
    the default of 2, following RFC 4340, 11.3 - "New connections start with Ack
    Ratio 2 for both endpoints";
    * what happens then is part of another patch set, since it concerns the
    dynamic update of Ack Ratio while the connection is in full flight.

    Thanks to Tomasz Grobelny for discussion leading up to this patch.

    Signed-off-by: Gerrit Renker
    Acked-by: Arnaldo Carvalho de Melo
    Signed-off-by: David S. Miller

    Gerrit Renker
     

12 Nov, 2008

1 commit

  • This patch limits feature (capability) negotation to the connection setup phase:

    1. Although it is theoretically possible to perform feature negotiation at any
    time (and RFC 4340 supports this), in practice this is prohibitively complex,
    as it requires to put traffic on hold for each new negotiation.
    2. As a byproduct of restricting feature negotiation to connection setup, the
    feature-negotiation retransmit timer is no longer required. This part is now
    mapped onto the protocol-level retransmission.
    Details indicating why timers are no longer needed can be found on
    http://www.erg.abdn.ac.uk/users/gerrit/dccp/notes/feature_negotiation/\
    implementation_notes.html

    This patch disables anytime negotiation, subsequent patches work out full
    feature negotiation support for connection setup.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     

09 Sep, 2008

1 commit


04 Sep, 2008

7 commits

  • This patch replaces an almost identical replication of code: large parts
    of dccp_parse_options() re-appeared as ccid2_ackvector() in ccid2.c.

    Apart from the duplication, this caused two more problems:
    1. CCIDs should not need to be concerned with parsing header options;
    2. one can not assume that Ack Vectors appear as a contiguous area within an
    skb, it is legal to insert other options and/or padding in between. The
    current code would throw an error and stop reading in such a case.

    The patch provides a new data structure and associated list housekeeping.

    Only small changes were necessary to integrate with CCID-2: data structure
    initialisation, adapt list traversal routine, and add call to the provided
    cleanup routine.

    The latter also lead to fixing the following BUG: CCID-2 so far ignored
    Ack Vectors on all packets other than Ack/DataAck, which is incorrect,
    since Ack Vectors can be present on any packet that has an Ack field.

    Details:
    --------
    * received Ack Vectors are parsed by dccp_parse_options() alone, which passes
    the result on to the CCID-specific routine ccid_hc_tx_parse_options();
    * CCIDs interested in using/decoding Ack Vector information will add code
    to fetch parsed Ack Vectors via this interface;
    * a data structure, `struct dccp_ackvec_parsed' is provided as interface;
    * this structure arranges Ack Vectors of the same skb into a FIFO order;
    * a doubly-linked list is used to keep the required FIFO code small.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • The problem with Ack Vectors is that

    i) their length is variable and can in principle grow quite large,
    ii) it is hard to predict exactly how large they will be.

    Due to the second point it seems not a good idea to reduce the MPS; in
    particular when on average there is enough room for the Ack Vector and an
    increase in length is momentarily due to some burst loss, after which the
    Ack Vector returns to its normal/average length.

    The solution taken by this patch is to subtract a minimum-expected Ack Vector
    length from the MPS (previous patch), and to defer any larger Ack Vectors onto
    a separate Sync - but only if indeed there is no space left on the skb.

    This patch provides the infrastructure to schedule Sync-packets for transporting
    (urgent) out-of-band data. Its signalling is quicker than scheduling an Ack, since
    it does not need to wait for new application data.

    It can thus serve other parts of the DCCP code as well.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This provides a routine to consistently update the buffer state when the
    peer acknowledges receipt of Ack Vectors; updating state in the list of Ack
    Vectors as well as in the circular buffer.

    While based on RFC 4340, several additional (and necessary) precautions were
    added to protect the consistency of the buffer state. These additions are
    essential, since analysis and experience showed that the basic algorithm was
    insufficient for this task (which lead to problems that were hard to debug).

    The algorithm now
    * deals with HC-sender acknowledging to HC-receiver and vice versa,
    * keeps track of the last unacknowledged but received seqno in tail_ackno,
    * has special cases to reset the overflow condition when appropriate,
    * is protected against receiving older information (would mess up buffer state).

    Note: The older code performed an unnecessary step, where the sender cleared
    Ack Vector state by parsing the Ack Vector received by the HC-receiver. Doing
    this was entirely redundant, since
    * the receiver always puts the full acknowledgment window (groups 2,3 in 11.4.2)
    into the Ack Vectors it sends; hence the HC-receiver is only interested in the
    highest state that the HC-sender received;
    * this means that the acknowledgment number on the (Data)Ack from the HC-sender
    is sufficient; and work done in parsing earlier state is not necessary, since
    the later state subsumes the earlier one (see also RFC 4340, A.4).
    This older interface (dccp_ackvec_parse()) is therefore removed.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This completes the implementation of a circular buffer for Ack Vectors, by
    extending the current (linear array-based) implementation. The changes are:

    (a) An `overflow' flag to deal with the case of overflow. As before, dynamic
    growth of the buffer will not be supported; but code will be added to deal
    robustly with overflowing Ack Vector buffers.

    (b) A `tail_seqno' field. When naively implementing the algorithm of Appendix A
    in RFC 4340, problems arise whenever subsequent Ack Vector records overlap,
    which can bring the entire run length calculation completely out of synch.
    (This is documented on http://www.erg.abdn.ac.uk/users/gerrit/dccp/notes/\
    ack_vectors/tracking_tail_ackno/ .)
    (c) The buffer lengthi is now computed dynamically (i.e. current fill level),
    as the span between head to tail.

    As a result, dccp_ackvec_pending() is now simpler - the #ifdef is no longer
    necessary since buf_empty is always true when IP_DCCP_ACKVEC is not configured.

    Note on overflow handling:
    -------------------------
    The Ack Vector code previously simply started to drop packets when the
    Ack Vector buffer overflowed. This means that the userspace application
    will not be able to receive, only because of an Ack Vector storage problem.

    Furthermore, overflow may be transient, so that applications may later
    recover from the overflow. Recovering from dropped packets is more difficult
    (e.g. video key frames).

    Hence the patch uses a different policy: when the buffer overflows, the oldest
    entries are subsequently overwritten. This has a higher chance of recovery.
    Details are on http://www.erg.abdn.ac.uk/users/gerrit/dccp/notes/ack_vectors/

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This patch
    * separates Ack Vector housekeeping code from option-insertion code;
    * shifts option-specific code from ackvec.c into options.c;
    * introduces a dedicated routine to take care of the Ack Vector records;
    * simplifies the dccp_ackvec_insert_avr() routine: the BUG_ON was redundant,
    since the list is automatically arranged in descending order of ack_seqno.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This schedules an Ack when receiving a timestamp, exploiting the
    existing inet_csk_schedule_ack() function, saving one case in the
    `dccp_ack_pending()' function.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • The constants DCCPO_{MIN,MAX}_CCID_SPECIFIC are nowhere used in the code, but
    instead for the CCID-specific options numbers are used.

    This patch unifies the use of CCID-specific option numbers, by adding symbolic
    names reflecting the definitions in RFC 4340, 10.3.

    Signed-off-by: Gerrit Renker

    Gerrit Renker