diff options
author | Michele Baldessari <michele@acksyn.org> | 2012-11-30 23:49:42 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-03 13:32:15 -0500 |
commit | 196d67593439b03088913227093e374235596e33 (patch) | |
tree | d8d1580673e3cf878d6db230bf86b71187bf3550 /net/sctp/associola.c | |
parent | 96070ae4d08eefe62ac534904ce21a01e1a5c9c4 (diff) |
sctp: Add support to per-association statistics via a new SCTP_GET_ASSOC_STATS call
The current SCTP stack is lacking a mechanism to have per association
statistics. This is an implementation modeled after OpenSolaris'
SCTP_GET_ASSOC_STATS.
Userspace part will follow on lksctp if/when there is a general ACK on
this.
V4:
- Move ipackets++ before q->immediate.func() for consistency reasons
- Move sctp_max_rto() at the end of sctp_transport_update_rto() to avoid
returning bogus RTO values
- return asoc->rto_min when max_obs_rto value has not changed
V3:
- Increase ictrlchunks in sctp_assoc_bh_rcv() as well
- Move ipackets++ to sctp_inq_push()
- return 0 when no rto updates took place since the last call
V2:
- Implement partial retrieval of stat struct to cope for future expansion
- Kill the rtxpackets counter as it cannot be precise anyway
- Rename outseqtsns to outofseqtsns to make it clearer that these are out
of sequence unexpected TSNs
- Move asoc->ipackets++ under a lock to avoid potential miscounts
- Fold asoc->opackets++ into the already existing asoc check
- Kill unneeded (q->asoc) test when increasing rtxchunks
- Do not count octrlchunks if sending failed (SCTP_XMIT_OK != 0)
- Don't count SHUTDOWNs as SACKs
- Move SCTP_GET_ASSOC_STATS to the private space API
- Adjust the len check in sctp_getsockopt_assoc_stats() to allow for
future struct growth
- Move association statistics in their own struct
- Update idupchunks when we send a SACK with dup TSNs
- return min_rto in max_rto when RTO has not changed. Also return the
transport when max_rto last changed.
Signed-off: Michele Baldessari <michele@acksyn.org>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/associola.c')
-rw-r--r-- | net/sctp/associola.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index b1ef3bc301a5..ba3f9cc4c047 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -321,6 +321,9 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a | |||
321 | asoc->default_timetolive = sp->default_timetolive; | 321 | asoc->default_timetolive = sp->default_timetolive; |
322 | asoc->default_rcv_context = sp->default_rcv_context; | 322 | asoc->default_rcv_context = sp->default_rcv_context; |
323 | 323 | ||
324 | /* SCTP_GET_ASSOC_STATS COUNTERS */ | ||
325 | memset(&asoc->stats, 0, sizeof(struct sctp_priv_assoc_stats)); | ||
326 | |||
324 | /* AUTH related initializations */ | 327 | /* AUTH related initializations */ |
325 | INIT_LIST_HEAD(&asoc->endpoint_shared_keys); | 328 | INIT_LIST_HEAD(&asoc->endpoint_shared_keys); |
326 | err = sctp_auth_asoc_copy_shkeys(ep, asoc, gfp); | 329 | err = sctp_auth_asoc_copy_shkeys(ep, asoc, gfp); |
@@ -760,6 +763,7 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, | |||
760 | 763 | ||
761 | /* Set the transport's RTO.initial value */ | 764 | /* Set the transport's RTO.initial value */ |
762 | peer->rto = asoc->rto_initial; | 765 | peer->rto = asoc->rto_initial; |
766 | sctp_max_rto(asoc, peer); | ||
763 | 767 | ||
764 | /* Set the peer's active state. */ | 768 | /* Set the peer's active state. */ |
765 | peer->state = peer_state; | 769 | peer->state = peer_state; |
@@ -1152,8 +1156,12 @@ static void sctp_assoc_bh_rcv(struct work_struct *work) | |||
1152 | */ | 1156 | */ |
1153 | if (sctp_chunk_is_data(chunk)) | 1157 | if (sctp_chunk_is_data(chunk)) |
1154 | asoc->peer.last_data_from = chunk->transport; | 1158 | asoc->peer.last_data_from = chunk->transport; |
1155 | else | 1159 | else { |
1156 | SCTP_INC_STATS(net, SCTP_MIB_INCTRLCHUNKS); | 1160 | SCTP_INC_STATS(net, SCTP_MIB_INCTRLCHUNKS); |
1161 | asoc->stats.ictrlchunks++; | ||
1162 | if (chunk->chunk_hdr->type == SCTP_CID_SACK) | ||
1163 | asoc->stats.isacks++; | ||
1164 | } | ||
1157 | 1165 | ||
1158 | if (chunk->transport) | 1166 | if (chunk->transport) |
1159 | chunk->transport->last_time_heard = jiffies; | 1167 | chunk->transport->last_time_heard = jiffies; |