rxrpc: Reinitialise the call ACK and timer state for client reply phase
[linux-block.git] / net / rxrpc / input.c
index a707d5952164699877129185f964d95426e1eb1b..bda11eb2ab2ad2de51aded7542753495d8a52690 100644 (file)
@@ -36,6 +36,23 @@ static void rxrpc_proto_abort(const char *why,
        }
 }
 
+/*
+ * Ping the other end to fill our RTT cache and to retrieve the rwind
+ * and MTU parameters.
+ */
+static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb,
+                           int skew)
+{
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+       ktime_t now = skb->tstamp;
+
+       if (call->peer->rtt_usage < 3 ||
+           ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), now))
+               rxrpc_propose_ACK(call, RXRPC_ACK_PING, skew, sp->hdr.serial,
+                                 true, true,
+                                 rxrpc_propose_ack_ping_for_params);
+}
+
 /*
  * Apply a hard ACK by advancing the Tx window.
  */
@@ -43,6 +60,7 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to)
 {
        struct sk_buff *skb, *list = NULL;
        int ix;
+       u8 annotation;
 
        spin_lock(&call->lock);
 
@@ -50,22 +68,29 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to)
                call->tx_hard_ack++;
                ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK;
                skb = call->rxtx_buffer[ix];
-               rxrpc_see_skb(skb);
+               annotation = call->rxtx_annotations[ix];
+               rxrpc_see_skb(skb, rxrpc_skb_tx_rotated);
                call->rxtx_buffer[ix] = NULL;
                call->rxtx_annotations[ix] = 0;
                skb->next = list;
                list = skb;
+
+               if (annotation & RXRPC_TX_ANNO_LAST)
+                       set_bit(RXRPC_CALL_TX_LAST, &call->flags);
        }
 
        spin_unlock(&call->lock);
 
+       trace_rxrpc_transmit(call, (test_bit(RXRPC_CALL_TX_LAST, &call->flags) ?
+                                   rxrpc_transmit_rotate_last :
+                                   rxrpc_transmit_rotate));
        wake_up(&call->waitq);
 
        while (list) {
                skb = list;
                list = skb->next;
                skb->next = NULL;
-               rxrpc_free_skb(skb);
+               rxrpc_free_skb(skb, rxrpc_skb_tx_freed);
        }
 }
 
@@ -75,40 +100,74 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to)
  * This occurs when we get an ACKALL packet, the first DATA packet of a reply,
  * or a final ACK packet.
  */
