diff options
-rw-r--r-- | include/net/sctp/structs.h | 1 | ||||
-rw-r--r-- | net/sctp/associola.c | 9 | ||||
-rw-r--r-- | net/sctp/transport.c | 32 |
3 files changed, 42 insertions, 0 deletions
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 31a8e88f1a74..f431acf3dcea 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
@@ -1002,6 +1002,7 @@ void sctp_transport_update_rto(struct sctp_transport *, __u32); | |||
1002 | void sctp_transport_raise_cwnd(struct sctp_transport *, __u32, __u32); | 1002 | void sctp_transport_raise_cwnd(struct sctp_transport *, __u32, __u32); |
1003 | void sctp_transport_lower_cwnd(struct sctp_transport *, sctp_lower_cwnd_t); | 1003 | void sctp_transport_lower_cwnd(struct sctp_transport *, sctp_lower_cwnd_t); |
1004 | unsigned long sctp_transport_timeout(struct sctp_transport *); | 1004 | unsigned long sctp_transport_timeout(struct sctp_transport *); |
1005 | void sctp_transport_reset(struct sctp_transport *); | ||
1005 | 1006 | ||
1006 | 1007 | ||
1007 | /* This is the structure we use to queue packets as they come into | 1008 | /* This is the structure we use to queue packets as they come into |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 2505cd3b8d29..78d2ddb5ca18 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -1046,6 +1046,9 @@ void sctp_assoc_update(struct sctp_association *asoc, | |||
1046 | trans = list_entry(pos, struct sctp_transport, transports); | 1046 | trans = list_entry(pos, struct sctp_transport, transports); |
1047 | if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) | 1047 | if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) |
1048 | sctp_assoc_del_peer(asoc, &trans->ipaddr); | 1048 | sctp_assoc_del_peer(asoc, &trans->ipaddr); |
1049 | |||
1050 | if (asoc->state >= SCTP_STATE_ESTABLISHED) | ||
1051 | sctp_transport_reset(trans); | ||
1049 | } | 1052 | } |
1050 | 1053 | ||
1051 | /* If the case is A (association restart), use | 1054 | /* If the case is A (association restart), use |
@@ -1069,6 +1072,12 @@ void sctp_assoc_update(struct sctp_association *asoc, | |||
1069 | */ | 1072 | */ |
1070 | sctp_ulpq_flush(&asoc->ulpq); | 1073 | sctp_ulpq_flush(&asoc->ulpq); |
1071 | 1074 | ||
1075 | /* reset the overall association error count so | ||
1076 | * that the restarted association doesn't get torn | ||
1077 | * down on the next retransmission timer. | ||
1078 | */ | ||
1079 | asoc->overall_error_count = 0; | ||
1080 | |||
1072 | } else { | 1081 | } else { |
1073 | /* Add any peer addresses from the new association. */ | 1082 | /* Add any peer addresses from the new association. */ |
1074 | list_for_each(pos, &new->peer.transport_addr_list) { | 1083 | list_for_each(pos, &new->peer.transport_addr_list) { |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index a596f5308cb1..c4699f5c409d 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
@@ -526,3 +526,35 @@ unsigned long sctp_transport_timeout(struct sctp_transport *t) | |||
526 | timeout += jiffies; | 526 | timeout += jiffies; |
527 | return timeout; | 527 | return timeout; |
528 | } | 528 | } |
529 | |||
530 | /* Reset transport variables to their initial values */ | ||
531 | void sctp_transport_reset(struct sctp_transport *t) | ||
532 | { | ||
533 | struct sctp_association *asoc = t->asoc; | ||
534 | |||
535 | /* RFC 2960 (bis), Section 5.2.4 | ||
536 | * All the congestion control parameters (e.g., cwnd, ssthresh) | ||
537 | * related to this peer MUST be reset to their initial values | ||
538 | * (see Section 6.2.1) | ||
539 | */ | ||
540 | t->cwnd = min(4*asoc->pathmtu, max_t(__u32, 2*asoc->pathmtu, 4380)); | ||
541 | t->ssthresh = SCTP_DEFAULT_MAXWINDOW; | ||
542 | t->rto = asoc->rto_initial; | ||
543 | t->rtt = 0; | ||
544 | t->srtt = 0; | ||
545 | t->rttvar = 0; | ||
546 | |||
547 | /* Reset these additional varibles so that we have a clean | ||
548 | * slate. | ||
549 | */ | ||
550 | t->partial_bytes_acked = 0; | ||
551 | t->flight_size = 0; | ||
552 | t->error_count = 0; | ||
553 | t->rto_pending = 0; | ||
554 | |||
555 | /* Initialize the state information for SFR-CACC */ | ||
556 | t->cacc.changeover_active = 0; | ||
557 | t->cacc.cycling_changeover = 0; | ||
558 | t->cacc.next_tsn_at_change = 0; | ||
559 | t->cacc.cacc_saw_newack = 0; | ||
560 | } | ||