summaryrefslogtreecommitdiffstats
path: root/net/sctp/input.c
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2010-06-08 20:05:18 -0400
committerJ. Bruce Fields <bfields@citi.umich.edu>2010-06-08 20:05:18 -0400
commit44b56603c4c476b845a824cff6fe905c6268b2a1 (patch)
treeb7e792414fef2390718a657765719fbbb529ce84 /net/sctp/input.c
parentc3935e30495869dd611e1cd62253c94ebc7c6c04 (diff)
parentb160fdabe93a8a53094f90f02bf4dcb500782aab (diff)
downloadkernel-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.c22
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. */