diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-07-30 18:14:15 -0400 | 
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-07-30 18:14:15 -0400 | 
| commit | a670fcb43f01a67ef56176afc76e5d43d128b25c (patch) | |
| tree | 09c9411c78a33ff980e9ea871bc7686e7589abbf /net/sctp/input.c | |
| parent | 327309e899662b482c58cf25f574513d38b5788c (diff) | |
| parent | b0825488a642cadcf39709961dde61440cb0731c (diff) | |
/spare/repo/netdev-2.6 branch 'master'
Diffstat (limited to 'net/sctp/input.c')
| -rw-r--r-- | net/sctp/input.c | 45 | 
1 files changed, 12 insertions, 33 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index 5e085e041a6..742be9171b7 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -351,7 +351,6 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,   *   */  void sctp_icmp_proto_unreachable(struct sock *sk, -                           struct sctp_endpoint *ep,                             struct sctp_association *asoc,                             struct sctp_transport *t)  { @@ -367,7 +366,6 @@ void sctp_icmp_proto_unreachable(struct sock *sk,  /* Common lookup code for icmp/icmpv6 error handler. */  struct sock *sctp_err_lookup(int family, struct sk_buff *skb,  			     struct sctphdr *sctphdr, -			     struct sctp_endpoint **epp,  			     struct sctp_association **app,  			     struct sctp_transport **tpp)  { @@ -375,11 +373,10 @@ struct sock *sctp_err_lookup(int family, struct sk_buff *skb,  	union sctp_addr daddr;  	struct sctp_af *af;  	struct sock *sk = NULL; -	struct sctp_endpoint *ep = NULL;  	struct sctp_association *asoc = NULL;  	struct sctp_transport *transport = NULL; -	*app = NULL; *epp = NULL; *tpp = NULL; +	*app = NULL; *tpp = NULL;  	af = sctp_get_af_specific(family);  	if (unlikely(!af)) { @@ -394,26 +391,15 @@ struct sock *sctp_err_lookup(int family, struct sk_buff *skb,  	 * packet.  	 */  	asoc = __sctp_lookup_association(&saddr, &daddr, &transport); -	if (!asoc) { -		/* If there is no matching association, see if it matches any -		 * endpoint. This may happen for an ICMP error generated in -		 * response to an INIT_ACK. -		 */ -		ep = __sctp_rcv_lookup_endpoint(&daddr); -		if (!ep) { -			return NULL; -		} -	} +	if (!asoc) +		return NULL; -	if (asoc) { -		sk = asoc->base.sk; +	sk = asoc->base.sk; -		if (ntohl(sctphdr->vtag) != asoc->c.peer_vtag) { -			ICMP_INC_STATS_BH(ICMP_MIB_INERRORS); -			goto out; -		} -	} else -		sk = ep->base.sk; +	if (ntohl(sctphdr->vtag) != asoc->c.peer_vtag) { +		ICMP_INC_STATS_BH(ICMP_MIB_INERRORS); +		goto out; +	}  	sctp_bh_lock_sock(sk); @@ -423,7 +409,6 @@ struct sock *sctp_err_lookup(int family, struct sk_buff *skb,  	if (sock_owned_by_user(sk))  		NET_INC_STATS_BH(LINUX_MIB_LOCKDROPPEDICMPS); -	*epp = ep;  	*app = asoc;  	*tpp = transport;  	return sk; @@ -432,21 +417,16 @@ out:  	sock_put(sk);  	if (asoc)  		sctp_association_put(asoc); -	if (ep) -		sctp_endpoint_put(ep);  	return NULL;  }  /* Common cleanup code for icmp/icmpv6 error handler. */ -void sctp_err_finish(struct sock *sk, struct sctp_endpoint *ep, -		     struct sctp_association *asoc) +void sctp_err_finish(struct sock *sk, struct sctp_association *asoc)  {  	sctp_bh_unlock_sock(sk);  	sock_put(sk);  	if (asoc)  		sctp_association_put(asoc); -	if (ep) -		sctp_endpoint_put(ep);  }  /* @@ -471,7 +451,6 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)  	int type = skb->h.icmph->type;  	int code = skb->h.icmph->code;  	struct sock *sk; -	struct sctp_endpoint *ep;  	struct sctp_association *asoc;  	struct sctp_transport *transport;  	struct inet_sock *inet; @@ -488,7 +467,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)  	savesctp  = skb->h.raw;  	skb->nh.iph = iph;  	skb->h.raw = (char *)sh; -	sk = sctp_err_lookup(AF_INET, skb, sh, &ep, &asoc, &transport); +	sk = sctp_err_lookup(AF_INET, skb, sh, &asoc, &transport);  	/* Put back, the original pointers. */  	skb->nh.raw = saveip;  	skb->h.raw = savesctp; @@ -515,7 +494,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)  		}  		else {  			if (ICMP_PROT_UNREACH == code) { -				sctp_icmp_proto_unreachable(sk, ep, asoc, +				sctp_icmp_proto_unreachable(sk, asoc,  							    transport);  				goto out_unlock;  			} @@ -544,7 +523,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)  	}  out_unlock: -	sctp_err_finish(sk, ep, asoc); +	sctp_err_finish(sk, asoc);  }  /*  | 
