diff options
Diffstat (limited to 'net/rxrpc/ar-output.c')
| -rw-r--r-- | net/rxrpc/ar-output.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/net/rxrpc/ar-output.c b/net/rxrpc/ar-output.c index e1ac183d50b..0b4b9a79f5a 100644 --- a/net/rxrpc/ar-output.c +++ b/net/rxrpc/ar-output.c @@ -18,7 +18,10 @@  #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, @@ -152,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; @@ -487,7 +490,7 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,  	       ntohl(sp->hdr.serial), ntohl(sp->hdr.seq));  	sp->need_resend = false; -	sp->resend_at = jiffies + rxrpc_resend_timeout * HZ; +	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; @@ -666,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 */ @@ -678,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; @@ -697,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,  | 
