patch-2.3.14 linux/drivers/isdn/hisax/tei.c
Next file: linux/drivers/isdn/hisax/teleint.c
Previous file: linux/drivers/isdn/hisax/sportster.c
Back to the patch index
Back to the overall index
- Lines: 99
- Date:
Thu Aug 12 09:42:33 1999
- Orig file:
v2.3.13/linux/drivers/isdn/hisax/tei.c
- Orig date:
Sun May 23 10:03:41 1999
diff -u --recursive --new-file v2.3.13/linux/drivers/isdn/hisax/tei.c linux/drivers/isdn/hisax/tei.c
@@ -1,4 +1,4 @@
-/* $Id: tei.c,v 2.11 1998/11/15 23:55:24 keil Exp $
+/* $Id: tei.c,v 2.13 1999/07/21 14:46:28 keil Exp $
* Author Karsten Keil (keil@isdn4linux.de)
* based on the teles driver from Jan den Ouden
@@ -11,6 +11,12 @@
* Fritz Elfert
*
* $Log: tei.c,v $
+ * Revision 2.13 1999/07/21 14:46:28 keil
+ * changes from EICON certification
+ *
+ * Revision 2.12 1999/07/01 08:12:11 keil
+ * Common HiSax version for 2.0, 2.1, 2.2 and 2.3 kernel
+ *
* Revision 2.11 1998/11/15 23:55:24 keil
* changes from 2.0
*
@@ -72,7 +78,7 @@
#include "isdnl2.h"
#include <linux/random.h>
-const char *tei_revision = "$Revision: 2.11 $";
+const char *tei_revision = "$Revision: 2.13 $";
#define ID_REQUEST 1
#define ID_ASSIGNED 2
@@ -163,6 +169,7 @@
printk(KERN_WARNING "HiSax: No skb for TEI manager\n");
return;
}
+ SET_SKB_FREE(skb);
bp = skb_put(skb, 3);
bp[0] = (TEI_SAPI << 2);
bp[1] = (GROUP_TEI << 1) | 0x1;
@@ -226,6 +233,25 @@
}
static void
+tei_id_test_dup(struct FsmInst *fi, int event, void *arg)
+{
+ struct PStack *ost, *st = fi->userdata;
+ struct sk_buff *skb = arg;
+ int tei, ri;
+
+ ri = ((unsigned int) skb->data[1] << 8) + skb->data[2];
+ tei = skb->data[4] >> 1;
+ if (st->ma.debug)
+ st->ma.tei_m.printdebug(&st->ma.tei_m,
+ "foreign identity assign ri %d tei %d", ri, tei);
+ if ((ost = findtei(st, tei))) { /* same tei is in use */
+ st->ma.tei_m.printdebug(&st->ma.tei_m,
+ "possible duplicate assignment tei %d", tei);
+ FsmEvent(&ost->ma.tei_m, EV_VERIFY, NULL);
+ }
+}
+
+static void
tei_id_denied(struct FsmInst *fi, int event, void *arg)
{
struct PStack *st = fi->userdata;
@@ -345,7 +371,7 @@
int mt;
if (test_bit(FLG_FIXED_TEI, &st->l2.flag)) {
- dev_kfree_skb(skb);
+ idev_kfree_skb(skb, FREE_READ);
return;
}
@@ -353,8 +379,8 @@
if (skb->len < 3) {
st->ma.tei_m.printdebug(&st->ma.tei_m,
"short mgr frame %ld/3", skb->len);
- } else if (((skb->data[0] >> 2) != TEI_SAPI) ||
- ((skb->data[1] >> 1) != GROUP_TEI)) {
+ } else if ((skb->data[0] != ((TEI_SAPI << 2) | 2)) ||
+ (skb->data[1] != ((GROUP_TEI << 1) | 1))) {
st->ma.tei_m.printdebug(&st->ma.tei_m,
"wrong mgr sapi/tei %x/%x",
skb->data[0], skb->data[1]);
@@ -391,7 +417,7 @@
st->ma.tei_m.printdebug(&st->ma.tei_m,
"tei handler wrong pr %x\n", pr);
}
- dev_kfree_skb(skb);
+ idev_kfree_skb(skb, FREE_READ);
}
static void
@@ -468,6 +494,7 @@
static struct FsmNode TeiFnList[] HISAX_INITDATA =
{
{ST_TEI_NOP, EV_IDREQ, tei_id_request},
+ {ST_TEI_NOP, EV_ASSIGN, tei_id_test_dup},
{ST_TEI_NOP, EV_VERIFY, tei_id_verify},
{ST_TEI_NOP, EV_REMOVE, tei_id_remove},
{ST_TEI_NOP, EV_CHKREQ, tei_id_chk_req},
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)