diff options
Diffstat (limited to 'net/sctp/associola.c')
| -rw-r--r-- | net/sctp/associola.c | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index df5abbff63e..3912420cedc 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -87,9 +87,6 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a  	/* Retrieve the SCTP per socket area.  */  	sp = sctp_sk((struct sock *)sk); -	/* Init all variables to a known value.  */ -	memset(asoc, 0, sizeof(struct sctp_association)); -  	/* Discarding const is appropriate here.  */  	asoc->ep = (struct sctp_endpoint *)ep;  	sctp_endpoint_hold(asoc->ep); @@ -762,7 +759,8 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,  		asoc->peer.retran_path = peer;  	} -	if (asoc->peer.active_path == asoc->peer.retran_path) { +	if (asoc->peer.active_path == asoc->peer.retran_path && +	    peer->state != SCTP_UNCONFIRMED) {  		asoc->peer.retran_path = peer;  	} @@ -1194,8 +1192,10 @@ void sctp_assoc_update(struct sctp_association *asoc,  	/* Remove any peer addresses not present in the new association. */  	list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {  		trans = list_entry(pos, struct sctp_transport, transports); -		if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) -			sctp_assoc_del_peer(asoc, &trans->ipaddr); +		if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) { +			sctp_assoc_rm_peer(asoc, trans); +			continue; +		}  		if (asoc->state >= SCTP_STATE_ESTABLISHED)  			sctp_transport_reset(trans); @@ -1318,12 +1318,13 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)  			/* Keep track of the next transport in case  			 * we don't find any active transport.  			 */ -			if (!next) +			if (t->state != SCTP_UNCONFIRMED && !next)  				next = t;  		}  	} -	asoc->peer.retran_path = t; +	if (t) +		asoc->peer.retran_path = t;  	SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_update_retran_path:association"  				 " %p addr: ", @@ -1483,7 +1484,7 @@ void sctp_assoc_rwnd_decrease(struct sctp_association *asoc, unsigned len)  	if (asoc->rwnd >= len) {  		asoc->rwnd -= len;  		if (over) { -			asoc->rwnd_press = asoc->rwnd; +			asoc->rwnd_press += asoc->rwnd;  			asoc->rwnd = 0;  		}  	} else {  |