326 lines
10 KiB
C
326 lines
10 KiB
C
/* $Id$
|
|
|
|
* Variable-debugging for isdn4linux.
|
|
*
|
|
* Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de)
|
|
* Copyright 1995 Thinking Objects Software GmbH Wuerzburg
|
|
*
|
|
* This file is part of Isdn4Linux.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
* $Log$
|
|
* Revision 1.5 1997/02/03 23:34:51 fritz
|
|
* Reformatted
|
|
*
|
|
* Revision 1.4 1996/04/30 07:55:50 fritz
|
|
* Disabled mmap.
|
|
*
|
|
* Revision 1.3 1996/04/28 15:19:23 fritz
|
|
* adapted to new ioctl names.
|
|
*
|
|
* Revision 1.2 1996/01/04 02:46:16 fritz
|
|
* Changed copying policy to GPL.
|
|
*
|
|
* Revision 1.1 1995/12/18 18:22:52 fritz
|
|
* Initial revision
|
|
*
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/fcntl.h>
|
|
/* #include <sys/mman.h> */
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <linux/isdn.h>
|
|
#include <linux/isdnif.h>
|
|
|
|
typedef unsigned char uchar;
|
|
int mem_fd;
|
|
|
|
#if 0 /* Weiss der Teufel, warum das nicht mit mmap geht */
|
|
uchar
|
|
* mapmem(ulong location, long size)
|
|
{
|
|
ulong mmseg;
|
|
ulong mmsize;
|
|
ulong addr;
|
|
ulong offset;
|
|
|
|
mmseg = location & 0xffffe000L;
|
|
mmsize = (location - mmseg + size) + 0x1000;
|
|
offset = location - mmseg;
|
|
addr = (ulong) mmap(0, mmsize, PROT_READ, MAP_SHARED, mem_fd, mmseg);
|
|
if ((int) addr == -1) {
|
|
perror("mmap");
|
|
exit(1);
|
|
}
|
|
printf("mmap: loc=%08lx siz=%08lx mseg=%08lx msiz=%08lx ofs=%08lx adr=%08lx\n", location, size, mmseg, mmsize, offset, addr);
|
|
return ((uchar *) (addr + offset));
|
|
}
|
|
#else
|
|
uchar
|
|
* mapmem(ulong location, long size)
|
|
{
|
|
uchar *buffer;
|
|
|
|
if ((buffer = malloc(size))) {
|
|
lseek(mem_fd, location, SEEK_SET);
|
|
read(mem_fd, buffer, size);
|
|
} else {
|
|
perror("malloc");
|
|
exit(1);
|
|
}
|
|
return buffer;
|
|
}
|
|
#endif
|
|
|
|
char *
|
|
dumpIntArray(int *arr, int count)
|
|
{
|
|
static char buf[1024];
|
|
char *p = buf;
|
|
int i;
|
|
|
|
for (i = 0; i < count; i++)
|
|
p += sprintf(p, "%d%s", arr[i], (i < (count - 1)) ? ", " : "\0");
|
|
return (buf);
|
|
}
|
|
|
|
char *
|
|
dumpCharArray(char *arr, int count)
|
|
{
|
|
static char buf[1024];
|
|
char *p = buf;
|
|
int i;
|
|
|
|
for (i = 0; i < count; i++)
|
|
p += sprintf(p, "%02x%s", (uchar) arr[i], (i < (count - 1)) ? ", " : "\0");
|
|
return (buf);
|
|
}
|
|
|
|
char *
|
|
dumpStringArray(char *arr, int count, int len)
|
|
{
|
|
static char buf[1024];
|
|
char *p = buf;
|
|
char *s = arr;
|
|
int i;
|
|
|
|
for (i = 0; i < count; s += len, i++)
|
|
p += sprintf(p, "\"%s\"%s", s, (i < (count - 1)) ? ", " : "\0");
|
|
return (buf);
|
|
}
|
|
|
|
void
|
|
dumpDriver(ulong drvaddr)
|
|
{
|
|
driver *drv = (driver *) mapmem(drvaddr, sizeof(driver));
|
|
isdn_if *ifc = (isdn_if *) mapmem((ulong) drv->interface, sizeof(isdn_if));
|
|
|
|
printf(" online = %08lx\n", drv->online);
|
|
printf(" channels = %d\n", drv->channels);
|
|
printf(" locks = %d\n", drv->locks);
|
|
printf(" reject_bus = %d\n", drv->flags & DRV_FLAG_REJBUS);
|
|
printf(" running = %d\n", drv->flags & DRV_FLAG_RUNNING);
|
|
printf(" loaded = %d\n", drv->flags & DRV_FLAG_LOADED);
|
|
printf(" maxbufsize = %d\n", drv->maxbufsize);
|
|
printf(" pktcount = %ld\n", drv->pktcount);
|
|
printf(" stavail = %d\n", drv->stavail);
|
|
printf(" Interface @%08lx:\n", (ulong) drv->interface);
|
|
printf(" Id(ch) = %d\n", ifc->channels);
|
|
printf(" maxbufsize = %d\n", ifc->maxbufsize);
|
|
printf(" features = %08lx\n", ifc->features);
|
|
}
|
|
|
|
void
|
|
dumpModem(modem mdm)
|
|
{
|
|
int i;
|
|
atemu *atm;
|
|
modem_info *info;
|
|
|
|
for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
|
|
printf("mdm [%02d]\n", i);
|
|
printf(" msr = %08x\n", mdm.msr[i]);
|
|
printf(" mlr = %08x\n", mdm.mlr[i]);
|
|
printf(" refcount = %d\n", mdm.refcount);
|
|
printf(" online = %d\n", mdm.online[i]);
|
|
printf(" dialing = %d\n", mdm.dialing[i]);
|
|
printf(" rcvsched = %d\n", mdm.rcvsched[i]);
|
|
printf(" ncarrier = %d\n", mdm.ncarrier[i]);
|
|
printf(" atmodem:\n");
|
|
atm = &mdm.atmodem[i];
|
|
printf(" profile = \n %s\n", dumpCharArray(atm->mdmreg, ISDN_MODEM_ANZREG));
|
|
printf(" mdmreg = \n %s\n", dumpCharArray(atm->mdmreg, ISDN_MODEM_ANZREG));
|
|
printf(" msn = \"%s\"\n", atm->msn);
|
|
printf(" mdmcmdl = %d\n", atm->mdmcmdl);
|
|
printf(" pluscount = %d\n", atm->pluscount);
|
|
printf(" lastplus = %08x\n", atm->lastplus);
|
|
printf(" mdmcmd = \"%s\"\n", atm->mdmcmd);
|
|
printf(" info:\n");
|
|
info = &mdm.info[i];
|
|
printf(" magic = %08x\n", info->magic);
|
|
printf(" flags = %08x\n", info->flags);
|
|
printf(" type = %d\n", info->type);
|
|
printf(" x_char = %02x\n", info->x_char);
|
|
printf(" close_delay = %d\n", info->close_delay);
|
|
printf(" MCR = %08x\n", info->MCR);
|
|
printf(" line = %d\n", info->line);
|
|
printf(" count = %d\n", info->count);
|
|
printf(" blocked_open = %d\n", info->blocked_open);
|
|
printf(" session = %08lx\n", info->session);
|
|
printf(" pgrp = %08lx\n", info->pgrp);
|
|
printf(" isdn_driver = %d\n", info->isdn_driver);
|
|
printf(" isdn_channel = %d\n", info->isdn_channel);
|
|
printf(" drv_index = %d\n", info->drv_index);
|
|
printf(" xmit_size = %d\n", info->xmit_size);
|
|
printf(" xmit_count = %d\n", info->xmit_count);
|
|
}
|
|
}
|
|
|
|
void
|
|
dumpNetPhone(ulong paddr)
|
|
{
|
|
ulong pa = paddr;
|
|
isdn_net_phone *phone;
|
|
|
|
while (pa) {
|
|
phone = (isdn_net_phone *) mapmem(pa, sizeof(isdn_net_phone));
|
|
printf(" @%08lx: \"%s\"\n", pa, phone->num);
|
|
pa = (ulong) (phone->next);
|
|
}
|
|
}
|
|
|
|
void
|
|
dumpNetDev(ulong devaddr)
|
|
{
|
|
ulong nda = devaddr;
|
|
isdn_net_dev *ndev;
|
|
|
|
while (nda) {
|
|
ndev = (isdn_net_dev *) mapmem(nda, sizeof(isdn_net_dev));
|
|
printf("Net-Device @%08lx:\n", nda);
|
|
printf("dev. :\n");
|
|
printf(" start = %d\n", ndev->dev.start);
|
|
printf(" tbusy = %ld\n", ndev->dev.tbusy);
|
|
printf(" interrupt = %d\n", ndev->dev.interrupt);
|
|
printf("local. :\n");
|
|
printf(" name = \"%s\"\n", ndev->local.name);
|
|
printf(" isdn_device = %d\n", ndev->local.isdn_device);
|
|
printf(" isdn_channel = %d\n", ndev->local.isdn_channel);
|
|
printf(" ppp_minor = %d\n", ndev->local.ppp_minor);
|
|
printf(" pre_device = %d\n", ndev->local.pre_device);
|
|
printf(" pre_channel = %d\n", ndev->local.pre_channel);
|
|
printf(" exclusive = %d\n", ndev->local.exclusive);
|
|
printf(" flags = %d\n", ndev->local.flags);
|
|
printf(" dialstate = %d\n", ndev->local.dialstate);
|
|
printf(" dialretry = %d\n", ndev->local.dialretry);
|
|
printf(" dialmax = %d\n", ndev->local.dialmax);
|
|
printf(" msn = \"%s\"\n", ndev->local.msn);
|
|
printf(" dtimer = %d\n", ndev->local.dtimer);
|
|
printf(" p_encap = %d\n", ndev->local.p_encap);
|
|
printf(" l2_proto = %d\n", ndev->local.l2_proto);
|
|
printf(" l3_proto = %d\n", ndev->local.l3_proto);
|
|
printf(" huptimer = %d\n", ndev->local.huptimer);
|
|
printf(" charge = %d\n", ndev->local.charge);
|
|
printf(" chargetime = %08x\n", ndev->local.chargetime);
|
|
printf(" hupflags = %d\n", ndev->local.hupflags);
|
|
printf(" outgoing = %d\n", ndev->local.outgoing);
|
|
printf(" onhtime = %d\n", ndev->local.onhtime);
|
|
printf(" chargeint = %d\n", ndev->local.chargeint);
|
|
printf(" onum = %d\n", ndev->local.onum);
|
|
printf(" sqfull = %08x\n", ndev->local.sqfull);
|
|
printf(" sqfull_stamp = %08lx\n", ndev->local.sqfull_stamp);
|
|
printf(" master = -> %08x\n", (unsigned int) ndev->local.master);
|
|
printf(" slave = -> %08x\n", (unsigned int) ndev->local.slave);
|
|
if (ndev->local.phone[0]) {
|
|
printf(" phone[in]:\n");
|
|
dumpNetPhone((ulong) ndev->local.phone[0]);
|
|
} else
|
|
printf(" phone[in] = NULL\n");
|
|
if (ndev->local.phone[1]) {
|
|
printf(" phone[out]:\n");
|
|
dumpNetPhone((ulong) ndev->local.phone[1]);
|
|
} else
|
|
printf(" phone[out] = NULL\n");
|
|
printf(" dial = @%08lx\n", (ulong) ndev->local.dial);
|
|
nda = (ulong) (ndev->next);
|
|
}
|
|
}
|
|
|
|
void
|
|
main(int argc, char *argv[], char *envp[])
|
|
{
|
|
int f;
|
|
int i;
|
|
static isdn_dev *my_isdndev;
|
|
ulong kaddr;
|
|
|
|
printf("\nDebugger for isdn and icn Modules\n");
|
|
f = open("/dev/isdnctrl", O_RDONLY);
|
|
if (ioctl(f, IIOCDBGVAR, &kaddr)) {
|
|
perror("ioctl IIOCDBGVAR");
|
|
exit(-1);
|
|
}
|
|
close(f);
|
|
if ((mem_fd = open("/dev/kmem", O_RDWR)) < 0) {
|
|
perror("open /dev/kmem");
|
|
exit(1);
|
|
}
|
|
printf("isdn-main-struct at %08lx (%d):\n", kaddr, sizeof(isdn_dev));
|
|
my_isdndev = (isdn_dev *) mapmem(kaddr, sizeof(isdn_dev));
|
|
printf("isdndev.flags = %d\n", my_isdndev->flags);
|
|
printf("isdndev.drivers = %d\n", my_isdndev->drivers);
|
|
printf("isdndev.channels = %d\n", my_isdndev->channels);
|
|
printf("isdndev.net_verbose = %d\n", my_isdndev->net_verbose);
|
|
printf("isdndev.modempoll = %d\n", my_isdndev->modempoll);
|
|
printf("isdndev.tflags = %d\n", my_isdndev->tflags);
|
|
printf("isdndev.global_flags = %d\n", my_isdndev->global_flags);
|
|
if (my_isdndev->infochain) {
|
|
printf("isdndev.infochain = @%08lx:\n", (ulong) my_isdndev->infochain);
|
|
} else
|
|
printf("isdndev.infochain = NULL\n");
|
|
if (my_isdndev->info_waitq) {
|
|
printf("isdndev.info_waitq = @%08lx:\n", (ulong) my_isdndev->info_waitq);
|
|
} else
|
|
printf("isdndev.info_waitq = NULL\n");
|
|
printf("isdndev.chanmap = %s\n",
|
|
dumpIntArray(my_isdndev->chanmap, ISDN_MAX_CHANNELS));
|
|
printf("isdndev.drvmap = %s\n",
|
|
dumpIntArray(my_isdndev->drvmap, ISDN_MAX_CHANNELS));
|
|
printf("isdndev.usage = %s\n",
|
|
dumpIntArray(my_isdndev->usage, ISDN_MAX_CHANNELS));
|
|
printf("isdndev.num = %s\n",
|
|
dumpStringArray(my_isdndev->num[0], ISDN_MAX_CHANNELS, 20));
|
|
printf("isdndev.m_idx = %s\n",
|
|
dumpIntArray(my_isdndev->m_idx, ISDN_MAX_CHANNELS));
|
|
dumpModem(my_isdndev->mdm);
|
|
for (i = 0; i < ISDN_MAX_DRIVERS; i++)
|
|
if (my_isdndev->drv[i]) {
|
|
printf("isdndev.drv[%02d] = @%08lx:\n", i, (ulong) my_isdndev->drv[i]);
|
|
dumpDriver((ulong) (my_isdndev->drv[i]));
|
|
}
|
|
if (my_isdndev->netdev) {
|
|
printf("isdndev.netdev = @%08lx:\n", (ulong) my_isdndev->netdev);
|
|
dumpNetDev((ulong) my_isdndev->netdev);
|
|
} else
|
|
printf("isdndev.netdev = NULL\n");
|
|
close(mem_fd);
|
|
}
|