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
Date:
Fri Jun 21 08:47:35 2013 +0000
Revision:
35:6078073547bb
Parent:
29:1a47b7151851
Child:
37:bdf736327c71
Added missing functions(broadcast, multicast, udp support functions). Fixed some small things.

Who changed what in which revision?

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