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>
This commit is contained in:
committed by
David S. Miller
parent
96070ae4d0
commit
196d675934
@@ -311,6 +311,8 @@ static sctp_xmit_t __sctp_packet_append_chunk(struct sctp_packet *packet,
|
||||
|
||||
case SCTP_CID_SACK:
|
||||
packet->has_sack = 1;
|
||||
if (chunk->asoc)
|
||||
chunk->asoc->stats.osacks++;
|
||||
break;
|
||||
|
||||
case SCTP_CID_AUTH:
|
||||
@@ -584,11 +586,13 @@ int sctp_packet_transmit(struct sctp_packet *packet)
|
||||
*/
|
||||
|
||||
/* Dump that on IP! */
|
||||
if (asoc && asoc->peer.last_sent_to != tp) {
|
||||
/* Considering the multiple CPU scenario, this is a
|
||||
* "correcter" place for last_sent_to. --xguo
|
||||
*/
|
||||
asoc->peer.last_sent_to = tp;
|
||||
if (asoc) {
|
||||
asoc->stats.opackets++;
|
||||
if (asoc->peer.last_sent_to != tp)
|
||||
/* Considering the multiple CPU scenario, this is a
|
||||
* "correcter" place for last_sent_to. --xguo
|
||||
*/
|
||||
asoc->peer.last_sent_to = tp;
|
||||
}
|
||||
|
||||
if (has_data) {
|
||||
|
||||
Reference in New Issue
Block a user