/* $NetBSD: xlog.c,v 1.7 2009/04/16 05:56:32 lukem Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Martin Husemann . * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #define LOG 1 #define OK 0xff #define MORE_EVENTS 0xfe #define NO_EVENT 1 #define OFF_LOG_RC 0 /* 1 byte */ #define OFF_LOG_TIMEL1 1 /* 1 byte */ #define OFF_LOG_TIMEL2 2 /* 1 byte */ #define OFF_LOG_TIMES 3 /* 2 byte */ #define OFF_LOG_TIMEH 5 /* 2 byte */ #define OFF_LOG_CODE 7 /* 2 byte */ #define OFF_PAR_TEXT 9 /* 42 bytes */ #define OFF_PAR_L1_LEN 9 /* 2 byte */ #define OFF_PAR_L1_I 11 /* 22 byte */ #define OFF_PAR_L2_CODE 9 /* 2 byte */ #define OFF_PAR_L2_LEN 11 /* 2 byte */ #define OFF_PAR_L2_I 13 /* 20 byte */ #define DIAG_SIZE 49 #define WORD(d,o) (((d)[(o)])|((d)[(o)+1])<<8) #define DWORD(d,o) (WORD(d,o)|(WORD(d,o+2)<<16)) void xlog(int fd, int controller); static const char *ll_name[10] = { "LL_UDATA", "LL_ESTABLISH", "LL_RELEASE", "LL_DATA", "LL_RESTART", "LL_RESET", "LL_POLL", "LL_TEST", "LL_MDATA", "LL_BUDATA" }; static const char *ns_name[11] = { "N_MDATA", "N_CONNECT", "N_CONNECT ACK", "N_DISC", "N_DISC ACK", "N_RESET", "N_RESET ACK", "N_DATA", "N_EDATA", "N_UDATA", "N_BDATA" }; void xlog(int fd, int controller) { int i, n, code, fin; struct isdn_diagnostic_request req; u_int8_t data[DIAG_SIZE]; u_int8_t rc; printf("xlog:\n"); memset(&req, 0, sizeof(req)); req.controller = controller; req.cmd = LOG; req.out_param_len = DIAG_SIZE; req.out_param = &data; for (fin = 0; !fin; ) { if (ioctl(fd, I4B_ACTIVE_DIAGNOSTIC, &req) == -1) { perror("ioctl(I4B_ACTIVE_DIAGNOSTIC)"); fin = 1; break; } rc = data[OFF_LOG_RC]; if (rc == NO_EVENT) { fin = 1; printf("No log event\n"); break; } if (rc == MORE_EVENTS) { printf("More events...(0x%02x)\n", rc); fin = 0; } else if (rc == OK) { printf("Last event...(0x%02x)\n", rc); fin = 1; } else { printf("error: unknown rc = 0x%02x\n", rc); fin = 1; break; } /* print timestamp */ printf("%5d:%04d:%03d - ", WORD(data,OFF_LOG_TIMEH), WORD(data,OFF_LOG_TIMES), data[OFF_LOG_TIMEL2]*20 + data[OFF_LOG_TIMEL1]); code = data[OFF_LOG_CODE]; switch (code) { case 1: n = WORD(data, OFF_PAR_L1_LEN); printf("B-X(%03d) ",n); for (i=0; ii) printf(" ..."); break; case 2: n = WORD(data, OFF_PAR_L1_LEN); printf("B-R(%03d) ", n); for (i=0; ii) printf(" ..."); break; case 3: n = WORD(data, OFF_PAR_L1_LEN); printf("D-X(%03d) ",n); for (i=0; ii) printf(" ..."); break; case 4: n = WORD(data, OFF_PAR_L1_LEN); printf("D-R(%03d) ",n); for (i=0; ii) printf(" ..."); break; case 5: n = WORD(data, OFF_PAR_L2_LEN); printf("SIG-EVENT(%03d)%04X - ", n, WORD(data, OFF_PAR_L2_CODE)); for (i=0; ii) printf(" ..."); break; case 6: code = WORD(data, OFF_PAR_L2_CODE); if (code && code <= 10) printf("%s IND",ll_name[code-1]); else printf("UNKNOWN LL IND"); break; case 7: code = WORD(data, OFF_PAR_L2_CODE); if (code && code <= 10) printf("%s REQ",ll_name[code-1]); else printf("UNKNOWN LL REQ"); break; case 8: n = WORD(data, OFF_PAR_L2_LEN); printf("DEBUG%04X - ",WORD(data, OFF_PAR_L2_CODE)); for (i=0; ii) printf(" ..."); break; case 9: printf("MDL-ERROR(%s)",&data[OFF_PAR_TEXT]); break; case 10: printf("UTASK->PC(%02X)",WORD(data, OFF_PAR_L2_CODE)); break; case 11: printf("PC->UTASK(%02X)",WORD(data, OFF_PAR_L2_CODE)); break; case 12: n = WORD(data, OFF_PAR_L1_LEN); printf("X-X(%03d) ",n); for (i=0; ii) printf(" ..."); break; case 13: n = WORD(data, OFF_PAR_L1_LEN); printf("X-R(%03d) ",n); for (i=0; ii) printf(" ..."); break; case 14: code = WORD(data, OFF_PAR_L2_CODE)-1; if ((code &0x0f)<=10) printf("%s IND",ns_name[code &0x0f]); else printf("UNKNOWN NS IND"); break; case 15: code = WORD(data, OFF_PAR_L2_CODE)-1; if ((code & 0x0f)<=10) printf("%s REQ",ns_name[code &0x0f]); else printf("UNKNOWN NS REQ"); break; case 16: printf("TASK %02i: %s", WORD(data, OFF_PAR_L2_CODE), &data[OFF_PAR_L2_I]); break; case 18: code = WORD(data, OFF_PAR_L2_CODE); printf("IO-REQ %02x",code); break; case 19: code = WORD(data, OFF_PAR_L2_CODE); printf("IO-CON %02x",code); break; default: printf("unknown event code = %d\n", code); break; } printf("\n"); } printf("\n"); }