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