lkml.org 
[lkml]   [2015]   [Jul]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[RFC patch] sctp: sctp_generate_fwdtsn: Initialize sctp_fwdtsn_skip array, neatening
    From
    Date
    It's not clear to me that the sctp_fwdtsn_skip array is
    always initialized when used.

    It is appropriate to initialize the array to 0?

    This patch initializes the array too 0 and moves the
    local variables into the blocks where used.

    It also does some miscellaneous neatening by using
    continue; and unindenting the following block and
    using ARRAY_SIZE rather than 10 to decouple the
    array declaration size from a constant.
    ---
    net/sctp/outqueue.c | 90 ++++++++++++++++++++++++++---------------------------
    1 file changed, 44 insertions(+), 46 deletions(-)

    diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
    index 7e8f0a1..4c80d7b 100644
    --- a/net/sctp/outqueue.c
    +++ b/net/sctp/outqueue.c
    @@ -1684,13 +1684,9 @@ static inline int sctp_get_skip_pos(struct sctp_fwdtsn_skip *skiplist,
    static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
    {
    struct sctp_association *asoc = q->asoc;
    - struct sctp_chunk *ftsn_chunk = NULL;
    - struct sctp_fwdtsn_skip ftsn_skip_arr[10];
    - int nskips = 0;
    - int skip_pos = 0;
    - __u32 tsn;
    - struct sctp_chunk *chunk;
    struct list_head *lchunk, *temp;
    + struct sctp_fwdtsn_skip ftsn_skip_arr[10] = {};
    + int nskips = 0;

    if (!asoc->peer.prsctp_capable)
    return;
    @@ -1726,9 +1722,11 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
    * "Advanced.Peer.Ack.Point" from 102 to 104 locally.
    */
    list_for_each_safe(lchunk, temp, &q->abandoned) {
    - chunk = list_entry(lchunk, struct sctp_chunk,
    - transmitted_list);
    - tsn = ntohl(chunk->subh.data_hdr->tsn);
    + struct sctp_chunk *chunk = list_entry(lchunk, struct sctp_chunk,
    + transmitted_list);
    + sctp_datahdr_t *data_hdr = chunk->subh.data_hdr;
    + __u32 tsn = ntohl(data_hdr->tsn);
    + int skip_pos;

    /* Remove any chunks in the abandoned queue that are acked by
    * the ctsn.
    @@ -1736,52 +1734,52 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
    if (TSN_lte(tsn, ctsn)) {
    list_del_init(lchunk);
    sctp_chunk_free(chunk);
    - } else {
    - if (TSN_lte(tsn, asoc->adv_peer_ack_point+1)) {
    - asoc->adv_peer_ack_point = tsn;
    - if (chunk->chunk_hdr->flags &
    - SCTP_DATA_UNORDERED)
    - continue;
    - skip_pos = sctp_get_skip_pos(&ftsn_skip_arr[0],
    - nskips,
    - chunk->subh.data_hdr->stream);
    - ftsn_skip_arr[skip_pos].stream =
    - chunk->subh.data_hdr->stream;
    - ftsn_skip_arr[skip_pos].ssn =
    - chunk->subh.data_hdr->ssn;
    - if (skip_pos == nskips)
    - nskips++;
    - if (nskips == 10)
    - break;
    - } else
    - break;
    + continue;
    }
    +
    + if (!TSN_lte(tsn, asoc->adv_peer_ack_point + 1))
    + break;
    +
    + asoc->adv_peer_ack_point = tsn;
    + if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
    + continue;
    +
    + skip_pos = sctp_get_skip_pos(ftsn_skip_arr, nskips,
    + data_hdr->stream);
    + ftsn_skip_arr[skip_pos].stream = data_hdr->stream;
    + ftsn_skip_arr[skip_pos].ssn = data_hdr->ssn;
    + if (skip_pos == nskips)
    + nskips++;
    + if (nskips == ARRAY_SIZE(ftsn_skip_arr))
    + break;
    }

    /* PR-SCTP C3) If, after step C1 and C2, the "Advanced.Peer.Ack.Point"
    - * is greater than the Cumulative TSN ACK carried in the received
    - * SACK, the data sender MUST send the data receiver a FORWARD TSN
    - * chunk containing the latest value of the
    - * "Advanced.Peer.Ack.Point".
    + * is greater than the Cumulative TSN ACK carried in the received SACK,
    + * the data sender MUST send the data receiver a FORWARD TSN chunk
    + * containing the latest value of the "Advanced.Peer.Ack.Point".
    *
    * C4) For each "abandoned" TSN the sender of the FORWARD TSN SHOULD
    * list each stream and sequence number in the forwarded TSN. This
    - * information will enable the receiver to easily find any
    - * stranded TSN's waiting on stream reorder queues. Each stream
    - * SHOULD only be reported once; this means that if multiple
    - * abandoned messages occur in the same stream then only the
    - * highest abandoned stream sequence number is reported. If the
    - * total size of the FORWARD TSN does NOT fit in a single MTU then
    - * the sender of the FORWARD TSN SHOULD lower the
    - * Advanced.Peer.Ack.Point to the last TSN that will fit in a
    + * information will enable the receiver to easily find any stranded
    + * TSN's waiting on stream reorder queues. Each stream SHOULD only be
    + * reported once; this means that if multiple abandoned messages occur
    + * in the same stream then only the highest abandoned stream sequence
    + * number is reported. If the total size of the FORWARD TSN does NOT
    + * fit in a single MTU then the sender of the FORWARD TSN SHOULD lower
    + * the Advanced.Peer.Ack.Point to the last TSN that will fit in a
    * single MTU.
    */
    - if (asoc->adv_peer_ack_point > ctsn)
    - ftsn_chunk = sctp_make_fwdtsn(asoc, asoc->adv_peer_ack_point,
    - nskips, &ftsn_skip_arr[0]);
    + if (asoc->adv_peer_ack_point > ctsn) {
    + struct sctp_chunk *ftsn_chunk;

    - if (ftsn_chunk) {
    - list_add_tail(&ftsn_chunk->list, &q->control_chunk_list);
    - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
    + ftsn_chunk = sctp_make_fwdtsn(asoc, asoc->adv_peer_ack_point,
    + nskips, ftsn_skip_arr);
    + if (ftsn_chunk) {
    + list_add_tail(&ftsn_chunk->list,
    + &q->control_chunk_list);
    + SCTP_INC_STATS(sock_net(asoc->base.sk),
    + SCTP_MIB_OUTCTRLCHUNKS);
    + }
    }
    }



    \
     
     \ /
      Last update: 2015-07-03 00:01    [W:8.239 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site