summaryrefslogtreecommitdiff
path: root/net/sctp/sm_make_chunk.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sctp/sm_make_chunk.c')
-rw-r--r--net/sctp/sm_make_chunk.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index 487221d46a65..0677dbbbd802 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -222,9 +222,7 @@ sctp_chunk_t *sctp_make_init(const sctp_association_t *asoc,
sctp_addto_chunk(retval, sizeof(sctp_paramhdr_t), &sat_param);
sctp_addto_chunk(retval, sizeof(sat_addr_types), sat_addr_types);
-
sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
-
nodata:
if (addrs.v)
kfree(addrs.v);
@@ -245,7 +243,8 @@ sctp_chunk_t *sctp_make_init_ack(const sctp_association_t *asoc,
retval = NULL;
- addrs = sctp_bind_addrs_to_raw(&asoc->base.bind_addr, &addrs_len, priority);
+ addrs = sctp_bind_addrs_to_raw(&asoc->base.bind_addr, &addrs_len,
+ priority);
if (!addrs.v)
goto nomem_rawaddr;
@@ -586,14 +585,12 @@ sctp_chunk_t *sctp_make_sack(const sctp_association_t *asoc)
sctp_gap_ack_block_t gab;
int length;
__u32 ctsn;
- sctp_tsnmap_iter_t iter;
- __u16 num_gabs;
- __u16 num_dup_tsns = asoc->peer.next_dup_tsn;
- const sctp_tsnmap_t *map = &asoc->peer.tsn_map;
+ struct sctp_tsnmap_iter iter;
+ __u16 num_gabs, num_dup_tsns;
+ struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
ctsn = sctp_tsnmap_get_ctsn(map);
- SCTP_DEBUG_PRINTK("make_sack: sackCTSNAck sent is 0x%x.\n",
- ctsn);
+ SCTP_DEBUG_PRINTK("sackCTSNAck sent is 0x%x.\n", ctsn);
/* Count the number of Gap Ack Blocks. */
sctp_tsnmap_iter_init(map, &iter);
@@ -603,15 +600,17 @@ sctp_chunk_t *sctp_make_sack(const sctp_association_t *asoc)
/* Do nothing. */
}
+ num_dup_tsns = sctp_tsnmap_num_dups(map);
+
/* Initialize the SACK header. */
sack.cum_tsn_ack = htonl(ctsn);
sack.a_rwnd = htonl(asoc->rwnd);
sack.num_gap_ack_blocks = htons(num_gabs);
- sack.num_dup_tsns = htons(num_dup_tsns);
+ sack.num_dup_tsns = htons(num_dup_tsns);
length = sizeof(sack)
+ sizeof(sctp_gap_ack_block_t) * num_gabs
- + sizeof(sctp_dup_tsn_t) * num_dup_tsns;
+ + sizeof(__u32) * num_dup_tsns;
/* Create the chunk. */
retval = sctp_make_chunk(asoc, SCTP_CID_SACK, 0, length);
@@ -658,21 +657,18 @@ sctp_chunk_t *sctp_make_sack(const sctp_association_t *asoc)
while(sctp_tsnmap_next_gap_ack(map, &iter, &gab.start, &gab.end)) {
gab.start = htons(gab.start);
gab.end = htons(gab.end);
- sctp_addto_chunk(retval,
- sizeof(sctp_gap_ack_block_t),
- &gab);
+ sctp_addto_chunk(retval, sizeof(sctp_gap_ack_block_t), &gab);
}
/* Register the duplicates. */
- sctp_addto_chunk(retval,
- sizeof(sctp_dup_tsn_t) * num_dup_tsns,
- &asoc->peer.dup_tsns);
+ sctp_addto_chunk(retval, sizeof(__u32) * num_dup_tsns,
+ sctp_tsnmap_get_dups(map));
nodata:
return retval;
}
-/* FIXME: Comments. */
+/* Make a SHUTDOWN chunk. */
sctp_chunk_t *sctp_make_shutdown(const sctp_association_t *asoc)
{
sctp_chunk_t *retval;
@@ -689,7 +685,6 @@ sctp_chunk_t *sctp_make_shutdown(const sctp_association_t *asoc)
retval->subh.shutdown_hdr =
sctp_addto_chunk(retval, sizeof(shut), &shut);
-
nodata:
return retval;
}
@@ -1180,6 +1175,9 @@ int sctp_datachunks_from_user(sctp_association_t *asoc,
over = msg_len % max;
offset = 0;
+ if (whole && over)
+ SCTP_INC_STATS_USER(SctpFragUsrMsgs);
+
/* Create chunks for all the full sized DATA chunks. */
for (i=0, len=first_len; i < whole; i++) {
frag = SCTP_DATA_MIDDLE_FRAG;