Article View: de.comp.os.linux
Article #3isdn4linux - /dev/isdninfo BUG?
From: Kristian Köhntopp
Date: Mon, 13 Nov 1995 16:52
Date: Mon, 13 Nov 1995 16:52
120 lines
5250 bytes
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!krisShow 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