linux/net/rxrpc/output.c
<<
>>
Prefs
   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 "ar-internal.h"
  17
  18struct rxrpc_ack_buffer {
  19        struct rxrpc_wire_header whdr;
  20        struct rxrpc_ackpacket ack;
  21        u8 acks[255];
  22        u8 pad[3];
  23        struct rxrpc_ackinfo ackinfo;
  24};
  25
  26struct rxrpc_abort_buffer {
  27        struct rxrpc_wire_header whdr;
  28        __be32 abort_code;
  29};
  30
  31static const char rxrpc_keepalive_string[] = "";
  32
  33/*
  34 * Increase Tx backoff on transmission failure and clear it on success.
  35 */
  36static void rxrpc_tx_backoff(struct rxrpc_call *call, int ret)
  37{
  38        if (ret < 0) {
  39                u16 tx_backoff = READ_ONCE(call->tx_backoff);
  40
  41                if (tx_backoff < HZ)
  42                        WRITE_ONCE(call->tx_backoff, tx_backoff + 1);
  43        } else {
  44                WRITE_ONCE(call->tx_backoff, 0);
  45        }
  46}
  47
  48/*
  49 * Arrange for a keepalive ping a certain time after we last transmitted.  This
  50 * lets the far side know we're still interested in this call and helps keep
  51 * the route through any intervening firewall open.
  52 *
  53 * Receiving a response to the ping will prevent the ->expect_rx_by timer from
  54 * expiring.
  55 */
  56static void rxrpc_set_keepalive(struct rxrpc_call *call)
  57{
  58        unsigned long now = jiffies, keepalive_at = call->next_rx_timo / 6;
  59
  60        keepalive_at += now;
  61        WRITE_ONCE(call->keepalive_at, keepalive_at);
  62        rxrpc_reduce_call_timer(call, keepalive_at, now,
  63                                rxrpc_timer_set_for_keepalive);
  64}
  65
  66/*
  67 * Fill out an ACK packet.
  68 */
  69static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
  70                                 struct rxrpc_call *call,
  71                                 struct rxrpc_ack_buffer *pkt,
  72                                 rxrpc_seq_t *_hard_ack,
  73                                 rxrpc_seq_t *_top,
  74                                 u8 reason)
  75{
  76        rxrpc_serial_t serial;
  77        rxrpc_seq_t hard_ack, top, seq;
  78        int ix;
  79        u32 mtu, jmax;
  80        u8 *ackp = pkt->acks;
  81
  82        /* Barrier against rxrpc_input_data(). */
  83        serial = call->ackr_serial;
  84        hard_ack = READ_ONCE(call->rx_hard_ack);
  85        top = smp_load_acquire(&call->rx_top);
  86        *_hard_ack = hard_ack;
  87        *_top = top;
  88
  89        pkt->ack.bufferSpace    = htons(8);
  90        pkt->ack.maxSkew        = htons(0);
  91        pkt->ack.firstPacket    = htonl(hard_ack + 1);
  92        pkt->ack.previousPacket = htonl(call->ackr_prev_seq);
  93        pkt->ack.serial         = htonl(serial);
  94        pkt->ack.reason         = reason;
  95        pkt->ack.nAcks          = top - hard_ack;
  96
  97        if (reason == RXRPC_ACK_PING)
  98                pkt->whdr.flags |= RXRPC_REQUEST_ACK;
  99
 100        if (after(top, hard_ack)) {
 101                seq = hard_ack + 1;
 102                do {
 103                        ix = seq & RXRPC_RXTX_BUFF_MASK;
 104                        if (call->rxtx_buffer[ix])
 105                                *ackp++ = RXRPC_ACK_TYPE_ACK;
 106                        else
 107                                *ackp++ = RXRPC_ACK_TYPE_NACK;
 108                        seq++;
 109                } while (before_eq(seq, top));
 110        }
 111
 112        mtu = conn->params.peer->if_mtu;
 113        mtu -= conn->params.peer->hdrsize;
 114        jmax = (call->nr_jumbo_bad > 3) ? 1 : rxrpc_rx_jumbo_max;
 115        pkt->ackinfo.rxMTU      = htonl(rxrpc_rx_mtu);
 116        pkt->ackinfo.maxMTU     = htonl(mtu);
 117        pkt->ackinfo.rwind      = htonl(call->rx_winsize);
 118        pkt->ackinfo.jumbo_max  = htonl(jmax);
 119
 120        *ackp++ = 0;
 121        *ackp++ = 0;
 122        *ackp++ = 0;
 123        return top - hard_ack + 3;
 124}
 125
 126/*
 127 * Record the beginning of an RTT probe.
 128 */
 129static int rxrpc_begin_rtt_probe(struct rxrpc_call *call, rxrpc_serial_t serial,
 130                                 enum rxrpc_rtt_tx_trace why)
 131{
 132        unsigned long avail = call->rtt_avail;
 133        int rtt_slot = 9;
 134
 135        if (!(avail & RXRPC_CALL_RTT_AVAIL_MASK))
 136                goto no_slot;
 137
 138        rtt_slot = __ffs(avail & RXRPC_CALL_RTT_AVAIL_MASK);
 139        if (!test_and_clear_bit(rtt_slot, &call->rtt_avail))
 140                goto no_slot;
 141
 142        call->rtt_serial[rtt_slot] = serial;
 143        call->rtt_sent_at[rtt_slot] = ktime_get_real();
 144        smp_wmb(); /* Write data before avail bit */
 145        set_bit(rtt_slot + RXRPC_CALL_RTT_PEND_SHIFT, &call->rtt_avail);
 146
 147        trace_rxrpc_rtt_tx(call, why, rtt_slot, serial);
 148        return rtt_slot;
 149
 150no_slot:
 151        trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_no_slot, rtt_slot, serial);
 152        return -1;
 153}
 154
 155/*
 156 * Cancel an RTT probe.
 157 */
 158static void rxrpc_cancel_rtt_probe(struct rxrpc_call *call,
 159                                   rxrpc_serial_t serial, int rtt_slot)
 160{
 161        if (rtt_slot != -1) {
 162                clear_bit(rtt_slot + RXRPC_CALL_RTT_PEND_SHIFT, &call->rtt_avail);
 163                smp_wmb(); /* Clear pending bit before setting slot */
 164                set_bit(rtt_slot, &call->rtt_avail);
 165                trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_cancel, rtt_slot, serial);
 166        }
 167}
 168
 169/*
 170 * Send an ACK call packet.
 171 */
 172int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping,
 173                          rxrpc_serial_t *_serial)
 174{
 175        struct rxrpc_connection *conn;
 176        struct rxrpc_ack_buffer *pkt;
 177        struct msghdr msg;
 178        struct kvec iov[2];
 179        rxrpc_serial_t serial;
 180        rxrpc_seq_t hard_ack, top;
 181        size_t len, n;
 182        int ret, rtt_slot = -1;
 183        u8 reason;
 184
 185        if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
 186                return -ECONNRESET;
 187
 188        pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
 189        if (!pkt)
 190                return -ENOMEM;
 191
 192        conn = call->conn;
 193
 194        msg.msg_name    = &call->peer->srx.transport;
 195        msg.msg_namelen = call->peer->srx.transport_len;
 196        msg.msg_control = NULL;
 197        msg.msg_controllen = 0;
 198        msg.msg_flags   = 0;
 199
 200        pkt->whdr.epoch         = htonl(conn->proto.epoch);
 201        pkt->whdr.cid           = htonl(call->cid);
 202        pkt->whdr.callNumber    = htonl(call->call_id);
 203        pkt->whdr.seq           = 0;
 204        pkt->whdr.type          = RXRPC_PACKET_TYPE_ACK;
 205        pkt->whdr.flags         = RXRPC_SLOW_START_OK | conn->out_clientflag;
 206        pkt->whdr.userStatus    = 0;
 207        pkt->whdr.securityIndex = call->security_ix;
 208        pkt->whdr._rsvd         = 0;
 209        pkt->whdr.serviceId     = htons(call->service_id);
 210
 211        spin_lock_bh(&call->lock);
 212        if (ping) {
 213                reason = RXRPC_ACK_PING;
 214        } else {
 215                reason = call->ackr_reason;
 216                if (!call->ackr_reason) {
 217                        spin_unlock_bh(&call->lock);
 218                        ret = 0;
 219                        goto out;
 220                }
 221                call->ackr_reason = 0;
 222        }
 223        n = rxrpc_fill_out_ack(conn, call, pkt, &hard_ack, &top, reason);
 224
 225        spin_unlock_bh(&call->lock);
 226
 227        iov[0].iov_base = pkt;
 228        iov[0].iov_len  = sizeof(pkt->whdr) + sizeof(pkt->ack) + n;
 229        iov[1].iov_base = &pkt->ackinfo;
 230        iov[1].iov_len  = sizeof(pkt->ackinfo);
 231        len = iov[0].iov_len + iov[1].iov_len;
 232
 233        serial = atomic_inc_return(&conn->serial);
 234        pkt->whdr.serial = htonl(serial);
 235        trace_rxrpc_tx_ack(call->debug_id, serial,
 236                           ntohl(pkt->ack.firstPacket),
 237                           ntohl(pkt->ack.serial),
 238                           pkt->ack.reason, pkt->ack.nAcks);
 239        if (_serial)
 240                *_serial = serial;
 241
 242        if (ping)
 243                rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping);
 244
 245        ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
 246        conn->params.peer->last_tx_at = ktime_get_seconds();
 247        if (ret < 0)
 248                trace_rxrpc_tx_fail(call->debug_id, serial, ret,
 249                                    rxrpc_tx_point_call_ack);
 250        else
 251                trace_rxrpc_tx_packet(call->debug_id, &pkt->whdr,
 252                                      rxrpc_tx_point_call_ack);
 253        rxrpc_tx_backoff(call, ret);
 254
 255        if (call->state < RXRPC_CALL_COMPLETE) {
 256                if (ret < 0) {
 257                        rxrpc_cancel_rtt_probe(call, serial, rtt_slot);
 258                        rxrpc_propose_ACK(call, pkt->ack.reason,
 259                                          ntohl(pkt->ack.serial),
 260                                          false, true,
 261                                          rxrpc_propose_ack_retry_tx);
 262                } else {
 263                        spin_lock_bh(&call->lock);
 264                        if (after(hard_ack, call->ackr_consumed))
 265                                call->ackr_consumed = hard_ack;
 266                        if (after(top, call->ackr_seen))
 267                                call->ackr_seen = top;
 268                        spin_unlock_bh(&call->lock);
 269                }
 270
 271                rxrpc_set_keepalive(call);
 272        }
 273
 274out:
 275        kfree(pkt);
 276        return ret;
 277}
 278
 279/*
 280 * Send an ABORT call packet.
 281 */
 282int rxrpc_send_abort_packet(struct rxrpc_call *call)
 283{
 284        struct rxrpc_connection *conn;
 285        struct rxrpc_abort_buffer pkt;
 286        struct msghdr msg;
 287        struct kvec iov[1];
 288        rxrpc_serial_t serial;
 289        int ret;
 290
 291        /* Don't bother sending aborts for a client call once the server has
 292         * hard-ACK'd all of its request data.  After that point, we're not
 293         * going to stop the operation proceeding, and whilst we might limit
 294         * the reply, it's not worth it if we can send a new call on the same
 295         * channel instead, thereby closing off this call.
 296         */
 297        if (rxrpc_is_client_call(call) &&
 298            test_bit(RXRPC_CALL_TX_LAST, &call->flags))
 299                return 0;
 300
 301        if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
 302                return -ECONNRESET;
 303
 304        conn = call->conn;
 305
 306        msg.msg_name    = &call->peer->srx.transport;
 307        msg.msg_namelen = call->peer->srx.transport_len;
 308        msg.msg_control = NULL;
 309        msg.msg_controllen = 0;
 310        msg.msg_flags   = 0;
 311
 312        pkt.whdr.epoch          = htonl(conn->proto.epoch);
 313        pkt.whdr.cid            = htonl(call->cid);
 314        pkt.whdr.callNumber     = htonl(call->call_id);
 315        pkt.whdr.seq            = 0;
 316        pkt.whdr.type           = RXRPC_PACKET_TYPE_ABORT;
 317        pkt.whdr.flags          = conn->out_clientflag;
 318        pkt.whdr.userStatus     = 0;
 319        pkt.whdr.securityIndex  = call->security_ix;
 320        pkt.whdr._rsvd          = 0;
 321        pkt.whdr.serviceId      = htons(call->service_id);
 322        pkt.abort_code          = htonl(call->abort_code);
 323
 324        iov[0].iov_base = &pkt;
 325        iov[0].iov_len  = sizeof(pkt);
 326
 327        serial = atomic_inc_return(&conn->serial);
 328        pkt.whdr.serial = htonl(serial);
 329
 330        ret = kernel_sendmsg(conn->params.local->socket,
 331                             &msg, iov, 1, sizeof(pkt));
 332        conn->params.peer->last_tx_at = ktime_get_seconds();
 333        if (ret < 0)
 334                trace_rxrpc_tx_fail(call->debug_id, serial, ret,
 335                                    rxrpc_tx_point_call_abort);
 336        else
 337                trace_rxrpc_tx_packet(call->debug_id, &pkt.whdr,
 338                                      rxrpc_tx_point_call_abort);
 339        rxrpc_tx_backoff(call, ret);
 340        return ret;
 341}
 342
 343/*
 344 * send a packet through the transport endpoint
 345 */
 346int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
 347                           bool retrans)
 348{
 349        struct rxrpc_connection *conn = call->conn;
 350        struct rxrpc_wire_header whdr;
 351        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
 352        struct msghdr msg;
 353        struct kvec iov[2];
 354        rxrpc_serial_t serial;
 355        size_t len;
 356        int ret, rtt_slot = -1;
 357
 358        _enter(",{%d}", skb->len);
 359
 360        if (hlist_unhashed(&call->error_link)) {
 361                spin_lock_bh(&call->peer->lock);
 362                hlist_add_head_rcu(&call->error_link, &call->peer->error_targets);
 363                spin_unlock_bh(&call->peer->lock);
 364        }
 365
 366        /* Each transmission of a Tx packet needs a new serial number */
 367        serial = atomic_inc_return(&conn->serial);
 368
 369        whdr.epoch      = htonl(conn->proto.epoch);
 370        whdr.cid        = htonl(call->cid);
 371        whdr.callNumber = htonl(call->call_id);
 372        whdr.seq        = htonl(sp->hdr.seq);
 373        whdr.serial     = htonl(serial);
 374        whdr.type       = RXRPC_PACKET_TYPE_DATA;
 375        whdr.flags      = sp->hdr.flags;
 376        whdr.userStatus = 0;
 377        whdr.securityIndex = call->security_ix;
 378        whdr._rsvd      = htons(sp->hdr._rsvd);
 379        whdr.serviceId  = htons(call->service_id);
 380
 381        if (test_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags) &&
 382            sp->hdr.seq == 1)
 383                whdr.userStatus = RXRPC_USERSTATUS_SERVICE_UPGRADE;
 384
 385        iov[0].iov_base = &whdr;
 386        iov[0].iov_len = sizeof(whdr);
 387        iov[1].iov_base = skb->head;
 388        iov[1].iov_len = skb->len;
 389        len = iov[0].iov_len + iov[1].iov_len;
 390
 391        msg.msg_name = &call->peer->srx.transport;
 392        msg.msg_namelen = call->peer->srx.transport_len;
 393        msg.msg_control = NULL;
 394        msg.msg_controllen = 0;
 395        msg.msg_flags = 0;
 396
 397        /* If our RTT cache needs working on, request an ACK.  Also request
 398         * ACKs if a DATA packet appears to have been lost.
 399         *
 400         * However, we mustn't request an ACK on the last reply packet of a
 401         * service call, lest OpenAFS incorrectly send us an ACK with some
 402         * soft-ACKs in it and then never follow up with a proper hard ACK.
 403         */
 404        if ((!(sp->hdr.flags & RXRPC_LAST_PACKET) ||
 405             rxrpc_to_server(sp)
 406             ) &&
 407            (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events) ||
 408             retrans ||
 409             call->cong_mode == RXRPC_CALL_SLOW_START ||
 410             (call->peer->rtt_count < 3 && sp->hdr.seq & 1) ||
 411             ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000),
 412                          ktime_get_real())))
 413                whdr.flags |= RXRPC_REQUEST_ACK;
 414
 415        if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
 416                static int lose;
 417                if ((lose++ & 7) == 7) {
 418                        ret = 0;
 419                        trace_rxrpc_tx_data(call, sp->hdr.seq, serial,
 420                                            whdr.flags, retrans, true);
 421                        goto done;
 422                }
 423        }
 424
 425        trace_rxrpc_tx_data(call, sp->hdr.seq, serial, whdr.flags, retrans,
 426                            false);
 427
 428        /* send the packet with the don't fragment bit set if we currently
 429         * think it's small enough */
 430        if (iov[1].iov_len >= call->peer->maxdata)
 431                goto send_fragmentable;
 432
 433        down_read(&conn->params.local->defrag_sem);
 434
 435        sp->hdr.serial = serial;
 436        smp_wmb(); /* Set serial before timestamp */
 437        skb->tstamp = ktime_get_real();
 438        if (whdr.flags & RXRPC_REQUEST_ACK)
 439                rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_data);
 440
 441        /* send the packet by UDP
 442         * - returns -EMSGSIZE if UDP would have to fragment the packet
 443         *   to go out of the interface
 444         *   - in which case, we'll have processed the ICMP error
 445         *     message and update the peer record
 446         */
 447        ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
 448        conn->params.peer->last_tx_at = ktime_get_seconds();
 449
 450        up_read(&conn->params.local->defrag_sem);
 451        if (ret < 0) {
 452                rxrpc_cancel_rtt_probe(call, serial, rtt_slot);
 453                trace_rxrpc_tx_fail(call->debug_id, serial, ret,
 454                                    rxrpc_tx_point_call_data_nofrag);
 455        } else {
 456                trace_rxrpc_tx_packet(call->debug_id, &whdr,
 457                                      rxrpc_tx_point_call_data_nofrag);
 458        }
 459
 460        rxrpc_tx_backoff(call, ret);
 461        if (ret == -EMSGSIZE)
 462                goto send_fragmentable;
 463
 464done:
 465        if (ret >= 0) {
 466                if (whdr.flags & RXRPC_REQUEST_ACK) {
 467                        call->peer->rtt_last_req = skb->tstamp;
 468                        if (call->peer->rtt_count > 1) {
 469                                unsigned long nowj = jiffies, ack_lost_at;
 470
 471                                ack_lost_at = rxrpc_get_rto_backoff(call->peer, retrans);
 472                                ack_lost_at += nowj;
 473                                WRITE_ONCE(call->ack_lost_at, ack_lost_at);
 474                                rxrpc_reduce_call_timer(call, ack_lost_at, nowj,
 475                                                        rxrpc_timer_set_for_lost_ack);
 476                        }
 477                }
 478
 479                if (sp->hdr.seq == 1 &&
 480                    !test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER,
 481                                      &call->flags)) {
 482                        unsigned long nowj = jiffies, expect_rx_by;
 483
 484                        expect_rx_by = nowj + call->next_rx_timo;
 485                        WRITE_ONCE(call->expect_rx_by, expect_rx_by);
 486                        rxrpc_reduce_call_timer(call, expect_rx_by, nowj,
 487                                                rxrpc_timer_set_for_normal);
 488                }
 489
 490                rxrpc_set_keepalive(call);
 491        } else {
 492                /* Cancel the call if the initial transmission fails,
 493                 * particularly if that's due to network routing issues that
 494                 * aren't going away anytime soon.  The layer above can arrange
 495                 * the retransmission.
 496                 */
 497                if (!test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER, &call->flags))
 498                        rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
 499                                                  RX_USER_ABORT, ret);
 500        }
 501
 502        _leave(" = %d [%u]", ret, call->peer->maxdata);
 503        return ret;
 504
 505send_fragmentable:
 506        /* attempt to send this message with fragmentation enabled */
 507        _debug("send fragment");
 508
 509        down_write(&conn->params.local->defrag_sem);
 510
 511        sp->hdr.serial = serial;
 512        smp_wmb(); /* Set serial before timestamp */
 513        skb->tstamp = ktime_get_real();
 514        if (whdr.flags & RXRPC_REQUEST_ACK)
 515                rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_data);
 516
 517        switch (conn->params.local->srx.transport.family) {
 518        case AF_INET6:
 519        case AF_INET:
 520                ip_sock_set_mtu_discover(conn->params.local->socket->sk,
 521                                IP_PMTUDISC_DONT);
 522                ret = kernel_sendmsg(conn->params.local->socket, &msg,
 523                                     iov, 2, len);
 524                conn->params.peer->last_tx_at = ktime_get_seconds();
 525
 526                ip_sock_set_mtu_discover(conn->params.local->socket->sk,
 527                                IP_PMTUDISC_DO);
 528                break;
 529
 530        default:
 531                BUG();
 532        }
 533
 534        if (ret < 0) {
 535                rxrpc_cancel_rtt_probe(call, serial, rtt_slot);
 536                trace_rxrpc_tx_fail(call->debug_id, serial, ret,
 537                                    rxrpc_tx_point_call_data_frag);
 538        } else {
 539                trace_rxrpc_tx_packet(call->debug_id, &whdr,
 540                                      rxrpc_tx_point_call_data_frag);
 541        }
 542        rxrpc_tx_backoff(call, ret);
 543
 544        up_write(&conn->params.local->defrag_sem);
 545        goto done;
 546}
 547
 548/*
 549 * reject packets through the local endpoint
 550 */
 551void rxrpc_reject_packets(struct rxrpc_local *local)
 552{
 553        struct sockaddr_rxrpc srx;
 554        struct rxrpc_skb_priv *sp;
 555        struct rxrpc_wire_header whdr;
 556        struct sk_buff *skb;
 557        struct msghdr msg;
 558        struct kvec iov[2];
 559        size_t size;
 560        __be32 code;
 561        int ret, ioc;
 562
 563        _enter("%d", local->debug_id);
 564
 565        iov[0].iov_base = &whdr;
 566        iov[0].iov_len = sizeof(whdr);
 567        iov[1].iov_base = &code;
 568        iov[1].iov_len = sizeof(code);
 569
 570        msg.msg_name = &srx.transport;
 571        msg.msg_control = NULL;
 572        msg.msg_controllen = 0;
 573        msg.msg_flags = 0;
 574
 575        memset(&whdr, 0, sizeof(whdr));
 576
 577        while ((skb = skb_dequeue(&local->reject_queue))) {
 578                rxrpc_see_skb(skb, rxrpc_skb_seen);
 579                sp = rxrpc_skb(skb);
 580
 581                switch (skb->mark) {
 582                case RXRPC_SKB_MARK_REJECT_BUSY:
 583                        whdr.type = RXRPC_PACKET_TYPE_BUSY;
 584                        size = sizeof(whdr);
 585                        ioc = 1;
 586                        break;
 587                case RXRPC_SKB_MARK_REJECT_ABORT:
 588                        whdr.type = RXRPC_PACKET_TYPE_ABORT;
 589                        code = htonl(skb->priority);
 590                        size = sizeof(whdr) + sizeof(code);
 591                        ioc = 2;
 592                        break;
 593                default:
 594                        rxrpc_free_skb(skb, rxrpc_skb_freed);
 595                        continue;
 596                }
 597
 598                if (rxrpc_extract_addr_from_skb(&srx, skb) == 0) {
 599                        msg.msg_namelen = srx.transport_len;
 600
 601                        whdr.epoch      = htonl(sp->hdr.epoch);
 602                        whdr.cid        = htonl(sp->hdr.cid);
 603                        whdr.callNumber = htonl(sp->hdr.callNumber);
 604                        whdr.serviceId  = htons(sp->hdr.serviceId);
 605                        whdr.flags      = sp->hdr.flags;
 606                        whdr.flags      ^= RXRPC_CLIENT_INITIATED;
 607                        whdr.flags      &= RXRPC_CLIENT_INITIATED;
 608
 609                        ret = kernel_sendmsg(local->socket, &msg,
 610                                             iov, ioc, size);
 611                        if (ret < 0)
 612                                trace_rxrpc_tx_fail(local->debug_id, 0, ret,
 613                                                    rxrpc_tx_point_reject);
 614                        else
 615                                trace_rxrpc_tx_packet(local->debug_id, &whdr,
 616                                                      rxrpc_tx_point_reject);
 617                }
 618
 619                rxrpc_free_skb(skb, rxrpc_skb_freed);
 620        }
 621
 622        _leave("");
 623}
 624
 625/*
 626 * Send a VERSION reply to a peer as a keepalive.
 627 */
 628void rxrpc_send_keepalive(struct rxrpc_peer *peer)
 629{
 630        struct rxrpc_wire_header whdr;
 631        struct msghdr msg;
 632        struct kvec iov[2];
 633        size_t len;
 634        int ret;
 635
 636        _enter("");
 637
 638        msg.msg_name    = &peer->srx.transport;
 639        msg.msg_namelen = peer->srx.transport_len;
 640        msg.msg_control = NULL;
 641        msg.msg_controllen = 0;
 642        msg.msg_flags   = 0;
 643
 644        whdr.epoch      = htonl(peer->local->rxnet->epoch);
 645        whdr.cid        = 0;
 646        whdr.callNumber = 0;
 647        whdr.seq        = 0;
 648        whdr.serial     = 0;
 649        whdr.type       = RXRPC_PACKET_TYPE_VERSION; /* Not client-initiated */
 650        whdr.flags      = RXRPC_LAST_PACKET;
 651        whdr.userStatus = 0;
 652        whdr.securityIndex = 0;
 653        whdr._rsvd      = 0;
 654        whdr.serviceId  = 0;
 655
 656        iov[0].iov_base = &whdr;
 657        iov[0].iov_len  = sizeof(whdr);
 658        iov[1].iov_base = (char *)rxrpc_keepalive_string;
 659        iov[1].iov_len  = sizeof(rxrpc_keepalive_string);
 660
 661        len = iov[0].iov_len + iov[1].iov_len;
 662
 663        _proto("Tx VERSION (keepalive)");
 664
 665        ret = kernel_sendmsg(peer->local->socket, &msg, iov, 2, len);
 666        if (ret < 0)
 667                trace_rxrpc_tx_fail(peer->debug_id, 0, ret,
 668                                    rxrpc_tx_point_version_keepalive);
 669        else
 670                trace_rxrpc_tx_packet(peer->debug_id, &whdr,
 671                                      rxrpc_tx_point_version_keepalive);
 672
 673        peer->last_tx_at = ktime_get_seconds();
 674        _leave("");
 675}
 676