~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/rxrpc/output.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /* RxRPC packet transmission
  3  *
  4  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
  5  * Written by David Howells (dhowells@redhat.com)
  6  */
  7 
  8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  9 
 10 #include <linux/net.h>
 11 #include <linux/gfp.h>
 12 #include <linux/skbuff.h>
 13 #include <linux/export.h>
 14 #include <net/sock.h>
 15 #include <net/af_rxrpc.h>
 16 #include <net/udp.h>
 17 #include "ar-internal.h"
 18 
 19 extern int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
 20 
 21 static ssize_t do_udp_sendmsg(struct socket *socket, struct msghdr *msg, size_t len)
 22 {
 23         struct sockaddr *sa = msg->msg_name;
 24         struct sock *sk = socket->sk;
 25 
 26         if (IS_ENABLED(CONFIG_AF_RXRPC_IPV6)) {
 27                 if (sa->sa_family == AF_INET6) {
 28                         if (sk->sk_family != AF_INET6) {
 29                                 pr_warn("AF_INET6 address on AF_INET socket\n");
 30                                 return -ENOPROTOOPT;
 31                         }
 32                         return udpv6_sendmsg(sk, msg, len);
 33                 }
 34         }
 35         return udp_sendmsg(sk, msg, len);
 36 }
 37 
 38 struct rxrpc_abort_buffer {
 39         struct rxrpc_wire_header whdr;
 40         __be32 abort_code;
 41 };
 42 
 43 static const char rxrpc_keepalive_string[] = "";
 44 
 45 /*
 46  * Increase Tx backoff on transmission failure and clear it on success.
 47  */
 48 static void rxrpc_tx_backoff(struct rxrpc_call *call, int ret)
 49 {
 50         if (ret < 0) {
 51                 if (call->tx_backoff < 1000)
 52                         call->tx_backoff += 100;
 53         } else {
 54                 call->tx_backoff = 0;
 55         }
 56 }
 57 
 58 /*
 59  * Arrange for a keepalive ping a certain time after we last transmitted.  This
 60  * lets the far side know we're still interested in this call and helps keep
 61  * the route through any intervening firewall open.
 62  *
 63  * Receiving a response to the ping will prevent the ->expect_rx_by timer from
 64  * expiring.
 65  */
 66 static void rxrpc_set_keepalive(struct rxrpc_call *call, ktime_t now)
 67 {
 68         ktime_t delay = ms_to_ktime(READ_ONCE(call->next_rx_timo) / 6);
 69 
 70         call->keepalive_at = ktime_add(ktime_get_real(), delay);
 71         trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_keepalive);
 72 }
 73 
 74 /*
 75  * Fill out an ACK packet.
 76  */
 77 static void rxrpc_fill_out_ack(struct rxrpc_call *call,
 78                                struct rxrpc_txbuf *txb,
 79                                u8 ack_reason,
 80                                rxrpc_serial_t serial)
 81 {
 82         struct rxrpc_wire_header *whdr = txb->kvec[0].iov_base;
 83         struct rxrpc_acktrailer *trailer = txb->kvec[2].iov_base + 3;
 84         struct rxrpc_ackpacket *ack = (struct rxrpc_ackpacket *)(whdr + 1);
 85         unsigned int qsize, sack, wrap, to;
 86         rxrpc_seq_t window, wtop;
 87         int rsize;
 88         u32 mtu, jmax;
 89         u8 *filler = txb->kvec[2].iov_base;
 90         u8 *sackp = txb->kvec[1].iov_base;
 91 
 92         rxrpc_inc_stat(call->rxnet, stat_tx_ack_fill);
 93 
 94         window = call->ackr_window;
 95         wtop   = call->ackr_wtop;
 96         sack   = call->ackr_sack_base % RXRPC_SACK_SIZE;
 97 
 98         whdr->seq               = 0;
 99         whdr->type              = RXRPC_PACKET_TYPE_ACK;
100         txb->flags              |= RXRPC_SLOW_START_OK;
101         ack->bufferSpace        = 0;
102         ack->maxSkew            = 0;
103         ack->firstPacket        = htonl(window);
104         ack->previousPacket     = htonl(call->rx_highest_seq);
105         ack->serial             = htonl(serial);
106         ack->reason             = ack_reason;
107         ack->nAcks              = wtop - window;
108         filler[0]               = 0;
109         filler[1]               = 0;
110         filler[2]               = 0;
111 
112         if (ack_reason == RXRPC_ACK_PING)
113                 txb->flags |= RXRPC_REQUEST_ACK;
114 
115         if (after(wtop, window)) {
116                 txb->len += ack->nAcks;
117                 txb->kvec[1].iov_base = sackp;
118                 txb->kvec[1].iov_len = ack->nAcks;
119 
120                 wrap = RXRPC_SACK_SIZE - sack;
121                 to = min_t(unsigned int, ack->nAcks, RXRPC_SACK_SIZE);
122 
123                 if (sack + ack->nAcks <= RXRPC_SACK_SIZE) {
124                         memcpy(sackp, call->ackr_sack_table + sack, ack->nAcks);
125                 } else {
126                         memcpy(sackp, call->ackr_sack_table + sack, wrap);
127                         memcpy(sackp + wrap, call->ackr_sack_table, to - wrap);
128                 }
129         } else if (before(wtop, window)) {
130                 pr_warn("ack window backward %x %x", window, wtop);
131         } else if (ack->reason == RXRPC_ACK_DELAY) {
132                 ack->reason = RXRPC_ACK_IDLE;
133         }
134 
135         mtu = call->peer->if_mtu;
136         mtu -= call->peer->hdrsize;
137         jmax = rxrpc_rx_jumbo_max;
138         qsize = (window - 1) - call->rx_consumed;
139         rsize = max_t(int, call->rx_winsize - qsize, 0);
140         txb->ack_rwind = rsize;
141         trailer->maxMTU         = htonl(rxrpc_rx_mtu);
142         trailer->ifMTU          = htonl(mtu);
143         trailer->rwind          = htonl(rsize);
144         trailer->jumbo_max      = htonl(jmax);
145 }
146 
147 /*
148  * Record the beginning of an RTT probe.
149  */
150 static void rxrpc_begin_rtt_probe(struct rxrpc_call *call, rxrpc_serial_t serial,
151                                   ktime_t now, enum rxrpc_rtt_tx_trace why)
152 {
153         unsigned long avail = call->rtt_avail;
154         int rtt_slot = 9;
155 
156         if (!(avail & RXRPC_CALL_RTT_AVAIL_MASK))
157                 goto no_slot;
158 
159         rtt_slot = __ffs(avail & RXRPC_CALL_RTT_AVAIL_MASK);
160         if (!test_and_clear_bit(rtt_slot, &call->rtt_avail))
161                 goto no_slot;
162 
163         call->rtt_serial[rtt_slot] = serial;
164         call->rtt_sent_at[rtt_slot] = now;
165         smp_wmb(); /* Write data before avail bit */
166         set_bit(rtt_slot + RXRPC_CALL_RTT_PEND_SHIFT, &call->rtt_avail);
167 
168         trace_rxrpc_rtt_tx(call, why, rtt_slot, serial);
169         return;
170 
171 no_slot:
172         trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_no_slot, rtt_slot, serial);
173 }
174 
175 /*
176  * Transmit an ACK packet.
177  */
178 static void rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
179 {
180         struct rxrpc_wire_header *whdr = txb->kvec[0].iov_base;
181         struct rxrpc_connection *conn;
182         struct rxrpc_ackpacket *ack = (struct rxrpc_ackpacket *)(whdr + 1);
183         struct msghdr msg;
184         ktime_t now;
185         int ret;
186 
187         if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
188                 return;
189 
190         conn = call->conn;
191 
192         msg.msg_name    = &call->peer->srx.transport;
193         msg.msg_namelen = call->peer->srx.transport_len;
194         msg.msg_control = NULL;
195         msg.msg_controllen = 0;
196         msg.msg_flags   = MSG_SPLICE_PAGES;
197 
198         whdr->flags = txb->flags & RXRPC_TXBUF_WIRE_FLAGS;
199 
200         txb->serial = rxrpc_get_next_serial(conn);
201         whdr->serial = htonl(txb->serial);
202         trace_rxrpc_tx_ack(call->debug_id, txb->serial,
203                            ntohl(ack->firstPacket),
204                            ntohl(ack->serial), ack->reason, ack->nAcks,
205                            txb->ack_rwind);
206 
207         rxrpc_inc_stat(call->rxnet, stat_tx_ack_send);
208 
209         iov_iter_kvec(&msg.msg_iter, WRITE, txb->kvec, txb->nr_kvec, txb->len);
210         rxrpc_local_dont_fragment(conn->local, false);
211         ret = do_udp_sendmsg(conn->local->socket, &msg, txb->len);
212         call->peer->last_tx_at = ktime_get_seconds();
213         if (ret < 0) {
214                 trace_rxrpc_tx_fail(call->debug_id, txb->serial, ret,
215                                     rxrpc_tx_point_call_ack);
216         } else {
217                 trace_rxrpc_tx_packet(call->debug_id, whdr,
218                                       rxrpc_tx_point_call_ack);
219                 now = ktime_get_real();
220                 if (ack->reason == RXRPC_ACK_PING)
221                         rxrpc_begin_rtt_probe(call, txb->serial, now, rxrpc_rtt_tx_ping);
222                 if (txb->flags & RXRPC_REQUEST_ACK)
223                         call->peer->rtt_last_req = now;
224                 rxrpc_set_keepalive(call, now);
225         }
226         rxrpc_tx_backoff(call, ret);
227 }
228 
229 /*
230  * Queue an ACK for immediate transmission.
231  */
232 void rxrpc_send_ACK(struct rxrpc_call *call, u8 ack_reason,
233                     rxrpc_serial_t serial, enum rxrpc_propose_ack_trace why)
234 {
235         struct rxrpc_txbuf *txb;
236 
237         if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
238                 return;
239 
240         rxrpc_inc_stat(call->rxnet, stat_tx_acks[ack_reason]);
241 
242         txb = rxrpc_alloc_ack_txbuf(call, call->ackr_wtop - call->ackr_window);
243         if (!txb) {
244                 kleave(" = -ENOMEM");
245                 return;
246         }
247 
248         txb->ack_why = why;
249 
250         rxrpc_fill_out_ack(call, txb, ack_reason, serial);
251         call->ackr_nr_unacked = 0;
252         atomic_set(&call->ackr_nr_consumed, 0);
253         clear_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags);
254 
255         trace_rxrpc_send_ack(call, why, ack_reason, serial);
256         rxrpc_send_ack_packet(call, txb);
257         rxrpc_put_txbuf(txb, rxrpc_txbuf_put_ack_tx);
258 }
259 
260 /*
261  * Send an ABORT call packet.
262  */
263 int rxrpc_send_abort_packet(struct rxrpc_call *call)
264 {
265         struct rxrpc_connection *conn;
266         struct rxrpc_abort_buffer pkt;
267         struct msghdr msg;
268         struct kvec iov[1];
269         rxrpc_serial_t serial;
270         int ret;
271 
272         /* Don't bother sending aborts for a client call once the server has
273          * hard-ACK'd all of its request data.  After that point, we're not
274          * going to stop the operation proceeding, and whilst we might limit
275          * the reply, it's not worth it if we can send a new call on the same
276          * channel instead, thereby closing off this call.
277          */
278         if (rxrpc_is_client_call(call) &&
279             test_bit(RXRPC_CALL_TX_ALL_ACKED, &call->flags))
280                 return 0;
281 
282         if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
283                 return -ECONNRESET;
284 
285         conn = call->conn;
286 
287         msg.msg_name    = &call->peer->srx.transport;
288         msg.msg_namelen = call->peer->srx.transport_len;
289         msg.msg_control = NULL;
290         msg.msg_controllen = 0;
291         msg.msg_flags   = 0;
292 
293         pkt.whdr.epoch          = htonl(conn->proto.epoch);
294         pkt.whdr.cid            = htonl(call->cid);
295         pkt.whdr.callNumber     = htonl(call->call_id);
296         pkt.whdr.seq            = 0;
297         pkt.whdr.type           = RXRPC_PACKET_TYPE_ABORT;
298         pkt.whdr.flags          = conn->out_clientflag;
299         pkt.whdr.userStatus     = 0;
300         pkt.whdr.securityIndex  = call->security_ix;
301         pkt.whdr._rsvd          = 0;
302         pkt.whdr.serviceId      = htons(call->dest_srx.srx_service);
303         pkt.abort_code          = htonl(call->abort_code);
304 
305         iov[0].iov_base = &pkt;
306         iov[0].iov_len  = sizeof(pkt);
307 
308         serial = rxrpc_get_next_serial(conn);
309         pkt.whdr.serial = htonl(serial);
310 
311         iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, sizeof(pkt));
312         ret = do_udp_sendmsg(conn->local->socket, &msg, sizeof(pkt));
313         conn->peer->last_tx_at = ktime_get_seconds();
314         if (ret < 0)
315                 trace_rxrpc_tx_fail(call->debug_id, serial, ret,
316                                     rxrpc_tx_point_call_abort);
317         else
318                 trace_rxrpc_tx_packet(call->debug_id, &pkt.whdr,
319                                       rxrpc_tx_point_call_abort);
320         rxrpc_tx_backoff(call, ret);
321         return ret;
322 }
323 
324 /*
325  * Prepare a (sub)packet for transmission.
326  */
327 static void rxrpc_prepare_data_subpacket(struct rxrpc_call *call, struct rxrpc_txbuf *txb,
328                                          rxrpc_serial_t serial)
329 {
330         struct rxrpc_wire_header *whdr = txb->kvec[0].iov_base;
331         enum rxrpc_req_ack_trace why;
332         struct rxrpc_connection *conn = call->conn;
333 
334         _enter("%x,{%d}", txb->seq, txb->len);
335 
336         txb->serial = serial;
337 
338         if (test_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags) &&
339             txb->seq == 1)
340                 whdr->userStatus = RXRPC_USERSTATUS_SERVICE_UPGRADE;
341 
342         /* If our RTT cache needs working on, request an ACK.  Also request
343          * ACKs if a DATA packet appears to have been lost.
344          *
345          * However, we mustn't request an ACK on the last reply packet of a
346          * service call, lest OpenAFS incorrectly send us an ACK with some
347          * soft-ACKs in it and then never follow up with a proper hard ACK.
348          */
349         if (txb->flags & RXRPC_REQUEST_ACK)
350                 why = rxrpc_reqack_already_on;
351         else if ((txb->flags & RXRPC_LAST_PACKET) && rxrpc_sending_to_client(txb))
352                 why = rxrpc_reqack_no_srv_last;
353         else if (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events))
354                 why = rxrpc_reqack_ack_lost;
355         else if (txb->flags & RXRPC_TXBUF_RESENT)
356                 why = rxrpc_reqack_retrans;
357         else if (call->cong_mode == RXRPC_CALL_SLOW_START && call->cong_cwnd <= 2)
358                 why = rxrpc_reqack_slow_start;
359         else if (call->tx_winsize <= 2)
360                 why = rxrpc_reqack_small_txwin;
361         else if (call->peer->rtt_count < 3 && txb->seq & 1)
362                 why = rxrpc_reqack_more_rtt;
363         else if (ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), ktime_get_real()))
364                 why = rxrpc_reqack_old_rtt;
365         else
366                 goto dont_set_request_ack;
367 
368         rxrpc_inc_stat(call->rxnet, stat_why_req_ack[why]);
369         trace_rxrpc_req_ack(call->debug_id, txb->seq, why);
370         if (why != rxrpc_reqack_no_srv_last)
371                 txb->flags |= RXRPC_REQUEST_ACK;
372 dont_set_request_ack:
373 
374         whdr->flags = txb->flags & RXRPC_TXBUF_WIRE_FLAGS;
375         whdr->serial    = htonl(txb->serial);
376         whdr->cksum     = txb->cksum;
377 
378         trace_rxrpc_tx_data(call, txb->seq, txb->serial, txb->flags, false);
379 }
380 
381 /*
382  * Prepare a packet for transmission.
383  */
384 static size_t rxrpc_prepare_data_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
385 {
386         rxrpc_serial_t serial;
387 
388         /* Each transmission of a Tx packet needs a new serial number */
389         serial = rxrpc_get_next_serial(call->conn);
390 
391         rxrpc_prepare_data_subpacket(call, txb, serial);
392 
393         return txb->len;
394 }
395 
396 /*
397  * Set timeouts after transmitting a packet.
398  */
399 static void rxrpc_tstamp_data_packets(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
400 {
401         ktime_t now = ktime_get_real();
402         bool ack_requested = txb->flags & RXRPC_REQUEST_ACK;
403 
404         call->tx_last_sent = now;
405         txb->last_sent = now;
406 
407         if (ack_requested) {
408                 rxrpc_begin_rtt_probe(call, txb->serial, now, rxrpc_rtt_tx_data);
409 
410                 call->peer->rtt_last_req = now;
411                 if (call->peer->rtt_count > 1) {
412                         ktime_t delay = rxrpc_get_rto_backoff(call->peer, false);
413 
414                         call->ack_lost_at = ktime_add(now, delay);
415                         trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_lost_ack);
416                 }
417         }
418 
419         if (!test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER, &call->flags)) {
420                 ktime_t delay = ms_to_ktime(READ_ONCE(call->next_rx_timo));
421 
422                 call->expect_rx_by = ktime_add(now, delay);
423                 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_expect_rx);
424         }
425 
426         rxrpc_set_keepalive(call, now);
427 }
428 
429 /*
430  * send a packet through the transport endpoint
431  */
432 static int rxrpc_send_data_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
433 {
434         struct rxrpc_wire_header *whdr = txb->kvec[0].iov_base;
435         struct rxrpc_connection *conn = call->conn;
436         enum rxrpc_tx_point frag;
437         struct msghdr msg;
438         size_t len;
439         int ret;
440 
441         _enter("%x,{%d}", txb->seq, txb->len);
442 
443         len = rxrpc_prepare_data_packet(call, txb);
444 
445         if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
446                 static int lose;
447                 if ((lose++ & 7) == 7) {
448                         ret = 0;
449                         trace_rxrpc_tx_data(call, txb->seq, txb->serial,
450                                             txb->flags, true);
451                         goto done;
452                 }
453         }
454 
455         iov_iter_kvec(&msg.msg_iter, WRITE, txb->kvec, txb->nr_kvec, len);
456 
457         msg.msg_name    = &call->peer->srx.transport;
458         msg.msg_namelen = call->peer->srx.transport_len;
459         msg.msg_control = NULL;
460         msg.msg_controllen = 0;
461         msg.msg_flags   = MSG_SPLICE_PAGES;
462 
463         /* Track what we've attempted to transmit at least once so that the
464          * retransmission algorithm doesn't try to resend what we haven't sent
465          * yet.
466          */
467         if (txb->seq == call->tx_transmitted + 1)
468                 call->tx_transmitted = txb->seq;
469 
470         /* send the packet with the don't fragment bit set if we currently
471          * think it's small enough */
472         if (txb->len >= call->peer->maxdata) {
473                 rxrpc_local_dont_fragment(conn->local, false);
474                 frag = rxrpc_tx_point_call_data_frag;
475         } else {
476                 rxrpc_local_dont_fragment(conn->local, true);
477                 frag = rxrpc_tx_point_call_data_nofrag;
478         }
479 
480 retry:
481         /* send the packet by UDP
482          * - returns -EMSGSIZE if UDP would have to fragment the packet
483          *   to go out of the interface
484          *   - in which case, we'll have processed the ICMP error
485          *     message and update the peer record
486          */
487         rxrpc_inc_stat(call->rxnet, stat_tx_data_send);
488         ret = do_udp_sendmsg(conn->local->socket, &msg, len);
489         conn->peer->last_tx_at = ktime_get_seconds();
490 
491         if (ret < 0) {
492                 rxrpc_inc_stat(call->rxnet, stat_tx_data_send_fail);
493                 trace_rxrpc_tx_fail(call->debug_id, txb->serial, ret, frag);
494         } else {
495                 trace_rxrpc_tx_packet(call->debug_id, whdr, frag);
496         }
497 
498         rxrpc_tx_backoff(call, ret);
499         if (ret == -EMSGSIZE && frag == rxrpc_tx_point_call_data_frag) {
500                 rxrpc_local_dont_fragment(conn->local, false);
501                 frag = rxrpc_tx_point_call_data_frag;
502                 goto retry;
503         }
504 
505 done:
506         if (ret >= 0) {
507                 rxrpc_tstamp_data_packets(call, txb);
508         } else {
509                 /* Cancel the call if the initial transmission fails,
510                  * particularly if that's due to network routing issues that
511                  * aren't going away anytime soon.  The layer above can arrange
512                  * the retransmission.
513                  */
514                 if (!test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER, &call->flags))
515                         rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
516                                                   RX_USER_ABORT, ret);
517         }
518 
519         _leave(" = %d [%u]", ret, call->peer->maxdata);
520         return ret;
521 }
522 
523 /*
524  * Transmit a connection-level abort.
525  */
526 void rxrpc_send_conn_abort(struct rxrpc_connection *conn)
527 {
528         struct rxrpc_wire_header whdr;
529         struct msghdr msg;
530         struct kvec iov[2];
531         __be32 word;
532         size_t len;
533         u32 serial;
534         int ret;
535 
536         msg.msg_name    = &conn->peer->srx.transport;
537         msg.msg_namelen = conn->peer->srx.transport_len;
538         msg.msg_control = NULL;
539         msg.msg_controllen = 0;
540         msg.msg_flags   = 0;
541 
542         whdr.epoch      = htonl(conn->proto.epoch);
543         whdr.cid        = htonl(conn->proto.cid);
544         whdr.callNumber = 0;
545         whdr.seq        = 0;
546         whdr.type       = RXRPC_PACKET_TYPE_ABORT;
547         whdr.flags      = conn->out_clientflag;
548         whdr.userStatus = 0;
549         whdr.securityIndex = conn->security_ix;
550         whdr._rsvd      = 0;
551         whdr.serviceId  = htons(conn->service_id);
552 
553         word            = htonl(conn->abort_code);
554 
555         iov[0].iov_base = &whdr;
556         iov[0].iov_len  = sizeof(whdr);
557         iov[1].iov_base = &word;
558         iov[1].iov_len  = sizeof(word);
559 
560         len = iov[0].iov_len + iov[1].iov_len;
561 
562         serial = rxrpc_get_next_serial(conn);
563         whdr.serial = htonl(serial);
564 
565         iov_iter_kvec(&msg.msg_iter, WRITE, iov, 2, len);
566         ret = do_udp_sendmsg(conn->local->socket, &msg, len);
567         if (ret < 0) {
568                 trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
569                                     rxrpc_tx_point_conn_abort);
570                 _debug("sendmsg failed: %d", ret);
571                 return;
572         }
573 
574         trace_rxrpc_tx_packet(conn->debug_id, &whdr, rxrpc_tx_point_conn_abort);
575 
576         conn->peer->last_tx_at = ktime_get_seconds();
577 }
578 
579 /*
580  * Reject a packet through the local endpoint.
581  */
582 void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb)
583 {
584         struct rxrpc_wire_header whdr;
585         struct sockaddr_rxrpc srx;
586         struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
587         struct msghdr msg;
588         struct kvec iov[2];
589         size_t size;
590         __be32 code;
591         int ret, ioc;
592 
593         rxrpc_see_skb(skb, rxrpc_skb_see_reject);
594 
595         iov[0].iov_base = &whdr;
596         iov[0].iov_len = sizeof(whdr);
597         iov[1].iov_base = &code;
598         iov[1].iov_len = sizeof(code);
599 
600         msg.msg_name = &srx.transport;
601         msg.msg_control = NULL;
602         msg.msg_controllen = 0;
603         msg.msg_flags = 0;
604 
605         memset(&whdr, 0, sizeof(whdr));
606 
607         switch (skb->mark) {
608         case RXRPC_SKB_MARK_REJECT_BUSY:
609                 whdr.type = RXRPC_PACKET_TYPE_BUSY;
610                 size = sizeof(whdr);
611                 ioc = 1;
612                 break;
613         case RXRPC_SKB_MARK_REJECT_ABORT:
614                 whdr.type = RXRPC_PACKET_TYPE_ABORT;
615                 code = htonl(skb->priority);
616                 size = sizeof(whdr) + sizeof(code);
617                 ioc = 2;
618                 break;
619         default:
620                 return;
621         }
622 
623         if (rxrpc_extract_addr_from_skb(&srx, skb) == 0) {
624                 msg.msg_namelen = srx.transport_len;
625 
626                 whdr.epoch      = htonl(sp->hdr.epoch);
627                 whdr.cid        = htonl(sp->hdr.cid);
628                 whdr.callNumber = htonl(sp->hdr.callNumber);
629                 whdr.serviceId  = htons(sp->hdr.serviceId);
630                 whdr.flags      = sp->hdr.flags;
631                 whdr.flags      ^= RXRPC_CLIENT_INITIATED;
632                 whdr.flags      &= RXRPC_CLIENT_INITIATED;
633 
634                 iov_iter_kvec(&msg.msg_iter, WRITE, iov, ioc, size);
635                 ret = do_udp_sendmsg(local->socket, &msg, size);
636                 if (ret < 0)
637                         trace_rxrpc_tx_fail(local->debug_id, 0, ret,
638                                             rxrpc_tx_point_reject);
639                 else
640                         trace_rxrpc_tx_packet(local->debug_id, &whdr,
641                                               rxrpc_tx_point_reject);
642         }
643 }
644 
645 /*
646  * Send a VERSION reply to a peer as a keepalive.
647  */
648 void rxrpc_send_keepalive(struct rxrpc_peer *peer)
649 {
650         struct rxrpc_wire_header whdr;
651         struct msghdr msg;
652         struct kvec iov[2];
653         size_t len;
654         int ret;
655 
656         _enter("");
657 
658         msg.msg_name    = &peer->srx.transport;
659         msg.msg_namelen = peer->srx.transport_len;
660         msg.msg_control = NULL;
661         msg.msg_controllen = 0;
662         msg.msg_flags   = 0;
663 
664         whdr.epoch      = htonl(peer->local->rxnet->epoch);
665         whdr.cid        = 0;
666         whdr.callNumber = 0;
667         whdr.seq        = 0;
668         whdr.serial     = 0;
669         whdr.type       = RXRPC_PACKET_TYPE_VERSION; /* Not client-initiated */
670         whdr.flags      = RXRPC_LAST_PACKET;
671         whdr.userStatus = 0;
672         whdr.securityIndex = 0;
673         whdr._rsvd      = 0;
674         whdr.serviceId  = 0;
675 
676         iov[0].iov_base = &whdr;
677         iov[0].iov_len  = sizeof(whdr);
678         iov[1].iov_base = (char *)rxrpc_keepalive_string;
679         iov[1].iov_len  = sizeof(rxrpc_keepalive_string);
680 
681         len = iov[0].iov_len + iov[1].iov_len;
682 
683         iov_iter_kvec(&msg.msg_iter, WRITE, iov, 2, len);
684         ret = do_udp_sendmsg(peer->local->socket, &msg, len);
685         if (ret < 0)
686                 trace_rxrpc_tx_fail(peer->debug_id, 0, ret,
687                                     rxrpc_tx_point_version_keepalive);
688         else
689                 trace_rxrpc_tx_packet(peer->debug_id, &whdr,
690                                       rxrpc_tx_point_version_keepalive);
691 
692         peer->last_tx_at = ktime_get_seconds();
693         _leave("");
694 }
695 
696 /*
697  * Schedule an instant Tx resend.
698  */
699 static inline void rxrpc_instant_resend(struct rxrpc_call *call,
700                                         struct rxrpc_txbuf *txb)
701 {
702         if (!__rxrpc_call_is_complete(call))
703                 kdebug("resend");
704 }
705 
706 /*
707  * Transmit one packet.
708  */
709 void rxrpc_transmit_one(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
710 {
711         int ret;
712 
713         ret = rxrpc_send_data_packet(call, txb);
714         if (ret < 0) {
715                 switch (ret) {
716                 case -ENETUNREACH:
717                 case -EHOSTUNREACH:
718                 case -ECONNREFUSED:
719                         rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
720                                                   0, ret);
721                         break;
722                 default:
723                         _debug("need instant resend %d", ret);
724                         rxrpc_instant_resend(call, txb);
725                 }
726         } else {
727                 ktime_t delay = ns_to_ktime(call->peer->rto_us * NSEC_PER_USEC);
728 
729                 call->resend_at = ktime_add(ktime_get_real(), delay);
730                 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_resend_tx);
731         }
732 }
733 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php