Stream arrays are used to save per stream information, which includes ssn for each stream already. This patch is to replace ssnmap with asoc stream arrays. Signed-off-by: Xin Long <lucien.xin@xxxxxxxxx> --- include/net/sctp/structs.h | 19 ++++++------------- net/sctp/associola.c | 10 ---------- net/sctp/sm_make_chunk.c | 11 ++--------- net/sctp/sm_statefuns.c | 3 +-- net/sctp/ulpqueue.c | 33 +++++++++++---------------------- 5 files changed, 20 insertions(+), 56 deletions(-) diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 549f17d..f81c321 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -407,23 +407,16 @@ void sctp_ssnmap_free(struct sctp_ssnmap *map); void sctp_ssnmap_clear(struct sctp_ssnmap *map); /* What is the current SSN number for this stream? */ -static inline __u16 sctp_ssn_peek(struct sctp_stream *stream, __u16 id) -{ - return stream->ssn[id]; -} +#define sctp_ssn_peek(asoc, type, sid) \ + ((asoc)->stream##type[sid].ssn) /* Return the next SSN number for this stream. */ -static inline __u16 sctp_ssn_next(struct sctp_stream *stream, __u16 id) -{ - return stream->ssn[id]++; -} +#define sctp_ssn_next(asoc, type, sid) \ + ((asoc)->stream##type[sid].ssn++) /* Skip over this ssn and all below. */ -static inline void sctp_ssn_skip(struct sctp_stream *stream, __u16 id, - __u16 ssn) -{ - stream->ssn[id] = ssn+1; -} +#define sctp_ssn_skip(asoc, type, sid, ssn) \ + ((asoc)->stream##type[sid].ssn = ssn + 1) /* * Pointers to address related SCTP functions. diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 290ec4d..ea03270 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -358,9 +358,6 @@ void sctp_association_free(struct sctp_association *asoc) sctp_tsnmap_free(&asoc->peer.tsn_map); - /* Free ssnmap storage. */ - sctp_ssnmap_free(asoc->ssnmap); - /* Free stream information. */ kfree(asoc->streamout); kfree(asoc->streamin); @@ -1143,8 +1140,6 @@ void sctp_assoc_update(struct sctp_association *asoc, /* Reinitialize SSN for both local streams * and peer's streams. */ - sctp_ssnmap_clear(asoc->ssnmap); - for (i = 0; i < asoc->streamoutcnt; i++) asoc->streamout[i].ssn = 0; @@ -1174,11 +1169,6 @@ void sctp_assoc_update(struct sctp_association *asoc, asoc->ctsn_ack_point = asoc->next_tsn - 1; asoc->adv_peer_ack_point = asoc->ctsn_ack_point; - if (!asoc->ssnmap) { - /* Move the ssnmap. */ - asoc->ssnmap = new->ssnmap; - new->ssnmap = NULL; - } if (!asoc->streamin && !asoc->streamout) { asoc->streamout = new->streamout; diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index eeadeef..78cbd1b 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -1527,7 +1527,6 @@ void sctp_chunk_assign_ssn(struct sctp_chunk *chunk) { struct sctp_datamsg *msg; struct sctp_chunk *lchunk; - struct sctp_stream *stream; __u16 ssn; __u16 sid; @@ -1536,7 +1535,6 @@ void sctp_chunk_assign_ssn(struct sctp_chunk *chunk) /* All fragments will be on the same stream */ sid = ntohs(chunk->subh.data_hdr->stream); - stream = &chunk->asoc->ssnmap->out; /* Now assign the sequence number to the entire message. * All fragments must have the same stream sequence number. @@ -1547,9 +1545,9 @@ void sctp_chunk_assign_ssn(struct sctp_chunk *chunk) ssn = 0; } else { if (lchunk->chunk_hdr->flags & SCTP_DATA_LAST_FRAG) - ssn = sctp_ssn_next(stream, sid); + ssn = sctp_ssn_next(chunk->asoc, out, sid); else - ssn = sctp_ssn_peek(stream, sid); + ssn = sctp_ssn_peek(chunk->asoc, out, sid); } lchunk->subh.data_hdr->ssn = htons(ssn); @@ -2447,11 +2445,6 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk, asoc->streamoutcnt = asoc->c.sinit_num_ostreams; asoc->streamincnt = asoc->c.sinit_max_instreams; - asoc->ssnmap = sctp_ssnmap_new(asoc->c.sinit_max_instreams, - asoc->c.sinit_num_ostreams, gfp); - if (!asoc->ssnmap) - goto clean_up; - asoc->streamout = kcalloc(asoc->streamoutcnt, sizeof(*asoc->streamout), gfp); if (!asoc->streamout) diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 3382ef2..8a130a7 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -6274,9 +6274,8 @@ static int sctp_eat_data(const struct sctp_association *asoc, * and is invalid. */ ssn = ntohs(data_hdr->ssn); - if (ordered && SSN_lt(ssn, sctp_ssn_peek(&asoc->ssnmap->in, sid))) { + if (ordered && SSN_lt(ssn, sctp_ssn_peek(asoc, in, sid))) return SCTP_IERROR_PROTO_VIOLATION; - } /* Send the data up to the user. Note: Schedule the * SCTP_CMD_CHUNK_ULP cmd before the SCTP_CMD_GEN_SACK, as the SACK diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index 84d0fda..0d8bf26 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c @@ -760,11 +760,9 @@ static void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq, struct sk_buff_head *event_list; struct sk_buff *pos, *tmp; struct sctp_ulpevent *cevent; - struct sctp_stream *in; __u16 sid, csid, cssn; sid = event->stream; - in = &ulpq->asoc->ssnmap->in; event_list = (struct sk_buff_head *) sctp_event2skb(event)->prev; @@ -782,11 +780,11 @@ static void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq, if (csid < sid) continue; - if (cssn != sctp_ssn_peek(in, sid)) + if (cssn != sctp_ssn_peek(ulpq->asoc, in, sid)) break; - /* Found it, so mark in the ssnmap. */ - sctp_ssn_next(in, sid); + /* Found it, so mark in stream array. */ + sctp_ssn_next(ulpq->asoc, in, sid); __skb_unlink(pos, &ulpq->lobby); @@ -849,7 +847,6 @@ static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) { __u16 sid, ssn; - struct sctp_stream *in; /* Check if this message needs ordering. */ if (SCTP_DATA_UNORDERED & event->msg_flags) @@ -858,10 +855,9 @@ static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq, /* Note: The stream ID must be verified before this routine. */ sid = event->stream; ssn = event->ssn; - in = &ulpq->asoc->ssnmap->in; /* Is this the expected SSN for this stream ID? */ - if (ssn != sctp_ssn_peek(in, sid)) { + if (ssn != sctp_ssn_peek(ulpq->asoc, in, sid)) { /* We've received something out of order, so find where it * needs to be placed. We order by stream and then by SSN. */ @@ -870,7 +866,7 @@ static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq, } /* Mark that the next chunk has been found. */ - sctp_ssn_next(in, sid); + sctp_ssn_next(ulpq->asoc, in, sid); /* Go find any other chunks that were waiting for * ordering. @@ -888,13 +884,10 @@ static void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) struct sk_buff *pos, *tmp; struct sctp_ulpevent *cevent; struct sctp_ulpevent *event; - struct sctp_stream *in; struct sk_buff_head temp; struct sk_buff_head *lobby = &ulpq->lobby; __u16 csid, cssn; - in = &ulpq->asoc->ssnmap->in; - /* We are holding the chunks by stream, by SSN. */ skb_queue_head_init(&temp); event = NULL; @@ -912,7 +905,7 @@ static void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) continue; /* see if this ssn has been marked by skipping */ - if (!SSN_lt(cssn, sctp_ssn_peek(in, csid))) + if (!SSN_lt(cssn, sctp_ssn_peek(ulpq->asoc, in, csid))) break; __skb_unlink(pos, lobby); @@ -932,8 +925,9 @@ static void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) csid = cevent->stream; cssn = cevent->ssn; - if (csid == sid && cssn == sctp_ssn_peek(in, csid)) { - sctp_ssn_next(in, csid); + if (csid == sid && + cssn == sctp_ssn_peek(ulpq->asoc, in, csid)) { + sctp_ssn_next(ulpq->asoc, in, csid); __skb_unlink(pos, lobby); __skb_queue_tail(&temp, pos); event = sctp_skb2event(pos); @@ -955,17 +949,12 @@ static void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) */ void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn) { - struct sctp_stream *in; - - /* Note: The stream ID must be verified before this routine. */ - in = &ulpq->asoc->ssnmap->in; - /* Is this an old SSN? If so ignore. */ - if (SSN_lt(ssn, sctp_ssn_peek(in, sid))) + if (SSN_lt(ssn, sctp_ssn_peek(ulpq->asoc, in, sid))) return; /* Mark that we are no longer expecting this SSN or lower. */ - sctp_ssn_skip(in, sid, ssn); + sctp_ssn_skip(ulpq->asoc, in, sid, ssn); /* Go find any other chunks that were waiting for * ordering and deliver them if needed. -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html