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?
Author: 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?"
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