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

Dependents:   lpc1768-picotcp-demo ZeroMQ_PicoTCP_Publisher_demo TCPSocket_HelloWorld_PicoTCP Pico_TCP_UDP_Test ... more

PicoTCP. Copyright (c) 2013 TASS Belgium NV.

Released under the GNU General Public License, version 2.

Different licensing models may exist, at the sole discretion of the Copyright holders.

Official homepage: http://www.picotcp.com

Bug tracker: https://github.com/tass-belgium/picotcp/issues

Development steps:

  • initial integration with mbed RTOS
  • generic mbed Ethernet driver
  • high performance NXP LPC1768 specific Ethernet driver
  • Multi-threading support for mbed RTOS
  • Berkeley sockets and integration with the New Socket API
  • Fork of the apps running on top of the New Socket API
  • Scheduling optimizations
  • Debugging/benchmarking/testing

Demo application (measuring TCP sender performance):

Import programlpc1768-picotcp-demo

A PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.

Committer:
daniele
Date:
Thu Jun 20 13:43:13 2013 +0000
Revision:
33:d8af3f85a484
Parent:
32:865c101e0874
Child:
34:d868bb69114e
Getting rid of some ugly pseudo-booleans defines

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 29:1a47b7151851 1 /*********************************************************************
daniele 29:1a47b7151851 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 29:1a47b7151851 3 See LICENSE and COPYING for usage.
daniele 29:1a47b7151851 4
daniele 29:1a47b7151851 5 Authors: Daniele Lacamera
daniele 29:1a47b7151851 6 *********************************************************************/
daniele 29:1a47b7151851 7
daniele 29:1a47b7151851 8 #include "wrapper.h"
daniele 29:1a47b7151851 9 #include "rtos.h"
daniele 29:1a47b7151851 10 #include "cmsis_os.h"
daniele 29:1a47b7151851 11 #include "mbed.h"
daniele 29:1a47b7151851 12 #include "Socket.h"
daniele 29:1a47b7151851 13 #include "Mutex.h"
daniele 29:1a47b7151851 14
daniele 29:1a47b7151851 15 //#define ptsock_dbg printf
daniele 29:1a47b7151851 16 #define ptsock_dbg(...)
daniele 29:1a47b7151851 17
daniele 29:1a47b7151851 18 int in_the_stack = 0;
daniele 29:1a47b7151851 19 Mutex *PicoTcpLock;
daniele 29:1a47b7151851 20 Queue<void,16> *PicoTcpEvents;
daniele 29:1a47b7151851 21
daniele 29:1a47b7151851 22 static struct stack_endpoint *ep_accepting;
daniele 29:1a47b7151851 23 static Thread * serverThread = NULL;
daniele 29:1a47b7151851 24
daniele 29:1a47b7151851 25 #define pt_proxy_dbg(...)
daniele 29:1a47b7151851 26
daniele 29:1a47b7151851 27 /* Testing ng blocking mechanism */
daniele 29:1a47b7151851 28
daniele 29:1a47b7151851 29 /*
daniele 29:1a47b7151851 30 * backend of select function, used in blocking (like picotcp_read()...)
daniele 29:1a47b7151851 31 * calls. Sleeps on the message queue
daniele 29:1a47b7151851 32 *
daniele 29:1a47b7151851 33 *
daniele 29:1a47b7151851 34 * WARNING: PicoTcpLock (big stack lock) must be acquired before entering this.
daniele 29:1a47b7151851 35 */
daniele 29:1a47b7151851 36
tass 32:865c101e0874 37 static inline int __critical_select(struct stack_endpoint *ep, uint32_t time, uint8_t lock)
daniele 29:1a47b7151851 38 {
daniele 29:1a47b7151851 39 int retval = 0;
daniele 29:1a47b7151851 40 uint16_t ev = ep->revents;
daniele 29:1a47b7151851 41 uint32_t in_time = PICO_TIME_MS();
daniele 29:1a47b7151851 42
tass 32:865c101e0874 43 if(lock) PicoTcpLock->unlock();
daniele 29:1a47b7151851 44 while ((ep->events & ep->revents) == 0) {
daniele 29:1a47b7151851 45 ep->queue->get(time);
daniele 29:1a47b7151851 46 if ((time != osWaitForever) && (PICO_TIME_MS() > in_time + time)) {
daniele 29:1a47b7151851 47 printf("TIMEOUT in critical select... (ev:%04x rev:%04x \n", ep->events, ep->revents);
tass 32:865c101e0874 48 if(lock) PicoTcpLock->lock();
daniele 29:1a47b7151851 49 return 0;
daniele 29:1a47b7151851 50 }
daniele 29:1a47b7151851 51 }
tass 32:865c101e0874 52 if(lock) PicoTcpLock->lock();
daniele 29:1a47b7151851 53 return 1;
daniele 29:1a47b7151851 54 }
daniele 29:1a47b7151851 55
daniele 29:1a47b7151851 56 static void wakeup(uint16_t ev, struct pico_socket *s)
daniele 29:1a47b7151851 57 {
daniele 29:1a47b7151851 58 struct stack_endpoint *ep = (struct stack_endpoint *)s->priv;
daniele 29:1a47b7151851 59 if (!ep) {
daniele 29:1a47b7151851 60 if (ep_accepting != NULL) {
daniele 29:1a47b7151851 61 printf("Delivering %02x to accepting socket...\n", ev);
daniele 29:1a47b7151851 62 ep = ep_accepting;
daniele 29:1a47b7151851 63 } else {
daniele 29:1a47b7151851 64 printf("WAKEUP: socket not found! ev=%04x\n", ev);
daniele 29:1a47b7151851 65 return;
daniele 29:1a47b7151851 66 }
daniele 29:1a47b7151851 67 }
daniele 29:1a47b7151851 68 //if (((ep->revents & PICO_SOCK_EV_RD) == 0) && (ev & PICO_SOCK_EV_RD))
daniele 29:1a47b7151851 69 // printf("Activating RD\n");
daniele 29:1a47b7151851 70 ep->revents |= ev;
daniele 29:1a47b7151851 71
tass 32:865c101e0874 72 if(ev & PICO_SOCK_EV_ERR)
tass 32:865c101e0874 73 {
tass 32:865c101e0874 74 if(pico_err == PICO_ERR_ECONNRESET)
tass 32:865c101e0874 75 {
tass 32:865c101e0874 76 printf("Connection reset by peer...\n");
tass 32:865c101e0874 77 ep->state = SOCK_RESET_BY_PEER;
tass 32:865c101e0874 78 pico_socket_close(ep->s);
tass 32:865c101e0874 79 ep->s->priv = NULL;
tass 32:865c101e0874 80 }
tass 32:865c101e0874 81 }
daniele 29:1a47b7151851 82 if ((ev & PICO_SOCK_EV_CLOSE) || (ev & PICO_SOCK_EV_FIN)) {
daniele 29:1a47b7151851 83 ep->connected = 0;
daniele 29:1a47b7151851 84 }
daniele 29:1a47b7151851 85 if ((ev & PICO_SOCK_EV_CONN) || (ev & PICO_SOCK_EV_RD)) {
daniele 29:1a47b7151851 86 ep->connected = 1;
daniele 29:1a47b7151851 87 }
daniele 29:1a47b7151851 88 ep->queue->put((void *)0);
daniele 29:1a47b7151851 89 }
daniele 29:1a47b7151851 90
daniele 29:1a47b7151851 91
daniele 29:1a47b7151851 92 struct stack_endpoint *picotcp_socket(uint16_t net, uint16_t proto, uint16_t timeout)
daniele 29:1a47b7151851 93 {
daniele 29:1a47b7151851 94 struct stack_endpoint *ep = (struct stack_endpoint *)pico_zalloc(sizeof(struct stack_endpoint));
daniele 29:1a47b7151851 95 uint16_t p_net = ((net == AF_INET6)?PICO_PROTO_IPV6:PICO_PROTO_IPV4);
daniele 29:1a47b7151851 96 uint16_t p_proto = ((proto == SOCK_DGRAM)?PICO_PROTO_UDP:PICO_PROTO_TCP);
daniele 29:1a47b7151851 97 PicoTcpLock->lock();
daniele 29:1a47b7151851 98 ep->s = pico_socket_open( p_net, p_proto, &wakeup );
daniele 29:1a47b7151851 99 if (ep->s == NULL) {
daniele 29:1a47b7151851 100 delete(ep->queue);
daniele 29:1a47b7151851 101 pico_free(ep);
daniele 29:1a47b7151851 102 ep = NULL;
daniele 29:1a47b7151851 103 printf("Error opening socket!\n");
daniele 29:1a47b7151851 104 } else {
daniele 29:1a47b7151851 105 ep->s->priv = ep;
daniele 29:1a47b7151851 106 printf("Added socket (open)\n");
daniele 29:1a47b7151851 107 ep->queue = new Queue<void,1>();
daniele 29:1a47b7151851 108 }
daniele 29:1a47b7151851 109 PicoTcpLock->unlock();
daniele 29:1a47b7151851 110 return ep;
daniele 29:1a47b7151851 111 }
daniele 29:1a47b7151851 112
daniele 29:1a47b7151851 113
daniele 29:1a47b7151851 114 int picotcp_state(struct stack_endpoint *ep)
daniele 29:1a47b7151851 115 {
daniele 29:1a47b7151851 116 /* TODO: return one of:
daniele 29:1a47b7151851 117 SOCK_OPEN,
daniele 29:1a47b7151851 118 SOCK_BOUND,
daniele 29:1a47b7151851 119 SOCK_LISTEN,
daniele 29:1a47b7151851 120 SOCK_CONNECTED,
daniele 29:1a47b7151851 121 SOCK_CLOSED
daniele 29:1a47b7151851 122 */
daniele 29:1a47b7151851 123 return ep->state;
daniele 29:1a47b7151851 124 }
daniele 29:1a47b7151851 125
daniele 29:1a47b7151851 126 int picotcp_bind(struct stack_endpoint *ep, struct sockaddr *_local_addr, socklen_t len)
daniele 29:1a47b7151851 127 {
daniele 29:1a47b7151851 128 int ret;
daniele 29:1a47b7151851 129 struct sockaddr_in *local_addr;
daniele 29:1a47b7151851 130 local_addr = (struct sockaddr_in *)_local_addr;
daniele 29:1a47b7151851 131
daniele 29:1a47b7151851 132 PicoTcpLock->lock();
daniele 29:1a47b7151851 133 ret = pico_socket_bind(ep->s, (struct pico_ip4 *)(&local_addr->sin_addr.s_addr), &local_addr->sin_port);
daniele 29:1a47b7151851 134 PicoTcpLock->unlock();
daniele 29:1a47b7151851 135 return ret;
daniele 29:1a47b7151851 136 }
daniele 29:1a47b7151851 137
daniele 29:1a47b7151851 138 int picotcp_listen(struct stack_endpoint *ep, int queue)
daniele 29:1a47b7151851 139 {
daniele 29:1a47b7151851 140 int ret;
daniele 29:1a47b7151851 141 PicoTcpLock->lock();
daniele 29:1a47b7151851 142 ret = pico_socket_listen(ep->s, queue);
daniele 29:1a47b7151851 143 ep_accepting = (struct stack_endpoint *) pico_zalloc(sizeof(struct stack_endpoint));
daniele 29:1a47b7151851 144 ep_accepting->queue = new Queue<void,1>();
daniele 29:1a47b7151851 145 if (!ep_accepting)
daniele 29:1a47b7151851 146 ret = -1;
daniele 29:1a47b7151851 147 PicoTcpLock->unlock();
daniele 29:1a47b7151851 148 return ret;
daniele 29:1a47b7151851 149 }
daniele 29:1a47b7151851 150
daniele 29:1a47b7151851 151 int picotcp_connect(struct stack_endpoint *ep, struct sockaddr *_srv_addr, socklen_t len)
daniele 29:1a47b7151851 152 {
daniele 29:1a47b7151851 153 int retval;
daniele 29:1a47b7151851 154 struct sockaddr_in *srv_addr;
daniele 29:1a47b7151851 155 srv_addr = (struct sockaddr_in *)_srv_addr;
daniele 29:1a47b7151851 156 PicoTcpLock->lock();
daniele 29:1a47b7151851 157 pico_socket_connect(ep->s, (struct pico_ip4 *)(&srv_addr->sin_addr.s_addr), srv_addr->sin_port);
daniele 29:1a47b7151851 158 ep->events = PICO_SOCK_EV_CONN | PICO_SOCK_EV_ERR;
daniele 33:d8af3f85a484 159 __critical_select(ep, osWaitForever, 1);
daniele 29:1a47b7151851 160 if ((ep->revents & PICO_SOCK_EV_CONN) && ep->connected) {
daniele 29:1a47b7151851 161 ep->revents &= (~PICO_SOCK_EV_CONN);
daniele 29:1a47b7151851 162 ep->revents |= PICO_SOCK_EV_WR;
daniele 29:1a47b7151851 163 ptsock_dbg("Established. sock state: %x\n", ep->s->state);
daniele 29:1a47b7151851 164 retval = 0;
daniele 29:1a47b7151851 165 } else {
daniele 29:1a47b7151851 166 retval = -1;
daniele 29:1a47b7151851 167 }
daniele 29:1a47b7151851 168 PicoTcpLock->unlock();
daniele 29:1a47b7151851 169 return retval;
daniele 29:1a47b7151851 170 }
daniele 29:1a47b7151851 171
daniele 29:1a47b7151851 172 struct stack_endpoint *picotcp_accept(struct stack_endpoint *ep, struct sockaddr *_cli_addr, socklen_t *len)
daniele 29:1a47b7151851 173 {
daniele 29:1a47b7151851 174 int retval;
daniele 29:1a47b7151851 175 struct stack_endpoint *aep = ep_accepting;
daniele 29:1a47b7151851 176 struct sockaddr_in *cli_addr = (struct sockaddr_in *)_cli_addr;
daniele 29:1a47b7151851 177 ep_accepting = (struct stack_endpoint *) pico_zalloc(sizeof(struct stack_endpoint));
daniele 29:1a47b7151851 178 if (ep_accepting)
daniele 29:1a47b7151851 179 ep_accepting->queue = new Queue<void,1>();
daniele 29:1a47b7151851 180
daniele 29:1a47b7151851 181
daniele 29:1a47b7151851 182 if (!aep)
daniele 29:1a47b7151851 183 return aep;
daniele 29:1a47b7151851 184
daniele 29:1a47b7151851 185 PicoTcpLock->lock();
daniele 29:1a47b7151851 186 ep->events = PICO_SOCK_EV_CONN | PICO_SOCK_EV_ERR;
daniele 33:d8af3f85a484 187 __critical_select(ep, osWaitForever, 1);
daniele 29:1a47b7151851 188 if (ep->revents & PICO_SOCK_EV_CONN) {
daniele 29:1a47b7151851 189 printf("Calling Accept\n");
daniele 29:1a47b7151851 190 aep->s = pico_socket_accept(ep->s, (struct pico_ip4 *)(&cli_addr->sin_addr.s_addr), &cli_addr->sin_port);
daniele 29:1a47b7151851 191 printf("Accept returned\n");
daniele 29:1a47b7151851 192 aep->s->priv = aep;
daniele 29:1a47b7151851 193 ep->revents &= (~PICO_SOCK_EV_CONN);
tass 32:865c101e0874 194 aep->revents = 0; // set this to 0 to allow seq connections
daniele 29:1a47b7151851 195 aep->revents |= PICO_SOCK_EV_WR;
daniele 29:1a47b7151851 196 printf("Added socket (accept)\n");
daniele 29:1a47b7151851 197
daniele 29:1a47b7151851 198 *len = sizeof(struct sockaddr_in);
daniele 29:1a47b7151851 199 ptsock_dbg("Established. sock state: %x\n", aep->s->state);
daniele 29:1a47b7151851 200 } else {
daniele 29:1a47b7151851 201 pico_free(aep);
daniele 29:1a47b7151851 202 aep = NULL;
daniele 29:1a47b7151851 203 }
daniele 29:1a47b7151851 204 PicoTcpLock->unlock();
daniele 29:1a47b7151851 205 return aep;
daniele 29:1a47b7151851 206 }
daniele 29:1a47b7151851 207
daniele 29:1a47b7151851 208 int picotcp_select(struct stack_endpoint *ep, struct timeval *timeout, int read, int write)
daniele 29:1a47b7151851 209 {
daniele 29:1a47b7151851 210 int ret;
daniele 29:1a47b7151851 211 ep->timeout |= timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
daniele 29:1a47b7151851 212 ep->events = PICO_SOCK_EV_ERR;
daniele 29:1a47b7151851 213 ep->events |= PICO_SOCK_EV_FIN;
daniele 29:1a47b7151851 214 ep->events |= PICO_SOCK_EV_CLOSE;
daniele 29:1a47b7151851 215 ep->events |= PICO_SOCK_EV_CONN;
daniele 29:1a47b7151851 216 if (read) {
daniele 29:1a47b7151851 217 ep->events |= PICO_SOCK_EV_RD;
daniele 29:1a47b7151851 218 }
daniele 29:1a47b7151851 219 if (write)
daniele 29:1a47b7151851 220 ep->events |= PICO_SOCK_EV_WR;
daniele 33:d8af3f85a484 221 ret = __critical_select(ep, ep->timeout, 0);
daniele 29:1a47b7151851 222 return ret;
daniele 29:1a47b7151851 223 }
daniele 29:1a47b7151851 224
daniele 29:1a47b7151851 225 int picotcp_send(struct stack_endpoint *ep,void * buff, int len, int flags)
daniele 29:1a47b7151851 226 {
daniele 29:1a47b7151851 227 /* TODO */
daniele 29:1a47b7151851 228 return -1;
daniele 29:1a47b7151851 229 }
daniele 29:1a47b7151851 230
daniele 29:1a47b7151851 231 int picotcp_recv(struct stack_endpoint *ep,void * buff, int len, int flags)
daniele 29:1a47b7151851 232 {
daniele 29:1a47b7151851 233 /* TODO */
daniele 29:1a47b7151851 234 return -1;
daniele 29:1a47b7151851 235 }
daniele 29:1a47b7151851 236
daniele 29:1a47b7151851 237 int picotcp_sendto(struct stack_endpoint *ep,void * buff, int len, struct sockaddr *a, socklen_t l)
daniele 29:1a47b7151851 238 {
daniele 29:1a47b7151851 239 /* TODO */
daniele 29:1a47b7151851 240 return -1;
daniele 29:1a47b7151851 241 }
daniele 29:1a47b7151851 242
daniele 29:1a47b7151851 243 int picotcp_recvfrom(struct stack_endpoint *ep,void * buff, int len, struct sockaddr *a, socklen_t *l)
daniele 29:1a47b7151851 244 {
daniele 29:1a47b7151851 245 /* TODO */
daniele 29:1a47b7151851 246 return -1;
daniele 29:1a47b7151851 247 }
daniele 29:1a47b7151851 248
daniele 29:1a47b7151851 249 int picotcp_read(struct stack_endpoint *ep,void *buf, int len)
daniele 29:1a47b7151851 250 {
daniele 29:1a47b7151851 251 int retval = 0;
daniele 29:1a47b7151851 252 int tot_len = 0;
daniele 29:1a47b7151851 253 if (!buf || (len <= 0))
daniele 29:1a47b7151851 254 return 0;
daniele 29:1a47b7151851 255 PicoTcpLock->lock();
daniele 29:1a47b7151851 256 while (tot_len < len) {
daniele 29:1a47b7151851 257 retval = pico_socket_read(ep->s, ((uint8_t *)buf) + tot_len , len - tot_len);
daniele 29:1a47b7151851 258 if (retval == 0) {
daniele 29:1a47b7151851 259 if (tot_len < len)
daniele 29:1a47b7151851 260 ep->revents &= ~PICO_SOCK_EV_RD;
daniele 29:1a47b7151851 261 break;
daniele 29:1a47b7151851 262 }
daniele 29:1a47b7151851 263 if (retval < 0) {
daniele 29:1a47b7151851 264 tot_len = -1;
daniele 29:1a47b7151851 265 break;
daniele 29:1a47b7151851 266 }
daniele 29:1a47b7151851 267 tot_len += retval;
daniele 29:1a47b7151851 268 }
daniele 29:1a47b7151851 269 PicoTcpLock->unlock();
daniele 29:1a47b7151851 270 picotcp_async_interrupt(NULL);
daniele 29:1a47b7151851 271 return tot_len;
daniele 29:1a47b7151851 272 }
daniele 29:1a47b7151851 273
daniele 29:1a47b7151851 274 int picotcp_write(struct stack_endpoint *ep,void *buf, int len)
daniele 29:1a47b7151851 275 {
daniele 29:1a47b7151851 276 int retval = 0;
daniele 29:1a47b7151851 277 int tot_len = 0;
daniele 29:1a47b7151851 278 if (!buf || (len <= 0))
daniele 29:1a47b7151851 279 return 0;
daniele 29:1a47b7151851 280 PicoTcpLock->lock();
daniele 29:1a47b7151851 281 while (tot_len < len) {
daniele 29:1a47b7151851 282 retval = pico_socket_write(ep->s, ((uint8_t *)buf) + tot_len , len - tot_len);
daniele 29:1a47b7151851 283 retval = pico_socket_read(ep->s, ((uint8_t *)buf) + tot_len , len - tot_len);
daniele 29:1a47b7151851 284 if (retval == 0) {
daniele 29:1a47b7151851 285 if (tot_len < len)
daniele 29:1a47b7151851 286 ep->revents &= ~PICO_SOCK_EV_RD;
daniele 29:1a47b7151851 287 break;
daniele 29:1a47b7151851 288 }
daniele 29:1a47b7151851 289 if (retval < 0) {
daniele 29:1a47b7151851 290 tot_len = -1;
daniele 29:1a47b7151851 291 break;
daniele 29:1a47b7151851 292 }
daniele 29:1a47b7151851 293 tot_len += retval;
daniele 29:1a47b7151851 294
daniele 29:1a47b7151851 295 }
daniele 29:1a47b7151851 296 PicoTcpLock->unlock();
daniele 29:1a47b7151851 297 picotcp_async_interrupt(NULL);
daniele 29:1a47b7151851 298 return tot_len;
daniele 29:1a47b7151851 299 }
daniele 29:1a47b7151851 300
daniele 29:1a47b7151851 301
daniele 29:1a47b7151851 302 int picotcp_setsockopt(struct stack_endpoint *ep, int option, void *value)
daniele 29:1a47b7151851 303 {
daniele 29:1a47b7151851 304 /* TODO */
daniele 29:1a47b7151851 305 return -1;
daniele 29:1a47b7151851 306 }
daniele 29:1a47b7151851 307
daniele 29:1a47b7151851 308 int picotcp_getsockopt(struct stack_endpoint *ep, int option, void *value)
daniele 29:1a47b7151851 309 {
daniele 29:1a47b7151851 310 /* TODO */
daniele 29:1a47b7151851 311 return -1;
daniele 29:1a47b7151851 312 }
daniele 29:1a47b7151851 313
daniele 29:1a47b7151851 314 int picotcp_close(struct stack_endpoint *ep)
daniele 29:1a47b7151851 315 {
daniele 29:1a47b7151851 316 PicoTcpLock->lock();
tass 32:865c101e0874 317 if(ep->state != SOCK_RESET_BY_PEER)
tass 32:865c101e0874 318 {
tass 32:865c101e0874 319 pico_socket_close(ep->s);
tass 32:865c101e0874 320 ep->s->priv = NULL;
tass 32:865c101e0874 321 }
daniele 29:1a47b7151851 322 printf("Socket closed!\n");
daniele 29:1a47b7151851 323 delete(ep->queue);
daniele 29:1a47b7151851 324 pico_free(ep);
daniele 29:1a47b7151851 325 PicoTcpLock->unlock();
daniele 29:1a47b7151851 326 }
daniele 29:1a47b7151851 327
daniele 29:1a47b7151851 328 int picotcp_join_multicast(struct stack_endpoint *ep,const char* address,const char* local)
daniele 29:1a47b7151851 329 {
daniele 29:1a47b7151851 330 /* TODO */
daniele 29:1a47b7151851 331 return -1;
daniele 29:1a47b7151851 332 }
daniele 29:1a47b7151851 333
daniele 29:1a47b7151851 334
daniele 29:1a47b7151851 335
daniele 29:1a47b7151851 336 void pico_wrapper_loop(const void * arg)
daniele 29:1a47b7151851 337 {
daniele 29:1a47b7151851 338 (void)arg;
daniele 29:1a47b7151851 339 int ret = 0;
daniele 29:1a47b7151851 340 struct pico_device *dev;
daniele 29:1a47b7151851 341 while(1) {
daniele 29:1a47b7151851 342
daniele 29:1a47b7151851 343 osEvent evt = PicoTcpEvents->get(5);
daniele 29:1a47b7151851 344
daniele 29:1a47b7151851 345 if (evt.status == osEventMessage) {
daniele 29:1a47b7151851 346 dev = (struct pico_device *)evt.value.p;
daniele 29:1a47b7151851 347 } else {
daniele 29:1a47b7151851 348 dev = NULL;
daniele 29:1a47b7151851 349 }
daniele 29:1a47b7151851 350 PicoTcpLock->lock();
daniele 29:1a47b7151851 351 if (dev && dev->dsr)
daniele 29:1a47b7151851 352 dev->dsr(dev, 5);
daniele 29:1a47b7151851 353 pico_stack_tick();
daniele 29:1a47b7151851 354 pico_stack_tick();
daniele 29:1a47b7151851 355 PicoTcpLock->unlock();
daniele 29:1a47b7151851 356 }
daniele 29:1a47b7151851 357 }
daniele 29:1a47b7151851 358
daniele 29:1a47b7151851 359 void picotcp_start(void)
daniele 29:1a47b7151851 360 {
daniele 29:1a47b7151851 361 if (serverThread == NULL) {
daniele 29:1a47b7151851 362 PicoTcpLock = new Mutex();
daniele 29:1a47b7151851 363 PicoTcpEvents = new Queue<void,16>();
daniele 29:1a47b7151851 364 printf (" *** PicoTCP initialized *** \n");
daniele 29:1a47b7151851 365 serverThread = new Thread(pico_wrapper_loop);
daniele 29:1a47b7151851 366 serverThread->set_priority(osPriorityIdle);
daniele 29:1a47b7151851 367 }
daniele 29:1a47b7151851 368 }
daniele 29:1a47b7151851 369
daniele 29:1a47b7151851 370 void picotcp_init(void)
daniele 29:1a47b7151851 371 {
daniele 29:1a47b7151851 372 picotcp_start();
daniele 29:1a47b7151851 373 }
daniele 29:1a47b7151851 374
daniele 29:1a47b7151851 375 int picotcp_async_interrupt(void *arg)
daniele 29:1a47b7151851 376 {
daniele 29:1a47b7151851 377 PicoTcpEvents->put(arg);
daniele 29:1a47b7151851 378 }