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