diff options
Diffstat (limited to 'net/rxrpc/ar-output.c')
| -rw-r--r-- | net/rxrpc/ar-output.c | 26 | 
1 files changed, 17 insertions, 9 deletions
diff --git a/net/rxrpc/ar-output.c b/net/rxrpc/ar-output.c index 5f22e263eda..0b4b9a79f5a 100644 --- a/net/rxrpc/ar-output.c +++ b/net/rxrpc/ar-output.c @@ -13,11 +13,15 @@  #include <linux/gfp.h>  #include <linux/skbuff.h>  #include <linux/circ_buf.h> +#include <linux/export.h>  #include <net/sock.h>  #include <net/af_rxrpc.h>  #include "ar-internal.h" -int rxrpc_resend_timeout = 4; +/* + * Time till packet resend (in jiffies). + */ +unsigned rxrpc_resend_timeout = 4 * HZ;  static int rxrpc_send_data(struct kiocb *iocb,  			   struct rxrpc_sock *rx, @@ -151,8 +155,8 @@ int rxrpc_client_sendmsg(struct kiocb *iocb, struct rxrpc_sock *rx,  	if (trans) {  		service_id = rx->service_id;  		if (msg->msg_name) { -			struct sockaddr_rxrpc *srx = -				(struct sockaddr_rxrpc *) msg->msg_name; +			DECLARE_SOCKADDR(struct sockaddr_rxrpc *, srx, +					 msg->msg_name);  			service_id = htons(srx->srx_service);  		}  		key = rx->key; @@ -241,7 +245,7 @@ int rxrpc_kernel_send_data(struct rxrpc_call *call, struct msghdr *msg,  EXPORT_SYMBOL(rxrpc_kernel_send_data); -/* +/**   * rxrpc_kernel_abort_call - Allow a kernel service to abort a call   * @call: The call to be aborted   * @abort_code: The abort code to stick into the ABORT packet @@ -485,8 +489,8 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,  	_proto("Tx DATA %%%u { #%u }",  	       ntohl(sp->hdr.serial), ntohl(sp->hdr.seq)); -	sp->need_resend = 0; -	sp->resend_at = jiffies + rxrpc_resend_timeout * HZ; +	sp->need_resend = false; +	sp->resend_at = jiffies + rxrpc_resend_timeout;  	if (!test_and_set_bit(RXRPC_CALL_RUN_RTIMER, &call->flags)) {  		_debug("run timer");  		call->resend_timer.expires = sp->resend_at; @@ -507,7 +511,7 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,  	if (ret < 0) {  		_debug("need instant resend %d", ret); -		sp->need_resend = 1; +		sp->need_resend = true;  		rxrpc_instant_resend(call);  	} @@ -665,6 +669,7 @@ static int rxrpc_send_data(struct kiocb *iocb,  		/* add the packet to the send queue if it's now full */  		if (sp->remain <= 0 || (segment == 0 && !more)) {  			struct rxrpc_connection *conn = call->conn; +			uint32_t seq;  			size_t pad;  			/* pad out if we're using security */ @@ -677,11 +682,12 @@ static int rxrpc_send_data(struct kiocb *iocb,  					memset(skb_put(skb, pad), 0, pad);  			} +			seq = atomic_inc_return(&call->sequence); +  			sp->hdr.epoch = conn->epoch;  			sp->hdr.cid = call->cid;  			sp->hdr.callNumber = call->call_id; -			sp->hdr.seq = -				htonl(atomic_inc_return(&call->sequence)); +			sp->hdr.seq = htonl(seq);  			sp->hdr.serial =  				htonl(atomic_inc_return(&conn->serial));  			sp->hdr.type = RXRPC_PACKET_TYPE_DATA; @@ -696,6 +702,8 @@ static int rxrpc_send_data(struct kiocb *iocb,  			else if (CIRC_SPACE(call->acks_head, call->acks_tail,  					    call->acks_winsz) > 1)  				sp->hdr.flags |= RXRPC_MORE_PACKETS; +			if (more && seq & 1) +				sp->hdr.flags |= RXRPC_REQUEST_ACK;  			ret = rxrpc_secure_packet(  				call, skb, skb->mark,  | 
