Free (GPLv2) TCP/IP stack developed by TASS Belgium
Fork of PicoTCP by
modules/pico_dev_loop.c@3:b4047e8a0123, 2013-05-24 (annotated)
- Committer:
- daniele
- Date:
- Fri May 24 15:25:25 2013 +0000
- Revision:
- 3:b4047e8a0123
Updated from main repo + fixed Mutexes;
Who changed what in which revision?
User | Revision | Line number | New 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 |