Free (GPLv2) TCP/IP stack developed by TASS Belgium

Fork of PicoTCP by Daniele Lacamera

Revision:
51:18637a3d071f
Parent:
3:b4047e8a0123
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/pico_dev_loop.c	Sat Aug 03 08:50:27 2013 +0000
@@ -0,0 +1,68 @@
+/*********************************************************************
+PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
+See LICENSE and COPYING for usage.
+
+Authors: Daniele Lacamera
+*********************************************************************/
+
+
+#include "pico_device.h"
+#include "pico_dev_loop.h"
+#include "pico_stack.h"
+
+
+#define LOOP_MTU 1500
+static uint8_t l_buf[LOOP_MTU];
+static int l_bufsize = 0;
+
+
+static int pico_loop_send(struct pico_device *dev, void *buf, int len)
+{
+  if (len > LOOP_MTU)
+    return 0;
+
+  if (l_bufsize == 0) {
+    memcpy(l_buf, buf, len);
+    l_bufsize+=len;
+    return len;
+  }
+  return 0;
+}
+
+static int pico_loop_poll(struct pico_device *dev, int loop_score)
+{
+  if (loop_score <= 0)
+    return 0;
+
+  if (l_bufsize > 0) {
+    pico_stack_recv(dev, l_buf, l_bufsize);
+    l_bufsize = 0;
+    loop_score--;
+  }
+  return loop_score;
+}
+
+/* Public interface: create/destroy. */
+
+void pico_loop_destroy(struct pico_device *dev)
+{
+}
+
+struct pico_device *pico_loop_create(void)
+{
+  struct pico_device *loop = pico_zalloc(sizeof(struct pico_device));
+  if (!loop)
+    return NULL;
+
+  if( 0 != pico_device_init((struct pico_device *)loop, "loop", NULL)) {
+    dbg ("Loop init failed.\n");
+    pico_loop_destroy((struct pico_device *)loop);
+    return NULL;
+  }
+  loop->send = pico_loop_send;
+  loop->poll = pico_loop_poll;
+  loop->destroy = pico_loop_destroy;
+  dbg("Device %s created.\n", loop->name);
+  return (struct pico_device *)loop;
+}
+