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_SYSTEM 9 #define TRACE_SYSTEM rpcgss 10 11 #if !defined(_TRACE_RPCGSS_H) || defined(TRACE_HEADER_MULTI_READ) 12 #define _TRACE_RPCGSS_H 13 14 #include <linux/tracepoint.h> 15 16 #include <trace/events/sunrpc_base.h> 17 18 /** 19 ** GSS-API related trace events 20 **/ 21 22 TRACE_DEFINE_ENUM(RPC_GSS_SVC_NONE); 23 TRACE_DEFINE_ENUM(RPC_GSS_SVC_INTEGRITY); 24 TRACE_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 32 TRACE_DEFINE_ENUM(GSS_S_BAD_MECH); 33 TRACE_DEFINE_ENUM(GSS_S_BAD_NAME); 34 TRACE_DEFINE_ENUM(GSS_S_BAD_NAMETYPE); 35 TRACE_DEFINE_ENUM(GSS_S_BAD_BINDINGS); 36 TRACE_DEFINE_ENUM(GSS_S_BAD_STATUS); 37 TRACE_DEFINE_ENUM(GSS_S_BAD_SIG); 38 TRACE_DEFINE_ENUM(GSS_S_NO_CRED); 39 TRACE_DEFINE_ENUM(GSS_S_NO_CONTEXT); 40 TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_TOKEN); 41 TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_CREDENTIAL); 42 TRACE_DEFINE_ENUM(GSS_S_CREDENTIALS_EXPIRED); 43 TRACE_DEFINE_ENUM(GSS_S_CONTEXT_EXPIRED); 44 TRACE_DEFINE_ENUM(GSS_S_FAILURE); 45 TRACE_DEFINE_ENUM(GSS_S_BAD_QOP); 46 TRACE_DEFINE_ENUM(GSS_S_UNAUTHORIZED); 47 TRACE_DEFINE_ENUM(GSS_S_UNAVAILABLE); 48 TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_ELEMENT); 49 TRACE_DEFINE_ENUM(GSS_S_NAME_NOT_MN); 50 TRACE_DEFINE_ENUM(GSS_S_CONTINUE_NEEDED); 51 TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_TOKEN); 52 TRACE_DEFINE_ENUM(GSS_S_OLD_TOKEN); 53 TRACE_DEFINE_ENUM(GSS_S_UNSEQ_TOKEN); 54 TRACE_DEFINE_ENUM(GSS_S_GAP_TOKEN); 55 56 #define show_gss_status(x) \ 57 __print_flags(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 83 DECLARE_EVENT_CLASS(rpcgss_gssapi_event, 84 TP_PROTO( 85 const struct rpc_task *task, 86 u32 maj_stat 87 ), 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 118 TRACE_EVENT(rpcgss_import_ctx, 119 TP_PROTO( 120 int status 121 ), 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 136 DEFINE_GSSAPI_EVENT(get_mic); 137 DEFINE_GSSAPI_EVENT(verify_mic); 138 DEFINE_GSSAPI_EVENT(wrap); 139 DEFINE_GSSAPI_EVENT(unwrap); 140 141 DECLARE_EVENT_CLASS(rpcgss_ctx_class, 142 TP_PROTO( 143 const struct gss_cred *gc 144 ), 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, gc->gc_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 172 DEFINE_CTX_EVENT(init); 173 DEFINE_CTX_EVENT(destroy); 174 175 DECLARE_EVENT_CLASS(rpcgss_svc_gssapi_class, 176 TP_PROTO( 177 const struct svc_rqst *rqstp, 178 u32 maj_stat 179 ), 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, rqstp->rq_xprt->xpt_remotebuf); 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 209 DEFINE_SVC_GSSAPI_EVENT(unwrap); 210 DEFINE_SVC_GSSAPI_EVENT(mic); 211 212 TRACE_EVENT(rpcgss_svc_unwrap_failed, 213 TP_PROTO( 214 const struct svc_rqst *rqstp 215 ), 216 217 TP_ARGS(rqstp), 218 219 TP_STRUCT__entry( 220 __field(u32, xid) 221 __string(addr, rqstp->rq_xprt->xpt_remotebuf) 222 ), 223 224 TP_fast_assign( 225 __entry->xid = be32_to_cpu(rqstp->rq_xid); 226 __assign_str(addr, rqstp->rq_xprt->xpt_remotebuf); 227 ), 228 229 TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid) 230 ); 231 232 TRACE_EVENT(rpcgss_svc_seqno_bad, 233 TP_PROTO( 234 const struct svc_rqst *rqstp, 235 u32 expected, 236 u32 received 237 ), 238 239 TP_ARGS(rqstp, expected, received), 240 241 TP_STRUCT__entry( 242 __field(u32, expected) 243 __field(u32, received) 244 __field(u32, xid) 245 __string(addr, rqstp->rq_xprt->xpt_remotebuf) 246 ), 247 248 TP_fast_assign( 249 __entry->expected = expected; 250 __entry->received = received; 251 __entry->xid = __be32_to_cpu(rqstp->rq_xid); 252 __assign_str(addr, rqstp->rq_xprt->xpt_remotebuf); 253 ), 254 255 TP_printk("addr=%s xid=0x%08x expected seqno %u, received seqno %u", 256 __get_str(addr), __entry->xid, 257 __entry->expected, __entry->received) 258 ); 259 260 TRACE_EVENT(rpcgss_svc_accept_upcall, 261 TP_PROTO( 262 const struct svc_rqst *rqstp, 263 u32 major_status, 264 u32 minor_status 265 ), 266 267 TP_ARGS(rqstp, major_status, minor_status), 268 269 TP_STRUCT__entry( 270 __field(u32, minor_status) 271 __field(unsigned long, major_status) 272 __field(u32, xid) 273 __string(addr, rqstp->rq_xprt->xpt_remotebuf) 274 ), 275 276 TP_fast_assign( 277 __entry->minor_status = minor_status; 278 __entry->major_status = major_status; 279 __entry->xid = be32_to_cpu(rqstp->rq_xid); 280 __assign_str(addr, rqstp->rq_xprt->xpt_remotebuf); 281 ), 282 283 TP_printk("addr=%s xid=0x%08x major_status=%s (0x%08lx) minor_status=%u", 284 __get_str(addr), __entry->xid, 285 (__entry->major_status == 0) ? "GSS_S_COMPLETE" : 286 show_gss_status(__entry->major_status), 287 __entry->major_status, __entry->minor_status 288 ) 289 ); 290 291 TRACE_EVENT(rpcgss_svc_authenticate, 292 TP_PROTO( 293 const struct svc_rqst *rqstp, 294 const struct rpc_gss_wire_cred *gc 295 ), 296 297 TP_ARGS(rqstp, gc), 298 299 TP_STRUCT__entry( 300 __field(u32, seqno) 301 __field(u32, xid) 302 __string(addr, rqstp->rq_xprt->xpt_remotebuf) 303 ), 304 305 TP_fast_assign( 306 __entry->xid = be32_to_cpu(rqstp->rq_xid); 307 __entry->seqno = gc->gc_seq; 308 __assign_str(addr, rqstp->rq_xprt->xpt_remotebuf); 309 ), 310 311 TP_printk("addr=%s xid=0x%08x seqno=%u", __get_str(addr), 312 __entry->xid, __entry->seqno) 313 ); 314 315 316 /** 317 ** GSS auth unwrap failures 318 **/ 319 320 TRACE_EVENT(rpcgss_unwrap_failed, 321 TP_PROTO( 322 const struct rpc_task *task 323 ), 324 325 TP_ARGS(task), 326 327 TP_STRUCT__entry( 328 __field(unsigned int, task_id) 329 __field(unsigned int, client_id) 330 ), 331 332 TP_fast_assign( 333 __entry->task_id = task->tk_pid; 334 __entry->client_id = task->tk_client->cl_clid; 335 ), 336 337 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER, 338 __entry->task_id, __entry->client_id) 339 ); 340 341 TRACE_EVENT(rpcgss_bad_seqno, 342 TP_PROTO( 343 const struct rpc_task *task, 344 u32 expected, 345 u32 received 346 ), 347 348 TP_ARGS(task, expected, received), 349 350 TP_STRUCT__entry( 351 __field(unsigned int, task_id) 352 __field(unsigned int, client_id) 353 __field(u32, expected) 354 __field(u32, received) 355 ), 356 357 TP_fast_assign( 358 __entry->task_id = task->tk_pid; 359 __entry->client_id = task->tk_client->cl_clid; 360 __entry->expected = expected; 361 __entry->received = received; 362 ), 363 364 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER 365 " expected seqno %u, received seqno %u", 366 __entry->task_id, __entry->client_id, 367 __entry->expected, __entry->received) 368 ); 369 370 TRACE_EVENT(rpcgss_seqno, 371 TP_PROTO( 372 const struct rpc_task *task 373 ), 374 375 TP_ARGS(task), 376 377 TP_STRUCT__entry( 378 __field(unsigned int, task_id) 379 __field(unsigned int, client_id) 380 __field(u32, xid) 381 __field(u32, seqno) 382 ), 383 384 TP_fast_assign( 385 const struct rpc_rqst *rqst = task->tk_rqstp; 386 387 __entry->task_id = task->tk_pid; 388 __entry->client_id = task->tk_client->cl_clid; 389 __entry->xid = be32_to_cpu(rqst->rq_xid); 390 __entry->seqno = rqst->rq_seqno; 391 ), 392 393 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER " xid=0x%08x seqno=%u", 394 __entry->task_id, __entry->client_id, 395 __entry->xid, __entry->seqno) 396 ); 397 398 TRACE_EVENT(rpcgss_need_reencode, 399 TP_PROTO( 400 const struct rpc_task *task, 401 u32 seq_xmit, 402 bool ret 403 ), 404 405 TP_ARGS(task, seq_xmit, ret), 406 407 TP_STRUCT__entry( 408 __field(unsigned int, task_id) 409 __field(unsigned int, client_id) 410 __field(u32, xid) 411 __field(u32, seq_xmit) 412 __field(u32, seqno) 413 __field(bool, ret) 414 ), 415 416 TP_fast_assign( 417 __entry->task_id = task->tk_pid; 418 __entry->client_id = task->tk_client->cl_clid; 419 __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); 420 __entry->seq_xmit = seq_xmit; 421 __entry->seqno = task->tk_rqstp->rq_seqno; 422 __entry->ret = ret; 423 ), 424 425 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER 426 " xid=0x%08x rq_seqno=%u seq_xmit=%u reencode %sneeded", 427 __entry->task_id, __entry->client_id, 428 __entry->xid, __entry->seqno, __entry->seq_xmit, 429 __entry->ret ? "" : "un") 430 ); 431 432 TRACE_EVENT(rpcgss_update_slack, 433 TP_PROTO( 434 const struct rpc_task *task, 435 const struct rpc_auth *auth 436 ), 437 438 TP_ARGS(task, auth), 439 440 TP_STRUCT__entry( 441 __field(unsigned int, task_id) 442 __field(unsigned int, client_id) 443 __field(u32, xid) 444 __field(const void *, auth) 445 __field(unsigned int, rslack) 446 __field(unsigned int, ralign) 447 __field(unsigned int, verfsize) 448 ), 449 450 TP_fast_assign( 451 __entry->task_id = task->tk_pid; 452 __entry->client_id = task->tk_client->cl_clid; 453 __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); 454 __entry->auth = auth; 455 __entry->rslack = auth->au_rslack; 456 __entry->ralign = auth->au_ralign; 457 __entry->verfsize = auth->au_verfsize; 458 ), 459 460 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER 461 " xid=0x%08x auth=%p rslack=%u ralign=%u verfsize=%u\n", 462 __entry->task_id, __entry->client_id, __entry->xid, 463 __entry->auth, __entry->rslack, __entry->ralign, 464 __entry->verfsize) 465 ); 466 467 DECLARE_EVENT_CLASS(rpcgss_svc_seqno_class, 468 TP_PROTO( 469 const struct svc_rqst *rqstp, 470 u32 seqno 471 ), 472 473 TP_ARGS(rqstp, seqno), 474 475 TP_STRUCT__entry( 476 __field(u32, xid) 477 __field(u32, seqno) 478 ), 479 480 TP_fast_assign( 481 __entry->xid = be32_to_cpu(rqstp->rq_xid); 482 __entry->seqno = seqno; 483 ), 484 485 TP_printk("xid=0x%08x seqno=%u", 486 __entry->xid, __entry->seqno) 487 ); 488 489 #define DEFINE_SVC_SEQNO_EVENT(name) \ 490 DEFINE_EVENT(rpcgss_svc_seqno_class, rpcgss_svc_seqno_##name, \ 491 TP_PROTO( \ 492 const struct svc_rqst *rqstp, \ 493 u32 seqno \ 494 ), \ 495 TP_ARGS(rqstp, seqno)) 496 497 DEFINE_SVC_SEQNO_EVENT(large); 498 DEFINE_SVC_SEQNO_EVENT(seen); 499 500 TRACE_EVENT(rpcgss_svc_seqno_low, 501 TP_PROTO( 502 const struct svc_rqst *rqstp, 503 u32 seqno, 504 u32 min, 505 u32 max 506 ), 507 508 TP_ARGS(rqstp, seqno, min, max), 509 510 TP_STRUCT__entry( 511 __field(u32, xid) 512 __field(u32, seqno) 513 __field(u32, min) 514 __field(u32, max) 515 ), 516 517 TP_fast_assign( 518 __entry->xid = be32_to_cpu(rqstp->rq_xid); 519 __entry->seqno = seqno; 520 __entry->min = min; 521 __entry->max = max; 522 ), 523 524 TP_printk("xid=0x%08x seqno=%u window=[%u..%u]", 525 __entry->xid, __entry->seqno, __entry->min, __entry->max) 526 ); 527 528 /** 529 ** gssd upcall related trace events 530 **/ 531 532 TRACE_EVENT(rpcgss_upcall_msg, 533 TP_PROTO( 534 const char *buf 535 ), 536 537 TP_ARGS(buf), 538 539 TP_STRUCT__entry( 540 __string(msg, buf) 541 ), 542 543 TP_fast_assign( 544 __assign_str(msg, buf); 545 ), 546 547 TP_printk("msg='%s'", __get_str(msg)) 548 ); 549 550 TRACE_EVENT(rpcgss_upcall_result, 551 TP_PROTO( 552 u32 uid, 553 int result 554 ), 555 556 TP_ARGS(uid, result), 557 558 TP_STRUCT__entry( 559 __field(u32, uid) 560 __field(int, result) 561 562 ), 563 564 TP_fast_assign( 565 __entry->uid = uid; 566 __entry->result = result; 567 ), 568 569 TP_printk("for uid %u, result=%d", __entry->uid, __entry->result) 570 ); 571 572 TRACE_EVENT(rpcgss_context, 573 TP_PROTO( 574 u32 window_size, 575 unsigned long expiry, 576 unsigned long now, 577 unsigned int timeout, 578 unsigned int len, 579 const u8 *data 580 ), 581 582 TP_ARGS(window_size, expiry, now, timeout, len, data), 583 584 TP_STRUCT__entry( 585 __field(unsigned long, expiry) 586 __field(unsigned long, now) 587 __field(unsigned int, timeout) 588 __field(u32, window_size) 589 __field(int, len) 590 __string(acceptor, data) 591 ), 592 593 TP_fast_assign( 594 __entry->expiry = expiry; 595 __entry->now = now; 596 __entry->timeout = timeout; 597 __entry->window_size = window_size; 598 __entry->len = len; 599 strncpy(__get_str(acceptor), data, len); 600 ), 601 602 TP_printk("win_size=%u expiry=%lu now=%lu timeout=%u acceptor=%.*s", 603 __entry->window_size, __entry->expiry, __entry->now, 604 __entry->timeout, __entry->len, __get_str(acceptor)) 605 ); 606 607 608 /** 609 ** Miscellaneous events 610 */ 611 612 TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5); 613 TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5I); 614 TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5P); 615 616 #define show_pseudoflavor(x) \ 617 __print_symbolic(x, \ 618 { RPC_AUTH_GSS_KRB5, "RPC_AUTH_GSS_KRB5" }, \ 619 { RPC_AUTH_GSS_KRB5I, "RPC_AUTH_GSS_KRB5I" }, \ 620 { RPC_AUTH_GSS_KRB5P, "RPC_AUTH_GSS_KRB5P" }) 621 622 623 TRACE_EVENT(rpcgss_createauth, 624 TP_PROTO( 625 unsigned int flavor, 626 int error 627 ), 628 629 TP_ARGS(flavor, error), 630 631 TP_STRUCT__entry( 632 __field(unsigned int, flavor) 633 __field(int, error) 634 635 ), 636 637 TP_fast_assign( 638 __entry->flavor = flavor; 639 __entry->error = error; 640 ), 641 642 TP_printk("flavor=%s error=%d", 643 show_pseudoflavor(__entry->flavor), __entry->error) 644 ); 645 646 TRACE_EVENT(rpcgss_oid_to_mech, 647 TP_PROTO( 648 const char *oid 649 ), 650 651 TP_ARGS(oid), 652 653 TP_STRUCT__entry( 654 __string(oid, oid) 655 ), 656 657 TP_fast_assign( 658 __assign_str(oid, oid); 659 ), 660 661 TP_printk("mech for oid %s was not found", __get_str(oid)) 662 ); 663 664 #endif /* _TRACE_RPCGSS_H */ 665 666 #include <trace/define_trace.h> 667