1244480Sgonzo/* $NetBSD: xlog.c,v 1.6 2008/04/28 20:24:16 martin Exp $ */
2244480Sgonzo
3244480Sgonzo/*-
4244480Sgonzo * Copyright (c) 2002 The NetBSD Foundation, Inc.
5244480Sgonzo * All rights reserved.
6244480Sgonzo *
7244480Sgonzo * This code is derived from software contributed to The NetBSD Foundation
8244480Sgonzo * by Martin Husemann <martin@NetBSD.org>.
9244480Sgonzo *
10244480Sgonzo * Redistribution and use in source and binary forms, with or without
11244480Sgonzo * modification, are permitted provided that the following conditions
12244480Sgonzo * are met:
13244480Sgonzo * 1. Redistributions of source code must retain the above copyright
14244480Sgonzo *    notice, this list of conditions and the following disclaimer.
15244480Sgonzo * 2. Redistributions in binary form must reproduce the above copyright
16244480Sgonzo *    notice, this list of conditions and the following disclaimer in the
17244480Sgonzo *    documentation and/or other materials provided with the distribution.
18244480Sgonzo *
19244480Sgonzo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20244480Sgonzo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21244480Sgonzo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22244480Sgonzo * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23244480Sgonzo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24244480Sgonzo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25244480Sgonzo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26244480Sgonzo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27244480Sgonzo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28244480Sgonzo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29244480Sgonzo * POSSIBILITY OF SUCH DAMAGE.
30244480Sgonzo */
31244480Sgonzo
32244480Sgonzo#include <stdio.h>
33244480Sgonzo#include <stdlib.h>
34244480Sgonzo#include <string.h>
35244480Sgonzo#include <sys/ioctl.h>
36244480Sgonzo#include <netisdn/i4b_ioctl.h>
37244480Sgonzo
38244480Sgonzo#define LOG                     1
39244480Sgonzo
40244480Sgonzo#define OK 			0xff
41244480Sgonzo#define MORE_EVENTS 		0xfe
42244480Sgonzo#define NO_EVENT 		1
43244480Sgonzo
44244480Sgonzo#define OFF_LOG_RC	0	/* 1 byte */
45244480Sgonzo#define	OFF_LOG_TIMEL1	1	/* 1 byte */
46244480Sgonzo#define	OFF_LOG_TIMEL2	2	/* 1 byte */
47244480Sgonzo#define	OFF_LOG_TIMES	3	/* 2 byte */
48244480Sgonzo#define	OFF_LOG_TIMEH	5	/* 2 byte */
49244480Sgonzo#define	OFF_LOG_CODE	7	/* 2 byte */
50244480Sgonzo#define	OFF_PAR_TEXT	9	/* 42 bytes */
51244480Sgonzo#define	OFF_PAR_L1_LEN	9	/* 2 byte */
52244480Sgonzo#define	OFF_PAR_L1_I	11	/* 22 byte */
53244480Sgonzo#define OFF_PAR_L2_CODE	9	/* 2 byte */
54244480Sgonzo#define	OFF_PAR_L2_LEN	11	/* 2 byte */
55244480Sgonzo#define	OFF_PAR_L2_I	13	/* 20 byte */
56244480Sgonzo
57244480Sgonzo#define	DIAG_SIZE	49
58244480Sgonzo#define	WORD(d,o)	(((d)[(o)])|((d)[(o)+1])<<8)
59244480Sgonzo#define	DWORD(d,o)	(WORD(d,o)|(WORD(d,o+2)<<16))
60244480Sgonzo
61244480Sgonzovoid xlog(int fd, int controller);
62244480Sgonzo
63244480Sgonzostatic const char *ll_name[10] = {
64244480Sgonzo  "LL_UDATA",
65275523Sandrew  "LL_ESTABLISH",
66248028Skientzle  "LL_RELEASE",
67244480Sgonzo  "LL_DATA",
68244480Sgonzo  "LL_RESTART",
69244480Sgonzo  "LL_RESET",
70244480Sgonzo  "LL_POLL",
71244480Sgonzo  "LL_TEST",
72244480Sgonzo  "LL_MDATA",
73244480Sgonzo  "LL_BUDATA"
74244480Sgonzo};
75244480Sgonzo
76283366Sandrewstatic const char *ns_name[11] = {
77244480Sgonzo  "N_MDATA",
78244480Sgonzo  "N_CONNECT",
79244480Sgonzo  "N_CONNECT ACK",
80244480Sgonzo  "N_DISC",
81244480Sgonzo  "N_DISC ACK",
82244480Sgonzo  "N_RESET",
83244480Sgonzo  "N_RESET ACK",
84244480Sgonzo  "N_DATA",
85244480Sgonzo  "N_EDATA",
86244480Sgonzo  "N_UDATA",
87244480Sgonzo  "N_BDATA"
88244480Sgonzo};
89244480Sgonzo
90244480Sgonzovoid
91244480Sgonzoxlog(int fd, int controller)
92244480Sgonzo{
93244480Sgonzo	int i, n, code, fin;
94244480Sgonzo	struct isdn_diagnostic_request req;
95244480Sgonzo	u_int8_t data[DIAG_SIZE];
96244480Sgonzo	u_int8_t rc;
97244480Sgonzo
98244480Sgonzo	printf("xlog:\n");
99244480Sgonzo	memset(&req, 0, sizeof(req));
100244480Sgonzo	req.controller = controller;
101244480Sgonzo	req.cmd = LOG;
102244480Sgonzo	req.out_param_len = DIAG_SIZE;
103244480Sgonzo	req.out_param = &data;
104244480Sgonzo
105244480Sgonzo	for (fin = 0; !fin; ) {
106244480Sgonzo		if (ioctl(fd, I4B_ACTIVE_DIAGNOSTIC, &req) == -1) {
107244480Sgonzo			perror("ioctl(I4B_ACTIVE_DIAGNOSTIC)");
108244480Sgonzo			fin = 1;
109244480Sgonzo			break;
110244480Sgonzo		}
111244480Sgonzo		rc = data[OFF_LOG_RC];
112244480Sgonzo		if (rc == NO_EVENT) {
113244480Sgonzo			fin = 1;
114244480Sgonzo			printf("No log event\n");
115244480Sgonzo			break;
116244480Sgonzo		}
117244480Sgonzo		if (rc == MORE_EVENTS) {
118244480Sgonzo			printf("More events...(0x%02x)\n", rc);
119244480Sgonzo			fin = 0;
120244480Sgonzo		} else if (rc == OK) {
121244480Sgonzo			printf("Last event...(0x%02x)\n", rc);
122248361Sandrew			fin = 1;
123244480Sgonzo		} else {
124244480Sgonzo			printf("error: unknown rc = 0x%02x\n", rc);
125244480Sgonzo			fin = 1;
126244480Sgonzo			break;
127244480Sgonzo		}
128248361Sandrew
129244480Sgonzo		/* print timestamp */
130244480Sgonzo		printf("%5d:%04d:%03d - ", WORD(data,OFF_LOG_TIMEH),
131244480Sgonzo			WORD(data,OFF_LOG_TIMES),
132244480Sgonzo			data[OFF_LOG_TIMEL2]*20 + data[OFF_LOG_TIMEL1]);
133248361Sandrew
134244480Sgonzo		code = data[OFF_LOG_CODE];
135244480Sgonzo		switch (code) {
136244480Sgonzo		  case 1:
137244480Sgonzo			n = WORD(data, OFF_PAR_L1_LEN);
138244480Sgonzo			printf("B-X(%03d) ",n);
139244480Sgonzo			for (i=0; i<n && i<30; i++)
140244480Sgonzo			    printf("%02X ", data[OFF_PAR_L1_I+i]);
141244480Sgonzo			if (n>i) printf(" ...");
142283366Sandrew			break;
143244480Sgonzo		  case 2:
144244480Sgonzo			n = WORD(data, OFF_PAR_L1_LEN);
145283366Sandrew			printf("B-R(%03d) ", n);
146244480Sgonzo			for (i=0; i<n && i<30; i++)
147244480Sgonzo			    printf("%02X ", data[OFF_PAR_L1_I+i]);
148244480Sgonzo			if (n>i) printf(" ...");
149283366Sandrew			break;
150283366Sandrew		  case 3:
151283366Sandrew			n = WORD(data, OFF_PAR_L1_LEN);
152283366Sandrew			printf("D-X(%03d) ",n);
153283366Sandrew			for (i=0; i<n && i<38; i++)
154283366Sandrew			    printf("%02X ", data[OFF_PAR_L1_I+i]);
155283366Sandrew			if (n>i) printf(" ...");
156244480Sgonzo			break;
157244480Sgonzo		  case 4:
158244480Sgonzo			n = WORD(data, OFF_PAR_L1_LEN);
159244480Sgonzo			printf("D-R(%03d) ",n);
160248361Sandrew			for (i=0; i<n && i<38; i++)
161244480Sgonzo			    printf("%02X ", data[OFF_PAR_L1_I+i]);
162244480Sgonzo			if (n>i) printf(" ...");
163244480Sgonzo			break;
164244480Sgonzo		  case 5:
165244480Sgonzo			n = WORD(data, OFF_PAR_L2_LEN);
166244480Sgonzo			printf("SIG-EVENT(%03d)%04X - ", n, WORD(data, OFF_PAR_L2_CODE));
167244480Sgonzo			for (i=0; i<n && i<28; i++)
168244480Sgonzo			    printf("%02X ", data[OFF_PAR_L2_I+i]);
169283366Sandrew			if (n>i) printf(" ...");
170244480Sgonzo			break;
171244480Sgonzo		  case 6:
172283366Sandrew			code = WORD(data, OFF_PAR_L2_CODE);
173244480Sgonzo			if (code && code <= 10)
174244480Sgonzo				printf("%s IND",ll_name[code-1]);
175244480Sgonzo			else
176283366Sandrew				printf("UNKNOWN LL IND");
177283366Sandrew			break;
178283366Sandrew		  case 7:
179283366Sandrew			code = WORD(data, OFF_PAR_L2_CODE);
180283366Sandrew			if (code && code <= 10)
181283366Sandrew				printf("%s REQ",ll_name[code-1]);
182283366Sandrew			else
183244480Sgonzo				printf("UNKNOWN LL REQ");
184244480Sgonzo			break;
185244480Sgonzo		  case 8:
186244480Sgonzo			n = WORD(data, OFF_PAR_L2_LEN);
187248361Sandrew			printf("DEBUG%04X - ",WORD(data, OFF_PAR_L2_CODE));
188244480Sgonzo			for (i=0; i<n && i<38; i++)
189244480Sgonzo			    printf("%02X ", data[OFF_PAR_L2_I+i]);
190244480Sgonzo			if (n>i) printf(" ...");
191283366Sandrew			break;
192244480Sgonzo		  case 9:
193244480Sgonzo			printf("MDL-ERROR(%s)",&data[OFF_PAR_TEXT]);
194244480Sgonzo			break;
195244480Sgonzo		  case 10:
196244480Sgonzo			printf("UTASK->PC(%02X)",WORD(data, OFF_PAR_L2_CODE));
197244480Sgonzo			break;
198244480Sgonzo		  case 11:
199244480Sgonzo			printf("PC->UTASK(%02X)",WORD(data, OFF_PAR_L2_CODE));
200244480Sgonzo			break;
201244480Sgonzo		  case 12:
202244480Sgonzo			n = WORD(data, OFF_PAR_L1_LEN);
203244480Sgonzo			printf("X-X(%03d) ",n);
204244480Sgonzo			for (i=0; i<n && i<30; i++)
205244480Sgonzo			    printf("%02X ", data[OFF_PAR_L1_I+i]);
206244480Sgonzo			if (n>i) printf(" ...");
207244480Sgonzo			break;
208244480Sgonzo		  case 13:
209244480Sgonzo			n = WORD(data, OFF_PAR_L1_LEN);
210248361Sandrew			printf("X-R(%03d) ",n);
211248361Sandrew			for (i=0; i<n && i<30; i++)
212			    printf("%02X ", data[OFF_PAR_L1_I+i]);
213			if (n>i) printf(" ...");
214			break;
215		  case 14:
216			code = WORD(data, OFF_PAR_L2_CODE)-1;
217			if ((code &0x0f)<=10)
218				printf("%s IND",ns_name[code &0x0f]);
219			else
220				printf("UNKNOWN NS IND");
221			break;
222		  case 15:
223			code = WORD(data, OFF_PAR_L2_CODE)-1;
224			if ((code & 0x0f)<=10)
225				printf("%s REQ",ns_name[code &0x0f]);
226			else
227				printf("UNKNOWN NS REQ");
228			break;
229		  case 16:
230			printf("TASK %02i: %s",
231				WORD(data, OFF_PAR_L2_CODE), &data[OFF_PAR_L2_I]);
232			break;
233		  case 18:
234			code = WORD(data, OFF_PAR_L2_CODE);
235			printf("IO-REQ %02x",code);
236			break;
237		  case 19:
238			code = WORD(data, OFF_PAR_L2_CODE);
239			printf("IO-CON %02x",code);
240			break;
241		  default:
242		  	printf("unknown event code = %d\n", code);
243		  	break;
244		}
245		printf("\n");
246	}
247	printf("\n");
248}
249
250