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 0 stevel * Common Development and Distribution License, Version 1.0 only 6 0 stevel * (the "License"). You may not use this file except in compliance 7 0 stevel * with the License. 8 0 stevel * 9 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 0 stevel * or http://www.opensolaris.org/os/licensing. 11 0 stevel * See the License for the specific language governing permissions 12 0 stevel * and limitations under the License. 13 0 stevel * 14 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 15 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 0 stevel * If applicable, add the following below this CDDL HEADER, with the 17 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 18 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 19 0 stevel * 20 0 stevel * CDDL HEADER END 21 0 stevel */ 22 0 stevel /* 23 0 stevel * Copyright (c) 2001 by Sun Microsystems, Inc. 24 0 stevel * All rights reserved. 25 0 stevel */ 26 0 stevel 27 0 stevel #pragma ident "%Z%%M% %I% %E% SMI" 28 0 stevel 29 0 stevel #include <stdio.h> 30 0 stevel #include <sys/types.h> 31 0 stevel 32 0 stevel #include <at.h> 33 0 stevel #include <snoop.h> 34 0 stevel 35 0 stevel static void show_nbp_tuples(uint8_t *, int, uint8_t *); 36 0 stevel 37 0 stevel static char *nbp_short[] = { 38 0 stevel "0", /* 0 */ 39 0 stevel "BRRQ ", /* 1 */ 40 0 stevel "LKUP C ", /* 2 */ 41 0 stevel "LKUP R ", /* 3 */ 42 0 stevel "FWD ", /* 4 */ 43 0 stevel "5 ", 44 0 stevel "6 ", 45 0 stevel "7 ", 46 0 stevel "8 ", 47 0 stevel "9 ", 48 0 stevel "10 ", 49 0 stevel "11 ", 50 0 stevel "RGSTR ", /* 12 */ 51 0 stevel "UNRGSTR", /* 13 */ 52 0 stevel "OK ", /* 14 */ 53 0 stevel "ERROR ", /* 15 */ 54 0 stevel }; 55 0 stevel 56 0 stevel void 57 0 stevel interpret_nbp(int flags, struct nbp_hdr *nbp, int len) 58 0 stevel { 59 0 stevel uint8_t *data; 60 0 stevel int nbp_cnt = nbp->nbp_fun_cnt & 0xf; /* lower four bits */ 61 0 stevel int nbp_op = (nbp->nbp_fun_cnt >> 4) & 0xf; /* upper four bits */ 62 0 stevel 63 0 stevel data = (uint8_t *)(nbp + 1); 64 0 stevel 65 0 stevel if (flags & F_SUM) { 66 0 stevel if (len < sizeof (struct nbp_hdr)) { 67 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 68 0 stevel "NBP (short packet)"); 69 0 stevel return; 70 0 stevel } 71 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 72 0 stevel "NBP F=%s CNT=%d ID=%d", nbp_short[nbp_op], 73 0 stevel nbp_cnt, nbp->nbp_id); 74 0 stevel } 75 0 stevel 76 0 stevel if (flags & F_DTAIL) { 77 0 stevel show_header("NBP: ", "NBP Header", len); 78 0 stevel show_space(); 79 0 stevel 80 0 stevel if (len < sizeof (struct nbp_hdr)) { 81 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 82 0 stevel "NBP (short packet)"); 83 0 stevel return; 84 0 stevel } 85 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 86 0 stevel "Length = %d", len); 87 0 stevel 88 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 89 0 stevel "Func = %d (%s)", nbp_op, nbp_short[nbp_op]); 90 0 stevel 91 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 92 0 stevel "Tuple count = %d", nbp_cnt); 93 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 94 0 stevel "Id = %d", nbp->nbp_id); 95 0 stevel show_nbp_tuples(data, nbp_cnt, ((uint8_t *)nbp) + len); 96 0 stevel } 97 0 stevel } 98 0 stevel 99 0 stevel static void 100 0 stevel show_nbp_tuples(uint8_t *p, int tuples, uint8_t *tail) 101 0 stevel { 102 0 stevel uint16_t net; 103 0 stevel uint8_t node; 104 0 stevel uint8_t sock; 105 0 stevel uint8_t enumer; 106 0 stevel char obj[100]; 107 0 stevel char *op; 108 0 stevel char *otail = &obj[sizeof (obj)]; 109 0 stevel 110 0 stevel while (tuples--) { 111 0 stevel op = obj; 112 0 stevel if ((p + 5) > tail) 113 0 stevel goto out; 114 0 stevel net = get_short(p); 115 0 stevel p += 2; 116 0 stevel node = *p++; 117 0 stevel sock = *p++; 118 0 stevel enumer = *p++; 119 0 stevel 120 0 stevel if (p > tail || &p[1]+p[0] > tail) 121 0 stevel goto out; 122 0 stevel op += snprintf(op, otail-op, "%.*s", p[0], &p[1]); 123 0 stevel 124 0 stevel p = &p[1]+p[0]; 125 0 stevel if (p > tail || &p[1]+p[0] > tail) 126 0 stevel goto out; 127 0 stevel op += snprintf(op, otail-op, ":%.*s", p[0], &p[1]); 128 0 stevel 129 0 stevel p = &p[1]+p[0]; 130 0 stevel if (p > tail || &p[1]+p[0] > tail) 131 0 stevel goto out; 132 0 stevel (void) snprintf(op, otail-op, "@%.*s", p[0], &p[1]); 133 0 stevel p = &p[1]+p[0]; 134 0 stevel 135 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 136 0 stevel "Name = \"%s\"", obj); 137 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 138 0 stevel "Net = %d, node = %d, sock = %d, enum = %d", 139 0 stevel net, node, sock, enumer); 140 0 stevel } 141 0 stevel return; 142 0 stevel out: 143 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 144 0 stevel "NBP (short tuple)"); 145 0 stevel } 146