diff options
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 60 | 
1 files changed, 32 insertions, 28 deletions
| diff --git a/net/sctp/socket.c b/net/sctp/socket.c index e13519e9df80..fee06b99a4da 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -2115,6 +2115,12 @@ static int sctp_recvmsg(struct kiocb *iocb, struct sock *sk,  		sctp_skb_pull(skb, copied);  		skb_queue_head(&sk->sk_receive_queue, skb); +		/* When only partial message is copied to the user, increase +		 * rwnd by that amount. If all the data in the skb is read, +		 * rwnd is updated when the event is freed. +		 */ +		if (!sctp_ulpevent_is_notification(event)) +			sctp_assoc_rwnd_increase(event->asoc, copied);  		goto out;  	} else if ((event->msg_flags & MSG_NOTIFICATION) ||  		   (event->msg_flags & MSG_EOR)) @@ -3315,10 +3321,10 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk,  				      char __user *optval,  				      unsigned int optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_authchunk val; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (optlen != sizeof(struct sctp_authchunk)) @@ -3335,7 +3341,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk,  	}  	/* add this chunk id to the endpoint */ -	return sctp_auth_ep_add_chunkid(sctp_sk(sk)->ep, val.sauth_chunk); +	return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk);  }  /* @@ -3348,12 +3354,12 @@ static int sctp_setsockopt_hmac_ident(struct sock *sk,  				      char __user *optval,  				      unsigned int optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_hmacalgo *hmacs;  	u32 idents;  	int err; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (optlen < sizeof(struct sctp_hmacalgo)) @@ -3370,7 +3376,7 @@ static int sctp_setsockopt_hmac_ident(struct sock *sk,  		goto out;  	} -	err = sctp_auth_ep_set_hmacs(sctp_sk(sk)->ep, hmacs); +	err = sctp_auth_ep_set_hmacs(ep, hmacs);  out:  	kfree(hmacs);  	return err; @@ -3386,12 +3392,12 @@ static int sctp_setsockopt_auth_key(struct sock *sk,  				    char __user *optval,  				    unsigned int optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_authkey *authkey;  	struct sctp_association *asoc;  	int ret; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (optlen <= sizeof(struct sctp_authkey)) @@ -3412,7 +3418,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk,  		goto out;  	} -	ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey); +	ret = sctp_auth_set_key(ep, asoc, authkey);  out:  	kzfree(authkey);  	return ret; @@ -3428,11 +3434,11 @@ static int sctp_setsockopt_active_key(struct sock *sk,  				      char __user *optval,  				      unsigned int optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_authkeyid val;  	struct sctp_association *asoc; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (optlen != sizeof(struct sctp_authkeyid)) @@ -3444,8 +3450,7 @@ static int sctp_setsockopt_active_key(struct sock *sk,  	if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))  		return -EINVAL; -	return sctp_auth_set_active_key(sctp_sk(sk)->ep, asoc, -					val.scact_keynumber); +	return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber);  }  /* @@ -3457,11 +3462,11 @@ static int sctp_setsockopt_del_key(struct sock *sk,  				   char __user *optval,  				   unsigned int optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_authkeyid val;  	struct sctp_association *asoc; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (optlen != sizeof(struct sctp_authkeyid)) @@ -3473,8 +3478,7 @@ static int sctp_setsockopt_del_key(struct sock *sk,  	if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))  		return -EINVAL; -	return sctp_auth_del_key_id(sctp_sk(sk)->ep, asoc, -				    val.scact_keynumber); +	return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber);  } @@ -5381,16 +5385,16 @@ static int sctp_getsockopt_maxburst(struct sock *sk, int len,  static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,  				    char __user *optval, int __user *optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_hmacalgo  __user *p = (void __user *)optval;  	struct sctp_hmac_algo_param *hmacs;  	__u16 data_len = 0;  	u32 num_idents; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES; -	hmacs = sctp_sk(sk)->ep->auth_hmacs_list; +	hmacs = ep->auth_hmacs_list;  	data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t);  	if (len < sizeof(struct sctp_hmacalgo) + data_len) @@ -5411,11 +5415,11 @@ static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,  static int sctp_getsockopt_active_key(struct sock *sk, int len,  				    char __user *optval, int __user *optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_authkeyid val;  	struct sctp_association *asoc; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (len < sizeof(struct sctp_authkeyid)) @@ -5430,7 +5434,7 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,  	if (asoc)  		val.scact_keynumber = asoc->active_key_id;  	else -		val.scact_keynumber = sctp_sk(sk)->ep->active_key_id; +		val.scact_keynumber = ep->active_key_id;  	len = sizeof(struct sctp_authkeyid);  	if (put_user(len, optlen)) @@ -5444,7 +5448,7 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,  static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,  				    char __user *optval, int __user *optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_authchunks __user *p = (void __user *)optval;  	struct sctp_authchunks val;  	struct sctp_association *asoc; @@ -5452,7 +5456,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,  	u32    num_chunks = 0;  	char __user *to; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (len < sizeof(struct sctp_authchunks)) @@ -5489,7 +5493,7 @@ num:  static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,  				    char __user *optval, int __user *optlen)  { -	struct net *net = sock_net(sk); +	struct sctp_endpoint *ep = sctp_sk(sk)->ep;  	struct sctp_authchunks __user *p = (void __user *)optval;  	struct sctp_authchunks val;  	struct sctp_association *asoc; @@ -5497,7 +5501,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,  	u32    num_chunks = 0;  	char __user *to; -	if (!net->sctp.auth_enable) +	if (!ep->auth_enable)  		return -EACCES;  	if (len < sizeof(struct sctp_authchunks)) @@ -5514,7 +5518,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,  	if (asoc)  		ch = (struct sctp_chunks_param *)asoc->c.auth_chunks;  	else -		ch = sctp_sk(sk)->ep->auth_chunk_list; +		ch = ep->auth_chunk_list;  	if (!ch)  		goto num; |