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 410 kcpoon * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 410 kcpoon * Use is subject to license terms. 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 #include <netinet/in.h> 32 0 stevel #include <at.h> 33 0 stevel #include <snoop.h> 34 0 stevel 35 0 stevel extern char *src_name, *dst_name; 36 0 stevel 37 410 kcpoon struct socktable { 38 0 stevel int pt_num; 39 0 stevel char *pt_short; 40 0 stevel }; 41 0 stevel 42 0 stevel static struct socktable pt_ddp[] = { 43 0 stevel {1, "RTMP"}, 44 0 stevel {2, "NIS"}, 45 0 stevel {4, "Echoer"}, 46 0 stevel {6, "ZIS"}, 47 0 stevel {0, NULL}, 48 0 stevel }; 49 0 stevel 50 0 stevel static struct socktable pt_ddp_types[] = { 51 0 stevel {1, "RTMP Resp"}, 52 0 stevel {2, "NBP"}, 53 0 stevel {3, "ATP"}, 54 0 stevel {4, "AEP"}, 55 0 stevel {5, "RTMP Req"}, 56 0 stevel {6, "ZIP"}, 57 0 stevel {7, "ADSP"}, 58 0 stevel {0, NULL}, 59 0 stevel }; 60 0 stevel 61 0 stevel static char * 62 0 stevel apple_ddp_type(struct socktable *p, uint16_t port) 63 0 stevel { 64 0 stevel for (; p->pt_num != 0; p++) { 65 0 stevel if (port == p->pt_num) 66 0 stevel return (p->pt_short); 67 0 stevel } 68 0 stevel return (NULL); 69 0 stevel } 70 0 stevel 71 0 stevel /* 72 0 stevel * return the short at p, regardless of alignment 73 0 stevel */ 74 0 stevel 75 0 stevel uint16_t 76 0 stevel get_short(uint8_t *p) 77 0 stevel { 78 0 stevel return (p[0] << 8 | p[1]); 79 0 stevel } 80 0 stevel 81 0 stevel /* 82 0 stevel * return the long at p, regardless of alignment 83 0 stevel */ 84 0 stevel uint32_t 85 0 stevel get_long(uint8_t *p) 86 0 stevel { 87 0 stevel return (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]); 88 0 stevel } 89 0 stevel 90 0 stevel /* 91 0 stevel * format a MAC address 92 0 stevel */ 93 0 stevel 94 0 stevel char * 95 0 stevel print_macaddr(uint8_t *ha, int len) 96 0 stevel { 97 0 stevel static char buf[128]; 98 0 stevel char *p = buf; 99 0 stevel 100 0 stevel while (len-- != 0) { 101 0 stevel p += snprintf(p, sizeof (buf) - (p - buf), 102 0 stevel len > 0 ? "%x:" : "%x", *ha++); 103 0 stevel } 104 0 stevel return (buf); 105 0 stevel } 106 0 stevel 107 0 stevel /* ARGSUSED */ 108 0 stevel void 109 0 stevel interpret_at(int flags, struct ddp_hdr *ddp, int len) 110 0 stevel { 111 0 stevel int ddplen; 112 0 stevel char *pname; 113 0 stevel char buff [32]; 114 0 stevel static char src_buf[16]; 115 0 stevel static char dst_buf[16]; 116 0 stevel 117 0 stevel if (ddp_pad(ddp) != 0) 118 0 stevel return; /* unknown AppleTalk proto */ 119 0 stevel 120 0 stevel ddplen = ddp_len(ddp); 121 0 stevel 122 0 stevel (void) snprintf(src_buf, sizeof (src_buf), 123 0 stevel "%u.%u", ntohs(ddp->ddp_src_net), ddp->ddp_src_id); 124 0 stevel src_name = src_buf; 125 0 stevel 126 0 stevel (void) snprintf(dst_buf, sizeof (dst_buf), 127 0 stevel "%u.%u", ntohs(ddp->ddp_dest_net), ddp->ddp_dest_id); 128 0 stevel if (ddp->ddp_dest_id == NODE_ID_BROADCAST) 129 0 stevel dst_name = "(broadcast)"; 130 0 stevel else 131 0 stevel dst_name = dst_buf; 132 0 stevel 133 0 stevel if (flags & F_SUM) { 134 0 stevel (void) snprintf(get_sum_line(), MAXLINE, 135 0 stevel "DDP S=%u.%u:%u D=%u.%u:%u LEN=%d", 136 0 stevel ntohs(ddp->ddp_src_net), 137 0 stevel ddp->ddp_src_id, 138 0 stevel ddp->ddp_src_sock, 139 0 stevel ntohs(ddp->ddp_dest_net), 140 0 stevel ddp->ddp_dest_id, 141 0 stevel ddp->ddp_dest_sock, 142 0 stevel ddp_len(ddp)); 143 0 stevel } 144 0 stevel 145 0 stevel if (flags & F_DTAIL) { 146 0 stevel show_header("DDP: ", "DDP Header", ddplen - DDPHDR_SIZE); 147 0 stevel show_space(); 148 0 stevel pname = apple_ddp_type(pt_ddp, ddp->ddp_src_sock); 149 0 stevel if (pname == NULL) { 150 0 stevel pname = ""; 151 0 stevel } else { 152 0 stevel (void) snprintf(buff, sizeof (buff), "(%s)", pname); 153 0 stevel pname = buff; 154 0 stevel } 155 0 stevel 156 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 157 0 stevel "Source = %s, Socket = %u %s", 158 0 stevel src_name, ddp->ddp_src_sock, pname); 159 0 stevel pname = apple_ddp_type(pt_ddp, ddp->ddp_dest_sock); 160 0 stevel if (pname == NULL) { 161 0 stevel pname = ""; 162 0 stevel } else { 163 0 stevel (void) snprintf(buff, sizeof (buff), "(%s)", pname); 164 0 stevel pname = buff; 165 0 stevel } 166 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 167 0 stevel "Destination = %s, Socket = %u %s", 168 0 stevel dst_name, ddp->ddp_dest_sock, pname); 169 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 170 0 stevel "Hop count = %d", 171 0 stevel ddp_hop(ddp)); 172 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 173 0 stevel "Length = %d", 174 0 stevel ddp_len(ddp)); 175 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 176 0 stevel "Checksum = %04x %s", 177 0 stevel ntohs(ddp->ddp_cksum), 178 0 stevel ddp->ddp_cksum == 0 ? "(no checksum)" : ""); 179 0 stevel (void) snprintf(get_line(0, 0), get_line_remain(), 180 0 stevel "DDP type = %d (%s)", 181 0 stevel ddp->ddp_type, 182 0 stevel apple_ddp_type(pt_ddp_types, ddp->ddp_type)); 183 0 stevel show_space(); 184 0 stevel } 185 0 stevel 186 0 stevel 187 0 stevel /* go to the next protocol layer */ 188 0 stevel 189 0 stevel switch (ddp->ddp_type) { 190 0 stevel case DDP_TYPE_NBP: 191 0 stevel interpret_nbp(flags, (struct nbp_hdr *)ddp, ddplen); 192 0 stevel break; 193 0 stevel case DDP_TYPE_AEP: 194 0 stevel interpret_aecho(flags, ddp, ddplen); 195 0 stevel break; 196 0 stevel case DDP_TYPE_ATP: 197 0 stevel interpret_atp(flags, ddp, ddplen); 198 0 stevel break; 199 0 stevel case DDP_TYPE_ZIP: 200 0 stevel interpret_ddp_zip(flags, (struct zip_hdr *)ddp, ddplen); 201 0 stevel break; 202 0 stevel case DDP_TYPE_ADSP: 203 0 stevel interpret_adsp(flags, (struct ddp_adsphdr *)ddp, ddplen); 204 0 stevel break; 205 0 stevel case DDP_TYPE_RTMPRQ: 206 0 stevel case DDP_TYPE_RTMPRESP: 207 0 stevel interpret_rtmp(flags, ddp, ddplen); 208 0 stevel break; 209 0 stevel } 210 0 stevel } 211