|
@@ -134,13 +134,11 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,
|
|
write_unlock_bh(&call->state_lock);
|
|
write_unlock_bh(&call->state_lock);
|
|
}
|
|
}
|
|
|
|
|
|
- _proto("Tx DATA %%%u { #%u }", sp->hdr.serial, sp->hdr.seq);
|
|
|
|
-
|
|
|
|
if (seq == 1 && rxrpc_is_client_call(call))
|
|
if (seq == 1 && rxrpc_is_client_call(call))
|
|
rxrpc_expose_client_call(call);
|
|
rxrpc_expose_client_call(call);
|
|
|
|
|
|
sp->resend_at = jiffies + rxrpc_resend_timeout;
|
|
sp->resend_at = jiffies + rxrpc_resend_timeout;
|
|
- ret = rxrpc_send_data_packet(call->conn, skb);
|
|
|
|
|
|
+ ret = rxrpc_send_data_packet(call, skb);
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
_debug("need instant resend %d", ret);
|
|
_debug("need instant resend %d", ret);
|
|
rxrpc_instant_resend(call, ix);
|
|
rxrpc_instant_resend(call, ix);
|
|
@@ -150,29 +148,6 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,
|
|
_leave("");
|
|
_leave("");
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Convert a host-endian header into a network-endian header.
|
|
|
|
- */
|
|
|
|
-static void rxrpc_insert_header(struct sk_buff *skb)
|
|
|
|
-{
|
|
|
|
- struct rxrpc_wire_header whdr;
|
|
|
|
- struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
|
|
-
|
|
|
|
- whdr.epoch = htonl(sp->hdr.epoch);
|
|
|
|
- whdr.cid = htonl(sp->hdr.cid);
|
|
|
|
- whdr.callNumber = htonl(sp->hdr.callNumber);
|
|
|
|
- whdr.seq = htonl(sp->hdr.seq);
|
|
|
|
- whdr.serial = htonl(sp->hdr.serial);
|
|
|
|
- whdr.type = sp->hdr.type;
|
|
|
|
- whdr.flags = sp->hdr.flags;
|
|
|
|
- whdr.userStatus = sp->hdr.userStatus;
|
|
|
|
- whdr.securityIndex = sp->hdr.securityIndex;
|
|
|
|
- whdr._rsvd = htons(sp->hdr._rsvd);
|
|
|
|
- whdr.serviceId = htons(sp->hdr.serviceId);
|
|
|
|
-
|
|
|
|
- memcpy(skb->head, &whdr, sizeof(whdr));
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* send data through a socket
|
|
* send data through a socket
|
|
* - must be called in process context
|
|
* - must be called in process context
|
|
@@ -232,7 +207,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
|
|
space = chunk + call->conn->size_align;
|
|
space = chunk + call->conn->size_align;
|
|
space &= ~(call->conn->size_align - 1UL);
|
|
space &= ~(call->conn->size_align - 1UL);
|
|
|
|
|
|
- size = space + call->conn->header_size;
|
|
|
|
|
|
+ size = space + call->conn->security_size;
|
|
|
|
|
|
_debug("SIZE: %zu/%zu/%zu", chunk, space, size);
|
|
_debug("SIZE: %zu/%zu/%zu", chunk, space, size);
|
|
|
|
|
|
@@ -248,9 +223,9 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
|
|
|
|
|
|
ASSERTCMP(skb->mark, ==, 0);
|
|
ASSERTCMP(skb->mark, ==, 0);
|
|
|
|
|
|
- _debug("HS: %u", call->conn->header_size);
|
|
|
|
- skb_reserve(skb, call->conn->header_size);
|
|
|
|
- skb->len += call->conn->header_size;
|
|
|
|
|
|
+ _debug("HS: %u", call->conn->security_size);
|
|
|
|
+ skb_reserve(skb, call->conn->security_size);
|
|
|
|
+ skb->len += call->conn->security_size;
|
|
|
|
|
|
sp = rxrpc_skb(skb);
|
|
sp = rxrpc_skb(skb);
|
|
sp->remain = chunk;
|
|
sp->remain = chunk;
|
|
@@ -312,33 +287,23 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
|
|
|
|
|
|
seq = call->tx_top + 1;
|
|
seq = call->tx_top + 1;
|
|
|
|
|
|
- sp->hdr.epoch = conn->proto.epoch;
|
|
|
|
- sp->hdr.cid = call->cid;
|
|
|
|
- sp->hdr.callNumber = call->call_id;
|
|
|
|
sp->hdr.seq = seq;
|
|
sp->hdr.seq = seq;
|
|
- sp->hdr.serial = atomic_inc_return(&conn->serial);
|
|
|
|
- sp->hdr.type = RXRPC_PACKET_TYPE_DATA;
|
|
|
|
- sp->hdr.userStatus = 0;
|
|
|
|
- sp->hdr.securityIndex = call->security_ix;
|
|
|
|
sp->hdr._rsvd = 0;
|
|
sp->hdr._rsvd = 0;
|
|
- sp->hdr.serviceId = call->service_id;
|
|
|
|
|
|
+ sp->hdr.flags = conn->out_clientflag;
|
|
|
|
|
|
- sp->hdr.flags = conn->out_clientflag;
|
|
|
|
if (msg_data_left(msg) == 0 && !more)
|
|
if (msg_data_left(msg) == 0 && !more)
|
|
sp->hdr.flags |= RXRPC_LAST_PACKET;
|
|
sp->hdr.flags |= RXRPC_LAST_PACKET;
|
|
else if (call->tx_top - call->tx_hard_ack <
|
|
else if (call->tx_top - call->tx_hard_ack <
|
|
call->tx_winsize)
|
|
call->tx_winsize)
|
|
sp->hdr.flags |= RXRPC_MORE_PACKETS;
|
|
sp->hdr.flags |= RXRPC_MORE_PACKETS;
|
|
- if (more && seq & 1)
|
|
|
|
|
|
+ if (seq & 1)
|
|
sp->hdr.flags |= RXRPC_REQUEST_ACK;
|
|
sp->hdr.flags |= RXRPC_REQUEST_ACK;
|
|
|
|
|
|
ret = conn->security->secure_packet(
|
|
ret = conn->security->secure_packet(
|
|
- call, skb, skb->mark,
|
|
|
|
- skb->head + sizeof(struct rxrpc_wire_header));
|
|
|
|
|
|
+ call, skb, skb->mark, skb->head);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- rxrpc_insert_header(skb);
|
|
|
|
rxrpc_queue_packet(call, skb, !msg_data_left(msg) && !more);
|
|
rxrpc_queue_packet(call, skb, !msg_data_left(msg) && !more);
|
|
skb = NULL;
|
|
skb = NULL;
|
|
}
|
|
}
|