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) 1991-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 char *adsp_ctrl(uint8_t); 34 35 void 36 interpret_adsp(int flags, struct ddp_adsphdr *adp, int len) 37 { 38 struct ddp_adsp_open *apo; 39 40 if (flags & F_SUM) { 41 if (len < sizeof (struct ddp_adsphdr)) { 42 (void) snprintf(get_sum_line(), MAXLINE, 43 "ADSP (short packet)"); 44 return; 45 } 46 (void) snprintf(get_sum_line(), MAXLINE, 47 "ADSP ConnID=%u (%s)", 48 get_short(adp->ad_connid), 49 adsp_ctrl(adp->ad_desc)); 50 } 51 52 if (flags & F_DTAIL) { 53 show_header("ADSP: ", "ADSP Header", 54 len - sizeof (struct ddp_adsphdr)); 55 show_space(); 56 57 if (len < sizeof (struct ddp_adsphdr)) { 58 (void) snprintf(get_line(0, 0), get_line_remain(), 59 "(short packet)"); 60 return; 61 } 62 63 (void) snprintf(get_line(0, 0), get_line_remain(), 64 "ConnID = %u, ByteSeq = %u, RecvSeq = %u", 65 get_short(adp->ad_connid), 66 get_long(adp->ad_fbseq), 67 get_long(adp->ad_nrseq)); 68 69 (void) snprintf(get_line(0, 0), get_line_remain(), 70 "RcvWin = %u, Ctrl = 0x%x (%s)", 71 get_short(adp->ad_rcvwin), 72 adp->ad_desc, 73 adsp_ctrl(adp->ad_desc)); 74 75 switch (adp->ad_desc) { 76 case AD_CREQ: /* open requests */ 77 case AD_CACK: 78 case AD_CREQ_ACK: 79 case AD_CDENY: 80 apo = (struct ddp_adsp_open *)adp; 81 if (len < sizeof (struct ddp_adsp_open)) { 82 (void) snprintf(get_line(0, 0), 83 get_line_remain(), 84 "(short packet)"); 85 return; 86 } 87 (void) snprintf(get_line(0, 0), get_line_remain(), 88 "Dest ConnID = %u, AttRcvSeq = %u", 89 get_short(apo->ad_dconnid), 90 get_long(apo->ad_attseq)); 91 break; 92 } 93 94 if (adp->ad_desc & AD_ATT) { 95 (void) snprintf(get_line(0, 0), get_line_remain(), 96 "AttCode = 0x%x", 97 get_short(((struct ddp_adsp_att *)adp)-> 98 ad_att_code)); 99 } 100 } 101 } 102 103 static char *adsp_ctrl_msg[] = { 104 "Probe/Ack", 105 "OpenConnReq", 106 "OpenConnAck", 107 "OpenConnReq+Ack", 108 "OpenConnDeny", 109 "CloseConnAdv", 110 "ForwReset", 111 "ForwReset Ack", 112 "RetransAdv", 113 "9", "10", "11", "12", "13", "14", "15", 114 }; 115 116 static char * 117 adsp_ctrl(uint8_t ctrl) 118 { 119 static char buf[50]; 120 char *p = buf; 121 char *tail = &buf[sizeof (buf)]; 122 123 if (ctrl & AD_ACKREQ) 124 p += snprintf(p, tail-p, "AckReq"); 125 126 if (ctrl & AD_EOM) { 127 p += snprintf(p, tail-p, p == buf ? "EOM" : " EOM"); 128 } 129 130 if (ctrl & AD_ATT) { 131 p += snprintf(p, tail-p, p == buf ? "Att" : " Att"); 132 } 133 134 if (ctrl & AD_CTRL) { 135 (void) snprintf(p, tail-p, "%s%s", p == buf ? "" : " ", 136 adsp_ctrl_msg[ctrl & AD_CTRL_MASK]); 137 } 138 139 return (buf); 140 } 141