-static bool rxrpc_end_tx_phase(struct rxrpc_call *call, const char *abort_why)
+static bool rxrpc_end_tx_phase(struct rxrpc_call *call, bool reply_begun,
+                              const char *abort_why)
 {
-       _enter("");
 
-       switch (call->state) {
-       case RXRPC_CALL_CLIENT_RECV_REPLY:
-               return true;
-       case RXRPC_CALL_CLIENT_AWAIT_REPLY:
-       case RXRPC_CALL_SERVER_AWAIT_ACK:
-               break;
-       default:
-               rxrpc_proto_abort(abort_why, call, call->tx_top);
-               return false;
-       }
-
-       rxrpc_rotate_tx_window(call, call->tx_top);
+       ASSERT(test_bit(RXRPC_CALL_TX_LAST, &call->flags));
 
        write_lock(&call->state_lock);
 
        switch (call->state) {
-       default:
-               break;
+       case RXRPC_CALL_CLIENT_SEND_REQUEST:
        case RXRPC_CALL_CLIENT_AWAIT_REPLY:
-               call->state = RXRPC_CALL_CLIENT_RECV_REPLY;
+               if (reply_begun)
+                       call->state = RXRPC_CALL_CLIENT_RECV_REPLY;
+               else
+                       call->state = RXRPC_CALL_CLIENT_AWAIT_REPLY;
                break;
+
        case RXRPC_CALL_SERVER_AWAIT_ACK:
                __rxrpc_call_completed(call);
                rxrpc_notify_socket(call);
                break;
+
+       default:
+               goto bad_state;
        }
 
        write_unlock(&call->state_lock);
+       if (call->state == RXRPC_CALL_CLIENT_AWAIT_REPLY) {
+               trace_rxrpc_transmit(call, rxrpc_transmit_await_reply);
+       } else {
+               trace_rxrpc_transmit(call, rxrpc_transmit_end);
+       }
        _leave(" = ok");
        return true;
+
+bad_state:
+       write_unlock(&call->state_lock);
+       kdebug("end_tx %s", rxrpc_call_states[call->state]);
+       rxrpc_proto_abort(abort_why, call, call->tx_top);
+       return false;
+}
+
+/*
+ * Begin the reply reception phase of a call.
+ */
+static bool rxrpc_receiving_reply(struct rxrpc_call *call)
+{
+       rxrpc_seq_t top = READ_ONCE(call->tx_top);
+
+       if (call->ackr_reason) {
+               spin_lock_bh(&call->lock);
+               call->ackr_reason = 0;
+               call->resend_at = call->expire_at;
+               call->ack_at = call->expire_at;
+               spin_unlock_bh(&call->lock);
+               rxrpc_set_timer(call, rxrpc_timer_init_for_reply);
+       }
+
+       if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags))
+               rxrpc_rotate_tx_window(call, top);
+       if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags)) {
+               rxrpc_proto_abort("TXL", call, top);
+               return false;
+       }
+       if (!rxrpc_end_tx_phase(call, true, "ETD"))
+               return false;
+       call->tx_phase = false;
+       return true;
 }
 
 /*
@@ -127,7 +186,7 @@ static bool rxrpc_validate_jumbo(struct sk_buff *skb)
 {
        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        unsigned int offset = sp->offset;
-       unsigned int len = skb->data_len;
+       unsigned int len = skb->len;
        int nr_jumbo = 1;
        u8 flags = sp->hdr.flags;
 
@@ -164,7 +223,7 @@ protocol_error:
  * (that information is encoded in the ACK packet).
  */
 static void rxrpc_input_dup_data(struct rxrpc_call *call, rxrpc_seq_t seq,
-                                u8 annotation, bool *_jumbo_dup)
+                                u8 annotation, bool *_jumbo_bad)
 {
        /* Discard normal packets that are duplicates. */
        if (annotation == 0)
@@ -174,9 +233,9 @@ static void rxrpc_input_dup_data(struct rxrpc_call *call, rxrpc_seq_t seq,
         * more partially duplicate jumbo packets, we refuse to take any more
         * jumbos for this call.
         */
-       if (!*_jumbo_dup) {
-               call->nr_jumbo_dup++;
-               *_jumbo_dup = true;
+       if (!*_jumbo_bad) {
+               call->nr_jumbo_bad++;
+               *_jumbo_bad = true;
        }
 }
 
@@ -191,12 +250,12 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb,
        unsigned int ix;
        rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0;
        rxrpc_seq_t seq = sp->hdr.seq, hard_ack;
-       bool immediate_ack = false, jumbo_dup = false, queued;
+       bool immediate_ack = false, jumbo_bad = false, queued;
        u16 len;
        u8 ack = 0, flags, annotation = 0;
 
        _enter("{%u,%u},{%u,%u}",
-              call->rx_hard_ack, call->rx_top, skb->data_len, seq);
+              call->rx_hard_ack, call->rx_top, skb->len, seq);
 
        _proto("Rx DATA %%%u { #%u f=%02x }",
               sp->hdr.serial, seq, sp->hdr.flags);
@@ -207,8 +266,9 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb,
        /* Received data implicitly ACKs all of the request packets we sent
         * when we're acting as a client.
         */
-       if (call->state == RXRPC_CALL_CLIENT_AWAIT_REPLY &&
-           !rxrpc_end_tx_phase(call, "ETD"))
+       if ((call->state == RXRPC_CALL_CLIENT_SEND_REQUEST ||
+            call->state == RXRPC_CALL_CLIENT_AWAIT_REPLY) &&
+           !rxrpc_receiving_reply(call))
                return;
 
        call->ackr_prev_seq = seq;
@@ -222,7 +282,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb,
 
        flags = sp->hdr.flags;
        if (flags & RXRPC_JUMBO_PACKET) {
-               if (call->nr_jumbo_dup > 3) {
+               if (call->nr_jumbo_bad > 3) {
                        ack = RXRPC_ACK_NOSPACE;
                        ack_serial = serial;
                        goto ack;
@@ -233,12 +293,12 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb,
 next_subpacket:
        queued = false;
        ix = seq & RXRPC_RXTX_BUFF_MASK;
-       len = skb->data_len;
+       len = skb->len;
        if (flags & RXRPC_JUMBO_PACKET)
                len = RXRPC_JUMBO_DATALEN;
 
        if (flags & RXRPC_LAST_PACKET) {
-               if (test_and_set_bit(RXRPC_CALL_RX_LAST, &call->flags) &&
+               if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) &&
                    seq != call->rx_top)
                        return rxrpc_proto_abort("LSN", call, seq);
        } else {
@@ -259,7 +319,7 @@ next_subpacket:
        }
 
        if (call->rxtx_buffer[ix]) {
-               rxrpc_input_dup_data(call, seq, annotation, &jumbo_dup);
+               rxrpc_input_dup_data(call, seq, annotation, &jumbo_bad);
                if (ack != RXRPC_ACK_DUPLICATE) {
                        ack = RXRPC_ACK_DUPLICATE;
                        ack_serial = serial;
@@ -276,12 +336,26 @@ next_subpacket:
         * Barriers against rxrpc_recvmsg_data() and rxrpc_rotate_rx_window()
         * and also rxrpc_fill_out_ack().
         */
-       rxrpc_get_skb(skb);
+       rxrpc_get_skb(skb, rxrpc_skb_rx_got);
        call->rxtx_annotations[ix] = annotation;
        smp_wmb();
        call->rxtx_buffer[ix] = skb;
-       if (after(seq, call->rx_top))
+       if (after(seq, call->rx_top)) {
                smp_store_release(&call->rx_top, seq);
+       } else if (before(seq, call->rx_top)) {
+               /* Send an immediate ACK if we fill in a hole */
+               if (!ack) {
+                       ack = RXRPC_ACK_DELAY;
+                       ack_serial = serial;
+               }
+               immediate_ack = true;
+       }
+       if (flags & RXRPC_LAST_PACKET) {
+               set_bit(RXRPC_CALL_RX_LAST, &call->flags);
+               trace_rxrpc_receive(call, rxrpc_receive_queue_last, serial, seq);
+       } else {
+               trace_rxrpc_receive(call, rxrpc_receive_queue, serial, seq);
+       }
        queued = true;
 
        if (after_eq(seq, call->rx_expect_next)) {
@@ -304,6 +378,15 @@ skip:
                annotation++;
                if (flags & RXRPC_JUMBO_PACKET)
                        annotation |= RXRPC_RX_ANNO_JLAST;
+               if (after(seq, hard_ack + call->rx_winsize)) {
+                       ack = RXRPC_ACK_EXCEEDS_WINDOW;
+                       ack_serial = serial;
+                       if (!jumbo_bad) {
+                               call->nr_jumbo_bad++;
+                               jumbo_bad = true;
+                       }
+                       goto ack;
+               }
 
                _proto("Rx DATA Jumbo %%%u", serial);
                goto next_subpacket;
@@ -317,13 +400,72 @@ skip:
 ack:
        if (ack)
                rxrpc_propose_ACK(call, ack, skew, ack_serial,
-                                 immediate_ack, true);
+                                 immediate_ack, true,
+                                 rxrpc_propose_ack_input_data);
 
        if (sp->hdr.seq == READ_ONCE(call->rx_hard_ack) + 1)
                rxrpc_notify_socket(call);
        _leave(" [queued]");
 }
 
+/*
+ * Process a requested ACK.
+ */
+static void rxrpc_input_requested_ack(struct rxrpc_call *call,
+                                     ktime_t resp_time,
+                                     rxrpc_serial_t orig_serial,
+                                     rxrpc_serial_t ack_serial)
+{
+       struct rxrpc_skb_priv *sp;
+       struct sk_buff *skb;
+       ktime_t sent_at;
+       int ix;
+
+       for (ix = 0; ix < RXRPC_RXTX_BUFF_SIZE; ix++) {
+               skb = call->rxtx_buffer[ix];
+               if (!skb)
+                       continue;
+
+               sp = rxrpc_skb(skb);
+               if (sp->hdr.serial != orig_serial)
+                       continue;
+               smp_rmb();
+               sent_at = skb->tstamp;
+               goto found;
+       }
+       return;
+
+found:
+       rxrpc_peer_add_rtt(call, rxrpc_rtt_rx_requested_ack,
+                          orig_serial, ack_serial, sent_at, resp_time);
+}
+
+/*
+ * Process a ping response.
+ */
+static void rxrpc_input_ping_response(struct rxrpc_call *call,
+                                     ktime_t resp_time,
+                                     rxrpc_serial_t orig_serial,
+                                     rxrpc_serial_t ack_serial)
+{
+       rxrpc_serial_t ping_serial;
+       ktime_t ping_time;
+
+       ping_time = call->ackr_ping_time;
+       smp_rmb();
+       ping_serial = call->ackr_ping;
+
+       if (!test_bit(RXRPC_CALL_PINGING, &call->flags) ||
+           before(orig_serial, ping_serial))
+               return;
+       clear_bit(RXRPC_CALL_PINGING, &call->flags);
+       if (after(orig_serial, ping_serial))
+               return;
+
+       rxrpc_peer_add_rtt(call, rxrpc_rtt_rx_ping_response,
+                          orig_serial, ack_serial, ping_time, resp_time);
+}
+
 /*
  * Process the extra information that may be appended to an ACK packet
  */
@@ -333,14 +475,16 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb,
        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        struct rxrpc_peer *peer;
        unsigned int mtu;
+       u32 rwind = ntohl(ackinfo->rwind);
 
        _proto("Rx ACK %%%u Info { rx=%u max=%u rwin=%u jm=%u }",
               sp->hdr.serial,
               ntohl(ackinfo->rxMTU), ntohl(ackinfo->maxMTU),
-              ntohl(ackinfo->rwind), ntohl(ackinfo->jumbo_max));
+              rwind, ntohl(ackinfo->jumbo_max));
 
-       if (call->tx_winsize > ntohl(ackinfo->rwind))
-               call->tx_winsize = ntohl(ackinfo->rwind);
+       if (rwind > RXRPC_RXTX_BUFF_SIZE - 1)
+               rwind = RXRPC_RXTX_BUFF_SIZE - 1;
+       call->tx_winsize = rwind;
 
        mtu = min(ntohl(ackinfo->rxMTU), ntohl(ackinfo->maxMTU));
 
@@ -368,17 +512,27 @@ static void rxrpc_input_soft_acks(struct rxrpc_call *call, u8 *acks,
 {
        bool resend = false;
        int ix;
+       u8 annotation, anno_type;
 
        for (; nr_acks > 0; nr_acks--, seq++) {
                ix = seq & RXRPC_RXTX_BUFF_MASK;
-               switch (*acks) {
+               annotation = call->rxtx_annotations[ix];
+               anno_type = annotation & RXRPC_TX_ANNO_MASK;
+               annotation &= ~RXRPC_TX_ANNO_MASK;
+               switch (*acks++) {
                case RXRPC_ACK_TYPE_ACK:
-                       call->rxtx_annotations[ix] = RXRPC_TX_ANNO_ACK;
+                       if (anno_type == RXRPC_TX_ANNO_ACK)
+                               continue;
+                       call->rxtx_annotations[ix] =
+                               RXRPC_TX_ANNO_ACK | annotation;
                        break;
                case RXRPC_ACK_TYPE_NACK:
-                       if (call->rxtx_annotations[ix] == RXRPC_TX_ANNO_NAK)
+                       if (anno_type == RXRPC_TX_ANNO_NAK)
                                continue;
-                       call->rxtx_annotations[ix] = RXRPC_TX_ANNO_NAK;
+                       if (anno_type == RXRPC_TX_ANNO_RETRANS)
+                               continue;
+                       call->rxtx_annotations[ix] =
+                               RXRPC_TX_ANNO_NAK | annotation;
                        resend = true;
                        break;
                default:
@@ -404,12 +558,14 @@ static void rxrpc_input_soft_acks(struct rxrpc_call *call, u8 *acks,
 static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
                            u16 skew)
 {
+       u8 ack_reason;
        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        union {
                struct rxrpc_ackpacket ack;
                struct rxrpc_ackinfo info;
                u8 acks[RXRPC_MAXACKS];
        } buf;
+       rxrpc_serial_t acked_serial;
        rxrpc_seq_t first_soft_ack, hard_ack;
        int nr_acks, offset;
 
@@ -421,30 +577,44 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
        }
        sp->offset += sizeof(buf.ack);
 
+       acked_serial = ntohl(buf.ack.serial);
        first_soft_ack = ntohl(buf.ack.firstPacket);
        hard_ack = first_soft_ack - 1;
        nr_acks = buf.ack.nAcks;
+       ack_reason = (buf.ack.reason < RXRPC_ACK__INVALID ?
+                     buf.ack.reason : RXRPC_ACK__INVALID);
+
+       trace_rxrpc_rx_ack(call, first_soft_ack, ack_reason, nr_acks);
 
        _proto("Rx ACK %%%u { m=%hu f=#%u p=#%u s=%%%u r=%s n=%u }",
               sp->hdr.serial,
               ntohs(buf.ack.maxSkew),
               first_soft_ack,
               ntohl(buf.ack.previousPacket),
-              ntohl(buf.ack.serial),
-              rxrpc_acks(buf.ack.reason),
+              acked_serial,
+              rxrpc_ack_names[ack_reason],
               buf.ack.nAcks);
 
+       if (buf.ack.reason == RXRPC_ACK_PING_RESPONSE)
+               rxrpc_input_ping_response(call, skb->tstamp, acked_serial,
+                                         sp->hdr.serial);
+       if (buf.ack.reason == RXRPC_ACK_REQUESTED)
+               rxrpc_input_requested_ack(call, skb->tstamp, acked_serial,
+                                         sp->hdr.serial);
+
        if (buf.ack.reason == RXRPC_ACK_PING) {
                _proto("Rx ACK %%%u PING Request", sp->hdr.serial);
                rxrpc_propose_ACK(call, RXRPC_ACK_PING_RESPONSE,
-                                 skew, sp->hdr.serial, true, true);
+                                 skew, sp->hdr.serial, true, true,
+                                 rxrpc_propose_ack_respond_to_ping);
        } else if (sp->hdr.flags & RXRPC_REQUEST_ACK) {
                rxrpc_propose_ACK(call, RXRPC_ACK_REQUESTED,
-                                 skew, sp->hdr.serial, true, true);
+                                 skew, sp->hdr.serial, true, true,
+                                 rxrpc_propose_ack_respond_to_ack);
        }
 
        offset = sp->offset + nr_acks + 3;
-       if (skb->data_len >= offset + sizeof(buf.info)) {
+       if (skb->len >= offset + sizeof(buf.info)) {
                if (skb_copy_bits(skb, offset, &buf.info, sizeof(buf.info)) < 0)
                        return rxrpc_proto_abort("XAI", call, 0);
                rxrpc_input_ackinfo(call, skb, &buf.info);
@@ -465,34 +635,33 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
        }
 
        /* Discard any out-of-order or duplicate ACKs. */
-       if ((int)sp->hdr.serial - (int)call->acks_latest <= 0) {
+       if (before_eq(sp->hdr.serial, call->acks_latest)) {
                _debug("discard ACK %d <= %d",
                       sp->hdr.serial, call->acks_latest);
                return;
        }
        call->acks_latest = sp->hdr.serial;
 
-       if (test_bit(RXRPC_CALL_TX_LAST, &call->flags) &&
-           hard_ack == call->tx_top) {
-               rxrpc_end_tx_phase(call, "ETA");
-               return;
-       }
-
        if (before(hard_ack, call->tx_hard_ack) ||
            after(hard_ack, call->tx_top))
                return rxrpc_proto_abort("AKW", call, 0);
+       if (nr_acks > call->tx_top - hard_ack)
+               return rxrpc_proto_abort("AKN", call, 0);
 
        if (after(hard_ack, call->tx_hard_ack))
                rxrpc_rotate_tx_window(call, hard_ack);
 
-       if (after(first_soft_ack, call->tx_top))
+       if (nr_acks > 0) {
+               if (skb_copy_bits(skb, sp->offset, buf.acks, nr_acks) < 0)
+                       return rxrpc_proto_abort("XSA", call, 0);
+               rxrpc_input_soft_acks(call, buf.acks, first_soft_ack, nr_acks);
+       }
+
+       if (test_bit(RXRPC_CALL_TX_LAST, &call->flags)) {
+               rxrpc_end_tx_phase(call, false, "ETA");
                return;
+       }
 
-       if (nr_acks > call->tx_top - first_soft_ack + 1)
-               nr_acks = first_soft_ack - call->tx_top + 1;
-       if (skb_copy_bits(skb, sp->offset, buf.acks, nr_acks) < 0)
-               return rxrpc_proto_abort("XSA", call, 0);
-       rxrpc_input_soft_acks(call, buf.acks, first_soft_ack, nr_acks);
 }
 
 /*
@@ -504,7 +673,9 @@ static void rxrpc_input_ackall(struct rxrpc_call *call, struct sk_buff *skb)
 
        _proto("Rx ACKALL %%%u", sp->hdr.serial);
 
-       rxrpc_end_tx_phase(call, "ETL");
+       rxrpc_rotate_tx_window(call, call->tx_top);
+       if (test_bit(RXRPC_CALL_TX_LAST, &call->flags))
+               rxrpc_end_tx_phase(call, false, "ETL");
 }
 
 /*
@@ -670,13 +841,13 @@ void rxrpc_data_ready(struct sock *udp_sk)
                return;
        }
 
-       rxrpc_new_skb(skb);
+       rxrpc_new_skb(skb, rxrpc_skb_rx_received);
 
        _net("recv skb %p", skb);
 
        /* we'll probably need to checksum it (didn't call sock_recvmsg) */
        if (skb_checksum_complete(skb)) {
-               rxrpc_free_skb(skb);
+               rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
                __UDP_INC_STATS(&init_net, UDP_MIB_INERRORS, 0);
                _leave(" [CSUM failed]");
                return;
@@ -690,12 +861,19 @@ void rxrpc_data_ready(struct sock *udp_sk)
        skb_orphan(skb);
        sp = rxrpc_skb(skb);
 
-       _net("Rx UDP packet from %08x:%04hu",
-            ntohl(ip_hdr(skb)->saddr), ntohs(udp_hdr(skb)->source));
-
        /* dig out the RxRPC connection details */
        if (rxrpc_extract_header(sp, skb) < 0)
                goto bad_message;
+
+       if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
+               static int lose;
+               if ((lose++ & 7) == 7) {
+                       trace_rxrpc_rx_lose(sp);
+                       rxrpc_lose_skb(skb, rxrpc_skb_rx_lost);
+                       return;
+               }
+       }
+
        trace_rxrpc_rx_packet(sp);
 
        _net("Rx RxRPC %s ep=%x call=%x:%x",
@@ -792,6 +970,7 @@ void rxrpc_data_ready(struct sock *udp_sk)
                        rcu_read_unlock();
                        goto reject_packet;
                }
+               rxrpc_send_ping(call, skb, skew);
        }
 
        rxrpc_input_call_packet(call, skb, skew);
@@ -800,7 +979,7 @@ void rxrpc_data_ready(struct sock *udp_sk)
 discard_unlock:
        rcu_read_unlock();
 discard:
-       rxrpc_free_skb(skb);
+       rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
 out:
        trace_rxrpc_rx_done(0, 0);
        return;