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 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 #include <stdio.h>
30 #include <sys/types.h>
31
32 #include <at.h>
33 #include <snoop.h>
34
35 static void show_nbp_tuples(uint8_t *, int, uint8_t *);
36
37 static char *nbp_short[] = {
38 "0", /* 0 */
39 "BRRQ ", /* 1 */
40 "LKUP C ", /* 2 */
41 "LKUP R ", /* 3 */
42 "FWD ", /* 4 */
43 "5 ",
44 "6 ",
45 "7 ",
46 "8 ",
47 "9 ",
48 "10 ",
49 "11 ",
50 "RGSTR ", /* 12 */
51 "UNRGSTR", /* 13 */
52 "OK ", /* 14 */
53 "ERROR ", /* 15 */
54 };
55
56 void
interpret_nbp(int flags,struct nbp_hdr * nbp,int len)57 interpret_nbp(int flags, struct nbp_hdr *nbp, int len)
58 {
59 uint8_t *data;
60 int nbp_cnt = nbp->nbp_fun_cnt & 0xf; /* lower four bits */
61 int nbp_op = (nbp->nbp_fun_cnt >> 4) & 0xf; /* upper four bits */
62
63 data = (uint8_t *)(nbp + 1);
64
65 if (flags & F_SUM) {
66 if (len < sizeof (struct nbp_hdr)) {
67 (void) snprintf(get_sum_line(), MAXLINE,
68 "NBP (short packet)");
69 return;
70 }
71 (void) snprintf(get_sum_line(), MAXLINE,
72 "NBP F=%s CNT=%d ID=%d", nbp_short[nbp_op],
73 nbp_cnt, nbp->nbp_id);
74 }
75
76 if (flags & F_DTAIL) {
77 show_header("NBP: ", "NBP Header", len);
78 show_space();
79
80 if (len < sizeof (struct nbp_hdr)) {
81 (void) snprintf(get_line(0, 0), get_line_remain(),
82 "NBP (short packet)");
83 return;
84 }
85 (void) snprintf(get_line(0, 0), get_line_remain(),
86 "Length = %d", len);
87
88 (void) snprintf(get_line(0, 0), get_line_remain(),
89 "Func = %d (%s)", nbp_op, nbp_short[nbp_op]);
90
91 (void) snprintf(get_line(0, 0), get_line_remain(),
92 "Tuple count = %d", nbp_cnt);
93 (void) snprintf(get_line(0, 0), get_line_remain(),
94 "Id = %d", nbp->nbp_id);
95 show_nbp_tuples(data, nbp_cnt, ((uint8_t *)nbp) + len);
96 }
97 }
98
99 static void
show_nbp_tuples(uint8_t * p,int tuples,uint8_t * tail)100 show_nbp_tuples(uint8_t *p, int tuples, uint8_t *tail)
101 {
102 uint16_t net;
103 uint8_t node;
104 uint8_t sock;
105 uint8_t enumer;
106 char obj[100];
107 char *op;
108 char *otail = &obj[sizeof (obj)];
109
110 while (tuples--) {
111 op = obj;
112 if ((p + 5) > tail)
113 goto out;
114 net = get_short(p);
115 p += 2;
116 node = *p++;
117 sock = *p++;
118 enumer = *p++;
119
120 if (p > tail || &p[1]+p[0] > tail)
121 goto out;
122 op += snprintf(op, otail-op, "%.*s", p[0], &p[1]);
123
124 p = &p[1]+p[0];
125 if (p > tail || &p[1]+p[0] > tail)
126 goto out;
127 op += snprintf(op, otail-op, ":%.*s", p[0], &p[1]);
128
129 p = &p[1]+p[0];
130 if (p > tail || &p[1]+p[0] > tail)
131 goto out;
132 (void) snprintf(op, otail-op, "@%.*s", p[0], &p[1]);
133 p = &p[1]+p[0];
134
135 (void) snprintf(get_line(0, 0), get_line_remain(),
136 "Name = \"%s\"", obj);
137 (void) snprintf(get_line(0, 0), get_line_remain(),
138 "Net = %d, node = %d, sock = %d, enum = %d",
139 net, node, sock, enumer);
140 }
141 return;
142 out:
143 (void) snprintf(get_line(0, 0), get_line_remain(),
144 "NBP (short tuple)");
145 }
146