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 char *print_macaddr(uint8_t *, int); 36 0 stevel 37 0 stevel static char *zip_flags(char); 38 0 stevel static char *zip_flags_long(char); 39 0 stevel 40 0 stevel void 41 0 stevel interpret_ddp_zip(int flags, struct zip_hdr *zip, int len) 42 0 stevel { 43 0 stevel int cnt; 44 0 stevel uint16_t net; 45 0 stevel uint16_t range; 46 0 stevel uint8_t *p; 47 0 stevel char zone[33]; 48 0 stevel char defzone[60] = ""; 49 0 stevel char mcast[50] = ""; 50 0 stevel uint8_t gniflags; 51 0 stevel uint8_t *tail = (uint8_t *)zip + len; 52 0 stevel 53 0 stevel if (flags & F_SUM) { 54 0 stevel if (len < sizeof (struct zip_hdr)) 55 0 stevel goto out; 56 0 stevel 57 0 stevel switch (zip->zip_func) { 58 0 stevel case ZIP_QUERY: 59 0 stevel cnt = zip->zip_netcnt; 60 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 61 0 stevel "ZIP Query CNT = %d", cnt); 62 0 stevel break; 63 0 stevel case ZIP_REPLY: 64 0 stevel case ZIP_EXT_REPLY: 65 0 stevel cnt = zip->zip_netcnt; 66 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 67 0 stevel "ZIP Reply CNT = %d", cnt); 68 0 stevel break; 69 0 stevel case ZIP_GET_NET_INFO: 70 0 stevel p = &zip->zip_func; 71 0 stevel 72 0 stevel if ((p+6 > tail) || (p+7+p[6] > tail)) 73 0 stevel goto out; 74 0 stevel 75 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 76 0 stevel "ZIP GNI Zone = \"%.*s\"", p[6], &p[7]); 77 0 stevel break; 78 0 stevel case ZIP_GET_NET_INFO_REPLY: 79 0 stevel p = &zip->zip_func; 80 0 stevel 81 0 stevel gniflags = p[1]; 82 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 83 0 stevel "ZIP GNI Rep Flags 0x%x (%s)", 84 0 stevel gniflags, zip_flags(gniflags)); 85 0 stevel break; 86 0 stevel default: 87 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 88 0 stevel "ZIP CMD = %d", zip->zip_func); 89 0 stevel break; 90 0 stevel } 91 0 stevel } 92 0 stevel 93 0 stevel if (flags & F_DTAIL) { 94 0 stevel show_header("ZIP: ", "ZIP Header", len); 95 0 stevel show_space(); 96 0 stevel 97 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 98 0 stevel "Length = %d", len); 99 0 stevel 100 0 stevel if (len < sizeof (struct zip_hdr)) 101 0 stevel goto out; 102 0 stevel 103 0 stevel switch (zip->zip_func) { 104 0 stevel case ZIP_QUERY: 105 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 106 0 stevel "Query, Network count = %d", zip->zip_netcnt); 107 0 stevel cnt = zip->zip_netcnt; 108 0 stevel p = (uint8_t *)(zip + 1); 109 0 stevel while (cnt--) { 110 0 stevel if (p+2 > tail) 111 0 stevel goto out; 112 0 stevel net = get_short(p); 113 0 stevel p += 2; 114 0 stevel (void) snprintf(get_line(0, 0), 115 0 stevel get_line_remain(), "Net = %d", net); 116 0 stevel } 117 0 stevel break; 118 0 stevel case ZIP_REPLY: 119 0 stevel case ZIP_EXT_REPLY: 120 0 stevel cnt = zip->zip_netcnt; 121 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 122 0 stevel "Reply, Network count = %d", cnt); 123 0 stevel 124 0 stevel p = (uint8_t *)(zip + 1); 125 0 stevel while (cnt--) { 126 0 stevel if (p+2 > tail) 127 0 stevel goto out; 128 0 stevel net = get_short(p); 129 0 stevel p += 2; 130 0 stevel if (p+1 > tail || (&p[1] + p[0]) > tail) 131 0 stevel goto out; 132 0 stevel (void) snprintf(get_line(0, 0), 133 0 stevel get_line_remain(), 134 0 stevel "Network = %d, Zone = \"%.*s\"", 135 0 stevel net, p[0], &p[1]); 136 0 stevel p += p[0] + 1; 137 0 stevel } 138 0 stevel break; 139 0 stevel case ZIP_GET_NET_INFO: 140 0 stevel p = &zip->zip_func; 141 0 stevel if (p+1 > tail || (&p[1] + p[0]) > tail) 142 0 stevel goto out; 143 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 144 0 stevel "GetNetInfo Zone = \"%.*s\"", p[0], &p[1]); 145 0 stevel break; 146 0 stevel case ZIP_GET_NET_INFO_REPLY: 147 0 stevel p = &zip->zip_func; 148 0 stevel if (p+5 > tail) 149 0 stevel goto out; 150 0 stevel gniflags = p[1]; 151 0 stevel net = get_short(&p[2]); 152 0 stevel range = get_short(&p[4]); 153 0 stevel 154 0 stevel if (p+7 > tail || (&p[7] + p[6]) > tail) 155 0 stevel goto out; 156 0 stevel (void) snprintf(zone, sizeof (zone), 157 0 stevel "%.*s", p[6], &p[7]); 158 0 stevel p = &p[7] + p[6]; 159 0 stevel 160 0 stevel if ((gniflags & ZIP_FLG_USEBRC) == 0) { 161 0 stevel if (p+1 > tail || (&p[1] + p[0]) > tail) 162 0 stevel goto out; 163 0 stevel (void) snprintf(mcast, sizeof (mcast), 164 0 stevel "Multicast address = %s", 165 0 stevel print_macaddr(&p[1], p[0])); 166 0 stevel } 167 0 stevel 168 0 stevel if (gniflags & ZIP_FLG_ZINV) { 169 0 stevel p = &p[1] + p[0]; 170 0 stevel if (p+1 > tail || (&p[1] + p[0]) > tail) 171 0 stevel goto out; 172 0 stevel (void) snprintf(defzone, sizeof (defzone), 173 0 stevel "Default Zone = \"%.*s\"", 174 0 stevel p[0], &p[1]); 175 0 stevel } 176 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 177 0 stevel "GetNetInfo Reply, Flags 0x%x (%s)", 178 0 stevel gniflags, zip_flags_long(gniflags)); 179 0 stevel 180 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 181 0 stevel "Network number = %d-%d", net, range); 182 0 stevel 183 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 184 0 stevel "Zone = \"%s\"", zone); 185 0 stevel 186 0 stevel if (mcast[0]) 187 0 stevel (void) snprintf(get_line(0, 0), 188 0 stevel get_line_remain(), 189 0 stevel "%s", mcast); 190 0 stevel 191 0 stevel if (defzone[0]) 192 0 stevel (void) snprintf(get_line(0, 0), 193 0 stevel get_line_remain(), 194 0 stevel "%s", defzone); 195 0 stevel 196 0 stevel break; 197 0 stevel case ZIP_NOTIFY: 198 0 stevel p = &zip->zip_func; 199 0 stevel if (p+5 > tail) 200 0 stevel goto out; 201 0 stevel 202 0 stevel gniflags = p[1]; 203 0 stevel net = get_short(&p[2]); 204 0 stevel range = get_short(&p[4]); 205 0 stevel 206 0 stevel if (p+7 > tail || (&p[7] + p[6]) > tail) 207 0 stevel goto out; 208 0 stevel (void) snprintf(zone, sizeof (zone), 209 0 stevel "%.*s", p[6], &p[7]); 210 0 stevel p = &p[7] + p[6]; 211 0 stevel 212 0 stevel if ((gniflags & ZIP_FLG_USEBRC) == 0) { 213 0 stevel if (p+1 > tail || (&p[1] + p[0]) > tail) 214 0 stevel goto out; 215 0 stevel (void) snprintf(mcast, sizeof (mcast), 216 0 stevel "New Multicast address = %s", 217 0 stevel print_macaddr(&p[1], p[0])); 218 0 stevel } 219 0 stevel 220 0 stevel if (p+1 > tail || (&p[1] + p[0]) > tail) 221 0 stevel goto out; 222 0 stevel 223 0 stevel p = &p[1] + p[0]; 224 0 stevel 225 0 stevel if (p+1 > tail || (&p[1] + p[0]) > tail) 226 0 stevel goto out; 227 0 stevel 228 0 stevel (void) snprintf(defzone, sizeof (defzone), 229 0 stevel "New Default Zone = \"%.*s\"", 230 0 stevel p[0], &p[1]); 231 0 stevel 232 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 233 0 stevel "Notify, Flags 0x%x (%s)", 234 0 stevel gniflags, zip_flags_long(gniflags)); 235 0 stevel 236 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 237 0 stevel "Old Zone = \"%s\"", zone); 238 0 stevel 239 0 stevel if (mcast[0]) 240 0 stevel (void) snprintf(get_line(0, 0), 241 0 stevel get_line_remain(), "%s", mcast); 242 0 stevel 243 0 stevel if (defzone[0]) 244 0 stevel (void) snprintf(get_line(0, 0), 245 0 stevel get_line_remain(), "%s", defzone); 246 0 stevel 247 0 stevel break; 248 0 stevel default: 249 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 250 0 stevel "Op = %d", zip->zip_func); 251 0 stevel break; 252 0 stevel } 253 0 stevel } 254 0 stevel return; 255 0 stevel out: 256 0 stevel if (flags & F_SUM) 257 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 258 0 stevel "ZIP (short packet)"); 259 0 stevel if (flags & F_DTAIL) 260 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 261 0 stevel "ZIP (short packet)"); 262 0 stevel } 263 0 stevel 264 0 stevel static char * 265 0 stevel zip_flags(char flags) 266 0 stevel { 267 0 stevel static char buf[50]; 268 0 stevel char *p = buf; 269 0 stevel char *tail = &buf[sizeof (buf)]; 270 0 stevel 271 0 stevel buf[0] = '\0'; 272 0 stevel 273 0 stevel if (flags & ZIP_FLG_ZINV) 274 0 stevel p += snprintf(p, tail-p, "IZ"); 275 0 stevel 276 0 stevel if (flags & ZIP_FLG_USEBRC) 277 0 stevel p += snprintf(p, tail-p, p == buf ? "UB" : " UB"); 278 0 stevel 279 0 stevel if (flags & ZIP_FLG_ONEZ) 280 0 stevel (void) snprintf(p, tail-p, p == buf ? "OOZ" : " OOZ"); 281 0 stevel 282 0 stevel return (buf); 283 0 stevel } 284 0 stevel 285 0 stevel static char * 286 0 stevel zip_flags_long(char flags) 287 0 stevel { 288 0 stevel static char buf[50]; 289 0 stevel char *p = buf; 290 0 stevel char *tail = &buf[sizeof (buf)]; 291 0 stevel 292 0 stevel buf[0] = '\0'; 293 0 stevel 294 0 stevel if (flags & ZIP_FLG_ZINV) 295 0 stevel p += snprintf(p, tail-p, "ZoneInvalid"); 296 0 stevel 297 0 stevel if (flags & ZIP_FLG_USEBRC) 298 0 stevel p += snprintf(p, tail-p, 299 0 stevel p == buf ? "UseBroadcast" : " UseBroadcast"); 300 0 stevel 301 0 stevel if (flags & ZIP_FLG_ONEZ) 302 0 stevel (void) snprintf(p, tail-p, 303 0 stevel p == buf ? "OnlyOneZone" : " OnlyOneZone"); 304 0 stevel 305 0 stevel return (buf); 306 0 stevel } 307 0 stevel 308 0 stevel void 309 0 stevel interpret_atp_zip(int flags, struct atp_hdr *atp, int len) 310 0 stevel { 311 0 stevel int cnt; 312 0 stevel uint8_t *data; 313 0 stevel uint8_t *tail = (uint8_t *)(atp+1) + len; 314 0 stevel 315 0 stevel if (flags & F_SUM) { 316 0 stevel if (len < 0) { 317 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 318 0 stevel "ZIP (short packet)"); 319 0 stevel return; 320 0 stevel } 321 0 stevel 322 0 stevel switch (atp_fun(atp->atp_ctrl)) { 323 0 stevel case ATP_TREQ: 324 0 stevel switch (atp->atp_user[0]) { 325 0 stevel case ZIP_ATP_GETMYZONE: 326 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 327 0 stevel "ZIP GetMyZone"); 328 0 stevel break; 329 0 stevel 330 0 stevel case ZIP_ATP_GETZONELIST: 331 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 332 0 stevel "ZIP GetZoneList"); 333 0 stevel break; 334 0 stevel 335 0 stevel case ZIP_ATP_GETLOCALZONES: 336 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 337 0 stevel "ZIP GetLocalZones"); 338 0 stevel break; 339 0 stevel } 340 0 stevel break; 341 0 stevel case ATP_TRESP: 342 0 stevel cnt = get_short(&atp->atp_user[2]); 343 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 344 0 stevel "ZIP ZoneReply, Cnt = %d", cnt); 345 0 stevel 346 0 stevel break; 347 0 stevel } 348 0 stevel } 349 0 stevel 350 0 stevel if (flags & F_DTAIL) { 351 0 stevel show_header("ZIP: ", "ZIP Header", len); 352 0 stevel show_space(); 353 0 stevel 354 0 stevel if (len < 0) { 355 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 356 0 stevel "ZIP (short packet)"); 357 0 stevel return; 358 0 stevel } 359 0 stevel 360 0 stevel switch (atp_fun(atp->atp_ctrl)) { 361 0 stevel case ATP_TREQ: 362 0 stevel switch (atp->atp_user[0]) { 363 0 stevel case ZIP_ATP_GETMYZONE: 364 0 stevel (void) snprintf(get_line(0, 0), 365 0 stevel get_line_remain(), 366 0 stevel "GetMyZone, Start Index = %d", 367 0 stevel get_short(&atp->atp_user[2])); 368 0 stevel break; 369 0 stevel case ZIP_ATP_GETZONELIST: 370 0 stevel (void) snprintf(get_line(0, 0), 371 0 stevel get_line_remain(), 372 0 stevel "GetZoneList, Start Index = %d", 373 0 stevel get_short(&atp->atp_user[2])); 374 0 stevel break; 375 0 stevel case ZIP_ATP_GETLOCALZONES: 376 0 stevel (void) snprintf(get_line(0, 0), 377 0 stevel get_line_remain(), 378 0 stevel "GetLocalZones, Start Index = %d", 379 0 stevel get_short(&atp->atp_user[2])); 380 0 stevel break; 381 0 stevel } 382 0 stevel break; 383 0 stevel case ATP_TRESP: 384 0 stevel cnt = get_short(&atp->atp_user[2]); 385 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 386 0 stevel "ZoneReply, Number of Zones = %d, Length = %d", 387 0 stevel cnt, len); 388 0 stevel 389 0 stevel data = (uint8_t *)atp + DDPHDR_SIZE + ATPHDR_SIZE; 390 0 stevel 391 0 stevel while (cnt--) { 392 0 stevel if (data > tail || 393 0 stevel (&data[1] + data[0]) > tail) { 394 0 stevel (void) snprintf(get_line(0, 0), 395 0 stevel get_line_remain(), 396 0 stevel "ZoneReply (short packet)"); 397 0 stevel return; 398 0 stevel } 399 0 stevel (void) snprintf(get_line(0, 0), 400 0 stevel get_line_remain(), 401 0 stevel "Zone = \"%.*s\"", data[0], &data[1]); 402 0 stevel data += data[0] + 1; 403 0 stevel } 404 0 stevel break; 405 0 stevel } 406 0 stevel } 407 0 stevel } 408