1 /* RxRPC packet transmission
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14 #include <linux/net.h>
15 #include <linux/gfp.h>
16 #include <linux/skbuff.h>
17 #include <linux/export.h>
19 #include <net/af_rxrpc.h>
20 #include "ar-internal.h"
22 struct rxrpc_ack_buffer
{
23 struct rxrpc_wire_header whdr
;
24 struct rxrpc_ackpacket ack
;
27 struct rxrpc_ackinfo ackinfo
;
30 struct rxrpc_abort_buffer
{
31 struct rxrpc_wire_header whdr
;
36 * Fill out an ACK packet.
38 static size_t rxrpc_fill_out_ack(struct rxrpc_call
*call
,
39 struct rxrpc_ack_buffer
*pkt
,
40 rxrpc_seq_t
*_hard_ack
,
44 rxrpc_serial_t serial
;
45 rxrpc_seq_t hard_ack
, top
, seq
;
50 /* Barrier against rxrpc_input_data(). */
51 serial
= call
->ackr_serial
;
52 hard_ack
= READ_ONCE(call
->rx_hard_ack
);
53 top
= smp_load_acquire(&call
->rx_top
);
54 *_hard_ack
= hard_ack
;
57 pkt
->ack
.bufferSpace
= htons(8);
58 pkt
->ack
.maxSkew
= htons(call
->ackr_skew
);
59 pkt
->ack
.firstPacket
= htonl(hard_ack
+ 1);
60 pkt
->ack
.previousPacket
= htonl(call
->ackr_prev_seq
);
61 pkt
->ack
.serial
= htonl(serial
);
62 pkt
->ack
.reason
= reason
;
63 pkt
->ack
.nAcks
= top
- hard_ack
;
65 if (reason
== RXRPC_ACK_PING
)
66 pkt
->whdr
.flags
|= RXRPC_REQUEST_ACK
;
68 if (after(top
, hard_ack
)) {
71 ix
= seq
& RXRPC_RXTX_BUFF_MASK
;
72 if (call
->rxtx_buffer
[ix
])
73 *ackp
++ = RXRPC_ACK_TYPE_ACK
;
75 *ackp
++ = RXRPC_ACK_TYPE_NACK
;
77 } while (before_eq(seq
, top
));
80 mtu
= call
->conn
->params
.peer
->if_mtu
;
81 mtu
-= call
->conn
->params
.peer
->hdrsize
;
82 jmax
= (call
->nr_jumbo_bad
> 3) ? 1 : rxrpc_rx_jumbo_max
;
83 pkt
->ackinfo
.rxMTU
= htonl(rxrpc_rx_mtu
);
84 pkt
->ackinfo
.maxMTU
= htonl(mtu
);
85 pkt
->ackinfo
.rwind
= htonl(call
->rx_winsize
);
86 pkt
->ackinfo
.jumbo_max
= htonl(jmax
);
91 return top
- hard_ack
+ 3;
95 * Send an ACK call packet.
97 int rxrpc_send_ack_packet(struct rxrpc_call
*call
, bool ping
)
99 struct rxrpc_connection
*conn
= NULL
;
100 struct rxrpc_ack_buffer
*pkt
;
103 rxrpc_serial_t serial
;
104 rxrpc_seq_t hard_ack
, top
;
109 spin_lock_bh(&call
->lock
);
111 conn
= rxrpc_get_connection_maybe(call
->conn
);
112 spin_unlock_bh(&call
->lock
);
116 pkt
= kzalloc(sizeof(*pkt
), GFP_KERNEL
);
118 rxrpc_put_connection(conn
);
122 msg
.msg_name
= &call
->peer
->srx
.transport
;
123 msg
.msg_namelen
= call
->peer
->srx
.transport_len
;
124 msg
.msg_control
= NULL
;
125 msg
.msg_controllen
= 0;
128 pkt
->whdr
.epoch
= htonl(conn
->proto
.epoch
);
129 pkt
->whdr
.cid
= htonl(call
->cid
);
130 pkt
->whdr
.callNumber
= htonl(call
->call_id
);
132 pkt
->whdr
.type
= RXRPC_PACKET_TYPE_ACK
;
133 pkt
->whdr
.flags
= RXRPC_SLOW_START_OK
| conn
->out_clientflag
;
134 pkt
->whdr
.userStatus
= 0;
135 pkt
->whdr
.securityIndex
= call
->security_ix
;
137 pkt
->whdr
.serviceId
= htons(call
->service_id
);
139 spin_lock_bh(&call
->lock
);
141 reason
= RXRPC_ACK_PING
;
143 reason
= call
->ackr_reason
;
144 if (!call
->ackr_reason
) {
145 spin_unlock_bh(&call
->lock
);
149 call
->ackr_reason
= 0;
151 n
= rxrpc_fill_out_ack(call
, pkt
, &hard_ack
, &top
, reason
);
153 spin_unlock_bh(&call
->lock
);
155 iov
[0].iov_base
= pkt
;
156 iov
[0].iov_len
= sizeof(pkt
->whdr
) + sizeof(pkt
->ack
) + n
;
157 iov
[1].iov_base
= &pkt
->ackinfo
;
158 iov
[1].iov_len
= sizeof(pkt
->ackinfo
);
159 len
= iov
[0].iov_len
+ iov
[1].iov_len
;
161 serial
= atomic_inc_return(&conn
->serial
);
162 pkt
->whdr
.serial
= htonl(serial
);
163 trace_rxrpc_tx_ack(call
, serial
,
164 ntohl(pkt
->ack
.firstPacket
),
165 ntohl(pkt
->ack
.serial
),
166 pkt
->ack
.reason
, pkt
->ack
.nAcks
);
169 call
->ping_serial
= serial
;
171 /* We need to stick a time in before we send the packet in case
172 * the reply gets back before kernel_sendmsg() completes - but
173 * asking UDP to send the packet can take a relatively long
174 * time, so we update the time after, on the assumption that
175 * the packet transmission is more likely to happen towards the
176 * end of the kernel_sendmsg() call.
178 call
->ping_time
= ktime_get_real();
179 set_bit(RXRPC_CALL_PINGING
, &call
->flags
);
180 trace_rxrpc_rtt_tx(call
, rxrpc_rtt_tx_ping
, serial
);
183 ret
= kernel_sendmsg(conn
->params
.local
->socket
, &msg
, iov
, 2, len
);
185 call
->ping_time
= ktime_get_real();
187 if (call
->state
< RXRPC_CALL_COMPLETE
) {
190 clear_bit(RXRPC_CALL_PINGING
, &call
->flags
);
191 rxrpc_propose_ACK(call
, pkt
->ack
.reason
,
192 ntohs(pkt
->ack
.maxSkew
),
193 ntohl(pkt
->ack
.serial
),
195 rxrpc_propose_ack_retry_tx
);
197 spin_lock_bh(&call
->lock
);
198 if (after(hard_ack
, call
->ackr_consumed
))
199 call
->ackr_consumed
= hard_ack
;
200 if (after(top
, call
->ackr_seen
))
201 call
->ackr_seen
= top
;
202 spin_unlock_bh(&call
->lock
);
207 rxrpc_put_connection(conn
);
213 * Send an ABORT call packet.
215 int rxrpc_send_abort_packet(struct rxrpc_call
*call
)
217 struct rxrpc_connection
*conn
= NULL
;
218 struct rxrpc_abort_buffer pkt
;
221 rxrpc_serial_t serial
;
224 spin_lock_bh(&call
->lock
);
226 conn
= rxrpc_get_connection_maybe(call
->conn
);
227 spin_unlock_bh(&call
->lock
);
231 msg
.msg_name
= &call
->peer
->srx
.transport
;
232 msg
.msg_namelen
= call
->peer
->srx
.transport_len
;
233 msg
.msg_control
= NULL
;
234 msg
.msg_controllen
= 0;
237 pkt
.whdr
.epoch
= htonl(conn
->proto
.epoch
);
238 pkt
.whdr
.cid
= htonl(call
->cid
);
239 pkt
.whdr
.callNumber
= htonl(call
->call_id
);
241 pkt
.whdr
.type
= RXRPC_PACKET_TYPE_ABORT
;
242 pkt
.whdr
.flags
= conn
->out_clientflag
;
243 pkt
.whdr
.userStatus
= 0;
244 pkt
.whdr
.securityIndex
= call
->security_ix
;
246 pkt
.whdr
.serviceId
= htons(call
->service_id
);
247 pkt
.abort_code
= htonl(call
->abort_code
);
249 iov
[0].iov_base
= &pkt
;
250 iov
[0].iov_len
= sizeof(pkt
);
252 serial
= atomic_inc_return(&conn
->serial
);
253 pkt
.whdr
.serial
= htonl(serial
);
255 ret
= kernel_sendmsg(conn
->params
.local
->socket
,
256 &msg
, iov
, 1, sizeof(pkt
));
258 rxrpc_put_connection(conn
);
263 * send a packet through the transport endpoint
265 int rxrpc_send_data_packet(struct rxrpc_call
*call
, struct sk_buff
*skb
,
268 struct rxrpc_connection
*conn
= call
->conn
;
269 struct rxrpc_wire_header whdr
;
270 struct rxrpc_skb_priv
*sp
= rxrpc_skb(skb
);
273 rxrpc_serial_t serial
;
278 _enter(",{%d}", skb
->len
);
280 /* Each transmission of a Tx packet needs a new serial number */
281 serial
= atomic_inc_return(&conn
->serial
);
283 whdr
.epoch
= htonl(conn
->proto
.epoch
);
284 whdr
.cid
= htonl(call
->cid
);
285 whdr
.callNumber
= htonl(call
->call_id
);
286 whdr
.seq
= htonl(sp
->hdr
.seq
);
287 whdr
.serial
= htonl(serial
);
288 whdr
.type
= RXRPC_PACKET_TYPE_DATA
;
289 whdr
.flags
= sp
->hdr
.flags
;
291 whdr
.securityIndex
= call
->security_ix
;
292 whdr
._rsvd
= htons(sp
->hdr
._rsvd
);
293 whdr
.serviceId
= htons(call
->service_id
);
295 if (test_bit(RXRPC_CONN_PROBING_FOR_UPGRADE
, &conn
->flags
) &&
297 whdr
.userStatus
= RXRPC_USERSTATUS_SERVICE_UPGRADE
;
299 iov
[0].iov_base
= &whdr
;
300 iov
[0].iov_len
= sizeof(whdr
);
301 iov
[1].iov_base
= skb
->head
;
302 iov
[1].iov_len
= skb
->len
;
303 len
= iov
[0].iov_len
+ iov
[1].iov_len
;
305 msg
.msg_name
= &call
->peer
->srx
.transport
;
306 msg
.msg_namelen
= call
->peer
->srx
.transport_len
;
307 msg
.msg_control
= NULL
;
308 msg
.msg_controllen
= 0;
311 /* If our RTT cache needs working on, request an ACK. Also request
312 * ACKs if a DATA packet appears to have been lost.
314 if (!(sp
->hdr
.flags
& RXRPC_LAST_PACKET
) &&
316 call
->cong_mode
== RXRPC_CALL_SLOW_START
||
317 (call
->peer
->rtt_usage
< 3 && sp
->hdr
.seq
& 1) ||
318 ktime_before(ktime_add_ms(call
->peer
->rtt_last_req
, 1000),
320 whdr
.flags
|= RXRPC_REQUEST_ACK
;
322 if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS
)) {
324 if ((lose
++ & 7) == 7) {
331 _proto("Tx DATA %%%u { #%u }", serial
, sp
->hdr
.seq
);
333 /* send the packet with the don't fragment bit set if we currently
334 * think it's small enough */
335 if (iov
[1].iov_len
>= call
->peer
->maxdata
)
336 goto send_fragmentable
;
338 down_read(&conn
->params
.local
->defrag_sem
);
339 /* send the packet by UDP
340 * - returns -EMSGSIZE if UDP would have to fragment the packet
341 * to go out of the interface
342 * - in which case, we'll have processed the ICMP error
343 * message and update the peer record
345 ret
= kernel_sendmsg(conn
->params
.local
->socket
, &msg
, iov
, 2, len
);
347 up_read(&conn
->params
.local
->defrag_sem
);
348 if (ret
== -EMSGSIZE
)
349 goto send_fragmentable
;
352 trace_rxrpc_tx_data(call
, sp
->hdr
.seq
, serial
, whdr
.flags
,
355 ktime_t now
= ktime_get_real();
358 sp
->hdr
.serial
= serial
;
359 if (whdr
.flags
& RXRPC_REQUEST_ACK
) {
360 call
->peer
->rtt_last_req
= now
;
361 trace_rxrpc_rtt_tx(call
, rxrpc_rtt_tx_data
, serial
);
364 _leave(" = %d [%u]", ret
, call
->peer
->maxdata
);
368 /* attempt to send this message with fragmentation enabled */
369 _debug("send fragment");
371 down_write(&conn
->params
.local
->defrag_sem
);
373 switch (conn
->params
.local
->srx
.transport
.family
) {
375 opt
= IP_PMTUDISC_DONT
;
376 ret
= kernel_setsockopt(conn
->params
.local
->socket
,
377 SOL_IP
, IP_MTU_DISCOVER
,
378 (char *)&opt
, sizeof(opt
));
380 ret
= kernel_sendmsg(conn
->params
.local
->socket
, &msg
,
383 opt
= IP_PMTUDISC_DO
;
384 kernel_setsockopt(conn
->params
.local
->socket
, SOL_IP
,
386 (char *)&opt
, sizeof(opt
));
390 #ifdef CONFIG_AF_RXRPC_IPV6
392 opt
= IPV6_PMTUDISC_DONT
;
393 ret
= kernel_setsockopt(conn
->params
.local
->socket
,
394 SOL_IPV6
, IPV6_MTU_DISCOVER
,
395 (char *)&opt
, sizeof(opt
));
397 ret
= kernel_sendmsg(conn
->params
.local
->socket
, &msg
,
400 opt
= IPV6_PMTUDISC_DO
;
401 kernel_setsockopt(conn
->params
.local
->socket
,
402 SOL_IPV6
, IPV6_MTU_DISCOVER
,
403 (char *)&opt
, sizeof(opt
));
409 up_write(&conn
->params
.local
->defrag_sem
);
414 * reject packets through the local endpoint
416 void rxrpc_reject_packets(struct rxrpc_local
*local
)
418 struct sockaddr_rxrpc srx
;
419 struct rxrpc_skb_priv
*sp
;
420 struct rxrpc_wire_header whdr
;
427 _enter("%d", local
->debug_id
);
429 iov
[0].iov_base
= &whdr
;
430 iov
[0].iov_len
= sizeof(whdr
);
431 iov
[1].iov_base
= &code
;
432 iov
[1].iov_len
= sizeof(code
);
433 size
= sizeof(whdr
) + sizeof(code
);
435 msg
.msg_name
= &srx
.transport
;
436 msg
.msg_control
= NULL
;
437 msg
.msg_controllen
= 0;
440 memset(&whdr
, 0, sizeof(whdr
));
441 whdr
.type
= RXRPC_PACKET_TYPE_ABORT
;
443 while ((skb
= skb_dequeue(&local
->reject_queue
))) {
444 rxrpc_see_skb(skb
, rxrpc_skb_rx_seen
);
447 if (rxrpc_extract_addr_from_skb(local
, &srx
, skb
) == 0) {
448 msg
.msg_namelen
= srx
.transport_len
;
450 code
= htonl(skb
->priority
);
452 whdr
.epoch
= htonl(sp
->hdr
.epoch
);
453 whdr
.cid
= htonl(sp
->hdr
.cid
);
454 whdr
.callNumber
= htonl(sp
->hdr
.callNumber
);
455 whdr
.serviceId
= htons(sp
->hdr
.serviceId
);
456 whdr
.flags
= sp
->hdr
.flags
;
457 whdr
.flags
^= RXRPC_CLIENT_INITIATED
;
458 whdr
.flags
&= RXRPC_CLIENT_INITIATED
;
460 kernel_sendmsg(local
->socket
, &msg
, iov
, 2, size
);
463 rxrpc_free_skb(skb
, rxrpc_skb_rx_freed
);