🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.os.linux
Article #3

isdn4linux - /dev/isdninfo BUG?

#3
From: Kristian Köhntopp
Date: Mon, 13 Nov 1995 16:52
120 lines
5250 bytes
[ Followup-To ist gesetzt ]

Ich habe einige Probleme mit dem Gebrauch von /dev/isdninfo
unter isdn4linux, VERSION=0.6.6beta.

isdn4linux erzeugt ein isdninfo-Device, aus dem ich den Status
der Karte ablesen kann. Ich habe mir jetzt einen RPC-Service
isdn_svc geschrieben, der dieses Device auslesen kann und von
meinem anderen Rechner (Nextstation) abfragbar macht. Solange
ich nur TCP/IP-Devices verwende, funktioniert alles recht gut,
aber sobald ich einen Modem-Call mache, passieren seltsame
Dinge. Und zwar sieht das /dev/isdninfo nach einem abgehenden
Modemcall (nacheinander, nicht ueberlappend) auf cui1 und einem
anderen abgehenden Modemcall auf cui2 so aus (Rufnummern
gekuerzt to protect the innocent):

root@white:~/isdn# head -5 /dev/isdninfo
chmap:  0 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
drmap:  0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
usage:  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
flags:  0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
phone:  ??? 6642xxx 8059xxx ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? 

Beide Calls haben Channel 0 benutzt, haetten also mit der
Phone# in der ersten Spalte auftauchen sollen. Das ist bei
TCP/IP auch der Fall. Bei Modemcalls ist das nicht so:

root@white:~/isdn# vi isdn/isdn.c
:set number
  1122  static void
  1123  free_channel(int di, int ch, int usage) {
  1124    int i;
  1125    ulong flags;
  1126  
  1127    save_flags(flags);
  1128    cli();
  1129    for (i=0;i<ISDN_MAX_CHANNELS;i++)
  1130      if (((dev->usage[i] & ISDN_USAGE_MASK)== usage) && 
  1131          (dev->drvmap[i]==di)     &&
  1132          (dev->chanmap[i]==ch)       ) {
  1133        dev->usage[i] = ISDN_USAGE_NONE;
  1134        strcpy(dev->num[i],"???");
  1135        restore_flags(flags);
  1136        return ;
  1137      }
  1138    restore_flags(flags);
  1139  }

Dies sollte eigentlich den Eintrag fuer die Modembenutzung
loeschen, tut aber nicht. Da das usage-Feld aber korrekt
geloescht wird, nehme ich an, dass der free_channel-Aufruf
korrekt ist, der Eintrag der Telefonnummer beim Aufbau des Call
aber nicht. Das waere dann

  1149  static void
  1150  modem_dial(char *n, modem_info *info, atemu *m) {
[ ... ]
  1157    i = get_free_channel(ISDN_USAGE_MODEM,m->mdmreg[14],m->mdmreg[15],-1,-
[ ... ]
  1162      if (strlen(m->msn)) {
  1163        info->isdn_driver  = dev->drvmap[i];
  1164        info->isdn_channel = dev->chanmap[i];
  1165        info->drv_index    = i;
  1166        dev->m_idx[i]      = info->line;
  1167        dev->usage[i]      |= ISDN_USAGE_OUTGOING;
[ ... ]
  1185        cmd.driver  = info->isdn_driver;
  1186        cmd.arg     = info->isdn_channel;
  1187        sprintf(cmd.num,"%s,%s",n,m->msn);
  1188        cmd.command = ISDN_CMD_DIAL;
  1189        dev->mdm.dialing[info->line] = 1;
  1190        strcpy(dev->num[info->line],n);
  1191        dev->drv[info->isdn_driver]->interface->command(&cmd);

Hier wird einmal der Index dev->...[i] verwendet, um die usage
zu setzen (Zeile 1167) und mit der drvmap und der chanmap zu
arbeiten, andererseits aber dev->...[info->line], um die num zu
setzen (Zeile 1189-1190). Andererseits waehlt das Ding aber
auch.

Was ist verkehrt? Zeilen 1189-1190 oder meine Idee vom
Decodieren von /dev/isdninfo? Letzteres mache ich so:

root@white:/Net/black/Users/kris/Source/isdninfo# vi isdn_svc_proc.c
[ set number ]
   210  channelinfo_res *channelinfo_2_svc(int *arg, struct svc_req *request)
   211  {
   212      static channelinfo_res result;
   213             int             channelmask;
   214             int             i;
   215  
   216      update_isdn_info();
   217  
   218      /* Sanity check */
   219      if ((*arg<0) || (*arg>ISDN_MAX_CHANNELS))
   220          return NULL;
   221      
   222      /* To find the driver */
   223      channelmask = 1<<(*arg);
   224      
   225      /* Fill in result */
   226      result.outgoing = (info[*arg].usage &128)>>7;
   227      result.usage    = info[*arg].usage & 7;
   228      result.phone    = info[*arg].phone;
   229      
   230      result.driver = -1;
   231      for (i=0; i<ISDN_MAX_CHANNELS; i++)
   232          if ((info[i].flags >0 ) && (info[i].flags & channelmask))
   233              result.driver = i;
   234  
[ debug code ]
   243      return &result;
   244  }

Kristian

-- 
Kristian Koehntopp, Wassilystrasse 30, 24113 Kiel, +49 431 688897
"Was wechselt schneller: Die Signature oder die ISDN-Version von
 Matthias Urlichs?"
Technical Details
Message-ID: <DHzqvy.22M@white.schulung.netuse.de>
Path: arc1-ca.pugleaf.net!white.schulung.netuse.de!kris

Show Full Headers
Complete Article Headers
Newsgroups: de.comp.os.linux,de.comm.isdn
Path: arc1-ca.pugleaf.net!white.schulung.netuse.de!kris
From: kris@white.schulung.netuse.de (Kristian Köhntopp)
Subject: isdn4linux - /dev/isdninfo BUG?
X_copyright: (C) Copyright 1995 Kristian Koehntopp -- All rights reserved.
   Reproduktion, auch auszugsweise, ausserhalb elektronischer,
   nichtkommerzieller Datennetze nur mit ausdruecklichem,
   schriftlichem Einverstaendnis des Autors.
Followup-To: de.comm.isdn
Organization: entfällt
Message-ID: <DHzqvy.22M@white.schulung.netuse.de>
X_excuse: X-Copyright wegen Emma, Suedwestpresse und /C'T/DISKUSSIONEN.
Date: Mon, 13 Nov 1995 16:52:44 GMT