689 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright (c) 2018 Oracle. All rights reserved.4 *5 * Trace point definitions for the "rpcgss" subsystem.6 */7 8#undef TRACE_SYSTEM9#define TRACE_SYSTEM rpcgss10 11#if !defined(_TRACE_RPCGSS_H) || defined(TRACE_HEADER_MULTI_READ)12#define _TRACE_RPCGSS_H13 14#include <linux/tracepoint.h>15 16#include <trace/misc/sunrpc.h>17 18/**19 ** GSS-API related trace events20 **/21 22TRACE_DEFINE_ENUM(RPC_GSS_SVC_NONE);23TRACE_DEFINE_ENUM(RPC_GSS_SVC_INTEGRITY);24TRACE_DEFINE_ENUM(RPC_GSS_SVC_PRIVACY);25 26#define show_gss_service(x) \27 __print_symbolic(x, \28 { RPC_GSS_SVC_NONE, "none" }, \29 { RPC_GSS_SVC_INTEGRITY, "integrity" }, \30 { RPC_GSS_SVC_PRIVACY, "privacy" })31 32TRACE_DEFINE_ENUM(GSS_S_BAD_MECH);33TRACE_DEFINE_ENUM(GSS_S_BAD_NAME);34TRACE_DEFINE_ENUM(GSS_S_BAD_NAMETYPE);35TRACE_DEFINE_ENUM(GSS_S_BAD_BINDINGS);36TRACE_DEFINE_ENUM(GSS_S_BAD_STATUS);37TRACE_DEFINE_ENUM(GSS_S_BAD_SIG);38TRACE_DEFINE_ENUM(GSS_S_NO_CRED);39TRACE_DEFINE_ENUM(GSS_S_NO_CONTEXT);40TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_TOKEN);41TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_CREDENTIAL);42TRACE_DEFINE_ENUM(GSS_S_CREDENTIALS_EXPIRED);43TRACE_DEFINE_ENUM(GSS_S_CONTEXT_EXPIRED);44TRACE_DEFINE_ENUM(GSS_S_FAILURE);45TRACE_DEFINE_ENUM(GSS_S_BAD_QOP);46TRACE_DEFINE_ENUM(GSS_S_UNAUTHORIZED);47TRACE_DEFINE_ENUM(GSS_S_UNAVAILABLE);48TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_ELEMENT);49TRACE_DEFINE_ENUM(GSS_S_NAME_NOT_MN);50TRACE_DEFINE_ENUM(GSS_S_CONTINUE_NEEDED);51TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_TOKEN);52TRACE_DEFINE_ENUM(GSS_S_OLD_TOKEN);53TRACE_DEFINE_ENUM(GSS_S_UNSEQ_TOKEN);54TRACE_DEFINE_ENUM(GSS_S_GAP_TOKEN);55 56#define show_gss_status(x) \57 __print_symbolic(x, \58 { GSS_S_BAD_MECH, "GSS_S_BAD_MECH" }, \59 { GSS_S_BAD_NAME, "GSS_S_BAD_NAME" }, \60 { GSS_S_BAD_NAMETYPE, "GSS_S_BAD_NAMETYPE" }, \61 { GSS_S_BAD_BINDINGS, "GSS_S_BAD_BINDINGS" }, \62 { GSS_S_BAD_STATUS, "GSS_S_BAD_STATUS" }, \63 { GSS_S_BAD_SIG, "GSS_S_BAD_SIG" }, \64 { GSS_S_NO_CRED, "GSS_S_NO_CRED" }, \65 { GSS_S_NO_CONTEXT, "GSS_S_NO_CONTEXT" }, \66 { GSS_S_DEFECTIVE_TOKEN, "GSS_S_DEFECTIVE_TOKEN" }, \67 { GSS_S_DEFECTIVE_CREDENTIAL, "GSS_S_DEFECTIVE_CREDENTIAL" }, \68 { GSS_S_CREDENTIALS_EXPIRED, "GSS_S_CREDENTIALS_EXPIRED" }, \69 { GSS_S_CONTEXT_EXPIRED, "GSS_S_CONTEXT_EXPIRED" }, \70 { GSS_S_FAILURE, "GSS_S_FAILURE" }, \71 { GSS_S_BAD_QOP, "GSS_S_BAD_QOP" }, \72 { GSS_S_UNAUTHORIZED, "GSS_S_UNAUTHORIZED" }, \73 { GSS_S_UNAVAILABLE, "GSS_S_UNAVAILABLE" }, \74 { GSS_S_DUPLICATE_ELEMENT, "GSS_S_DUPLICATE_ELEMENT" }, \75 { GSS_S_NAME_NOT_MN, "GSS_S_NAME_NOT_MN" }, \76 { GSS_S_CONTINUE_NEEDED, "GSS_S_CONTINUE_NEEDED" }, \77 { GSS_S_DUPLICATE_TOKEN, "GSS_S_DUPLICATE_TOKEN" }, \78 { GSS_S_OLD_TOKEN, "GSS_S_OLD_TOKEN" }, \79 { GSS_S_UNSEQ_TOKEN, "GSS_S_UNSEQ_TOKEN" }, \80 { GSS_S_GAP_TOKEN, "GSS_S_GAP_TOKEN" })81 82 83DECLARE_EVENT_CLASS(rpcgss_gssapi_event,84 TP_PROTO(85 const struct rpc_task *task,86 u32 maj_stat87 ),88 89 TP_ARGS(task, maj_stat),90 91 TP_STRUCT__entry(92 __field(unsigned int, task_id)93 __field(unsigned int, client_id)94 __field(u32, maj_stat)95 96 ),97 98 TP_fast_assign(99 __entry->task_id = task->tk_pid;100 __entry->client_id = task->tk_client->cl_clid;101 __entry->maj_stat = maj_stat;102 ),103 104 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER " maj_stat=%s",105 __entry->task_id, __entry->client_id,106 __entry->maj_stat == 0 ?107 "GSS_S_COMPLETE" : show_gss_status(__entry->maj_stat))108);109 110#define DEFINE_GSSAPI_EVENT(name) \111 DEFINE_EVENT(rpcgss_gssapi_event, rpcgss_##name, \112 TP_PROTO( \113 const struct rpc_task *task, \114 u32 maj_stat \115 ), \116 TP_ARGS(task, maj_stat))117 118TRACE_EVENT(rpcgss_import_ctx,119 TP_PROTO(120 int status121 ),122 123 TP_ARGS(status),124 125 TP_STRUCT__entry(126 __field(int, status)127 ),128 129 TP_fast_assign(130 __entry->status = status;131 ),132 133 TP_printk("status=%d", __entry->status)134);135 136DEFINE_GSSAPI_EVENT(get_mic);137DEFINE_GSSAPI_EVENT(verify_mic);138DEFINE_GSSAPI_EVENT(wrap);139DEFINE_GSSAPI_EVENT(unwrap);140 141DECLARE_EVENT_CLASS(rpcgss_ctx_class,142 TP_PROTO(143 const struct gss_cred *gc144 ),145 146 TP_ARGS(gc),147 148 TP_STRUCT__entry(149 __field(const void *, cred)150 __field(unsigned long, service)151 __string(principal, gc->gc_principal)152 ),153 154 TP_fast_assign(155 __entry->cred = gc;156 __entry->service = gc->gc_service;157 __assign_str(principal);158 ),159 160 TP_printk("cred=%p service=%s principal='%s'",161 __entry->cred, show_gss_service(__entry->service),162 __get_str(principal))163);164 165#define DEFINE_CTX_EVENT(name) \166 DEFINE_EVENT(rpcgss_ctx_class, rpcgss_ctx_##name, \167 TP_PROTO( \168 const struct gss_cred *gc \169 ), \170 TP_ARGS(gc))171 172DEFINE_CTX_EVENT(init);173DEFINE_CTX_EVENT(destroy);174 175DECLARE_EVENT_CLASS(rpcgss_svc_gssapi_class,176 TP_PROTO(177 const struct svc_rqst *rqstp,178 u32 maj_stat179 ),180 181 TP_ARGS(rqstp, maj_stat),182 183 TP_STRUCT__entry(184 __field(u32, xid)185 __field(u32, maj_stat)186 __string(addr, rqstp->rq_xprt->xpt_remotebuf)187 ),188 189 TP_fast_assign(190 __entry->xid = __be32_to_cpu(rqstp->rq_xid);191 __entry->maj_stat = maj_stat;192 __assign_str(addr);193 ),194 195 TP_printk("addr=%s xid=0x%08x maj_stat=%s",196 __get_str(addr), __entry->xid,197 __entry->maj_stat == 0 ?198 "GSS_S_COMPLETE" : show_gss_status(__entry->maj_stat))199);200 201#define DEFINE_SVC_GSSAPI_EVENT(name) \202 DEFINE_EVENT(rpcgss_svc_gssapi_class, rpcgss_svc_##name, \203 TP_PROTO( \204 const struct svc_rqst *rqstp, \205 u32 maj_stat \206 ), \207 TP_ARGS(rqstp, maj_stat))208 209DEFINE_SVC_GSSAPI_EVENT(wrap);210DEFINE_SVC_GSSAPI_EVENT(unwrap);211DEFINE_SVC_GSSAPI_EVENT(mic);212DEFINE_SVC_GSSAPI_EVENT(get_mic);213 214TRACE_EVENT(rpcgss_svc_wrap_failed,215 TP_PROTO(216 const struct svc_rqst *rqstp217 ),218 219 TP_ARGS(rqstp),220 221 TP_STRUCT__entry(222 __field(u32, xid)223 __string(addr, rqstp->rq_xprt->xpt_remotebuf)224 ),225 226 TP_fast_assign(227 __entry->xid = be32_to_cpu(rqstp->rq_xid);228 __assign_str(addr);229 ),230 231 TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid)232);233 234TRACE_EVENT(rpcgss_svc_unwrap_failed,235 TP_PROTO(236 const struct svc_rqst *rqstp237 ),238 239 TP_ARGS(rqstp),240 241 TP_STRUCT__entry(242 __field(u32, xid)243 __string(addr, rqstp->rq_xprt->xpt_remotebuf)244 ),245 246 TP_fast_assign(247 __entry->xid = be32_to_cpu(rqstp->rq_xid);248 __assign_str(addr);249 ),250 251 TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid)252);253 254TRACE_EVENT(rpcgss_svc_seqno_bad,255 TP_PROTO(256 const struct svc_rqst *rqstp,257 u32 expected,258 u32 received259 ),260 261 TP_ARGS(rqstp, expected, received),262 263 TP_STRUCT__entry(264 __field(u32, expected)265 __field(u32, received)266 __field(u32, xid)267 __string(addr, rqstp->rq_xprt->xpt_remotebuf)268 ),269 270 TP_fast_assign(271 __entry->expected = expected;272 __entry->received = received;273 __entry->xid = __be32_to_cpu(rqstp->rq_xid);274 __assign_str(addr);275 ),276 277 TP_printk("addr=%s xid=0x%08x expected seqno %u, received seqno %u",278 __get_str(addr), __entry->xid,279 __entry->expected, __entry->received)280);281 282TRACE_EVENT(rpcgss_svc_accept_upcall,283 TP_PROTO(284 const struct svc_rqst *rqstp,285 u32 major_status,286 u32 minor_status287 ),288 289 TP_ARGS(rqstp, major_status, minor_status),290 291 TP_STRUCT__entry(292 __field(u32, minor_status)293 __field(unsigned long, major_status)294 __field(u32, xid)295 __string(addr, rqstp->rq_xprt->xpt_remotebuf)296 ),297 298 TP_fast_assign(299 __entry->minor_status = minor_status;300 __entry->major_status = major_status;301 __entry->xid = be32_to_cpu(rqstp->rq_xid);302 __assign_str(addr);303 ),304 305 TP_printk("addr=%s xid=0x%08x major_status=%s (0x%08lx) minor_status=%u",306 __get_str(addr), __entry->xid,307 (__entry->major_status == 0) ? "GSS_S_COMPLETE" :308 show_gss_status(__entry->major_status),309 __entry->major_status, __entry->minor_status310 )311);312 313TRACE_EVENT(rpcgss_svc_authenticate,314 TP_PROTO(315 const struct svc_rqst *rqstp,316 const struct rpc_gss_wire_cred *gc317 ),318 319 TP_ARGS(rqstp, gc),320 321 TP_STRUCT__entry(322 __field(u32, seqno)323 __field(u32, xid)324 __string(addr, rqstp->rq_xprt->xpt_remotebuf)325 ),326 327 TP_fast_assign(328 __entry->xid = be32_to_cpu(rqstp->rq_xid);329 __entry->seqno = gc->gc_seq;330 __assign_str(addr);331 ),332 333 TP_printk("addr=%s xid=0x%08x seqno=%u", __get_str(addr),334 __entry->xid, __entry->seqno)335);336 337 338/**339 ** GSS auth unwrap failures340 **/341 342TRACE_EVENT(rpcgss_unwrap_failed,343 TP_PROTO(344 const struct rpc_task *task345 ),346 347 TP_ARGS(task),348 349 TP_STRUCT__entry(350 __field(unsigned int, task_id)351 __field(unsigned int, client_id)352 ),353 354 TP_fast_assign(355 __entry->task_id = task->tk_pid;356 __entry->client_id = task->tk_client->cl_clid;357 ),358 359 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER,360 __entry->task_id, __entry->client_id)361);362 363TRACE_EVENT(rpcgss_bad_seqno,364 TP_PROTO(365 const struct rpc_task *task,366 u32 expected,367 u32 received368 ),369 370 TP_ARGS(task, expected, received),371 372 TP_STRUCT__entry(373 __field(unsigned int, task_id)374 __field(unsigned int, client_id)375 __field(u32, expected)376 __field(u32, received)377 ),378 379 TP_fast_assign(380 __entry->task_id = task->tk_pid;381 __entry->client_id = task->tk_client->cl_clid;382 __entry->expected = expected;383 __entry->received = received;384 ),385 386 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER387 " expected seqno %u, received seqno %u",388 __entry->task_id, __entry->client_id,389 __entry->expected, __entry->received)390);391 392TRACE_EVENT(rpcgss_seqno,393 TP_PROTO(394 const struct rpc_task *task395 ),396 397 TP_ARGS(task),398 399 TP_STRUCT__entry(400 __field(unsigned int, task_id)401 __field(unsigned int, client_id)402 __field(u32, xid)403 __field(u32, seqno)404 ),405 406 TP_fast_assign(407 const struct rpc_rqst *rqst = task->tk_rqstp;408 409 __entry->task_id = task->tk_pid;410 __entry->client_id = task->tk_client->cl_clid;411 __entry->xid = be32_to_cpu(rqst->rq_xid);412 __entry->seqno = rqst->rq_seqno;413 ),414 415 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER " xid=0x%08x seqno=%u",416 __entry->task_id, __entry->client_id,417 __entry->xid, __entry->seqno)418);419 420TRACE_EVENT(rpcgss_need_reencode,421 TP_PROTO(422 const struct rpc_task *task,423 u32 seq_xmit,424 bool ret425 ),426 427 TP_ARGS(task, seq_xmit, ret),428 429 TP_STRUCT__entry(430 __field(unsigned int, task_id)431 __field(unsigned int, client_id)432 __field(u32, xid)433 __field(u32, seq_xmit)434 __field(u32, seqno)435 __field(bool, ret)436 ),437 438 TP_fast_assign(439 __entry->task_id = task->tk_pid;440 __entry->client_id = task->tk_client->cl_clid;441 __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid);442 __entry->seq_xmit = seq_xmit;443 __entry->seqno = task->tk_rqstp->rq_seqno;444 __entry->ret = ret;445 ),446 447 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER448 " xid=0x%08x rq_seqno=%u seq_xmit=%u reencode %sneeded",449 __entry->task_id, __entry->client_id,450 __entry->xid, __entry->seqno, __entry->seq_xmit,451 __entry->ret ? "" : "un")452);453 454TRACE_EVENT(rpcgss_update_slack,455 TP_PROTO(456 const struct rpc_task *task,457 const struct rpc_auth *auth458 ),459 460 TP_ARGS(task, auth),461 462 TP_STRUCT__entry(463 __field(unsigned int, task_id)464 __field(unsigned int, client_id)465 __field(u32, xid)466 __field(const void *, auth)467 __field(unsigned int, rslack)468 __field(unsigned int, ralign)469 __field(unsigned int, verfsize)470 ),471 472 TP_fast_assign(473 __entry->task_id = task->tk_pid;474 __entry->client_id = task->tk_client->cl_clid;475 __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid);476 __entry->auth = auth;477 __entry->rslack = auth->au_rslack;478 __entry->ralign = auth->au_ralign;479 __entry->verfsize = auth->au_verfsize;480 ),481 482 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER483 " xid=0x%08x auth=%p rslack=%u ralign=%u verfsize=%u\n",484 __entry->task_id, __entry->client_id, __entry->xid,485 __entry->auth, __entry->rslack, __entry->ralign,486 __entry->verfsize)487);488 489DECLARE_EVENT_CLASS(rpcgss_svc_seqno_class,490 TP_PROTO(491 const struct svc_rqst *rqstp,492 u32 seqno493 ),494 495 TP_ARGS(rqstp, seqno),496 497 TP_STRUCT__entry(498 __field(u32, xid)499 __field(u32, seqno)500 ),501 502 TP_fast_assign(503 __entry->xid = be32_to_cpu(rqstp->rq_xid);504 __entry->seqno = seqno;505 ),506 507 TP_printk("xid=0x%08x seqno=%u",508 __entry->xid, __entry->seqno)509);510 511#define DEFINE_SVC_SEQNO_EVENT(name) \512 DEFINE_EVENT(rpcgss_svc_seqno_class, rpcgss_svc_seqno_##name, \513 TP_PROTO( \514 const struct svc_rqst *rqstp, \515 u32 seqno \516 ), \517 TP_ARGS(rqstp, seqno))518 519DEFINE_SVC_SEQNO_EVENT(large);520DEFINE_SVC_SEQNO_EVENT(seen);521 522TRACE_EVENT(rpcgss_svc_seqno_low,523 TP_PROTO(524 const struct svc_rqst *rqstp,525 u32 seqno,526 u32 min,527 u32 max528 ),529 530 TP_ARGS(rqstp, seqno, min, max),531 532 TP_STRUCT__entry(533 __field(u32, xid)534 __field(u32, seqno)535 __field(u32, min)536 __field(u32, max)537 ),538 539 TP_fast_assign(540 __entry->xid = be32_to_cpu(rqstp->rq_xid);541 __entry->seqno = seqno;542 __entry->min = min;543 __entry->max = max;544 ),545 546 TP_printk("xid=0x%08x seqno=%u window=[%u..%u]",547 __entry->xid, __entry->seqno, __entry->min, __entry->max)548);549 550/**551 ** gssd upcall related trace events552 **/553 554TRACE_EVENT(rpcgss_upcall_msg,555 TP_PROTO(556 const char *buf557 ),558 559 TP_ARGS(buf),560 561 TP_STRUCT__entry(562 __string(msg, buf)563 ),564 565 TP_fast_assign(566 __assign_str(msg);567 ),568 569 TP_printk("msg='%s'", __get_str(msg))570);571 572TRACE_EVENT(rpcgss_upcall_result,573 TP_PROTO(574 u32 uid,575 int result576 ),577 578 TP_ARGS(uid, result),579 580 TP_STRUCT__entry(581 __field(u32, uid)582 __field(int, result)583 584 ),585 586 TP_fast_assign(587 __entry->uid = uid;588 __entry->result = result;589 ),590 591 TP_printk("for uid %u, result=%d", __entry->uid, __entry->result)592);593 594TRACE_EVENT(rpcgss_context,595 TP_PROTO(596 u32 window_size,597 unsigned long expiry,598 unsigned long now,599 unsigned int timeout,600 unsigned int len,601 const u8 *data602 ),603 604 TP_ARGS(window_size, expiry, now, timeout, len, data),605 606 TP_STRUCT__entry(607 __field(unsigned long, expiry)608 __field(unsigned long, now)609 __field(unsigned int, timeout)610 __field(u32, window_size)611 __field(int, len)612 __string_len(acceptor, data, len)613 ),614 615 TP_fast_assign(616 __entry->expiry = expiry;617 __entry->now = now;618 __entry->timeout = timeout;619 __entry->window_size = window_size;620 __entry->len = len;621 __assign_str(acceptor);622 ),623 624 TP_printk("win_size=%u expiry=%lu now=%lu timeout=%u acceptor=%.*s",625 __entry->window_size, __entry->expiry, __entry->now,626 __entry->timeout, __entry->len, __get_str(acceptor))627);628 629 630/**631 ** Miscellaneous events632 */633 634TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5);635TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5I);636TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5P);637 638#define show_pseudoflavor(x) \639 __print_symbolic(x, \640 { RPC_AUTH_GSS_KRB5, "RPC_AUTH_GSS_KRB5" }, \641 { RPC_AUTH_GSS_KRB5I, "RPC_AUTH_GSS_KRB5I" }, \642 { RPC_AUTH_GSS_KRB5P, "RPC_AUTH_GSS_KRB5P" })643 644 645TRACE_EVENT(rpcgss_createauth,646 TP_PROTO(647 unsigned int flavor,648 int error649 ),650 651 TP_ARGS(flavor, error),652 653 TP_STRUCT__entry(654 __field(unsigned int, flavor)655 __field(int, error)656 657 ),658 659 TP_fast_assign(660 __entry->flavor = flavor;661 __entry->error = error;662 ),663 664 TP_printk("flavor=%s error=%d",665 show_pseudoflavor(__entry->flavor), __entry->error)666);667 668TRACE_EVENT(rpcgss_oid_to_mech,669 TP_PROTO(670 const char *oid671 ),672 673 TP_ARGS(oid),674 675 TP_STRUCT__entry(676 __string(oid, oid)677 ),678 679 TP_fast_assign(680 __assign_str(oid);681 ),682 683 TP_printk("mech for oid %s was not found", __get_str(oid))684);685 686#endif /* _TRACE_RPCGSS_H */687 688#include <trace/define_trace.h>689