|
@@ -669,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 */
|
|
@@ -681,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;
|
|
@@ -700,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,
|