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: Vlad Yasevich <vladislav.yasevich@hp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
8e1ee18c33
commit
02015180e2
@@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
__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)
|
|||||||
/* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
&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)
|
||||||
|
Reference in New Issue
Block a user