--- 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