From: Neil Horman <nhorman@redhat.com> Date: Fri, 8 Aug 2008 09:05:42 -0400 Subject: [net] sctp: export needed data to implement RFC 3873 Message-id: 20080808130542.GD25063@hmsendeavour.rdu.redhat.com O-Subject: Re: [RHEL 5.3 PATCH] export needed sctp data to implement RFC 3873 (bz 277111) Bugzilla: 277111 RH-Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> RH-Acked-by: Rik van Riel <riel@redhat.com> RH-Acked-by: David S. Miller <davem@redhat.com> Hey all- backport of upstream patch to export data needed to implement RFC 3873. Satisfies bz 277111. Regards Neil diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index aa29ce1..97f6fe0 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -1570,6 +1570,9 @@ struct sctp_association { /* Transport to which SHUTDOWN chunk was last sent. */ struct sctp_transport *shutdown_last_sent_to; + /* How many times have we resent a SHUTDOWN */ + int shutdown_retries; + /* Transport to which INIT chunk was last sent. */ struct sctp_transport *init_last_sent_to; @@ -1604,6 +1607,11 @@ struct sctp_association { */ __u16 unack_data; + /* The total number of data chunks that we've had to retransmit + * as the result of a T3 timer expiration + */ + __u32 rtx_data_chunks; + /* This is the association's receive buffer space. This value is used * to set a_rwnd field in an INIT or a SACK chunk. */ diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 30b710c..302b731 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c @@ -473,6 +473,8 @@ void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, */ if (transport == transport->asoc->peer.retran_path) sctp_assoc_update_retran_path(transport->asoc); + transport->asoc->rtx_data_chunks += + transport->asoc->unack_data; break; case SCTP_RTXR_FAST_RTX: sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX); diff --git a/net/sctp/proc.c b/net/sctp/proc.c index 00a79ec..53102a7 100644 --- a/net/sctp/proc.c +++ b/net/sctp/proc.c @@ -286,8 +286,10 @@ static void * sctp_assocs_seq_start(struct seq_file *seq, loff_t *pos) *pos = 0; if (*pos == 0) - seq_printf(seq, " ASSOC SOCK STY SST ST HBKT ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT " - "RPORT LADDRS <-> RADDRS\n"); + seq_printf(seq, " ASSOC SOCK STY SST ST HBKT " + "ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT " + "RPORT LADDRS <-> RADDRS " + "HBINT INS OUTS MAXRT T1X T2X RTXC\n"); return (void *)pos; } @@ -325,9 +327,11 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v) assoc = sctp_assoc(epb); sk = epb->sk; seq_printf(seq, - "%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ", + "%8p %8p %-3d %-3d %-2d %-4d " + "%4d %8d %8d %7d %5lu %-5d %5d ", assoc, sk, sctp_sk(sk)->type, sk->sk_state, - assoc->state, hash, assoc->assoc_id, + assoc->state, hash, + assoc->assoc_id, (sk->sk_rcvbuf - assoc->rwnd), assoc->sndbuf_used, sock_i_uid(sk), sock_i_ino(sk), @@ -338,6 +342,12 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v) sctp_seq_dump_local_addrs(seq, epb); seq_printf(seq, "<-> "); sctp_seq_dump_remote_addrs(seq, assoc); + seq_printf(seq, "\t%8lu %5d %5d %4d %4d %4d %8d", + assoc->hbinterval, assoc->c.sinit_max_instreams, + assoc->c.sinit_num_ostreams, assoc->max_retrans, + assoc->init_retries, assoc->shutdown_retries, + assoc->rtx_data_chunks); + seq_printf(seq, "\n"); } read_unlock(&head->lock); diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 5945077..541f828 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -2133,6 +2133,8 @@ static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep, return SCTP_DISPOSITION_DELETE_TCB; } + ((struct sctp_association *)asoc)->init_retries++; + err = (sctp_errhdr_t *)(chunk->skb->data); /* When calculating the time extension, an implementation