diff options
| author | Tony Luck <tony.luck@intel.com> | 2005-05-17 15:53:14 -0700 | 
|---|---|---|
| committer | Tony Luck <tony.luck@intel.com> | 2005-05-17 15:53:14 -0700 | 
| commit | 325a479c4c110db278ef3361460a48c4093252cc (patch) | |
| tree | bcfbf4d0647d9442045639a5c19da59d55190e81 /net/sctp/socket.c | |
| parent | ebcc80c1b6629a445f7471cc1ddb48faf8a84e70 (diff) | |
| parent | 7f9eaedf894dbaa08c157832e9a6c9c03ffed1ed (diff) | |
Merge with temp tree to get David's gdb inferior calls patch
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 38 | 
1 files changed, 32 insertions, 6 deletions
| diff --git a/net/sctp/socket.c b/net/sctp/socket.c index e8c210182571..0b338eca6dc0 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -115,9 +115,17 @@ static inline int sctp_wspace(struct sctp_association *asoc)  	struct sock *sk = asoc->base.sk;  	int amt = 0; -	amt = sk->sk_sndbuf - asoc->sndbuf_used; +	if (asoc->ep->sndbuf_policy) { +		/* make sure that no association uses more than sk_sndbuf */ +		amt = sk->sk_sndbuf - asoc->sndbuf_used; +	} else { +		/* do socket level accounting */ +		amt = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc); +	} +  	if (amt < 0)  		amt = 0; +  	return amt;  } @@ -138,12 +146,21 @@ static inline void sctp_set_owner_w(struct sctp_chunk *chunk)  	/* The sndbuf space is tracked per association.  */  	sctp_association_hold(asoc); +	skb_set_owner_w(chunk->skb, sk); +  	chunk->skb->destructor = sctp_wfree;  	/* Save the chunk pointer in skb for sctp_wfree to use later.  */  	*((struct sctp_chunk **)(chunk->skb->cb)) = chunk; -	asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk); -	sk->sk_wmem_queued += SCTP_DATA_SNDSIZE(chunk); +	asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk) + +				sizeof(struct sk_buff) + +				sizeof(struct sctp_chunk); + +	sk->sk_wmem_queued += SCTP_DATA_SNDSIZE(chunk) + +				sizeof(struct sk_buff) + +				sizeof(struct sctp_chunk); + +	atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);  }  /* Verify that this is a valid address. */ @@ -3473,7 +3490,7 @@ static int sctp_getsockopt_associnfo(struct sock *sk, int len,  		return -EINVAL;  	/* Values correspoinding to the specific association */ -	if (assocparams.sasoc_assoc_id != 0) { +	if (asoc) {  		assocparams.sasoc_asocmaxrxt = asoc->max_retrans;  		assocparams.sasoc_peer_rwnd = asoc->peer.rwnd;  		assocparams.sasoc_local_rwnd = asoc->a_rwnd; @@ -4422,8 +4439,17 @@ static void sctp_wfree(struct sk_buff *skb)  	chunk = *((struct sctp_chunk **)(skb->cb));  	asoc = chunk->asoc;  	sk = asoc->base.sk; -	asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk); -	sk->sk_wmem_queued -= SCTP_DATA_SNDSIZE(chunk); +	asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk) + +				sizeof(struct sk_buff) + +				sizeof(struct sctp_chunk); + +	sk->sk_wmem_queued -= SCTP_DATA_SNDSIZE(chunk) + +				sizeof(struct sk_buff) + +				sizeof(struct sctp_chunk); + +	atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); + +	sock_wfree(skb);  	__sctp_write_space(asoc);  	sctp_association_put(asoc); | 
