2 * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 *---------------------------------------------------------------------------
27 * layer2.c - decode and print layer 2 (Q.921) information
28 * -------------------------------------------------------
30 * $Id: layer2.c,v 1.5 1999/12/13 21:25:25 hm Exp $
32 * $FreeBSD: src/usr.sbin/i4b/isdndecode/layer2.c,v 1.6.2.1 2001/08/01 17:45:05 obrien Exp $
33 * $DragonFly: src/usr.sbin/i4b/isdndecode/layer2.c,v 1.2 2003/06/17 04:29:55 dillon Exp $
35 * last edit-date: [Mon Dec 13 21:50:41 1999]
37 *---------------------------------------------------------------------------*/
41 /*---------------------------------------------------------------------------*
43 *---------------------------------------------------------------------------*/
45 poll(int layer, char *buffer, int cnt, unsigned char value, unsigned char mask)
47 sprintline(layer, buffer, cnt, value, mask, "P/F, Poll = %s", (value & mask) ? "Immediate Response Required" : "No Immediate Response Required");
50 /*---------------------------------------------------------------------------*
52 *---------------------------------------------------------------------------*/
54 final(int layer, char *buffer, int cnt, unsigned char value, unsigned char mask)
56 sprintline(layer, buffer, cnt, value, mask, "P/F, Final = %s", (value & mask) ? "Result of Poll" : "No Result of Poll");
59 /*---------------------------------------------------------------------------*
60 * decode protocol specified in Q.921
61 *---------------------------------------------------------------------------*/
63 layer2(char *pbuf, unsigned char *buf, int dir, int printit)
68 char *lbufp = &locbuf[0];
76 sap = (buf[0] >> 2) & 0x3f;
79 strcpy(buffer, "Call Control");
80 else if((sap >= 1) && (sap <= 15))
81 strcpy(buffer, "Reserved");
83 strcpy(buffer, "X.25");
84 else if((sap >= 17) && (sap <= 31))
85 strcpy(buffer, "Reserved");
87 strcpy(buffer, "Layer 2 Management");
89 strcpy(buffer, "Not available for Q.921");
90 sprintline(2, lbufp+strlen(lbufp), cnt, buf[0], 0xfc, "SAPI = %d (%s)", sap, buffer);
93 cmd = !(buf[0] & 0x02);
97 sprintline(2, lbufp+strlen(lbufp), cnt, buf[0], 0x02, "C/R = %s", cmd ? "Command" : "Response");
98 extension(2, lbufp+strlen(lbufp), cnt, buf[0], 0x01);
105 if((tei >= 0) && (tei <= 63))
106 strcpy(buffer, "Non-automatic TEI");
107 else if((tei >= 64) && (tei <= 126))
108 strcpy(buffer, "Automatic TEI");
110 strcpy(buffer, "Group TEI");
112 sprintline(2, lbufp+strlen(lbufp), cnt, buf[1], 0xfe, "TEI = %d (%s)", tei, buffer);
113 extension(2, lbufp+strlen(lbufp), cnt, buf[1], 0x01);
118 if((buf[2] & 0x03) == 0x03)
122 if((buf[2] & 0xef) == 0x6f)
126 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xef, "U-Frame: SABME (Set Asynchonous Balanced Mode)");
127 poll(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
130 else if((buf[2] & 0xef) == 0x0f)
134 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xef, "U-Frame: DM (Disconnected Mode)");
135 final(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
138 else if((buf[2] & 0xef) == 0x03)
142 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xef, "U-Frame: UI (Unnumbered Information)");
143 poll(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
146 if(sap == 63 && (buf[3] == 0x0f)) /* TEI management */
148 sprintline(2, lbufp+strlen(lbufp), cnt, buf[3], 0xff, "MEI (Management Entity Identifier)");
150 sprintline(2, lbufp+strlen(lbufp), cnt, buf[4], 0xff, "Ri = 0x%04x (Reference number high)", (buf[4] << 8) | buf[5]);
152 sprintline(2, lbufp+strlen(lbufp), cnt, buf[5], 0xff, "Ri (Reference Number low)");
158 strcpy(buffer, "Identity Request");
161 strcpy(buffer, "Identity Assigned");
164 strcpy(buffer, "Identity denied");
167 strcpy(buffer, "Identity Check Request");
170 strcpy(buffer, "Identity Check Response");
173 strcpy(buffer, "Identity Remove");
176 strcpy(buffer, "Identity Verify");
179 strcpy(buffer, "undefined");
183 sprintline(2, lbufp+strlen(lbufp), cnt, buf[6], 0xff, "TEI %s (Message Type %d)", buffer, buf[6]);
189 strcpy(buffer, "Any TEI value acceptable");
195 strcpy(buffer, "No TEI Value available");
198 strcpy(buffer, "Check all TEI values");
204 strcpy(buffer, "Request for removal of all TEI values");
213 if(((buf[7] >> 1) & 0x7f) == 127)
214 sprintline(2, lbufp+strlen(lbufp), cnt, buf[7], 0xfe, "Ai = %d (Action Indicator = %s)", (buf[7] >> 1) & 0x7f, buffer);
216 sprintline(2, lbufp+strlen(lbufp), cnt, buf[7], 0xfe, "Ai = %d (Action Indicator)", (buf[7] >> 1) & 0x7f);
217 extension(2, lbufp+strlen(lbufp), cnt, buf[7], 0x01);
221 else if((buf[2] & 0xef) == 0x43)
225 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xef, "U-Frame: DISC (Disconnect)");
226 poll(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
229 else if((buf[2] & 0xef) == 0x63)
233 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xef, "U-Frame: UA (Unnumbered Acknowledge)");
234 final(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
237 else if((buf[2] & 0xef) == 0x87)
241 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xef, "U-Frame: FRMR (Frame Reject)");
242 final(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
245 else if((buf[2] & 0xef) == 0x9f)
249 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xef, "U-Frame: XID (Exchange Identification)");
251 poll(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
253 final(2, lbufp+strlen(lbufp), cnt, buf[2], 0x10);
258 else if((buf[2] & 0x03) == 0x01)
263 strcpy(buffer, "RR (Receiver Ready)");
264 else if(buf[2] == 0x05)
265 strcpy(buffer, "RNR (Receiver Not Ready)");
266 else if(buf[2] == 0x09)
267 strcpy(buffer, "REJ (Reject)");
269 strcpy(buffer, "Unknown");
271 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xff, "S-Frame: %s", buffer);
274 sprintline(2, lbufp+strlen(lbufp), cnt, buf[3], 0xfe, "N(R) = %d (receive sequence number)", (buf[3] >> 1) & 0x7f);
276 poll(2, lbufp+strlen(lbufp), cnt, buf[3], 0x01);
278 final(2, lbufp+strlen(lbufp), cnt, buf[3], 0x01);
282 else if((buf[2] & 0x01) == 0x00)
286 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0xfe, "N(S) = %d (send sequence number)", (buf[2] >> 1) & 0x7f);
287 sprintline(2, lbufp+strlen(lbufp), cnt, buf[2], 0x01, "I-Frame: Information transfer");
290 sprintf(buffer, "N(R) = %d", (buf[3] >> 1) & 0x7f);
291 sprintline(2, lbufp+strlen(lbufp), cnt, buf[3], 0xfe, "N(R) = %d (receive sequence number)", (buf[3] >> 1) & 0x7f);
292 poll(2, lbufp+strlen(lbufp), cnt, buf[3], 0x01);
297 sprintf((pbuf+strlen(pbuf)),"%s", &locbuf[0]);