Commit 02015180 authored by Vlad Yasevich's avatar Vlad Yasevich Committed by David S. Miller

sctp: shrink sctp_tsnmap some more by removing gabs array

The gabs array in the sctp_tsnmap structure is only used
in one place, sctp_make_sack().  As such, carrying the
array around in the sctp_tsnmap and thus directly in
the sctp_association is rather pointless since most
of the time it's just taking up space.  Now, let
sctp_make_sack create and populate it and then throw
it away when it's done.
Signed-off-by: default avatarVlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8e1ee18c
...@@ -94,11 +94,8 @@ struct sctp_tsnmap { ...@@ -94,11 +94,8 @@ struct sctp_tsnmap {
* every SACK. Store up to SCTP_MAX_DUP_TSNS worth of * every SACK. Store up to SCTP_MAX_DUP_TSNS worth of
* information. * information.
*/ */
__be32 dup_tsns[SCTP_MAX_DUP_TSNS];
__u16 num_dup_tsns; __u16 num_dup_tsns;
__be32 dup_tsns[SCTP_MAX_DUP_TSNS];
/* Record gap ack block information here. */
struct sctp_gap_ack_block gabs[SCTP_MAX_GABS];
}; };
struct sctp_tsnmap_iter { struct sctp_tsnmap_iter {
...@@ -151,17 +148,12 @@ static inline __be32 *sctp_tsnmap_get_dups(struct sctp_tsnmap *map) ...@@ -151,17 +148,12 @@ static inline __be32 *sctp_tsnmap_get_dups(struct sctp_tsnmap *map)
} }
/* How many gap ack blocks do we have recorded? */ /* How many gap ack blocks do we have recorded? */
__u16 sctp_tsnmap_num_gabs(struct sctp_tsnmap *map); __u16 sctp_tsnmap_num_gabs(struct sctp_tsnmap *map,
struct sctp_gap_ack_block *gabs);
/* Refresh the count on pending data. */ /* Refresh the count on pending data. */
__u16 sctp_tsnmap_pending(struct sctp_tsnmap *map); __u16 sctp_tsnmap_pending(struct sctp_tsnmap *map);
/* Return pointer to gap ack blocks as needed by SACK. */
static inline struct sctp_gap_ack_block *sctp_tsnmap_get_gabs(struct sctp_tsnmap *map)
{
return map->gabs;
}
/* Is there a gap in the TSN map? */ /* Is there a gap in the TSN map? */
static inline int sctp_tsnmap_has_gap(const struct sctp_tsnmap *map) static inline int sctp_tsnmap_has_gap(const struct sctp_tsnmap *map)
{ {
......
...@@ -702,12 +702,14 @@ struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc) ...@@ -702,12 +702,14 @@ struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc)
__u32 ctsn; __u32 ctsn;
__u16 num_gabs, num_dup_tsns; __u16 num_gabs, num_dup_tsns;
struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map; struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
struct sctp_gap_ack_block gabs[SCTP_MAX_GABS];
memset(gabs, 0, sizeof(gabs));
ctsn = sctp_tsnmap_get_ctsn(map); ctsn = sctp_tsnmap_get_ctsn(map);
SCTP_DEBUG_PRINTK("sackCTSNAck sent: 0x%x.\n", ctsn); SCTP_DEBUG_PRINTK("sackCTSNAck sent: 0x%x.\n", ctsn);
/* How much room is needed in the chunk? */ /* How much room is needed in the chunk? */
num_gabs = sctp_tsnmap_num_gabs(map); num_gabs = sctp_tsnmap_num_gabs(map, gabs);
num_dup_tsns = sctp_tsnmap_num_dups(map); num_dup_tsns = sctp_tsnmap_num_dups(map);
/* Initialize the SACK header. */ /* Initialize the SACK header. */
...@@ -763,7 +765,7 @@ struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc) ...@@ -763,7 +765,7 @@ struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc)
/* Add the gap ack block information. */ /* Add the gap ack block information. */
if (num_gabs) if (num_gabs)
sctp_addto_chunk(retval, sizeof(__u32) * num_gabs, sctp_addto_chunk(retval, sizeof(__u32) * num_gabs,
sctp_tsnmap_get_gabs(map)); gabs);
/* Add the duplicate TSN information. */ /* Add the duplicate TSN information. */
if (num_dup_tsns) if (num_dup_tsns)
......
...@@ -335,10 +335,11 @@ void sctp_tsnmap_renege(struct sctp_tsnmap *map, __u32 tsn) ...@@ -335,10 +335,11 @@ void sctp_tsnmap_renege(struct sctp_tsnmap *map, __u32 tsn)
} }
/* How many gap ack blocks do we have recorded? */ /* How many gap ack blocks do we have recorded? */
__u16 sctp_tsnmap_num_gabs(struct sctp_tsnmap *map) __u16 sctp_tsnmap_num_gabs(struct sctp_tsnmap *map,
struct sctp_gap_ack_block *gabs)
{ {
struct sctp_tsnmap_iter iter; struct sctp_tsnmap_iter iter;
int gabs = 0; int ngaps = 0;
/* Refresh the gap ack information. */ /* Refresh the gap ack information. */
if (sctp_tsnmap_has_gap(map)) { if (sctp_tsnmap_has_gap(map)) {
...@@ -348,14 +349,14 @@ __u16 sctp_tsnmap_num_gabs(struct sctp_tsnmap *map) ...@@ -348,14 +349,14 @@ __u16 sctp_tsnmap_num_gabs(struct sctp_tsnmap *map)
&start, &start,
&end)) { &end)) {
map->gabs[gabs].start = htons(start); gabs[ngaps].start = htons(start);
map->gabs[gabs].end = htons(end); gabs[ngaps].end = htons(end);
gabs++; ngaps++;
if (gabs >= SCTP_MAX_GABS) if (ngaps >= SCTP_MAX_GABS)
break; break;
} }
} }
return gabs; return ngaps;
} }
static int sctp_tsnmap_grow(struct sctp_tsnmap *map, u16 gap) static int sctp_tsnmap_grow(struct sctp_tsnmap *map, u16 gap)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment