🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.os.linux
1 messages
1 total messages Started by Kristian Köhntopp Mon, 13 Nov 1995 16:52
isdn4linux - /dev/isdninfo BUG?
#3
Author: 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?"
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads