Linux panic() emulating C64: 2.0.14 + ISDN Patch

Herbert Rosmanith (herp@wildsau.idv.uni-linz.ac.at)
Wed, 21 Aug 1996 17:35:48 +0200 (MET DST)


hello,

I just tried 2.0.14, applied Jan den Oudens isdn/teles patch (modified it
a bit as shown below), but still the crashed don't disappear.
The panic-routine is not very informative in this point: in fact
the screen looks like one of the old commodore-64 screens after
a crash: a fat arrow, a Garcon symbol, a little arrow pointing to the left,
an ascii-rubbout symbol, mathematical (predicate logic) equivalances ... all
splattered accross the screen.

the crash definitely comes from a message sent by an Ascotel PBX, but
it doesnt seem to be a non (EDSS1/1TR6) packet. the last thing before
the lights go out is the following frame:

root@ferkel # debugging flags set to ff
Q.931 frame network->user with tei 65 (not for us)
hex: 08 01 82 62 9f 54 03 91 e4 80 9f 54 03 91 e5 80 9f 54 03 91 eb 80 9f 54 03
91 02 00 9f 54 03 91 03 00 9f 54 03 81 24 00 9f 54 04 81 fe 88 00 9f 54 03 91 01
08 9f 54 03 81 30 00 9f 54 03 81 30 80 9f 54 03 81 5f 01 9f 54 03 81 30 40 9f 5
4 03 91 e3 ff 9f 1b 08 81 30 2c 30 30 41 54 53 9f 1b 08 91 30 2c 30 30 41 54 53
9f 54 04 81 fe 81 80
call reference 130 size 112 message type FACILITY
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 4
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 4
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 54 attribute size 3
Shift f
attribute 1b attribute size 8
Shift f
attribute 1b attribute size 8
Shift f
attribute 54 attribute size 4

the following is Jan den Ouden's patch to the teles-driver, I changed
the two little things:

a) PROTO_EDSS1 was undefined, I added #define PROTO_EDSS1 0x08 to l3_1tr6.h
er, well, I would rather belong to l3_edss1.h, but there is no such
file.

b) I am also interested in seeing frames that are neither 1tr6 nor edss1,
thus I moved the lines:
> +++ q931.c Mon Aug 19 19:59:38 1996
> @@ -981,6 +981,9 @@
> char *dp;
> int i, cs = 0, cs_old = 0, cs_fest = 0;
>
> + if ((buf[0] != PROTO_EDSS1) && ((buf[0] & 0xfe) != PROTO_DIS_N0))
> + return;
> +
> /* display header */
> dp = sp->dlogspace;

below the statements that just dump the frame in hexadecimal
format, and did

> dp += sprintf(dp, "unknown L3 proto\n");
> teles_putstatus(sp->dlogspace);

I think not that I screwed this one, since the message ("unknown...")
is printed correctly for every unknown frame.

The bug seems to be somewhere else. I'll check if the bug is in
the dlogframe() routine at all, by just doing a return instead of
having a structured printout.

/herp

--- isdnl3.c.old Mon Aug 19 19:45:31 1996
+++ isdnl3.c Mon Aug 19 19:58:57 1996
@@ -502,7 +502,7 @@
datastatelist_1tr6t[i].rout(st, pr, ibh);
break;
#endif
- default: /* E-DSS1 */
+ case PROTO_EDSS1: /* E-DSS1 */
for (i = 0; i < datasllen; i++)
if ((st->l3.state == datastatelist[i].state) &&
(mt == datastatelist[i].primitive))
@@ -514,6 +514,10 @@
st->l3.state, mt);
} else
datastatelist[i].rout(st, pr, ibh);
+ break;
+ default:
+ BufPoolRelease(ibh);
+ break;
}
} else if (pr == DL_UNIT_DATA) {
ptr = DATAPTR(ibh);
@@ -540,7 +544,7 @@
datastatelist_1tr6t[i].rout(st, pr, ibh);
break;
#endif
- default: /* E-DSS1 */
+ case PROTO_EDSS1: /* E-DSS1 */
for (i = 0; i < datasllen; i++)
if ((st->l3.state == datastatelist[i].state) &&
(mt == datastatelist[i].primitive))
@@ -552,6 +556,10 @@
st->l3.state, mt);
} else
datastatelist[i].rout(st, pr, ibh);
+ break;
+ default:
+ BufPoolRelease(ibh);
+ break;
}
}
}
--- teles.h.old Mon Aug 19 19:48:34 1996
+++ teles.h Mon Aug 19 19:56:37 1996
@@ -28,6 +28,8 @@
#include <linux/isdnif.h>
#include <linux/tty.h>

+#define PROTO_EDSS1 0x8
+
#define PH_ACTIVATE 1
#define PH_DATA 2
#define PH_DEACTIVATE 3
--- q931.c.old Mon Aug 19 19:52:39 1996
+++ q931.c Mon Aug 19 19:59:38 1996
@@ -981,6 +981,9 @@
char *dp;
int i, cs = 0, cs_old = 0, cs_fest = 0;

+ if ((buf[0] != PROTO_EDSS1) && ((buf[0] & 0xfe) != PROTO_DIS_N0))
+ return;
+
/* display header */
dp = sp->dlogspace;
dp += sprintf(dp, "%s\n", comment);