u32 data_size,
                                    void *sechdr)
 {
-       struct rxrpc_skb_priv *sp;
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher);
        struct rxkad_level1_hdr hdr;
        struct rxrpc_crypt iv;
        struct scatterlist sg;
        u16 check;
 
-       sp = rxrpc_skb(skb);
-
        _enter("");
 
        check = sp->hdr.seq ^ call->call_id;
        struct rxrpc_crypt iv;
        struct scatterlist sg[16];
        struct sk_buff *trailer;
+       bool aborted;
        u32 data_size, buf;
        u16 check;
        int nsg;
        _enter("");
 
        if (len < 8) {
-               rxrpc_abort_call("V1H", call, seq, RXKADSEALEDINCON, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_hdr", "V1H",
+                                          RXKADSEALEDINCON);
                goto protocol_error;
        }
 
 
        /* Extract the decrypted packet length */
        if (skb_copy_bits(skb, offset, &sechdr, sizeof(sechdr)) < 0) {
-               rxrpc_abort_call("XV1", call, seq, RXKADDATALEN, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_len", "XV1",
+                                            RXKADDATALEN);
                goto protocol_error;
        }
        offset += sizeof(sechdr);
        check ^= seq ^ call->call_id;
        check &= 0xffff;
        if (check != 0) {
-               rxrpc_abort_call("V1C", call, seq, RXKADSEALEDINCON, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_check", "V1C",
+                                            RXKADSEALEDINCON);
                goto protocol_error;
        }
 
        if (data_size > len) {
-               rxrpc_abort_call("V1L", call, seq, RXKADDATALEN, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_1_datalen", "V1L",
+                                            RXKADDATALEN);
                goto protocol_error;
        }
 
        return 0;
 
 protocol_error:
-       rxrpc_send_abort_packet(call);
-       _leave(" = -EPROTO");
+       if (aborted)
+               rxrpc_send_abort_packet(call);
        return -EPROTO;
 
 nomem:
        struct rxrpc_crypt iv;
        struct scatterlist _sg[4], *sg;
        struct sk_buff *trailer;
+       bool aborted;
        u32 data_size, buf;
        u16 check;
        int nsg;
        _enter(",{%d}", skb->len);
 
        if (len < 8) {
-               rxrpc_abort_call("V2H", call, seq, RXKADSEALEDINCON, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_hdr", "V2H",
+                                            RXKADSEALEDINCON);
                goto protocol_error;
        }
 
 
        /* Extract the decrypted packet length */
        if (skb_copy_bits(skb, offset, &sechdr, sizeof(sechdr)) < 0) {
-               rxrpc_abort_call("XV2", call, seq, RXKADDATALEN, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_len", "XV2",
+                                            RXKADDATALEN);
                goto protocol_error;
        }
        offset += sizeof(sechdr);
        check ^= seq ^ call->call_id;
        check &= 0xffff;
        if (check != 0) {
-               rxrpc_abort_call("V2C", call, seq, RXKADSEALEDINCON, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_check", "V2C",
+                                            RXKADSEALEDINCON);
                goto protocol_error;
        }
 
        if (data_size > len) {
-               rxrpc_abort_call("V2L", call, seq, RXKADDATALEN, -EPROTO);
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_2_datalen", "V2L",
+                                            RXKADDATALEN);
                goto protocol_error;
        }
 
        return 0;
 
 protocol_error:
-       rxrpc_send_abort_packet(call);
-       _leave(" = -EPROTO");
+       if (aborted)
+               rxrpc_send_abort_packet(call);
        return -EPROTO;
 
 nomem:
        SKCIPHER_REQUEST_ON_STACK(req, call->conn->cipher);
        struct rxrpc_crypt iv;
        struct scatterlist sg;
+       bool aborted;
        u16 cksum;
        u32 x, y;
 
                cksum = 1; /* zero checksums are not permitted */
 
        if (cksum != expected_cksum) {
-               rxrpc_abort_call("VCK", call, seq, RXKADSEALEDINCON, -EPROTO);
-               rxrpc_send_abort_packet(call);
-               _leave(" = -EPROTO [csum failed]");
-               return -EPROTO;
+               aborted = rxrpc_abort_eproto(call, skb, "rxkad_csum", "VCK",
+                                            RXKADSEALEDINCON);
+               goto protocol_error;
        }
 
        switch (call->conn->params.security_level) {
        default:
                return -ENOANO;
        }
