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:
Tue Jun 11 21:10:23 2013 +0000
Revision:
24:8bff2b51ea3b
Parent:
19:c7debad9a20a
Reworked socket interface. Fixed several bugs.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 5:445d2fc04784 1 /*
tass 5:445d2fc04784 2 *
tass 5:445d2fc04784 3 * PicoTCP Socket interface for mbed.
tass 5:445d2fc04784 4 * Copyright (C) 2013 TASS Belgium NV
tass 5:445d2fc04784 5 *
tass 5:445d2fc04784 6 * Released under GPL v2
tass 5:445d2fc04784 7 *
tass 5:445d2fc04784 8 * Other licensing models might apply at the sole discretion of the copyright holders.
tass 5:445d2fc04784 9 *
tass 5:445d2fc04784 10 *
tass 5:445d2fc04784 11 * This software is based on the mbed.org EthernetInterface implementation:
tass 5:445d2fc04784 12 * Copyright (C) 2012 mbed.org, MIT License
tass 5:445d2fc04784 13 *
tass 5:445d2fc04784 14 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
tass 5:445d2fc04784 15 * and associated documentation files (the "Software"), to deal in the Software without restriction,
tass 5:445d2fc04784 16 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
tass 5:445d2fc04784 17 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
tass 5:445d2fc04784 18 * furnished to do so, subject to the following conditions:
tass 5:445d2fc04784 19 *
tass 5:445d2fc04784 20 * The above copyright notice and this permission notice shall be included in all copies or
tass 5:445d2fc04784 21 * substantial portions of the Software.
tass 5:445d2fc04784 22 *
tass 5:445d2fc04784 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
tass 5:445d2fc04784 24 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
tass 5:445d2fc04784 25 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
tass 5:445d2fc04784 26 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
tass 5:445d2fc04784 27 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tass 5:445d2fc04784 28 */
tass 5:445d2fc04784 29 #include "TCPSocketConnection.h"
tass 18:c6f67fcfc62a 30 #include "wrapper.h"
tass 5:445d2fc04784 31 #include <cstring>
tass 5:445d2fc04784 32
tass 5:445d2fc04784 33 using std::memset;
tass 5:445d2fc04784 34 using std::memcpy;
tass 5:445d2fc04784 35
tass 5:445d2fc04784 36 TCPSocketConnection::TCPSocketConnection() :
tass 5:445d2fc04784 37 _is_connected(false) {
tass 5:445d2fc04784 38 }
tass 5:445d2fc04784 39
tass 5:445d2fc04784 40 int TCPSocketConnection::connect(const char* host, const int port) {
tass 5:445d2fc04784 41 if (init_socket(SOCK_STREAM) < 0)
tass 5:445d2fc04784 42 {
tass 5:445d2fc04784 43 printf("init_socket\n");
tass 5:445d2fc04784 44 return -1;
tass 5:445d2fc04784 45 }
tass 5:445d2fc04784 46
tass 5:445d2fc04784 47 if (set_address(host, port) != 0)
tass 5:445d2fc04784 48 {
tass 5:445d2fc04784 49 printf("set_address\n");
tass 5:445d2fc04784 50 return -1;
tass 5:445d2fc04784 51 }
tass 5:445d2fc04784 52
daniele 19:c7debad9a20a 53 if (picotcp_connect(_ep, (struct sockaddr *) &_remoteHost, sizeof(_remoteHost)) < 0) {
tass 5:445d2fc04784 54 close();
tass 5:445d2fc04784 55 return -1;
tass 5:445d2fc04784 56 }
tass 5:445d2fc04784 57 _is_connected = true;
tass 5:445d2fc04784 58
tass 5:445d2fc04784 59 return 0;
tass 5:445d2fc04784 60 }
tass 5:445d2fc04784 61
tass 5:445d2fc04784 62 bool TCPSocketConnection::is_connected(void) {
tass 5:445d2fc04784 63 return _is_connected;
tass 5:445d2fc04784 64 }
tass 5:445d2fc04784 65
tass 5:445d2fc04784 66 int TCPSocketConnection::send(char* data, int length) {
daniele 24:8bff2b51ea3b 67 int ret;
daniele 19:c7debad9a20a 68 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 69 return -1;
tass 5:445d2fc04784 70
tass 5:445d2fc04784 71 if (!_blocking) {
tass 5:445d2fc04784 72 TimeInterval timeout(_timeout);
tass 5:445d2fc04784 73 if (wait_writable(timeout) != 0)
tass 5:445d2fc04784 74 {
tass 5:445d2fc04784 75 printf("Failed\n");
tass 5:445d2fc04784 76 return -1;
tass 5:445d2fc04784 77 }
tass 5:445d2fc04784 78 }
daniele 24:8bff2b51ea3b 79 ret = picotcp_write(_ep, data, length);
daniele 24:8bff2b51ea3b 80 if (ret < length) {
daniele 24:8bff2b51ea3b 81 _ep->revents &= (~PICO_SOCK_EV_WR);
daniele 24:8bff2b51ea3b 82 printf("Short write\n");
daniele 24:8bff2b51ea3b 83 }
daniele 24:8bff2b51ea3b 84 return ret;
tass 5:445d2fc04784 85 }
tass 5:445d2fc04784 86
tass 5:445d2fc04784 87 // -1 if unsuccessful, else number of bytes written
tass 5:445d2fc04784 88 int TCPSocketConnection::send_all(char* data, int length) {
daniele 24:8bff2b51ea3b 89 int ret;
daniele 19:c7debad9a20a 90 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 91 return -1;
tass 5:445d2fc04784 92
daniele 19:c7debad9a20a 93 if (!_blocking) {
daniele 19:c7debad9a20a 94 TimeInterval timeout(_timeout);
daniele 19:c7debad9a20a 95 // Wait for socket to be writeable
daniele 19:c7debad9a20a 96 if (wait_writable(timeout) != 0) {
daniele 19:c7debad9a20a 97 return 0;
tass 5:445d2fc04784 98 }
tass 5:445d2fc04784 99 }
daniele 24:8bff2b51ea3b 100 ret = picotcp_write(_ep, data, length);
daniele 24:8bff2b51ea3b 101 if (ret < length) {
daniele 24:8bff2b51ea3b 102 _ep->revents &= (~PICO_SOCK_EV_WR);
daniele 24:8bff2b51ea3b 103 //printf("Short write\n");
daniele 24:8bff2b51ea3b 104 }
daniele 24:8bff2b51ea3b 105 return ret;
tass 5:445d2fc04784 106 }
tass 5:445d2fc04784 107
tass 5:445d2fc04784 108 int TCPSocketConnection::receive(char* data, int length) {
daniele 24:8bff2b51ea3b 109 int ret;
daniele 19:c7debad9a20a 110 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 111 return -1;
tass 5:445d2fc04784 112
tass 5:445d2fc04784 113 if (!_blocking) {
tass 5:445d2fc04784 114 TimeInterval timeout(_timeout);
tass 5:445d2fc04784 115 if (wait_readable(timeout) != 0)
tass 13:c6662adea07d 116 {
tass 13:c6662adea07d 117 printf("Failed receiving\n");
tass 5:445d2fc04784 118 return -1;
tass 13:c6662adea07d 119 }
tass 5:445d2fc04784 120 }
daniele 24:8bff2b51ea3b 121 ret = picotcp_read(_ep, data, length);
daniele 24:8bff2b51ea3b 122 if (ret < length) {
daniele 24:8bff2b51ea3b 123 _ep->revents &= (~PICO_SOCK_EV_RD);
daniele 24:8bff2b51ea3b 124 //printf("Short read\n");
daniele 24:8bff2b51ea3b 125 }
daniele 24:8bff2b51ea3b 126 return ret;
tass 5:445d2fc04784 127 }
tass 5:445d2fc04784 128
tass 5:445d2fc04784 129 // -1 if unsuccessful, else number of bytes received
tass 5:445d2fc04784 130 int TCPSocketConnection::receive_all(char* data, int length) {
daniele 19:c7debad9a20a 131 return receive(data, length);
tass 5:445d2fc04784 132 }