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