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

Reply via email to