1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 10616 Sebastien * Common Development and Distribution License (the "License"). 6 10616 Sebastien * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 10616 Sebastien * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel 26 0 stevel #include <sys/types.h> 27 0 stevel #include <sys/errno.h> 28 0 stevel #include <setjmp.h> 29 0 stevel 30 0 stevel #include <netinet/in.h> 31 0 stevel #include <netdb.h> 32 0 stevel 33 0 stevel #include <sys/tiuser.h> 34 0 stevel #include <rpc/types.h> 35 0 stevel #include <rpc/xdr.h> 36 0 stevel #include <rpc/auth.h> 37 0 stevel #include <rpc/auth_unix.h> 38 0 stevel #include <rpc/auth_des.h> 39 0 stevel #include <rpc/clnt.h> 40 0 stevel #include <rpc/rpc_msg.h> 41 0 stevel #include <rpc/pmap_clnt.h> 42 0 stevel #include <rpc/svc.h> 43 0 stevel #include <rpcsvc/yp_prot.h> 44 0 stevel #include <rpc/pmap_prot.h> 45 0 stevel #include "snoop.h" 46 0 stevel 47 0 stevel #ifndef MIN 48 0 stevel #define MIN(a, b) ((a) < (b) ? (a) : (b)) 49 0 stevel #endif 50 0 stevel 51 0 stevel int pos; 52 0 stevel struct cache_struct *find_xid(); 53 0 stevel extern jmp_buf xdr_err; 54 0 stevel void protoprint(); 55 0 stevel void print_rpcsec_gss_cred(int xid, int authlen); 56 0 stevel char *nameof_prog(); 57 0 stevel char *nameof_astat(); 58 0 stevel char *nameof_why(); 59 410 kcpoon static void rpc_detail_call(int, int, int, int, int, int, char *, int); 60 410 kcpoon static void rpc_detail_reply(int, int, struct cache_struct *, char *, int len); 61 410 kcpoon static void print_creds(int); 62 410 kcpoon static void print_verif(int); 63 410 kcpoon static void stash_xid(ulong_t, int, int, int, int); 64 0 stevel 65 0 stevel #define LAST_FRAG ((ulong_t)1 << 31) 66 0 stevel 67 410 kcpoon int 68 410 kcpoon interpret_rpc(int flags, char *rpc, int fraglen, int type) 69 0 stevel { 70 0 stevel ulong_t xid; 71 0 stevel int direction; 72 0 stevel struct cache_struct *x; 73 0 stevel int rpcvers, prog, vers, proc; 74 0 stevel int status, astat, rstat, why; 75 0 stevel char *lp; 76 0 stevel unsigned recmark; 77 0 stevel int markpos; 78 0 stevel extern int pi_frame; 79 0 stevel int lo, hi; 80 0 stevel 81 0 stevel xdr_init(rpc, fraglen); 82 0 stevel 83 0 stevel if (setjmp(xdr_err)) { 84 0 stevel if (flags & F_DTAIL) 85 0 stevel (void) sprintf(get_line(0, 0), 86 10616 Sebastien "---- short frame ---"); 87 0 stevel return (fraglen); 88 0 stevel } 89 0 stevel 90 0 stevel if (type == IPPROTO_TCP) { /* record mark */ 91 0 stevel markpos = getxdr_pos(); 92 0 stevel recmark = getxdr_long(); 93 0 stevel } 94 0 stevel 95 0 stevel xid = getxdr_u_long(); 96 0 stevel direction = getxdr_long(); 97 0 stevel 98 0 stevel if (direction == CALL) { 99 0 stevel rpcvers = getxdr_long(); 100 0 stevel pos = getxdr_pos(); 101 0 stevel prog = getxdr_long(); 102 0 stevel vers = getxdr_long(); 103 0 stevel proc = getxdr_long(); 104 0 stevel stash_xid(xid, pi_frame, prog, vers, proc); 105 10616 Sebastien if (!(flags & (F_SUM | F_DTAIL))) { 106 0 stevel protoprint(flags, CALL, xid, prog, vers, proc, 107 10616 Sebastien rpc, fraglen); 108 10616 Sebastien } 109 0 stevel } else { 110 0 stevel x = find_xid(xid); 111 0 stevel } 112 0 stevel 113 0 stevel if (flags & F_SUM) { 114 0 stevel switch (direction) { 115 0 stevel case CALL: 116 0 stevel (void) sprintf(get_sum_line(), 117 10616 Sebastien "RPC C XID=%lu PROG=%d (%s) VERS=%d PROC=%d", 118 10616 Sebastien xid, 119 10616 Sebastien prog, nameof_prog(prog), 120 10616 Sebastien vers, proc); 121 0 stevel if (getxdr_long() == RPCSEC_GSS) { /* Cred auth type */ 122 0 stevel extract_rpcsec_gss_cred_info(xid); 123 0 stevel /* RPCSEC_GSS cred auth data */ 124 0 stevel } else { 125 0 stevel xdr_skip(getxdr_long()); 126 0 stevel /* non RPCSEC_GSS cred auth data */ 127 0 stevel } 128 0 stevel xdr_skip(4); /* Verf auth type */ 129 0 stevel xdr_skip(RNDUP(getxdr_long())); /* Verf auth data */ 130 0 stevel 131 0 stevel protoprint(flags, CALL, xid, prog, vers, proc, 132 10616 Sebastien rpc, fraglen); 133 0 stevel break; 134 0 stevel 135 0 stevel case REPLY: 136 0 stevel lp = get_sum_line(); 137 0 stevel if (x == NULL) 138 0 stevel (void) sprintf(lp, "RPC R XID=%lu", xid); 139 0 stevel else 140 0 stevel (void) sprintf(lp, "RPC R (#%d) XID=%lu", 141 10616 Sebastien x->xid_frame, xid); 142 0 stevel 143 0 stevel lp += strlen(lp); 144 0 stevel status = getxdr_long(); 145 0 stevel switch (status) { 146 0 stevel case MSG_ACCEPTED: 147 0 stevel /* eat flavor and verifier */ 148 0 stevel (void) getxdr_long(); 149 0 stevel xdr_skip(RNDUP(getxdr_long())); 150 0 stevel astat = getxdr_long(); 151 0 stevel (void) sprintf(lp, " %s", 152 10616 Sebastien nameof_astat(astat)); 153 0 stevel lp += strlen(lp); 154 0 stevel 155 0 stevel switch (astat) { 156 0 stevel case SUCCESS: 157 0 stevel if (x) { 158 0 stevel protoprint(flags, REPLY, 159 10616 Sebastien xid, 160 10616 Sebastien x->xid_prog, 161 10616 Sebastien x->xid_vers, 162 10616 Sebastien x->xid_proc, 163 10616 Sebastien rpc, fraglen); 164 0 stevel } 165 0 stevel break; 166 0 stevel 167 0 stevel case PROG_UNAVAIL : 168 0 stevel case PROG_MISMATCH: 169 0 stevel case PROC_UNAVAIL : 170 0 stevel lo = getxdr_long(); 171 0 stevel hi = getxdr_long(); 172 0 stevel (void) sprintf(lp, 173 10616 Sebastien " (low=%d, high=%d)", 174 10616 Sebastien lo, hi); 175 0 stevel break; 176 0 stevel 177 0 stevel case GARBAGE_ARGS: 178 0 stevel case SYSTEM_ERR: 179 0 stevel default: 180 0 stevel ; 181 0 stevel } 182 0 stevel break; 183 0 stevel 184 0 stevel case MSG_DENIED: 185 0 stevel rstat = getxdr_long(); 186 0 stevel 187 0 stevel switch (rstat) { 188 0 stevel case RPC_MISMATCH: 189 0 stevel lo = getxdr_long(); 190 0 stevel hi = getxdr_long(); 191 0 stevel (void) sprintf(lp, 192 0 stevel " Vers mismatch (low=%d, high=%d)", 193 10616 Sebastien lo, hi); 194 0 stevel break; 195 0 stevel 196 0 stevel case AUTH_ERROR: 197 0 stevel why = getxdr_u_long(); 198 0 stevel (void) sprintf(lp, 199 10616 Sebastien " Can't authenticate (%s)", 200 10616 Sebastien nameof_why(why)); 201 0 stevel break; 202 0 stevel } 203 0 stevel } 204 0 stevel break; 205 0 stevel } 206 0 stevel } 207 0 stevel 208 0 stevel if (flags & F_DTAIL) { 209 0 stevel show_header("RPC: ", "SUN RPC Header", fraglen); 210 0 stevel show_space(); 211 0 stevel if (type == IPPROTO_TCP) { /* record mark */ 212 0 stevel (void) sprintf(get_line(markpos, markpos+4), 213 10616 Sebastien "Record Mark: %s fragment, length = %d", 214 10616 Sebastien recmark & LAST_FRAG ? "last" : "", 215 10616 Sebastien recmark & ~LAST_FRAG); 216 0 stevel } 217 0 stevel 218 0 stevel (void) sprintf(get_line(0, 0), 219 10616 Sebastien "Transaction id = %lu", 220 10616 Sebastien xid); 221 0 stevel (void) sprintf(get_line(0, 0), 222 10616 Sebastien "Type = %d (%s)", 223 10616 Sebastien direction, 224 10616 Sebastien direction == CALL ? "Call":"Reply"); 225 0 stevel 226 0 stevel switch (direction) { 227 0 stevel case CALL: 228 0 stevel rpc_detail_call(flags, xid, rpcvers, 229 10616 Sebastien prog, vers, proc, rpc, fraglen); 230 0 stevel break; 231 0 stevel case REPLY: 232 0 stevel rpc_detail_reply(flags, xid, x, rpc, fraglen); 233 0 stevel break; 234 0 stevel } 235 0 stevel } 236 0 stevel 237 0 stevel return (fraglen); 238 0 stevel } 239 0 stevel 240 410 kcpoon static void 241 410 kcpoon rpc_detail_call(int flags, int xid, int rpcvers, int prog, int vers, int proc, 242 410 kcpoon char *data, int len) 243 0 stevel { 244 0 stevel char *nameof_flavor(); 245 0 stevel char *nameof_prog(); 246 0 stevel 247 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 248 10616 Sebastien "RPC version = %d", 249 10616 Sebastien rpcvers); 250 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 251 10616 Sebastien "Program = %d (%s), version = %d, procedure = %d", 252 10616 Sebastien prog, nameof_prog(prog), vers, proc); 253 0 stevel print_creds(xid); 254 0 stevel print_verif(CALL); 255 0 stevel show_trailer(); 256 0 stevel protoprint(flags, CALL, xid, prog, vers, proc, data, len); 257 0 stevel } 258 0 stevel 259 0 stevel char * 260 0 stevel nameof_flavor(flavor) 261 0 stevel int flavor; 262 0 stevel { 263 0 stevel switch (flavor) { 264 0 stevel case AUTH_NONE : return ("None"); 265 0 stevel case AUTH_UNIX : return ("Unix"); 266 0 stevel case AUTH_SHORT: return ("Unix short"); 267 0 stevel case AUTH_DES : return ("DES"); 268 0 stevel case RPCSEC_GSS: return ("RPCSEC_GSS"); 269 0 stevel default: return ("unknown"); 270 0 stevel } 271 0 stevel } 272 0 stevel 273 0 stevel char * 274 0 stevel tohex(char *p, int len) 275 0 stevel { 276 0 stevel int i, j; 277 0 stevel static char hbuff[1024]; 278 0 stevel static char *hexstr = "0123456789ABCDEF"; 279 0 stevel char toobig = 0; 280 0 stevel 281 0 stevel if (len * 2 > sizeof (hbuff)) { 282 0 stevel toobig++; 283 0 stevel len = sizeof (hbuff) / 2; 284 0 stevel } 285 0 stevel 286 0 stevel j = 0; 287 0 stevel for (i = 0; i < len; i++) { 288 0 stevel hbuff[j++] = hexstr[p[i] >> 4 & 0x0f]; 289 0 stevel hbuff[j++] = hexstr[p[i] & 0x0f]; 290 0 stevel } 291 0 stevel 292 0 stevel if (toobig) { 293 0 stevel hbuff[len * 2 - strlen("<Too Long>")] = '\0'; 294 0 stevel strcat(hbuff, "<Too Long>"); 295 0 stevel } else 296 0 stevel hbuff[j] = '\0'; 297 0 stevel 298 0 stevel return (hbuff); 299 0 stevel } 300 0 stevel 301 410 kcpoon static void 302 0 stevel print_creds(int xid) 303 0 stevel { 304 0 stevel int pos, flavor, authlen; 305 0 stevel int uid, gid, len; 306 0 stevel int tlen, idlen; 307 0 stevel int i, namekind; 308 0 stevel char *p, *line; 309 0 stevel 310 0 stevel pos = getxdr_pos(); 311 0 stevel flavor = getxdr_long(); 312 0 stevel authlen = getxdr_long(); 313 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 314 10616 Sebastien "Credentials: Flavor = %d (%s), len = %d bytes", 315 10616 Sebastien flavor, nameof_flavor(flavor), authlen); 316 0 stevel if (authlen <= 0) 317 0 stevel return; 318 0 stevel 319 0 stevel switch (flavor) { 320 0 stevel case AUTH_UNIX: 321 0 stevel (void) showxdr_time(" Time = %s"); 322 0 stevel (void) showxdr_string(MAX_MACHINE_NAME, " Hostname = %s"); 323 0 stevel pos = getxdr_pos(); 324 0 stevel uid = getxdr_u_long(); 325 0 stevel gid = getxdr_u_long(); 326 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 327 10616 Sebastien " Uid = %d, Gid = %d", 328 10616 Sebastien uid, gid); 329 0 stevel len = getxdr_u_long(); 330 0 stevel line = get_line(pos, len * 4); 331 0 stevel if (len == 0) 332 0 stevel (void) sprintf(line, " Groups = (none)"); 333 0 stevel else { 334 0 stevel (void) sprintf(line, " Groups = "); 335 0 stevel line += strlen(line); 336 0 stevel while (len--) { 337 0 stevel gid = getxdr_u_long(); 338 0 stevel (void) sprintf(line, "%d ", gid); 339 0 stevel line += strlen(line); 340 0 stevel } 341 0 stevel } 342 0 stevel break; 343 0 stevel 344 0 stevel case AUTH_DES: 345 0 stevel namekind = getxdr_u_long(); 346 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 347 10616 Sebastien " Name kind = %d (%s)", 348 10616 Sebastien namekind, 349 10616 Sebastien namekind == ADN_FULLNAME ? 350 10616 Sebastien "fullname" : "nickname"); 351 10616 Sebastien switch (namekind) { 352 10616 Sebastien case ADN_FULLNAME: 353 10616 Sebastien (void) showxdr_string(64, 354 10616 Sebastien " Network name = %s"); 355 10616 Sebastien (void) showxdr_hex(8, 356 10616 Sebastien " Conversation key = 0x%s (DES encrypted)"); 357 10616 Sebastien (void) showxdr_hex(4, 358 10616 Sebastien " Window = 0x%s (DES encrypted)"); 359 10616 Sebastien break; 360 0 stevel 361 10616 Sebastien case ADN_NICKNAME: 362 10616 Sebastien (void) showxdr_hex(4, " Nickname = 0x%s"); 363 10616 Sebastien break; 364 10616 Sebastien }; 365 0 stevel break; 366 0 stevel 367 0 stevel case RPCSEC_GSS: 368 0 stevel print_rpcsec_gss_cred(xid, authlen); 369 0 stevel break; 370 0 stevel 371 0 stevel default: 372 0 stevel (void) showxdr_hex(authlen, "[%s]"); 373 0 stevel break; 374 0 stevel } 375 0 stevel } 376 0 stevel 377 410 kcpoon static void 378 410 kcpoon print_verif(int direction) 379 0 stevel { 380 0 stevel int pos, flavor, verlen; 381 0 stevel 382 0 stevel pos = getxdr_pos(); 383 0 stevel flavor = getxdr_long(); 384 0 stevel verlen = getxdr_long(); 385 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 386 10616 Sebastien "Verifier : Flavor = %d (%s), len = %d bytes", 387 10616 Sebastien flavor, nameof_flavor(flavor), verlen); 388 0 stevel if (verlen == 0) 389 0 stevel return; 390 0 stevel 391 0 stevel switch (flavor) { 392 0 stevel case AUTH_DES: 393 0 stevel (void) showxdr_hex(8, " Timestamp = 0x%s (DES encrypted)"); 394 0 stevel if (direction == CALL) 395 0 stevel (void) showxdr_hex(4, 396 10616 Sebastien " Window = 0x%s (DES encrypted)"); 397 0 stevel else 398 0 stevel (void) showxdr_hex(4, " Nickname = 0x%s"); 399 0 stevel break; 400 0 stevel 401 0 stevel /* For other flavors like AUTH_NONE, AUTH_UNIX, RPCSEC_GSS etc. */ 402 0 stevel default: 403 0 stevel (void) showxdr_hex(verlen, "[%s]"); 404 0 stevel break; 405 0 stevel } 406 0 stevel } 407 0 stevel 408 0 stevel struct rpcnames { 409 0 stevel int rp_prog; 410 0 stevel char *rp_name; 411 0 stevel } rpcnames[] = { 412 0 stevel 100000, "PMAP", /* Portmapper */ 413 0 stevel 100001, "RSTAT", /* Remote stats */ 414 0 stevel 100002, "RUSERS", /* Remote users */ 415 0 stevel 100003, "NFS", /* Nfs */ 416 0 stevel 100004, "NIS", /* Network Information Service */ 417 0 stevel 100005, "MOUNT", /* Mount demon */ 418 0 stevel 100006, "DBX", /* Remote dbx */ 419 0 stevel 100007, "NISBIND", /* NIS binder */ 420 0 stevel 100008, "WALL", /* Shutdown msg */ 421 0 stevel 100009, "NISPASSWD", /* Yppasswd server */ 422 0 stevel 100010, "ETHERSTAT", /* Ether stats */ 423 0 stevel 100011, "RQUOTA", /* Disk quotas */ 424 0 stevel 100012, "SPRAY", /* Spray packets */ 425 0 stevel 100013, "IBM3270", /* 3270 mapper */ 426 0 stevel 100014, "IBMRJE", /* RJE mapper */ 427 0 stevel 100015, "SELNSVC", /* Selection service */ 428 0 stevel 100016, "RDATABASE", /* Remote database access */ 429 0 stevel 100017, "REX", /* Remote execution */ 430 0 stevel 100018, "ALICE", /* Alice Office Automation */ 431 0 stevel 100019, "SCHED", /* Scheduling service */ 432 0 stevel 100020, "LLM", /* Local lock manager */ 433 0 stevel 100021, "NLM", /* Network lock manager */ 434 0 stevel 100022, "X25INR", /* X.25 inr protocol */ 435 0 stevel 100023, "STATMON1", /* Status monitor 1 */ 436 0 stevel 100024, "STATMON2", /* Status monitor 2 */ 437 0 stevel 100025, "SELNLIB", /* Selection library */ 438 0 stevel 100026, "BOOTPARAM", /* Boot parameters service */ 439 0 stevel 100027, "MAZEPROG", /* Mazewars game */ 440 0 stevel 100028, "NISUPDATE", /* NIS update */ 441 0 stevel 100029, "KEYSERVE", /* Key server */ 442 0 stevel 100030, "SECURECMD", /* Secure login */ 443 0 stevel 100031, "NETFWDI", /* NFS net forwarder init */ 444 0 stevel 100032, "NETFWDT", /* NFS net forwarder trans */ 445 0 stevel 100033, "SUNLINKMAP", /* Sunlink MAP */ 446 0 stevel 100034, "NETMON", /* Network monitor */ 447 0 stevel 100035, "DBASE", /* Lightweight database */ 448 0 stevel 100036, "PWDAUTH", /* Password authorization */ 449 0 stevel 100037, "TFS", /* Translucent file svc */ 450 0 stevel 100038, "NSE", /* NSE server */ 451 0 stevel 100039, "NSE_ACTIVATE", /* NSE activate daemon */ 452 0 stevel 100040, "SUNVIEW_HELP", /* Sunview help */ 453 0 stevel 100041, "PNP", /* PNP install */ 454 0 stevel 100042, "IPADDR_ALLOC", /* IP addr allocator */ 455 0 stevel 100043, "FILEHANDLE", /* Show filehandle */ 456 0 stevel 100044, "MVSNFS", /* MVS NFS mount */ 457 0 stevel 100045, "REM_FILEOP_USER", /* Remote user file operations */ 458 0 stevel 100046, "BATCH_NISUPDATE", /* Batched ypupdate */ 459 0 stevel 100047, "NEM", /* Network execution mgr */ 460 0 stevel 100048, "RAYTRACE_RD", /* Raytrace/mandelbrot remote daemon */ 461 0 stevel 100049, "RAYTRACE_LD", /* Raytrace/mandelbrot local daemon */ 462 0 stevel 100050, "REM_FILEOP_GROUP", /* Remote group file operations */ 463 0 stevel 100051, "REM_FILEOP_SYSTEM", /* Remote system file operations */ 464 0 stevel 100052, "REM_SYSTEM_ROLE", /* Remote system role operations */ 465 0 stevel 100055, "IOADMD", /* Ioadmd */ 466 0 stevel 100056, "FILEMERGE", /* Filemerge */ 467 0 stevel 100057, "NAMEBIND", /* Name Binding Program */ 468 0 stevel 100058, "NJE", /* Sunlink NJE */ 469 0 stevel 100059, "MVSATTR", /* MVSNFS get attribute service */ 470 0 stevel 100060, "RMGR", /* SunAccess/SunLink resource manager */ 471 0 stevel 100061, "UIDALLOC", /* UID allocation service */ 472 0 stevel 100062, "LBSERVER", /* License broker */ 473 0 stevel 100063, "LBBINDER", /* NETlicense client binder */ 474 0 stevel 100064, "GIDALLOC", /* GID allocation service */ 475 0 stevel 100065, "SUNISAM", /* SunIsam */ 476 0 stevel 100066, "RDBSRV", /* Remote Debug Server */ 477 0 stevel 100067, "NETDIR", /* Network directory daemon */ 478 0 stevel 100068, "CMSD", /* Network calendar program */ 479 0 stevel 100069, "NISXFR", /* NIS transfer */ 480 0 stevel 100070, "TIMED", /* RPC.timed */ 481 0 stevel 100071, "BUGTRAQ", /* Bugtraqd */ 482 0 stevel 100072, "NeFS", /* Internal use only */ 483 0 stevel 100073, "BILLBOARD", /* Connectathon Billboard - NFS */ 484 0 stevel 100074, "BILLBOARD", /* Connectathon Billboard - X */ 485 0 stevel 100075, "SCHEDROOM", /* Sun meeting room scheduler */ 486 0 stevel 100076, "AUTHNEGOTIATE", /* Authentication negotiation */ 487 0 stevel 100077, "ATTRPROG", /* Database manipulation */ 488 0 stevel 100080, "AUTODUMP", /* Sun consulting special */ 489 0 stevel 100081, "EVENT_SVC", /* Event protocol */ 490 0 stevel 100085, "ARM_PSD", /* ARM policy */ 491 0 stevel 100086, "ARMTOD", /* ARM TOD */ 492 0 stevel 100087, "NA.ADMIN", /* Sun (SNAG) administration agent */ 493 0 stevel 100099, "PLD", /* Genesil 8.1 hot plot */ 494 0 stevel 100101, "NA.EVENT", /* SNM (SunNet Manager) event dispatcher */ 495 0 stevel 100102, "NA.LOGGER", /* SNM report logger */ 496 0 stevel 100103, "NA.DISCOVER", /* SNM network discovery agent */ 497 0 stevel 100104, "NA.SYNC", /* SNM sync interface agent */ 498 0 stevel 100105, "NA.DISKINFO", /* SNM disk info agent */ 499 0 stevel 100106, "NA.IOSTAT", /* SNM iostat agent */ 500 0 stevel 100107, "NA.HOSTPERF", /* SNM rstat proxy agent */ 501 0 stevel 100108, "NA.CONFIG", /* SNM host configuration agent */ 502 0 stevel 100109, "NA.ACTIVITY", /* SNM activity daemon */ 503 0 stevel 100111, "NA.LPSTAT", /* SNM printer agent */ 504 0 stevel 100112, "NA.HOSTMEM", /* SNM host network memory agent */ 505 0 stevel 100113, "NA.SAMPLE", /* SNM sample agent */ 506 0 stevel 100114, "NA.X25", /* SNM X.25 agent */ 507 0 stevel 100115, "NA.PING", /* SNM ping proxy agent */ 508 0 stevel 100116, "NA.RPCNFS", /* SNM rpc and nfs agent */ 509 0 stevel 100117, "NA.HOSTIF", /* SNM host interface agent */ 510 0 stevel 100118, "NA.ETHERIF", /* SNM ethernet interface agent */ 511 0 stevel 100119, "NA.IPPATH", /* SNM traceroute proxy agent */ 512 0 stevel 100120, "NA.IPROUTES", /* SNM routing table agent */ 513 0 stevel 100121, "NA.LAYERS", /* SNM protocol layers gent */ 514 0 stevel 100122, "NA.SNMP", /* SNM SNMP proxy agent */ 515 0 stevel 100123, "NA.TRAFFIC", /* SNM network traffic agent */ 516 0 stevel 100124, "NA.DNI", /* DNI (DECnet) proxy agent */ 517 0 stevel 100125, "NA.CHAT", /* IBM Channel attach proxy agent */ 518 0 stevel 100126, "NA.FDDI", /* FDDI agent */ 519 0 stevel 100127, "NA.FDDISMT", /* FDDI SMT proxy agent */ 520 0 stevel 100128, "NA.MHS", /* MHS agent */ 521 0 stevel 100130, "SNM_GRAPHER", /* SNM 3D grapher */ 522 0 stevel 100132, "NA.TR", /* Token Ring agent */ 523 0 stevel 100134, "NA.TOKENRING", /* Token Ring agent */ 524 0 stevel 100136, "NA.FRAMERELAY", /* Frame Relay agent */ 525 0 stevel 100175, "NA.SNMPTRAP", /* SNM SNMP trap daemon */ 526 0 stevel 100180, "NA.MIPROUTES", /* SNM multicast routing table agent */ 527 0 stevel 100201, "MVSNFSSTAT", /* MVS/NFS Memory usage statistic server */ 528 0 stevel 100227, "NFS_ACL", /* NFS ACL support */ 529 0 stevel 100300, "NIS+", /* NIS+ name service */ 530 0 stevel 100302, "NIS+ CB", /* NIS+ callbacks */ 531 0 stevel 101002, "NSELINKTOOL", /* NSE link daemon */ 532 0 stevel 101003, "NSELINKAPP", /* NSE link application */ 533 0 stevel 110001, "GOLABEL", /* SunOS MLS */ 534 0 stevel 110002, "PUC", /* SunOS MLS */ 535 0 stevel 150001, "PCNFSD", /* PC passwd authorization */ 536 0 stevel 150002, "TOPS", /* TOPS name mapping */ 537 0 stevel 150003, "TOPS", /* TOPS external attribute storage */ 538 0 stevel 150004, "TOPS", /* TOPS hierarchical file system */ 539 0 stevel 150005, "TOPS", /* TOPS NFS transparency extensions */ 540 0 stevel 150006, "SOLARNET_FW", /* SolarNet Framework protocol */ 541 0 stevel 160001, "CM", /* Nihon Sun - Japanese Input system */ 542 0 stevel 300004, "FRAME 1", /* Frame program 1 */ 543 0 stevel 300009, "FRAME 2", /* Frame program 2 */ 544 0 stevel 390101, "RAP", /* Legato RAP protocol */ 545 0 stevel 390102, "RAPRD", /* Legato RAP resource dir protocol */ 546 0 stevel 500021, "ZNS", /* Zeus Network Service */ 547 0 stevel }; 548 0 stevel 549 410 kcpoon int 550 0 stevel compare(a, b) 551 0 stevel register struct rpcnames *a, *b; 552 0 stevel { 553 0 stevel return (a->rp_prog - b->rp_prog); 554 0 stevel } 555 0 stevel 556 0 stevel char * 557 0 stevel nameof_prog(prog) 558 0 stevel int prog; 559 0 stevel { 560 0 stevel struct rpcnames *r; 561 0 stevel struct rpcnames *bsearch(); 562 0 stevel int elems = sizeof (rpcnames) / sizeof (*r); 563 0 stevel 564 0 stevel r = bsearch(&prog, rpcnames, elems, sizeof (*r), compare); 565 0 stevel if (r) 566 0 stevel return (r->rp_name); 567 0 stevel 568 0 stevel if (prog >= 0x40000000 && prog <= 0x5fffffff) 569 0 stevel return ("transient"); 570 0 stevel 571 0 stevel return ("?"); 572 0 stevel } 573 0 stevel 574 0 stevel char * 575 0 stevel nameof_astat(status) 576 0 stevel int status; 577 0 stevel { 578 0 stevel switch (status) { 579 0 stevel case SUCCESS : return ("Success"); 580 0 stevel case PROG_UNAVAIL : return ("Program unavailable"); 581 0 stevel case PROG_MISMATCH: return ("Program number mismatch"); 582 0 stevel case PROC_UNAVAIL : return ("Procedure unavailable"); 583 0 stevel case GARBAGE_ARGS : return ("Garbage arguments"); 584 0 stevel case SYSTEM_ERR : return ("System error"); 585 0 stevel default: return ("unknown"); 586 0 stevel } 587 0 stevel } 588 0 stevel 589 0 stevel char * 590 0 stevel nameof_why(why) 591 0 stevel int why; 592 0 stevel { 593 0 stevel switch (why) { 594 0 stevel case AUTH_BADCRED: return ("bogus credentials (seal broken)"); 595 0 stevel case AUTH_REJECTEDCRED: return ("client should begin new session"); 596 0 stevel case AUTH_BADVERF: return ("bogus verifier (seal broken)"); 597 0 stevel case AUTH_REJECTEDVERF: return ("verifier expired or was replayed"); 598 0 stevel case AUTH_TOOWEAK: return ("too weak"); 599 0 stevel case AUTH_INVALIDRESP: return ("bogus response verifier"); 600 0 stevel case AUTH_TIMEEXPIRE: return ("time of credential expired"); 601 0 stevel case AUTH_TKT_FILE: return ("something wrong with ticket file"); 602 0 stevel case AUTH_DECODE: return ("can't decode authenticator"); 603 0 stevel case AUTH_NET_ADDR: return ("net address in ticket wrong"); 604 0 stevel case RPCSEC_GSS_NOCRED: return ("no credentials for user"); 605 0 stevel case RPCSEC_GSS_FAILED: return ("GSS failure, credentials deleted"); 606 0 stevel case AUTH_FAILED: 607 0 stevel default: 608 0 stevel return ("unknown reason"); 609 0 stevel } 610 0 stevel } 611 0 stevel 612 410 kcpoon static void 613 410 kcpoon rpc_detail_reply(int flags, int xid, struct cache_struct *x, char *data, 614 410 kcpoon int len) 615 0 stevel { 616 0 stevel int status; 617 0 stevel int astat, rstat, why; 618 0 stevel int pos; 619 0 stevel 620 0 stevel if (x) { 621 0 stevel (void) sprintf(get_line(0, 0), 622 10616 Sebastien "This is a reply to frame %d", 623 10616 Sebastien x->xid_frame); 624 0 stevel } 625 0 stevel pos = getxdr_pos(); 626 0 stevel status = getxdr_long(); 627 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 628 10616 Sebastien "Status = %d (%s)", 629 10616 Sebastien status, status ? "Denied" : "Accepted"); 630 0 stevel 631 0 stevel switch (status) { 632 0 stevel case MSG_ACCEPTED: 633 0 stevel print_verif(REPLY); 634 0 stevel pos = getxdr_pos(); 635 0 stevel astat = getxdr_long(); 636 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 637 10616 Sebastien "Accept status = %d (%s)", 638 10616 Sebastien astat, nameof_astat(astat)); 639 0 stevel 640 0 stevel switch (astat) { 641 0 stevel case SUCCESS: 642 0 stevel if (x) { 643 0 stevel show_trailer(); 644 0 stevel protoprint(flags, REPLY, xid, 645 10616 Sebastien x->xid_prog, x->xid_vers, x->xid_proc, 646 10616 Sebastien data, len); 647 0 stevel } 648 0 stevel break; 649 0 stevel case PROG_UNAVAIL : 650 0 stevel break; 651 0 stevel case PROG_MISMATCH: 652 0 stevel case PROC_UNAVAIL : 653 0 stevel showxdr_long(" Low = %d"); 654 0 stevel showxdr_long(" High = %d"); 655 0 stevel break; 656 0 stevel case GARBAGE_ARGS: 657 0 stevel case SYSTEM_ERR: 658 0 stevel default: 659 0 stevel ; 660 0 stevel } 661 0 stevel 662 0 stevel break; 663 0 stevel 664 0 stevel case MSG_DENIED: 665 0 stevel pos = getxdr_pos(); 666 0 stevel rstat = getxdr_long(); 667 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 668 10616 Sebastien "Reject status = %d (%s)", 669 10616 Sebastien rstat, 670 10616 Sebastien rstat ? "can't authenticate" 671 10616 Sebastien : "version mismatch"); 672 0 stevel 673 0 stevel switch (rstat) { 674 0 stevel case RPC_MISMATCH: 675 0 stevel showxdr_long(" Low = %d"); 676 0 stevel showxdr_long(" High = %d"); 677 0 stevel break; 678 0 stevel case AUTH_ERROR: 679 0 stevel why = getxdr_u_long(); 680 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), 681 10616 Sebastien " Why = %d (%s)", 682 10616 Sebastien why, nameof_why(why)); 683 0 stevel break; 684 0 stevel } 685 0 stevel break; 686 0 stevel } 687 0 stevel } 688 0 stevel 689 0 stevel /* 690 0 stevel * Return true if this is a valid RPC packet 691 0 stevel */ 692 410 kcpoon int 693 410 kcpoon valid_rpc(char *rpc, int rpclen) 694 0 stevel { 695 0 stevel XDR xdrm; 696 0 stevel struct rpc_msg msg; 697 0 stevel 698 0 stevel if (rpclen < 12) 699 0 stevel return (0); 700 0 stevel 701 0 stevel xdrmem_create(&xdrm, rpc, rpclen, XDR_DECODE); 702 0 stevel if (xdr_u_int(&xdrm, &msg.rm_xid) && 703 0 stevel xdr_u_int(&xdrm, (uint_t *)&msg.rm_direction)) { 704 0 stevel switch (msg.rm_direction) { 705 0 stevel case CALL: 706 0 stevel if (xdr_rpcvers(&xdrm, &msg.rm_call.cb_rpcvers) && 707 0 stevel msg.rm_call.cb_rpcvers == 2) 708 0 stevel return (1); 709 0 stevel break; 710 0 stevel case REPLY: 711 0 stevel if (xdr_u_int(&xdrm, 712 10616 Sebastien (uint_t *)&msg.rm_reply.rp_stat) && 713 0 stevel (msg.rm_reply.rp_stat == MSG_ACCEPTED || 714 0 stevel msg.rm_reply.rp_stat == MSG_DENIED)) 715 0 stevel return (1); 716 0 stevel break; 717 0 stevel } 718 0 stevel } 719 0 stevel 720 0 stevel return (0); 721 0 stevel } 722 0 stevel 723 0 stevel struct cache_struct *xcpfirst = &xid_cache[0]; 724 0 stevel struct cache_struct *xcp = &xid_cache[0]; 725 0 stevel struct cache_struct *xcplast = &xid_cache[XID_CACHE_SIZE - 1]; 726 0 stevel 727 0 stevel struct cache_struct * 728 0 stevel find_xid(xid) 729 0 stevel ulong_t xid; 730 0 stevel { 731 0 stevel struct cache_struct *x; 732 0 stevel 733 0 stevel for (x = xcp; x >= xcpfirst; x--) 734 0 stevel if (x->xid_num == xid) 735 0 stevel return (x); 736 0 stevel for (x = xcplast; x > xcp; x--) 737 0 stevel if (x->xid_num == xid) 738 0 stevel return (x); 739 0 stevel return (NULL); 740 0 stevel } 741 0 stevel 742 410 kcpoon static void 743 410 kcpoon stash_xid(ulong_t xid, int frame, int prog, int vers, int proc) 744 0 stevel { 745 0 stevel struct cache_struct *x; 746 0 stevel 747 0 stevel x = find_xid(xid); 748 0 stevel if (x == NULL) { 749 0 stevel x = xcp++; 750 0 stevel if (xcp > xcplast) 751 0 stevel xcp = xcpfirst; 752 0 stevel x->xid_num = xid; 753 0 stevel x->xid_frame = frame; 754 0 stevel } 755 0 stevel x->xid_prog = prog; 756 0 stevel x->xid_vers = vers; 757 0 stevel x->xid_proc = proc; 758 0 stevel x->xid_gss_proc = RPCSEC_GSS_DATA; 759 0 stevel x->xid_gss_service = rpc_gss_svc_default; 760 0 stevel } 761 0 stevel 762 0 stevel void 763 0 stevel check_retransmit(line, xid) 764 0 stevel char *line; 765 0 stevel ulong_t xid; 766 0 stevel { 767 0 stevel struct cache_struct *x; 768 0 stevel extern int pi_frame; 769 0 stevel 770 0 stevel x = find_xid(xid); 771 0 stevel if (x && x->xid_frame != pi_frame) 772 0 stevel (void) strcat(line, " (retransmit)"); 773 0 stevel } 774