Index: zaptel.h =================================================================== RCS file: /usr/cvsroot/zaptel/zaptel.h,v retrieving revision 1.51 diff -u -r1.51 zaptel.h --- zaptel.h 27 Oct 2005 16:05:07 -0000 1.51 +++ zaptel.h 8 Nov 2005 10:33:30 -0000 @@ -1344,7 +1344,7 @@ void (*destroy)(void *tpipe); /* Transmit a given message */ - int (*transmit)(void *tpipe, unsigned char *msg, int msglen); + struct sk_buff * (*transmit)(void *tpipe, unsigned char *msg, int msglen); struct zt_dynamic_driver *next; }; Index: ztd-eth.c =================================================================== RCS file: /usr/cvsroot/zaptel/ztd-eth.c,v retrieving revision 1.10 diff -u -r1.10 ztd-eth.c --- ztd-eth.c 31 Aug 2005 21:41:37 -0000 1.10 +++ ztd-eth.c 8 Nov 2005 10:33:30 -0000 @@ -135,7 +135,7 @@ return 0; } -static int ztdeth_transmit(void *pvt, unsigned char *msg, int msglen) +static struct sk_buff *ztdeth_transmit(void *pvt, unsigned char *msg, int msglen) { struct ztdeth *z; struct sk_buff *skb; @@ -171,12 +171,12 @@ skb->dev = dev; if (dev->hard_header) dev->hard_header(skb, dev, ETH_P_ZTDETH, addr, dev->dev_addr, skb->len); - dev_queue_xmit(skb); + return skb; } } else spin_unlock_irqrestore(&zlock, flags); - return 0; + return NULL; } static struct packet_type ztdeth_ptype = { Index: ztd-loc.c =================================================================== RCS file: /usr/cvsroot/zaptel/ztd-loc.c,v retrieving revision 1.2 diff -u -r1.2 ztd-loc.c --- ztd-loc.c 31 Aug 2005 21:41:37 -0000 1.2 +++ ztd-loc.c 8 Nov 2005 10:33:30 -0000 @@ -81,7 +81,7 @@ struct ztdlocal *next; } *zdevs = NULL; -/*static*/ int ztdlocal_transmit(void *pvt, unsigned char *msg, int msglen) +/*static*/ struct sk_buff * ztdlocal_transmit(void *pvt, unsigned char *msg, int msglen) { struct ztdlocal *z; unsigned long flags; @@ -95,7 +95,7 @@ zt_dynamic_receive(z->monitor_rx_peer->span, msg, msglen); } spin_unlock_irqrestore(&zlock, flags); - return 0; + return NULL; } static int digit2int(char d) Index: ztdynamic.c =================================================================== RCS file: /usr/cvsroot/zaptel/ztdynamic.c,v retrieving revision 1.14 diff -u -r1.14 ztdynamic.c --- ztdynamic.c 5 Oct 2005 00:02:54 -0000 1.14 +++ ztdynamic.c 8 Nov 2005 10:33:30 -0000 @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include #ifdef CONFIG_DEVFS_FS @@ -166,7 +168,7 @@ printk("TDMoX: No master.\n"); } -static void ztd_sendmessage(struct zt_dynamic *z) +static struct sk_buff *ztd_sendmessage(struct zt_dynamic *z) { unsigned char *buf = z->msgbuf; unsigned short bits; @@ -222,7 +224,7 @@ msglen += ZT_CHUNKSIZE; } - z->driver->transmit(z->pvt, z->msgbuf, msglen); + return z->driver->transmit(z->pvt, z->msgbuf, msglen); } @@ -230,7 +232,10 @@ { unsigned long flags; struct zt_dynamic *z; + struct sk_buff_head skbs; + struct sk_buff *skb; int y; + skb_queue_head_init(&skbs); spin_lock_irqsave(&dlock, flags); z = dspans; while(z) { @@ -242,12 +247,19 @@ } zt_receive(&z->span); zt_transmit(&z->span); - /* Handle all transmissions now */ - ztd_sendmessage(z); + /* Prepare all transmissions packets */ + skb = ztd_sendmessage(z); + if(skb) skb_queue_tail(&skbs, skb); } z = z->next; } spin_unlock_irqrestore(&dlock, flags); + /* Handle all transmissions now */ + for(;;) { + skb = skb_dequeue(&skbs); + if(skb == NULL) break; + dev_queue_xmit(skb); + } } #ifdef ENABLE_TASKLETS @@ -773,8 +785,8 @@ z = dspans; while(z) { newalarm = z->span.alarms & ~ZT_ALARM_RED; - /* If nothing received for a minute, consider that RED ALARM */ - if ((jiffies - z->rxjif) > 1000 / HZ) { + /* If nothing received for a second, consider that RED ALARM */ + if ((jiffies - z->rxjif) > 1 * HZ) { newalarm |= ZT_ALARM_RED; if (z->span.alarms != newalarm) { z->span.alarms = newalarm;