+
+protocol_error:
+       if (aborted)
+               rxrpc_send_abort_packet(call);
+       return -EPROTO;
 }
 
 /*
        struct rxkad_response resp
                __attribute__((aligned(8))); /* must be aligned for crypto */
        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+       const char *eproto;
        u32 version, nonce, min_level, abort_code;
        int ret;
 
        _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key));
 
+       eproto = tracepoint_string("chall_no_key");
        abort_code = RX_PROTOCOL_ERROR;
        if (!conn->params.key)
                goto protocol_error;
        if (ret < 0)
                goto other_error;
 
+       eproto = tracepoint_string("chall_short");
        abort_code = RXKADPACKETSHORT;
        if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
                          &challenge, sizeof(challenge)) < 0)
        _proto("Rx CHALLENGE %%%u { v=%u n=%u ml=%u }",
               sp->hdr.serial, version, nonce, min_level);
 
+       eproto = tracepoint_string("chall_ver");
        abort_code = RXKADINCONSISTENCY;
        if (version != RXKAD_VERSION)
                goto protocol_error;
        return rxkad_send_response(conn, &sp->hdr, &resp, token->kad);
 
 protocol_error:
+       trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto);
        ret = -EPROTO;
 other_error:
        *_abort_code = abort_code;
  * decrypt the kerberos IV ticket in the response
  */
 static int rxkad_decrypt_ticket(struct rxrpc_connection *conn,
+                               struct sk_buff *skb,
                                void *ticket, size_t ticket_len,
                                struct rxrpc_crypt *_session_key,
                                time_t *_expiry,
                                u32 *_abort_code)
 {
        struct skcipher_request *req;
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        struct rxrpc_crypt iv, key;
        struct scatterlist sg[1];
        struct in_addr addr;
        unsigned int life;
+       const char *eproto;
        time_t issue, now;
        bool little_endian;
        int ret;
+       u32 abort_code;
        u8 *p, *q, *name, *end;
 
        _enter("{%d},{%x}", conn->debug_id, key_serial(conn->server_key));
        if (ret < 0) {
                switch (ret) {
                case -EKEYEXPIRED:
-                       *_abort_code = RXKADEXPIRED;
+                       abort_code = RXKADEXPIRED;
                        goto other_error;
                default:
-                       *_abort_code = RXKADNOAUTH;
+                       abort_code = RXKADNOAUTH;
                        goto other_error;
                }
        }
        p = ticket;
        end = p + ticket_len;
 
-#define Z(size)                                                \
+#define Z(field)                                       \
        ({                                              \
                u8 *__str = p;                          \
+               eproto = tracepoint_string("rxkad_bad_"#field); \
                q = memchr(p, 0, end - p);              \
-               if (!q || q - p > (size))               \
+               if (!q || q - p > (field##_SZ))         \
                        goto bad_ticket;                \
                for (; p < q; p++)                      \
                        if (!isprint(*p))               \
        p++;
 
        /* extract the authentication name */
-       name = Z(ANAME_SZ);
+       name = Z(ANAME);
        _debug("KIV ANAME: %s", name);
 
        /* extract the principal's instance */
-       name = Z(INST_SZ);
+       name = Z(INST);
        _debug("KIV INST : %s", name);
 
        /* extract the principal's authentication domain */
-       name = Z(REALM_SZ);
+       name = Z(REALM);
        _debug("KIV REALM: %s", name);
 
+       eproto = tracepoint_string("rxkad_bad_len");
        if (end - p < 4 + 8 + 4 + 2)
                goto bad_ticket;
 
 
        /* check the ticket is in date */
        if (issue > now) {
-               *_abort_code = RXKADNOAUTH;
+               abort_code = RXKADNOAUTH;
                ret = -EKEYREJECTED;
                goto other_error;
        }
 
        if (issue < now - life) {
-               *_abort_code = RXKADEXPIRED;
+               abort_code = RXKADEXPIRED;
                ret = -EKEYEXPIRED;
                goto other_error;
        }
        *_expiry = issue + life;
 
        /* get the service name */
-       name = Z(SNAME_SZ);
+       name = Z(SNAME);
        _debug("KIV SNAME: %s", name);
 
        /* get the service instance name */
-       name = Z(INST_SZ);
+       name = Z(INST);
        _debug("KIV SINST: %s", name);
        return 0;
 
 bad_ticket:
-       *_abort_code = RXKADBADTICKET;
+       trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto);
+       abort_code = RXKADBADTICKET;
        ret = -EPROTO;
 other_error:
+       *_abort_code = abort_code;
        return ret;
 temporary_error:
        return ret;
                __attribute__((aligned(8))); /* must be aligned for crypto */
        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        struct rxrpc_crypt session_key;
+       const char *eproto;
        time_t expiry;
        void *ticket;
        u32 abort_code, version, kvno, ticket_len, level;
 
        _enter("{%d,%x}", conn->debug_id, key_serial(conn->server_key));
 
+       eproto = tracepoint_string("rxkad_rsp_short");
        abort_code = RXKADPACKETSHORT;
        if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
                          &response, sizeof(response)) < 0)
        _proto("Rx RESPONSE %%%u { v=%u kv=%u tl=%u }",
               sp->hdr.serial, version, kvno, ticket_len);
 
+       eproto = tracepoint_string("rxkad_rsp_ver");
        abort_code = RXKADINCONSISTENCY;
        if (version != RXKAD_VERSION)
                goto protocol_error;
 
+       eproto = tracepoint_string("rxkad_rsp_tktlen");
        abort_code = RXKADTICKETLEN;
        if (ticket_len < 4 || ticket_len > MAXKRB5TICKETLEN)
                goto protocol_error;
 
+       eproto = tracepoint_string("rxkad_rsp_unkkey");
        abort_code = RXKADUNKNOWNKEY;
        if (kvno >= RXKAD_TKT_TYPE_KERBEROS_V5)
                goto protocol_error;
        if (!ticket)
                goto temporary_error;
 
+       eproto = tracepoint_string("rxkad_tkt_short");
        abort_code = RXKADPACKETSHORT;
        if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
                          ticket, ticket_len) < 0)
                goto protocol_error_free;
 
-       ret = rxkad_decrypt_ticket(conn, ticket, ticket_len, &session_key,
+       ret = rxkad_decrypt_ticket(conn, skb, ticket, ticket_len, &session_key,
                                   &expiry, _abort_code);
        if (ret < 0)
                goto temporary_error_free;
         * response */
        rxkad_decrypt_response(conn, &response, &session_key);
 
+       eproto = tracepoint_string("rxkad_rsp_param");
        abort_code = RXKADSEALEDINCON;
        if (ntohl(response.encrypted.epoch) != conn->proto.epoch)
                goto protocol_error_free;
        csum = response.encrypted.checksum;
        response.encrypted.checksum = 0;
        rxkad_calc_response_checksum(&response);
+       eproto = tracepoint_string("rxkad_rsp_csum");
        if (response.encrypted.checksum != csum)
                goto protocol_error_free;
 
                struct rxrpc_call *call;
                u32 call_id = ntohl(response.encrypted.call_id[i]);
 
+               eproto = tracepoint_string("rxkad_rsp_callid");
                if (call_id > INT_MAX)
                        goto protocol_error_unlock;
 
+               eproto = tracepoint_string("rxkad_rsp_callctr");
                if (call_id < conn->channels[i].call_counter)
                        goto protocol_error_unlock;
+
+               eproto = tracepoint_string("rxkad_rsp_callst");
                if (call_id > conn->channels[i].call_counter) {
                        call = rcu_dereference_protected(
                                conn->channels[i].call,
        }
        spin_unlock(&conn->channel_lock);
 
+       eproto = tracepoint_string("rxkad_rsp_seq");
        abort_code = RXKADOUTOFSEQUENCE;
        if (ntohl(response.encrypted.inc_nonce) != conn->security_nonce + 1)
                goto protocol_error_free;
 
+       eproto = tracepoint_string("rxkad_rsp_level");
        abort_code = RXKADLEVELFAIL;
        level = ntohl(response.encrypted.level);
        if (level > RXRPC_SECURITY_ENCRYPT)
 protocol_error_free:
        kfree(ticket);
 protocol_error:
+       trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto);
        *_abort_code = abort_code;
-       _leave(" = -EPROTO [%d]", abort_code);
        return -EPROTO;
 
 temporary_error_free: