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:
TASS Belgium NV
Date:
Mon Dec 16 11:25:54 2013 +0100
Revision:
131:4758606c9316
Parent:
70:cd218dd180e5
Syncronized with master branch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 68:0847e35d08a6 1 /*********************************************************************
TASS Belgium NV 131:4758606c9316 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
TASS Belgium NV 131:4758606c9316 3 See LICENSE and COPYING for usage.
tass 68:0847e35d08a6 4
TASS Belgium NV 131:4758606c9316 5 Author: Andrei Carp <andrei.carp@tass.be>
TASS Belgium NV 131:4758606c9316 6 *********************************************************************/
tass 68:0847e35d08a6 7
tass 68:0847e35d08a6 8 #include <stdint.h>
tass 68:0847e35d08a6 9 #include "pico_config.h"
tass 68:0847e35d08a6 10 #include "pico_stack.h"
tass 68:0847e35d08a6 11 #include "pico_protocol.h"
tass 68:0847e35d08a6 12 #include "pico_http_util.h"
tass 68:0847e35d08a6 13
TASS Belgium NV 131:4758606c9316 14 #define TRUE 1
tass 68:0847e35d08a6 15 #define FALSE 0
tass 68:0847e35d08a6 16
TASS Belgium NV 131:4758606c9316 17 #define HTTP_PROTO_TOK "http://"
TASS Belgium NV 131:4758606c9316 18 #define HTTP_PROTO_LEN 7u
tass 68:0847e35d08a6 19
tass 68:0847e35d08a6 20 #if defined PICO_SUPPORT_HTTP_CLIENT || defined PICO_SUPPORT_HTTP_SERVER
tass 68:0847e35d08a6 21
TASS Belgium NV 131:4758606c9316 22 int pico_itoaHex(uint16_t port, char *ptr)
tass 68:0847e35d08a6 23 {
TASS Belgium NV 131:4758606c9316 24 int size = 0;
TASS Belgium NV 131:4758606c9316 25 int index;
tass 68:0847e35d08a6 26
TASS Belgium NV 131:4758606c9316 27 /* transform to from number to string [ in backwards ] */
TASS Belgium NV 131:4758606c9316 28 while(port)
TASS Belgium NV 131:4758606c9316 29 {
TASS Belgium NV 131:4758606c9316 30 ptr[size] = (char)(((port & 0xF) < 10) ? ((port & 0xF) + '0') : ((port & 0xF) - 10 + 'a'));
TASS Belgium NV 131:4758606c9316 31 port = port >> 4u; /* divide by 16 */
TASS Belgium NV 131:4758606c9316 32 size++;
TASS Belgium NV 131:4758606c9316 33 }
TASS Belgium NV 131:4758606c9316 34 /* invert positions */
TASS Belgium NV 131:4758606c9316 35 for(index = 0; index < (size >> 1u); index++)
TASS Belgium NV 131:4758606c9316 36 {
TASS Belgium NV 131:4758606c9316 37 char c = ptr[index];
TASS Belgium NV 131:4758606c9316 38 ptr[index] = ptr[size - index - 1];
TASS Belgium NV 131:4758606c9316 39 ptr[size - index - 1] = c;
TASS Belgium NV 131:4758606c9316 40 }
TASS Belgium NV 131:4758606c9316 41 ptr[size] = '\0';
TASS Belgium NV 131:4758606c9316 42 return size;
tass 68:0847e35d08a6 43 }
tass 68:0847e35d08a6 44
TASS Belgium NV 131:4758606c9316 45 uint16_t pico_itoa(uint16_t port, char *ptr)
tass 68:0847e35d08a6 46 {
TASS Belgium NV 131:4758606c9316 47 uint16_t size = 0;
TASS Belgium NV 131:4758606c9316 48 uint16_t index;
tass 68:0847e35d08a6 49
TASS Belgium NV 131:4758606c9316 50 /* transform to from number to string [ in backwards ] */
TASS Belgium NV 131:4758606c9316 51 while(port)
TASS Belgium NV 131:4758606c9316 52 {
TASS Belgium NV 131:4758606c9316 53 ptr[size] = (char)(port % 10 + '0');
TASS Belgium NV 131:4758606c9316 54 port = port / 10;
TASS Belgium NV 131:4758606c9316 55 size++;
TASS Belgium NV 131:4758606c9316 56 }
TASS Belgium NV 131:4758606c9316 57 /* invert positions */
TASS Belgium NV 131:4758606c9316 58 for(index = 0; index < (size >> 1u); index++)
TASS Belgium NV 131:4758606c9316 59 {
TASS Belgium NV 131:4758606c9316 60 char c = ptr[index];
TASS Belgium NV 131:4758606c9316 61 ptr[index] = ptr[size - index - 1];
TASS Belgium NV 131:4758606c9316 62 ptr[size - index - 1] = c;
TASS Belgium NV 131:4758606c9316 63 }
TASS Belgium NV 131:4758606c9316 64 ptr[size] = '\0';
TASS Belgium NV 131:4758606c9316 65 return size;
tass 68:0847e35d08a6 66 }
tass 68:0847e35d08a6 67
tass 68:0847e35d08a6 68
TASS Belgium NV 131:4758606c9316 69 int8_t pico_processURI(const char *uri, struct pico_http_uri *urikey)
tass 68:0847e35d08a6 70 {
tass 68:0847e35d08a6 71
TASS Belgium NV 131:4758606c9316 72 uint16_t lastIndex = 0, index;
tass 68:0847e35d08a6 73
TASS Belgium NV 131:4758606c9316 74 if(!uri || !urikey || uri[0] == '/')
TASS Belgium NV 131:4758606c9316 75 {
TASS Belgium NV 131:4758606c9316 76 pico_err = PICO_ERR_EINVAL;
TASS Belgium NV 131:4758606c9316 77 goto error;
TASS Belgium NV 131:4758606c9316 78 }
tass 68:0847e35d08a6 79
TASS Belgium NV 131:4758606c9316 80 /* detect protocol => search for "://" */
TASS Belgium NV 131:4758606c9316 81 if(memcmp(uri, HTTP_PROTO_TOK, HTTP_PROTO_LEN) == 0) /* could be optimized */
TASS Belgium NV 131:4758606c9316 82 { /* protocol identified, it is http */
TASS Belgium NV 131:4758606c9316 83 urikey->protoHttp = TRUE;
TASS Belgium NV 131:4758606c9316 84 lastIndex = HTTP_PROTO_LEN;
TASS Belgium NV 131:4758606c9316 85 }
TASS Belgium NV 131:4758606c9316 86 else
TASS Belgium NV 131:4758606c9316 87 {
TASS Belgium NV 131:4758606c9316 88 if(strstr(uri, "://")) /* different protocol specified */
TASS Belgium NV 131:4758606c9316 89 {
TASS Belgium NV 131:4758606c9316 90 urikey->protoHttp = FALSE;
TASS Belgium NV 131:4758606c9316 91 goto error;
TASS Belgium NV 131:4758606c9316 92 }
tass 68:0847e35d08a6 93
TASS Belgium NV 131:4758606c9316 94 /* no protocol specified, assuming by default it's http */
TASS Belgium NV 131:4758606c9316 95 urikey->protoHttp = TRUE;
TASS Belgium NV 131:4758606c9316 96 }
tass 68:0847e35d08a6 97
TASS Belgium NV 131:4758606c9316 98 /* detect hostname */
TASS Belgium NV 131:4758606c9316 99 index = lastIndex;
TASS Belgium NV 131:4758606c9316 100 while(uri[index] && uri[index] != '/' && uri[index] != ':') index++;
TASS Belgium NV 131:4758606c9316 101 if(index == lastIndex)
TASS Belgium NV 131:4758606c9316 102 {
TASS Belgium NV 131:4758606c9316 103 /* wrong format */
TASS Belgium NV 131:4758606c9316 104 urikey->host = urikey->resource = NULL;
TASS Belgium NV 131:4758606c9316 105 urikey->port = urikey->protoHttp = 0u;
tass 68:0847e35d08a6 106
TASS Belgium NV 131:4758606c9316 107 goto error;
TASS Belgium NV 131:4758606c9316 108 }
TASS Belgium NV 131:4758606c9316 109 else
TASS Belgium NV 131:4758606c9316 110 {
TASS Belgium NV 131:4758606c9316 111 /* extract host */
TASS Belgium NV 131:4758606c9316 112 urikey->host = (char *)pico_zalloc((uint32_t)(index - lastIndex + 1));
tass 68:0847e35d08a6 113
TASS Belgium NV 131:4758606c9316 114 if(!urikey->host)
TASS Belgium NV 131:4758606c9316 115 {
TASS Belgium NV 131:4758606c9316 116 /* no memory */
TASS Belgium NV 131:4758606c9316 117 goto error;
TASS Belgium NV 131:4758606c9316 118 }
TASS Belgium NV 131:4758606c9316 119
TASS Belgium NV 131:4758606c9316 120 memcpy(urikey->host, uri + lastIndex, (size_t)(index - lastIndex));
TASS Belgium NV 131:4758606c9316 121 }
tass 68:0847e35d08a6 122
TASS Belgium NV 131:4758606c9316 123 if(!uri[index])
TASS Belgium NV 131:4758606c9316 124 {
TASS Belgium NV 131:4758606c9316 125 /* nothing specified */
TASS Belgium NV 131:4758606c9316 126 urikey->port = 80u;
TASS Belgium NV 131:4758606c9316 127 urikey->resource = pico_zalloc(2u);
TASS Belgium NV 131:4758606c9316 128 urikey->resource[0] = '/';
TASS Belgium NV 131:4758606c9316 129 return HTTP_RETURN_OK;
TASS Belgium NV 131:4758606c9316 130 }
TASS Belgium NV 131:4758606c9316 131 else if(uri[index] == '/')
TASS Belgium NV 131:4758606c9316 132 {
TASS Belgium NV 131:4758606c9316 133 urikey->port = 80u;
TASS Belgium NV 131:4758606c9316 134 }
TASS Belgium NV 131:4758606c9316 135 else if(uri[index] == ':')
TASS Belgium NV 131:4758606c9316 136 {
TASS Belgium NV 131:4758606c9316 137 urikey->port = 0u;
TASS Belgium NV 131:4758606c9316 138 index++;
TASS Belgium NV 131:4758606c9316 139 while(uri[index] && uri[index] != '/')
TASS Belgium NV 131:4758606c9316 140 {
TASS Belgium NV 131:4758606c9316 141 /* should check if every component is a digit */
TASS Belgium NV 131:4758606c9316 142 urikey->port = (uint16_t)(urikey->port * 10 + (uri[index] - '0'));
TASS Belgium NV 131:4758606c9316 143 index++;
TASS Belgium NV 131:4758606c9316 144 }
TASS Belgium NV 131:4758606c9316 145 }
tass 68:0847e35d08a6 146
TASS Belgium NV 131:4758606c9316 147 /* extract resource */
TASS Belgium NV 131:4758606c9316 148 if(!uri[index])
TASS Belgium NV 131:4758606c9316 149 {
TASS Belgium NV 131:4758606c9316 150 urikey->resource = pico_zalloc(2u);
TASS Belgium NV 131:4758606c9316 151 urikey->resource[0] = '/';
TASS Belgium NV 131:4758606c9316 152 }
TASS Belgium NV 131:4758606c9316 153 else
TASS Belgium NV 131:4758606c9316 154 {
TASS Belgium NV 131:4758606c9316 155 lastIndex = index;
TASS Belgium NV 131:4758606c9316 156 while(uri[index] && uri[index] != '?' && uri[index] != '&' && uri[index] != '#') index++;
TASS Belgium NV 131:4758606c9316 157 urikey->resource = (char *)pico_zalloc((size_t)(index - lastIndex + 1));
tass 68:0847e35d08a6 158
TASS Belgium NV 131:4758606c9316 159 if(!urikey->resource)
TASS Belgium NV 131:4758606c9316 160 {
TASS Belgium NV 131:4758606c9316 161 /* no memory */
TASS Belgium NV 131:4758606c9316 162 pico_err = PICO_ERR_ENOMEM;
TASS Belgium NV 131:4758606c9316 163 goto error;
TASS Belgium NV 131:4758606c9316 164 }
tass 68:0847e35d08a6 165
TASS Belgium NV 131:4758606c9316 166 memcpy(urikey->resource, uri + lastIndex, (size_t)(index - lastIndex));
TASS Belgium NV 131:4758606c9316 167 }
tass 68:0847e35d08a6 168
TASS Belgium NV 131:4758606c9316 169 return HTTP_RETURN_OK;
tass 68:0847e35d08a6 170
TASS Belgium NV 131:4758606c9316 171 error:
TASS Belgium NV 131:4758606c9316 172 if(urikey->resource)
TASS Belgium NV 131:4758606c9316 173 {
TASS Belgium NV 131:4758606c9316 174 pico_free(urikey->resource);
TASS Belgium NV 131:4758606c9316 175 urikey->resource = NULL;
TASS Belgium NV 131:4758606c9316 176 }
tass 68:0847e35d08a6 177
TASS Belgium NV 131:4758606c9316 178 if(urikey->host)
TASS Belgium NV 131:4758606c9316 179 {
TASS Belgium NV 131:4758606c9316 180 pico_free(urikey->host);
TASS Belgium NV 131:4758606c9316 181 urikey->host = NULL;
TASS Belgium NV 131:4758606c9316 182 }
TASS Belgium NV 131:4758606c9316 183
TASS Belgium NV 131:4758606c9316 184 return HTTP_RETURN_ERROR;
tass 68:0847e35d08a6 185 }
tass 68:0847e35d08a6 186 #endif