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_RPCRDMA_H) || defined(TRACE_HEADER_MULTI_READ) 12 #define _TRACE_RPCGSS_H 13 14 #include <linux/tracepoint.h> 15 16 /** 17 ** GSS-API related trace events 18 **/ 19 20 TRACE_DEFINE_ENUM(RPC_GSS_SVC_NONE); 21 TRACE_DEFINE_ENUM(RPC_GSS_SVC_INTEGRITY); 22 TRACE_DEFINE_ENUM(RPC_GSS_SVC_PRIVACY); 23 24 #define show_gss_service(x) \ 25 __print_symbolic(x, \ 26 { RPC_GSS_SVC_NONE, "none" }, \ 27 { RPC_GSS_SVC_INTEGRITY, "integrity" }, \ 28 { RPC_GSS_SVC_PRIVACY, "privacy" }) 29 30 TRACE_DEFINE_ENUM(GSS_S_BAD_MECH); 31 TRACE_DEFINE_ENUM(GSS_S_BAD_NAME); 32 TRACE_DEFINE_ENUM(GSS_S_BAD_NAMETYPE); 33 TRACE_DEFINE_ENUM(GSS_S_BAD_BINDINGS); 34 TRACE_DEFINE_ENUM(GSS_S_BAD_STATUS); 35 TRACE_DEFINE_ENUM(GSS_S_BAD_SIG); 36 TRACE_DEFINE_ENUM(GSS_S_NO_CRED); 37 TRACE_DEFINE_ENUM(GSS_S_NO_CONTEXT); 38 TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_TOKEN); 39 TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_CREDENTIAL); 40 TRACE_DEFINE_ENUM(GSS_S_CREDENTIALS_EXPIRED); 41 TRACE_DEFINE_ENUM(GSS_S_CONTEXT_EXPIRED); 42 TRACE_DEFINE_ENUM(GSS_S_FAILURE); 43 TRACE_DEFINE_ENUM(GSS_S_BAD_QOP); 44 TRACE_DEFINE_ENUM(GSS_S_UNAUTHORIZED); 45 TRACE_DEFINE_ENUM(GSS_S_UNAVAILABLE); 46 TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_ELEMENT); 47 TRACE_DEFINE_ENUM(GSS_S_NAME_NOT_MN); 48 TRACE_DEFINE_ENUM(GSS_S_CONTINUE_NEEDED); 49 TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_TOKEN); 50 TRACE_DEFINE_ENUM(GSS_S_OLD_TOKEN); 51 TRACE_DEFINE_ENUM(GSS_S_UNSEQ_TOKEN); 52 TRACE_DEFINE_ENUM(GSS_S_GAP_TOKEN); 53 54 #define show_gss_status(x) \ 55 __print_flags(x, "|", \ 56 { GSS_S_BAD_MECH, "GSS_S_BAD_MECH" }, \ 57 { GSS_S_BAD_NAME, "GSS_S_BAD_NAME" }, \ 58 { GSS_S_BAD_NAMETYPE, "GSS_S_BAD_NAMETYPE" }, \ 59 { GSS_S_BAD_BINDINGS, "GSS_S_BAD_BINDINGS" }, \ 60 { GSS_S_BAD_STATUS, "GSS_S_BAD_STATUS" }, \ 61 { GSS_S_BAD_SIG, "GSS_S_BAD_SIG" }, \ 62 { GSS_S_NO_CRED, "GSS_S_NO_CRED" }, \ 63 { GSS_S_NO_CONTEXT, "GSS_S_NO_CONTEXT" }, \ 64 { GSS_S_DEFECTIVE_TOKEN, "GSS_S_DEFECTIVE_TOKEN" }, \ 65 { GSS_S_DEFECTIVE_CREDENTIAL, "GSS_S_DEFECTIVE_CREDENTIAL" }, \ 66 { GSS_S_CREDENTIALS_EXPIRED, "GSS_S_CREDENTIALS_EXPIRED" }, \ 67 { GSS_S_CONTEXT_EXPIRED, "GSS_S_CONTEXT_EXPIRED" }, \ 68 { GSS_S_FAILURE, "GSS_S_FAILURE" }, \ 69 { GSS_S_BAD_QOP, "GSS_S_BAD_QOP" }, \ 70 { GSS_S_UNAUTHORIZED, "GSS_S_UNAUTHORIZED" }, \ 71 { GSS_S_UNAVAILABLE, "GSS_S_UNAVAILABLE" }, \ 72 { GSS_S_DUPLICATE_ELEMENT, "GSS_S_DUPLICATE_ELEMENT" }, \ 73 { GSS_S_NAME_NOT_MN, "GSS_S_NAME_NOT_MN" }, \ 74 { GSS_S_CONTINUE_NEEDED, "GSS_S_CONTINUE_NEEDED" }, \ 75 { GSS_S_DUPLICATE_TOKEN, "GSS_S_DUPLICATE_TOKEN" }, \ 76 { GSS_S_OLD_TOKEN, "GSS_S_OLD_TOKEN" }, \ 77 { GSS_S_UNSEQ_TOKEN, "GSS_S_UNSEQ_TOKEN" }, \ 78 { GSS_S_GAP_TOKEN, "GSS_S_GAP_TOKEN" }) 79 80 81 DECLARE_EVENT_CLASS(rpcgss_gssapi_event, 82 TP_PROTO( 83 const struct rpc_task *task, 84 u32 maj_stat 85 ), 86 87 TP_ARGS(task, maj_stat), 88 89 TP_STRUCT__entry( 90 __field(unsigned int, task_id) 91 __field(unsigned int, client_id) 92 __field(u32, maj_stat) 93 94 ), 95 96 TP_fast_assign( 97 __entry->task_id = task->tk_pid; 98 __entry->client_id = task->tk_client->cl_clid; 99 __entry->maj_stat = maj_stat; 100 ), 101 102 TP_printk("task:%u@%u maj_stat=%s", 103 __entry->task_id, __entry->client_id, 104 __entry->maj_stat == 0 ? 105 "GSS_S_COMPLETE" : show_gss_status(__entry->maj_stat)) 106 ); 107 108 #define DEFINE_GSSAPI_EVENT(name) \ 109 DEFINE_EVENT(rpcgss_gssapi_event, rpcgss_##name, \ 110 TP_PROTO( \ 111 const struct rpc_task *task, \ 112 u32 maj_stat \ 113 ), \ 114 TP_ARGS(task, maj_stat)) 115 116 TRACE_EVENT(rpcgss_import_ctx, 117 TP_PROTO( 118 int status 119 ), 120 121 TP_ARGS(status), 122 123 TP_STRUCT__entry( 124 __field(int, status) 125 ), 126 127 TP_fast_assign( 128 __entry->status = status; 129 ), 130 131 TP_printk("status=%d", __entry->status) 132 ); 133 134 DEFINE_GSSAPI_EVENT(get_mic); 135 DEFINE_GSSAPI_EVENT(verify_mic); 136 DEFINE_GSSAPI_EVENT(wrap); 137 DEFINE_GSSAPI_EVENT(unwrap); 138 139 DECLARE_EVENT_CLASS(rpcgss_ctx_class, 140 TP_PROTO( 141 const struct gss_cred *gc 142 ), 143 144 TP_ARGS(gc), 145 146 TP_STRUCT__entry( 147 __field(const void *, cred) 148 __field(unsigned long, service) 149 __string(principal, gc->gc_principal) 150 ), 151 152 TP_fast_assign( 153 __entry->cred = gc; 154 __entry->service = gc->gc_service; 155 __assign_str(principal, gc->gc_principal) 156 ), 157 158 TP_printk("cred=%p service=%s principal='%s'", 159 __entry->cred, show_gss_service(__entry->service), 160 __get_str(principal)) 161 ); 162 163 #define DEFINE_CTX_EVENT(name) \ 164 DEFINE_EVENT(rpcgss_ctx_class, rpcgss_ctx_##name, \ 165 TP_PROTO( \ 166 const struct gss_cred *gc \ 167 ), \ 168 TP_ARGS(gc)) 169 170 DEFINE_CTX_EVENT(init); 171 DEFINE_CTX_EVENT(destroy); 172 173 TRACE_EVENT(rpcgss_svc_accept_upcall, 174 TP_PROTO( 175 __be32 xid, 176 u32 major_status, 177 u32 minor_status 178 ), 179 180 TP_ARGS(xid, major_status, minor_status), 181 182 TP_STRUCT__entry( 183 __field(u32, xid) 184 __field(u32, minor_status) 185 __field(unsigned long, major_status) 186 ), 187 188 TP_fast_assign( 189 __entry->xid = be32_to_cpu(xid); 190 __entry->minor_status = minor_status; 191 __entry->major_status = major_status; 192 ), 193 194 TP_printk("xid=0x%08x major_status=%s (0x%08lx) minor_status=%u", 195 __entry->xid, __entry->major_status == 0 ? "GSS_S_COMPLETE" : 196 show_gss_status(__entry->major_status), 197 __entry->major_status, __entry->minor_status 198 ) 199 ); 200 201 TRACE_EVENT(rpcgss_svc_accept, 202 TP_PROTO( 203 __be32 xid, 204 size_t len 205 ), 206 207 TP_ARGS(xid, len), 208 209 TP_STRUCT__entry( 210 __field(u32, xid) 211 __field(size_t, len) 212 ), 213 214 TP_fast_assign( 215 __entry->xid = be32_to_cpu(xid); 216 __entry->len = len; 217 ), 218 219 TP_printk("xid=0x%08x len=%zu", 220 __entry->xid, __entry->len 221 ) 222 ); 223 224 225 /** 226 ** GSS auth unwrap failures 227 **/ 228 229 TRACE_EVENT(rpcgss_unwrap_failed, 230 TP_PROTO( 231 const struct rpc_task *task 232 ), 233 234 TP_ARGS(task), 235 236 TP_STRUCT__entry( 237 __field(unsigned int, task_id) 238 __field(unsigned int, client_id) 239 ), 240 241 TP_fast_assign( 242 __entry->task_id = task->tk_pid; 243 __entry->client_id = task->tk_client->cl_clid; 244 ), 245 246 TP_printk("task:%u@%u", __entry->task_id, __entry->client_id) 247 ); 248 249 TRACE_EVENT(rpcgss_bad_seqno, 250 TP_PROTO( 251 const struct rpc_task *task, 252 u32 expected, 253 u32 received 254 ), 255 256 TP_ARGS(task, expected, received), 257 258 TP_STRUCT__entry( 259 __field(unsigned int, task_id) 260 __field(unsigned int, client_id) 261 __field(u32, expected) 262 __field(u32, received) 263 ), 264 265 TP_fast_assign( 266 __entry->task_id = task->tk_pid; 267 __entry->client_id = task->tk_client->cl_clid; 268 __entry->expected = expected; 269 __entry->received = received; 270 ), 271 272 TP_printk("task:%u@%u expected seqno %u, received seqno %u", 273 __entry->task_id, __entry->client_id, 274 __entry->expected, __entry->received) 275 ); 276 277 TRACE_EVENT(rpcgss_seqno, 278 TP_PROTO( 279 const struct rpc_task *task 280 ), 281 282 TP_ARGS(task), 283 284 TP_STRUCT__entry( 285 __field(unsigned int, task_id) 286 __field(unsigned int, client_id) 287 __field(u32, xid) 288 __field(u32, seqno) 289 ), 290 291 TP_fast_assign( 292 const struct rpc_rqst *rqst = task->tk_rqstp; 293 294 __entry->task_id = task->tk_pid; 295 __entry->client_id = task->tk_client->cl_clid; 296 __entry->xid = be32_to_cpu(rqst->rq_xid); 297 __entry->seqno = rqst->rq_seqno; 298 ), 299 300 TP_printk("task:%u@%u xid=0x%08x seqno=%u", 301 __entry->task_id, __entry->client_id, 302 __entry->xid, __entry->seqno) 303 ); 304 305 TRACE_EVENT(rpcgss_need_reencode, 306 TP_PROTO( 307 const struct rpc_task *task, 308 u32 seq_xmit, 309 bool ret 310 ), 311 312 TP_ARGS(task, seq_xmit, ret), 313 314 TP_STRUCT__entry( 315 __field(unsigned int, task_id) 316 __field(unsigned int, client_id) 317 __field(u32, xid) 318 __field(u32, seq_xmit) 319 __field(u32, seqno) 320 __field(bool, ret) 321 ), 322 323 TP_fast_assign( 324 __entry->task_id = task->tk_pid; 325 __entry->client_id = task->tk_client->cl_clid; 326 __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); 327 __entry->seq_xmit = seq_xmit; 328 __entry->seqno = task->tk_rqstp->rq_seqno; 329 __entry->ret = ret; 330 ), 331 332 TP_printk("task:%u@%u xid=0x%08x rq_seqno=%u seq_xmit=%u reencode %sneeded", 333 __entry->task_id, __entry->client_id, 334 __entry->xid, __entry->seqno, __entry->seq_xmit, 335 __entry->ret ? "" : "un") 336 ); 337 338 TRACE_EVENT(rpcgss_update_slack, 339 TP_PROTO( 340 const struct rpc_task *task, 341 const struct rpc_auth *auth 342 ), 343 344 TP_ARGS(task, auth), 345 346 TP_STRUCT__entry( 347 __field(unsigned int, task_id) 348 __field(unsigned int, client_id) 349 __field(u32, xid) 350 __field(const void *, auth) 351 __field(unsigned int, rslack) 352 __field(unsigned int, ralign) 353 __field(unsigned int, verfsize) 354 ), 355 356 TP_fast_assign( 357 __entry->task_id = task->tk_pid; 358 __entry->client_id = task->tk_client->cl_clid; 359 __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); 360 __entry->auth = auth; 361 __entry->rslack = auth->au_rslack; 362 __entry->ralign = auth->au_ralign; 363 __entry->verfsize = auth->au_verfsize; 364 ), 365 366 TP_printk("task:%u@%u xid=0x%08x auth=%p rslack=%u ralign=%u verfsize=%u\n", 367 __entry->task_id, __entry->client_id, __entry->xid, 368 __entry->auth, __entry->rslack, __entry->ralign, 369 __entry->verfsize) 370 ); 371 372 DECLARE_EVENT_CLASS(rpcgss_svc_seqno_class, 373 TP_PROTO( 374 __be32 xid, 375 u32 seqno 376 ), 377 378 TP_ARGS(xid, seqno), 379 380 TP_STRUCT__entry( 381 __field(u32, xid) 382 __field(u32, seqno) 383 ), 384 385 TP_fast_assign( 386 __entry->xid = be32_to_cpu(xid); 387 __entry->seqno = seqno; 388 ), 389 390 TP_printk("xid=0x%08x seqno=%u, request discarded", 391 __entry->xid, __entry->seqno) 392 ); 393 394 #define DEFINE_SVC_SEQNO_EVENT(name) \ 395 DEFINE_EVENT(rpcgss_svc_seqno_class, rpcgss_svc_##name, \ 396 TP_PROTO( \ 397 __be32 xid, \ 398 u32 seqno \ 399 ), \ 400 TP_ARGS(xid, seqno)) 401 402 DEFINE_SVC_SEQNO_EVENT(large_seqno); 403 DEFINE_SVC_SEQNO_EVENT(old_seqno); 404 405 406 /** 407 ** gssd upcall related trace events 408 **/ 409 410 TRACE_EVENT(rpcgss_upcall_msg, 411 TP_PROTO( 412 const char *buf 413 ), 414 415 TP_ARGS(buf), 416 417 TP_STRUCT__entry( 418 __string(msg, buf) 419 ), 420 421 TP_fast_assign( 422 __assign_str(msg, buf) 423 ), 424 425 TP_printk("msg='%s'", __get_str(msg)) 426 ); 427 428 TRACE_EVENT(rpcgss_upcall_result, 429 TP_PROTO( 430 u32 uid, 431 int result 432 ), 433 434 TP_ARGS(uid, result), 435 436 TP_STRUCT__entry( 437 __field(u32, uid) 438 __field(int, result) 439 440 ), 441 442 TP_fast_assign( 443 __entry->uid = uid; 444 __entry->result = result; 445 ), 446 447 TP_printk("for uid %u, result=%d", __entry->uid, __entry->result) 448 ); 449 450 TRACE_EVENT(rpcgss_context, 451 TP_PROTO( 452 u32 window_size, 453 unsigned long expiry, 454 unsigned long now, 455 unsigned int timeout, 456 unsigned int len, 457 const u8 *data 458 ), 459 460 TP_ARGS(window_size, expiry, now, timeout, len, data), 461 462 TP_STRUCT__entry( 463 __field(unsigned long, expiry) 464 __field(unsigned long, now) 465 __field(unsigned int, timeout) 466 __field(u32, window_size) 467 __field(int, len) 468 __string(acceptor, data) 469 ), 470 471 TP_fast_assign( 472 __entry->expiry = expiry; 473 __entry->now = now; 474 __entry->timeout = timeout; 475 __entry->window_size = window_size; 476 __entry->len = len; 477 strncpy(__get_str(acceptor), data, len); 478 ), 479 480 TP_printk("win_size=%u expiry=%lu now=%lu timeout=%u acceptor=%.*s", 481 __entry->window_size, __entry->expiry, __entry->now, 482 __entry->timeout, __entry->len, __get_str(acceptor)) 483 ); 484 485 486 /** 487 ** Miscellaneous events 488 */ 489 490 TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5); 491 TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5I); 492 TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5P); 493 494 #define show_pseudoflavor(x) \ 495 __print_symbolic(x, \ 496 { RPC_AUTH_GSS_KRB5, "RPC_AUTH_GSS_KRB5" }, \ 497 { RPC_AUTH_GSS_KRB5I, "RPC_AUTH_GSS_KRB5I" }, \ 498 { RPC_AUTH_GSS_KRB5P, "RPC_AUTH_GSS_KRB5P" }) 499 500 501 TRACE_EVENT(rpcgss_createauth, 502 TP_PROTO( 503 unsigned int flavor, 504 int error 505 ), 506 507 TP_ARGS(flavor, error), 508 509 TP_STRUCT__entry( 510 __field(unsigned int, flavor) 511 __field(int, error) 512 513 ), 514 515 TP_fast_assign( 516 __entry->flavor = flavor; 517 __entry->error = error; 518 ), 519 520 TP_printk("flavor=%s error=%d", 521 show_pseudoflavor(__entry->flavor), __entry->error) 522 ); 523 524 TRACE_EVENT(rpcgss_oid_to_mech, 525 TP_PROTO( 526 const char *oid 527 ), 528 529 TP_ARGS(oid), 530 531 TP_STRUCT__entry( 532 __string(oid, oid) 533 ), 534 535 TP_fast_assign( 536 __assign_str(oid, oid); 537 ), 538 539 TP_printk("mech for oid %s was not found", __get_str(oid)) 540 ); 541 542 #endif /* _TRACE_RPCGSS_H */ 543 544 #include <trace/define_trace.h> 545