]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rxrpc: Add more CHALLENGE/RESPONSE packet tracing
authorDavid Howells <dhowells@redhat.com>
Fri, 11 Apr 2025 09:52:58 +0000 (10:52 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 15 Apr 2025 00:36:42 +0000 (17:36 -0700)
Add more tracing for CHALLENGE and RESPONSE packets.  Currently, rxrpc only
has client-relevant tracepoints (rx_challenge and tx_response), but add the
server-side ones too.

Further, record the service ID in the rx_challenge tracepoint as well.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Simon Horman <horms@kernel.org>
cc: linux-afs@lists.infradead.org
Link: https://patch.msgid.link/20250411095303.2316168-14-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/trace/events/rxrpc.h
net/rxrpc/output.c
net/rxrpc/rxgk.c
net/rxrpc/rxkad.c

index 920439df1f6fea37b171bf6b7debd95891b08feb..378d2dfc73923025a163a3ebb4407951c56b6037 100644 (file)
@@ -1201,6 +1201,39 @@ TRACE_EVENT(rxrpc_rx_conn_abort,
                      __entry->abort_code)
            );
 
+TRACE_EVENT(rxrpc_tx_challenge,
+           TP_PROTO(struct rxrpc_connection *conn, rxrpc_serial_t serial,
+                    u32 version, u32 nonce),
+
+           TP_ARGS(conn, serial, version, nonce),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       conn)
+                   __field(rxrpc_serial_t,     serial)
+                   __field(u32,                version)
+                   __field(u32,                nonce)
+                   __field(u16,                service_id)
+                   __field(u8,                 security_ix)
+                            ),
+
+           TP_fast_assign(
+                   __entry->conn = conn->debug_id;
+                   __entry->serial = serial;
+                   __entry->version = version;
+                   __entry->nonce = nonce;
+                   __entry->service_id = conn->service_id;
+                   __entry->security_ix = conn->security_ix;
+                          ),
+
+           TP_printk("C=%08x CHALLENGE r=%08x sv=%u+%u v=%x n=%x",
+                     __entry->conn,
+                     __entry->serial,
+                     __entry->service_id,
+                     __entry->security_ix,
+                     __entry->version,
+                     __entry->nonce)
+           );
+
 TRACE_EVENT(rxrpc_rx_challenge,
            TP_PROTO(struct rxrpc_connection *conn, rxrpc_serial_t serial,
                     u32 version, u32 nonce, u32 min_level),
@@ -1213,6 +1246,7 @@ TRACE_EVENT(rxrpc_rx_challenge,
                    __field(u32,                version)
                    __field(u32,                nonce)
                    __field(u32,                min_level)
+                   __field(u16,                service_id)
                    __field(u8,                 security_ix)
                             ),
 
@@ -1222,18 +1256,60 @@ TRACE_EVENT(rxrpc_rx_challenge,
                    __entry->version = version;
                    __entry->nonce = nonce;
                    __entry->min_level = min_level;
+                   __entry->service_id = conn->service_id;
                    __entry->security_ix = conn->security_ix;
                           ),
 
-           TP_printk("C=%08x CHALLENGE r=%08x sx=%u v=%x n=%x ml=%x",
+           TP_printk("C=%08x CHALLENGE r=%08x sv=%u+%u v=%x n=%x ml=%x",
                      __entry->conn,
                      __entry->serial,
+                     __entry->service_id,
                      __entry->security_ix,
                      __entry->version,
                      __entry->nonce,
                      __entry->min_level)
            );
 
+TRACE_EVENT(rxrpc_tx_response,
+           TP_PROTO(struct rxrpc_connection *conn, rxrpc_serial_t serial,
+                    struct rxrpc_skb_priv *rsp),
+
+           TP_ARGS(conn, serial, rsp),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       conn)
+                   __field(rxrpc_serial_t,     serial)
+                   __field(rxrpc_serial_t,     challenge)
+                   __field(u32,                version)
+                   __field(u32,                kvno)
+                   __field(u16,                ticket_len)
+                   __field(u16,                appdata_len)
+                   __field(u16,                service_id)
+                   __field(u8,                 security_ix)
+                            ),
+
+           TP_fast_assign(
+                   __entry->conn       = conn->debug_id;
+                   __entry->serial     = serial;
+                   __entry->challenge  = rsp->resp.challenge_serial;
+                   __entry->version    = rsp->resp.version;
+                   __entry->kvno       = rsp->resp.kvno;
+                   __entry->ticket_len = rsp->resp.ticket_len;
+                   __entry->service_id = conn->service_id;
+                   __entry->security_ix = conn->security_ix;
+                          ),
+
+           TP_printk("C=%08x RESPONSE r=%08x cr=%08x sv=%u+%u v=%x kv=%x tl=%u",
+                     __entry->conn,
+                     __entry->serial,
+                     __entry->challenge,
+                     __entry->service_id,
+                     __entry->security_ix,
+                     __entry->version,
+                     __entry->kvno,
+                     __entry->ticket_len)
+           );
+
 TRACE_EVENT(rxrpc_rx_response,
            TP_PROTO(struct rxrpc_connection *conn, rxrpc_serial_t serial,
                     u32 version, u32 kvno, u32 ticket_len),
index 8138f35d794597f234e2d96c9b2bf675b59fb61c..0af19bcdc80a4359ed11a4a6a54642ec67607f92 100644 (file)
@@ -953,6 +953,8 @@ void rxrpc_send_response(struct rxrpc_connection *conn, struct sk_buff *response
        serial = rxrpc_get_next_serials(conn, 1);
        wserial = htonl(serial);
 
+       trace_rxrpc_tx_response(conn, serial, sp);
+
        ret = skb_store_bits(response, offsetof(struct rxrpc_wire_header, serial),
                             &wserial, sizeof(wserial));
        if (ret < 0)
index 6175fc54ba90a2238b9afd5475ff1cebb90596c4..ba8bc201b8d38e44e5654a4a5a0ba12844c01906 100644 (file)
@@ -668,6 +668,8 @@ static int rxgk_issue_challenge(struct rxrpc_connection *conn)
        serial = rxrpc_get_next_serials(conn, 1);
        whdr->serial = htonl(serial);
 
+       trace_rxrpc_tx_challenge(conn, serial, 0, *(u32 *)&conn->rxgk.nonce);
+
        ret = do_udp_sendmsg(conn->local->socket, &msg, len);
        if (ret > 0)
                conn->peer->last_tx_at = ktime_get_seconds();
@@ -1203,6 +1205,8 @@ static int rxgk_verify_response(struct rxrpc_connection *conn,
        if (xdr_round_up(token_len) + sizeof(__be32) > len)
                goto short_packet;
 
+       trace_rxrpc_rx_response(conn, sp->hdr.serial, 0, sp->hdr.cksum, token_len);
+
        offset  += xdr_round_up(token_len);
        len     -= xdr_round_up(token_len);
 
index 0b5e007c7de956caab910b525c5cc555bfeb443f..3657c0661cdc7f69dc98d7f45977fcaee936262e 100644 (file)
@@ -685,6 +685,8 @@ static int rxkad_issue_challenge(struct rxrpc_connection *conn)
        serial = rxrpc_get_next_serial(conn);
        whdr.serial = htonl(serial);
 
+       trace_rxrpc_tx_challenge(conn, serial, 0, conn->rxkad.nonce);
+
        ret = kernel_sendmsg(conn->local->socket, &msg, iov, 2, len);
        if (ret < 0) {
                trace_rxrpc_tx_fail(conn->debug_id, serial, ret,