You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.4 KiB
66 lines
1.4 KiB
/********************************************************************* |
|
PicoTCP. Copyright (c) 2012-2015 Altran Intelligent Systems. 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) |
|
{ |
|
IGNORE_PARAMETER(dev); |
|
if (len > LOOP_MTU) |
|
return 0; |
|
|
|
if (l_bufsize == 0) { |
|
memcpy(l_buf, buf, (size_t)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, (uint32_t)l_bufsize); |
|
l_bufsize = 0; |
|
loop_score--; |
|
} |
|
|
|
return loop_score; |
|
} |
|
|
|
|
|
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(loop, "loop", NULL)) { |
|
dbg ("Loop init failed.\n"); |
|
pico_device_destroy(loop); |
|
return NULL; |
|
} |
|
|
|
loop->send = pico_loop_send; |
|
loop->poll = pico_loop_poll; |
|
dbg("Device %s created.\n", loop->name); |
|
return loop; |
|
} |
|
|
|
|