aboutsummaryrefslogtreecommitdiff
path: root/net/sctp/associola.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-22 19:34:09 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-22 19:34:09 -0700
commitd6e8823e7bf423c6850c68f716d2f5f693c97447 (patch)
treedafa7c94a3acbb432271ac6c80f2fc7256b2d887 /net/sctp/associola.c
parentf64cd9de37bfd97c8d23a05a9f50759ff7195212 (diff)
parent848c29fd648e78fa87d0e399223826ce5dfc1b7a (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [NETFILTER]: nat: avoid rerouting packets if only XFRM policy key changed [NETFILTER]: nf_conntrack_netlink: add missing dependency on NF_NAT [NET]: fix up misplaced inlines. [SCTP]: Correctly reset ssthresh when restarting association [BRIDGE]: Fix fdb RCU race [NET]: Fix fib_rules dump race [XFRM]: ipsecv6 needs a space when printing audit record. [X25] x25_forward_call(): fix NULL dereferences [SCTP]: Reset some transport and association variables on restart [SCTP]: Increment error counters on user requested HBs. [SCTP]: Clean up stale data during association restart [IrDA]: Calling ppp_unregister_channel() from process context [IrDA]: irttp_dup spin_lock initialisation [IrDA]: Delay needed when uploading firmware chunks
Diffstat (limited to 'net/sctp/associola.c')
-rw-r--r--net/sctp/associola.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c
index fa82b73c965..78d2ddb5ca1 100644
--- a/net/sctp/associola.c
+++ b/net/sctp/associola.c
@@ -1046,6 +1046,9 @@ void sctp_assoc_update(struct sctp_association *asoc,
trans = list_entry(pos, struct sctp_transport, transports);
if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr))
sctp_assoc_del_peer(asoc, &trans->ipaddr);
+
+ if (asoc->state >= SCTP_STATE_ESTABLISHED)
+ sctp_transport_reset(trans);
}
/* If the case is A (association restart), use
@@ -1063,6 +1066,18 @@ void sctp_assoc_update(struct sctp_association *asoc,
*/
sctp_ssnmap_clear(asoc->ssnmap);
+ /* Flush the ULP reassembly and ordered queue.
+ * Any data there will now be stale and will
+ * cause problems.
+ */
+ sctp_ulpq_flush(&asoc->ulpq);
+
+ /* reset the overall association error count so
+ * that the restarted association doesn't get torn
+ * down on the next retransmission timer.
+ */
+ asoc->overall_error_count = 0;
+
} else {
/* Add any peer addresses from the new association. */
list_for_each(pos, &new->peer.transport_addr_list) {