On Mon, May 09, 2005 at 10:29:08PM -0500, Karl Kobel wrote:
> I'm stuck. I'm nearly done with a single threaded version of slip. I
> will add it to contrib when I complete it.
If you might be interested, I've attached my changes to slipif that modify
slipif_input() and create a replacement for slipif_loop(), slipif_loop_iter(),
to run a single iteration instead of creating a thread and looping forever.
To allow the caller to sleep for a bit if there appears to be no traffic,
slipif_loop_iter() returns 1 if it read data, else 0.
The code is unfortunately fairly ugly, but perhaps it'll be of some use?
Thanks for lwip!
--
Chris Frost | <http://www.frostnet.net/chris/>
-------------+----------------------------------
Public PGP Key:
Email [EMAIL PROTECTED] with the subject "retrieve pgp key"
or visit <http://www.frostnet.net/chris/about/pgp_key.phtml>
--- lwip-1.1.0/src/netif/slipif.c Mon Feb 23 02:15:06 2004
+++ school/rks/trunk/kudos/lib/net/netif/slipif.c Sat Apr 30 14:10:44 2005
@@ -51,6 +51,8 @@
#define MAX_SIZE 1500
+#define SLIP_FROST_DEBUG 0
+
/**
* Send a pbuf doing the necessary SLIP encapsulation
*
@@ -98,72 +100,120 @@
static struct pbuf *
slipif_input( struct netif * netif )
{
- u8_t c;
- struct pbuf *p, *q;
- int recved;
- int i;
-
- q = p = NULL;
- recved = i = 0;
- c = 0;
-
- while (1) {
- c = sio_recv(netif->state);
- switch (c) {
- case SLIP_END:
- if (recved > 0) {
- /* Received whole packet. */
- pbuf_realloc(q, recved);
-
- LINK_STATS_INC(link.recv);
-
- LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet\n"));
- return q;
- }
- break;
-
- case SLIP_ESC:
- c = sio_recv(netif->state);
- switch (c) {
- case SLIP_ESC_END:
- c = SLIP_END;
- break;
- case SLIP_ESC_ESC:
- c = SLIP_ESC;
- break;
- }
- /* FALLTHROUGH */
-
- default:
- if (p == NULL) {
- LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n"));
- p = pbuf_alloc(PBUF_LINK, PBUF_POOL_BUFSIZE, PBUF_POOL);
-
- if (p == NULL) {
- LINK_STATS_INC(link.drop);
- LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n"));
- }
-
- if (q != NULL) {
- pbuf_cat(q, p);
- } else {
- q = p;
- }
- }
- if (p != NULL && recved < MAX_SIZE) {
- ((u8_t *)p->payload)[i] = c;
- recved++;
- i++;
- if (i >= p->len) {
- i = 0;
- p = NULL;
- }
- }
- break;
- }
-
- }
- return NULL;
+ static struct netif *si_netif = 0;
+ static u8_t si_c;
+ static struct pbuf *si_p, *si_q;
+ static int si_recved;
+ static int si_i;
+
+ u8_t c;
+ struct pbuf *p, *q;
+ int recved;
+ int i;
+
+ if(si_netif == 0) {
+ q = p = NULL;
+ recved = i = 0;
+ c = 0;
+ } else {
+ if(netif != si_netif)
+ panic("multiple netifs not supported");
+ if(SLIP_FROST_DEBUG)
+ printf("_");
+ q = si_q;
+ p = si_p;
+ recved = si_recved;
+ i = si_i;
+ c = si_c;
+ }
+
+ while (1) {
+ c = sio_recv(netif->state);
+
+ if(((sio_fd_t)netif->state)->sioread == 0) {
+ if(p != 0 || q != 0 || recved != 0 || i != 0) {
+ // Save current state
+ si_netif = netif;
+ si_p = p;
+ si_q = q;
+ si_recved = recved;
+ si_i = i;
+ si_c = c;
+ }
+ return NULL;
+ }
+
+
+
+ switch (c) {
+ case SLIP_END:
+ if (recved > 0) {
+ /* Received whole packet. */
+ pbuf_realloc(q, recved);
+
+ LINK_STATS_INC(link.recv);
+
+ LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got
packet\n"));
+
+ si_netif = 0; // show done with si_*
+
+ return q;
+ }
+ break;
+
+ case SLIP_ESC:
+ c = sio_recv(netif->state);
+ if(((sio_fd_t)netif->state)->sioread == 0) {
+ // Save current state
+ si_netif = netif;
+ si_p = p;
+ si_q = q;
+ si_recved = recved;
+ si_i = i;
+ si_c = c;
+ return NULL;
+ }
+
+ switch (c) {
+ case SLIP_ESC_END:
+ c = SLIP_END;
+ break;
+ case SLIP_ESC_ESC:
+ c = SLIP_ESC;
+ break;
+ }
+ /* FALLTHROUGH */
+
+ default:
+ if (p == NULL) {
+ LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input:
alloc\n"));
+ p = pbuf_alloc(PBUF_LINK,
PBUF_POOL_BUFSIZE, PBUF_POOL);
+
+ if (p == NULL) {
+ LINK_STATS_INC(link.drop);
+ LWIP_DEBUGF(SLIP_DEBUG,
("slipif_input: no new pbuf! (DROP)\n"));
+ }
+
+ if (q != NULL) {
+ pbuf_cat(q, p);
+ } else {
+ q = p;
+ }
+ }
+ if (p != NULL && recved < MAX_SIZE) {
+ ((u8_t *)p->payload)[i] = c;
+ recved++;
+ i++;
+ if (i >= p->len) {
+ i = 0;
+ p = NULL;
+ }
+ }
+ break;
+ }
+
+ }
+ return NULL;
}
/**
@@ -171,6 +221,8 @@
*
* Feed the IP layer with incoming packets
*/
+
+/*
static void
slipif_loop(void *nf)
{
@@ -182,6 +234,23 @@
netif->input(p, netif);
}
}
+*/
+
+// Returns 1 when data was found, else 0.
+int
+slipif_loop_iter(struct netif *nif)
+{
+ struct pbuf *p;
+ p = slipif_input(nif);
+ if(p != NULL) {
+ if(SLIP_FROST_DEBUG)
+ printf("*");
+ nif->input(p, nif);
+ }
+
+ return (p ? 1 : 0);
+}
+
/**
* SLIP netif initialization
@@ -205,7 +274,8 @@
if (!netif->state)
return ERR_IF;
- sys_thread_new(slipif_loop, netif, SLIPIF_THREAD_PRIO);
+ // Frost
+ //sys_thread_new(slipif_loop, netif, SLIPIF_THREAD_PRIO);
return ERR_OK;
}
--- lwip-1.1.0/src/include/netif/slipif.h Thu Feb 20 03:51:54 2003
+++ school/rks/trunk/kudos/inc/net/netif/slipif.h Sat Apr 30 14:11:25 2005
@@ -38,5 +38,7 @@
err_t slipif_init(struct netif * netif);
+int slipif_loop_iter(struct netif *nif);
+
#endif
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users