diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-11 10:11:40 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-11 10:11:40 -0700 | 
| commit | 9fc282baa8f743a7049e301d13cf9968ee95a91c (patch) | |
| tree | d34e827ed35c21b98eb4e3d4c3731d1da54fa03a /net/sctp/sm_sideeffect.c | |
| parent | c61ea31dac0319ec64b33725917bda81fc293a25 (diff) | |
| parent | de02d72bb3cc5b3d4c873db4ca8291723dd48479 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
  net: Fix FDDI and TR config checks in ipv4 arp and LLC.
  IPv4: unresolved multicast route cleanup
  mac80211: remove association work when processing deauth request
  ar9170: wait for asynchronous firmware loading
  ipv4: udp: fix short packet and bad checksum logging
  phy: Fix initialization in micrel driver.
  sctp: Fix a race between ICMP protocol unreachable and connect()
  veth: Dont kfree_skb() after dev_forward_skb()
  IPv6: fix IPV6_RECVERR handling of locally-generated errors
  net/gianfar: drop recycled skbs on MTU change
  iwlwifi: work around passive scan issue
Diffstat (limited to 'net/sctp/sm_sideeffect.c')
| -rw-r--r-- | net/sctp/sm_sideeffect.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index d5ae450b6f02..eb1f42f45fdd 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -397,6 +397,41 @@ out_unlock:  	sctp_transport_put(transport);  } +/* Handle the timeout of the ICMP protocol unreachable timer.  Trigger + * the correct state machine transition that will close the association. + */ +void sctp_generate_proto_unreach_event(unsigned long data) +{ +	struct sctp_transport *transport = (struct sctp_transport *) data; +	struct sctp_association *asoc = transport->asoc; +	 +	sctp_bh_lock_sock(asoc->base.sk); +	if (sock_owned_by_user(asoc->base.sk)) { +		SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __func__); + +		/* Try again later.  */ +		if (!mod_timer(&transport->proto_unreach_timer, +				jiffies + (HZ/20))) +			sctp_association_hold(asoc); +		goto out_unlock; +	} + +	/* Is this structure just waiting around for us to actually +	 * get destroyed? +	 */ +	if (asoc->base.dead) +		goto out_unlock; + +	sctp_do_sm(SCTP_EVENT_T_OTHER, +		   SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH), +		   asoc->state, asoc->ep, asoc, transport, GFP_ATOMIC); + +out_unlock: +	sctp_bh_unlock_sock(asoc->base.sk); +	sctp_association_put(asoc); +} + +  /* Inject a SACK Timeout event into the state machine.  */  static void sctp_generate_sack_event(unsigned long data)  {  | 
