diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2010-06-08 20:05:18 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2010-06-08 20:05:18 -0400 |
commit | 44b56603c4c476b845a824cff6fe905c6268b2a1 (patch) | |
tree | b7e792414fef2390718a657765719fbbb529ce84 /net/sctp/input.c | |
parent | c3935e30495869dd611e1cd62253c94ebc7c6c04 (diff) | |
parent | b160fdabe93a8a53094f90f02bf4dcb500782aab (diff) | |
download | kernel-crypto-44b56603c4c476b845a824cff6fe905c6268b2a1.tar.gz kernel-crypto-44b56603c4c476b845a824cff6fe905c6268b2a1.tar.xz kernel-crypto-44b56603c4c476b845a824cff6fe905c6268b2a1.zip |
Merge branch 'for-2.6.34-incoming' into for-2.6.35-incoming
Diffstat (limited to 'net/sctp/input.c')
-rw-r--r-- | net/sctp/input.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index 2a570184e5a..ea2192444ce 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -440,11 +440,25 @@ void sctp_icmp_proto_unreachable(struct sock *sk, { SCTP_DEBUG_PRINTK("%s\n", __func__); - sctp_do_sm(SCTP_EVENT_T_OTHER, - SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH), - asoc->state, asoc->ep, asoc, t, - GFP_ATOMIC); + if (sock_owned_by_user(sk)) { + if (timer_pending(&t->proto_unreach_timer)) + return; + else { + if (!mod_timer(&t->proto_unreach_timer, + jiffies + (HZ/20))) + sctp_association_hold(asoc); + } + + } else { + if (timer_pending(&t->proto_unreach_timer) && + del_timer(&t->proto_unreach_timer)) + sctp_association_put(asoc); + sctp_do_sm(SCTP_EVENT_T_OTHER, + SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH), + asoc->state, asoc->ep, asoc, t, + GFP_ATOMIC); + } } /* Common lookup code for icmp/icmpv6 error handler. */ |