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

Fork of PicoTCP by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 08:50:27 2013 +0000
Revision:
51:18637a3d071f
Parent:
3:b4047e8a0123
Branch for CDC-ECM: Work in progress

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 3:b4047e8a0123 1 /*********************************************************************
daniele 3:b4047e8a0123 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 3:b4047e8a0123 3 See LICENSE and COPYING for usage.
daniele 3:b4047e8a0123 4
daniele 3:b4047e8a0123 5 Authors: Daniele Lacamera
daniele 3:b4047e8a0123 6 *********************************************************************/
daniele 3:b4047e8a0123 7
daniele 3:b4047e8a0123 8
daniele 3:b4047e8a0123 9 #include "pico_device.h"
daniele 3:b4047e8a0123 10 #include "pico_dev_loop.h"
daniele 3:b4047e8a0123 11 #include "pico_stack.h"
daniele 3:b4047e8a0123 12
daniele 3:b4047e8a0123 13
daniele 3:b4047e8a0123 14 #define LOOP_MTU 1500
daniele 3:b4047e8a0123 15 static uint8_t l_buf[LOOP_MTU];
daniele 3:b4047e8a0123 16 static int l_bufsize = 0;
daniele 3:b4047e8a0123 17
daniele 3:b4047e8a0123 18
daniele 3:b4047e8a0123 19 static int pico_loop_send(struct pico_device *dev, void *buf, int len)
daniele 3:b4047e8a0123 20 {
daniele 3:b4047e8a0123 21 if (len > LOOP_MTU)
daniele 3:b4047e8a0123 22 return 0;
daniele 3:b4047e8a0123 23
daniele 3:b4047e8a0123 24 if (l_bufsize == 0) {
daniele 3:b4047e8a0123 25 memcpy(l_buf, buf, len);
daniele 3:b4047e8a0123 26 l_bufsize+=len;
daniele 3:b4047e8a0123 27 return len;
daniele 3:b4047e8a0123 28 }
daniele 3:b4047e8a0123 29 return 0;
daniele 3:b4047e8a0123 30 }
daniele 3:b4047e8a0123 31
daniele 3:b4047e8a0123 32 static int pico_loop_poll(struct pico_device *dev, int loop_score)
daniele 3:b4047e8a0123 33 {
daniele 3:b4047e8a0123 34 if (loop_score <= 0)
daniele 3:b4047e8a0123 35 return 0;
daniele 3:b4047e8a0123 36
daniele 3:b4047e8a0123 37 if (l_bufsize > 0) {
daniele 3:b4047e8a0123 38 pico_stack_recv(dev, l_buf, l_bufsize);
daniele 3:b4047e8a0123 39 l_bufsize = 0;
daniele 3:b4047e8a0123 40 loop_score--;
daniele 3:b4047e8a0123 41 }
daniele 3:b4047e8a0123 42 return loop_score;
daniele 3:b4047e8a0123 43 }
daniele 3:b4047e8a0123 44
daniele 3:b4047e8a0123 45 /* Public interface: create/destroy. */
daniele 3:b4047e8a0123 46
daniele 3:b4047e8a0123 47 void pico_loop_destroy(struct pico_device *dev)
daniele 3:b4047e8a0123 48 {
daniele 3:b4047e8a0123 49 }
daniele 3:b4047e8a0123 50
daniele 3:b4047e8a0123 51 struct pico_device *pico_loop_create(void)
daniele 3:b4047e8a0123 52 {
daniele 3:b4047e8a0123 53 struct pico_device *loop = pico_zalloc(sizeof(struct pico_device));
daniele 3:b4047e8a0123 54 if (!loop)
daniele 3:b4047e8a0123 55 return NULL;
daniele 3:b4047e8a0123 56
daniele 3:b4047e8a0123 57 if( 0 != pico_device_init((struct pico_device *)loop, "loop", NULL)) {
daniele 3:b4047e8a0123 58 dbg ("Loop init failed.\n");
daniele 3:b4047e8a0123 59 pico_loop_destroy((struct pico_device *)loop);
daniele 3:b4047e8a0123 60 return NULL;
daniele 3:b4047e8a0123 61 }
daniele 3:b4047e8a0123 62 loop->send = pico_loop_send;
daniele 3:b4047e8a0123 63 loop->poll = pico_loop_poll;
daniele 3:b4047e8a0123 64 loop->destroy = pico_loop_destroy;
daniele 3:b4047e8a0123 65 dbg("Device %s created.\n", loop->name);
daniele 3:b4047e8a0123 66 return (struct pico_device *)loop;
daniele 3:b4047e8a0123 67 }
daniele 3:b4047e8a0123 68