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 picotcp@tass.be
Date:
Wed Apr 09 14:31:41 2014 +0200
Revision:
149:5f4cb161cec3
Child:
152:a3d286bf94e5
Update from git masterbranch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass picotcp@tass.be 149:5f4cb161cec3 1 /*********************************************************************
tass picotcp@tass.be 149:5f4cb161cec3 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
tass picotcp@tass.be 149:5f4cb161cec3 3 See LICENSE and COPYING for usage.
tass picotcp@tass.be 149:5f4cb161cec3 4
tass picotcp@tass.be 149:5f4cb161cec3 5 .
tass picotcp@tass.be 149:5f4cb161cec3 6
tass picotcp@tass.be 149:5f4cb161cec3 7 *********************************************************************/
tass picotcp@tass.be 149:5f4cb161cec3 8 #ifndef _INCLUDE_PICO_ICMP6
tass picotcp@tass.be 149:5f4cb161cec3 9 #define _INCLUDE_PICO_ICMP6
tass picotcp@tass.be 149:5f4cb161cec3 10 #include "pico_addressing.h"
tass picotcp@tass.be 149:5f4cb161cec3 11 #include "pico_protocol.h"
tass picotcp@tass.be 149:5f4cb161cec3 12
tass picotcp@tass.be 149:5f4cb161cec3 13 /* ICMP header sizes */
tass picotcp@tass.be 149:5f4cb161cec3 14 #define PICO_ICMP6HDR_DRY_SIZE 4
tass picotcp@tass.be 149:5f4cb161cec3 15 #define PICO_ICMP6HDR_ECHO_REQUEST_SIZE 8
tass picotcp@tass.be 149:5f4cb161cec3 16 #define PICO_ICMP6HDR_DEST_UNREACH_SIZE 8
tass picotcp@tass.be 149:5f4cb161cec3 17 #define PICO_ICMP6HDR_TIME_XCEEDED_SIZE 8
tass picotcp@tass.be 149:5f4cb161cec3 18 #define PICO_ICMP6HDR_NEIGH_SOL_SIZE 24
tass picotcp@tass.be 149:5f4cb161cec3 19 #define PICO_ICMP6HDR_NEIGH_ADV_SIZE 24
tass picotcp@tass.be 149:5f4cb161cec3 20 #define PICO_ICMP6HDR_ROUTER_SOL_SIZE 8
tass picotcp@tass.be 149:5f4cb161cec3 21 #define PICO_ICMP6HDR_ROUTER_ADV_SIZE 16
tass picotcp@tass.be 149:5f4cb161cec3 22 #define PICO_ICMP6HDR_REDIRECT_SIZE 40
tass picotcp@tass.be 149:5f4cb161cec3 23
tass picotcp@tass.be 149:5f4cb161cec3 24 /* ICMP types */
tass picotcp@tass.be 149:5f4cb161cec3 25 #define PICO_ICMP6_DEST_UNREACH 1
tass picotcp@tass.be 149:5f4cb161cec3 26 #define PICO_ICMP6_PKT_TOO_BIG 2
tass picotcp@tass.be 149:5f4cb161cec3 27 #define PICO_ICMP6_TIME_EXCEEDED 3
tass picotcp@tass.be 149:5f4cb161cec3 28 #define PICO_ICMP6_PARAM_PROBLEM 4
tass picotcp@tass.be 149:5f4cb161cec3 29 #define PICO_ICMP6_ECHO_REQUEST 128
tass picotcp@tass.be 149:5f4cb161cec3 30 #define PICO_ICMP6_ECHO_REPLY 129
tass picotcp@tass.be 149:5f4cb161cec3 31 #define PICO_ICMP6_ROUTER_SOL 133
tass picotcp@tass.be 149:5f4cb161cec3 32 #define PICO_ICMP6_ROUTER_ADV 134
tass picotcp@tass.be 149:5f4cb161cec3 33 #define PICO_ICMP6_NEIGH_SOL 135
tass picotcp@tass.be 149:5f4cb161cec3 34 #define PICO_ICMP6_NEIGH_ADV 136
tass picotcp@tass.be 149:5f4cb161cec3 35 #define PICO_ICMP6_REDIRECT 137
tass picotcp@tass.be 149:5f4cb161cec3 36
tass picotcp@tass.be 149:5f4cb161cec3 37 /* destination unreachable codes */
tass picotcp@tass.be 149:5f4cb161cec3 38 #define PICO_ICMP6_UNREACH_NOROUTE 0
tass picotcp@tass.be 149:5f4cb161cec3 39 #define PICO_ICMP6_UNREACH_ADMIN 1
tass picotcp@tass.be 149:5f4cb161cec3 40 #define PICO_ICMP6_UNREACH_SRCSCOPE 2
tass picotcp@tass.be 149:5f4cb161cec3 41 #define PICO_ICMP6_UNREACH_ADDR 3
tass picotcp@tass.be 149:5f4cb161cec3 42 #define PICO_ICMP6_UNREACH_PORT 4
tass picotcp@tass.be 149:5f4cb161cec3 43 #define PICO_ICMP6_UNREACH_SRCFILTER 5
tass picotcp@tass.be 149:5f4cb161cec3 44 #define PICO_ICMP6_UNREACH_REJROUTE 6
tass picotcp@tass.be 149:5f4cb161cec3 45
tass picotcp@tass.be 149:5f4cb161cec3 46 /* time exceeded codes */
tass picotcp@tass.be 149:5f4cb161cec3 47 #define PICO_ICMP6_TIMXCEED_INTRANS 0
tass picotcp@tass.be 149:5f4cb161cec3 48 #define PICO_ICMP6_TIMXCEED_REASS 1
tass picotcp@tass.be 149:5f4cb161cec3 49
tass picotcp@tass.be 149:5f4cb161cec3 50 /* parameter problem codes */
tass picotcp@tass.be 149:5f4cb161cec3 51 #define PICO_ICMP6_PARAMPROB_HDRFIELD 0
tass picotcp@tass.be 149:5f4cb161cec3 52 #define PICO_ICMP6_PARAMPROB_NXTHDR 1
tass picotcp@tass.be 149:5f4cb161cec3 53 #define PICO_ICMP6_PARAMPROB_IPV6OPT 2
tass picotcp@tass.be 149:5f4cb161cec3 54
tass picotcp@tass.be 149:5f4cb161cec3 55 /* ping error codes */
tass picotcp@tass.be 149:5f4cb161cec3 56 #define PICO_PING6_ERR_REPLIED 0
tass picotcp@tass.be 149:5f4cb161cec3 57 #define PICO_PING6_ERR_TIMEOUT 1
tass picotcp@tass.be 149:5f4cb161cec3 58 #define PICO_PING6_ERR_UNREACH 2
tass picotcp@tass.be 149:5f4cb161cec3 59 #define PICO_PING6_ERR_PENDING 0xFFFF
tass picotcp@tass.be 149:5f4cb161cec3 60
tass picotcp@tass.be 149:5f4cb161cec3 61 /* custom defines */
tass picotcp@tass.be 149:5f4cb161cec3 62 #define PICO_ICMP6_ND_UNICAST 0
tass picotcp@tass.be 149:5f4cb161cec3 63 #define PICO_ICMP6_ND_ANYCAST 1
tass picotcp@tass.be 149:5f4cb161cec3 64 #define PICO_ICMP6_ND_SOLICITED 2
tass picotcp@tass.be 149:5f4cb161cec3 65 #define PICO_ICMP6_ND_DAD 3
tass picotcp@tass.be 149:5f4cb161cec3 66
tass picotcp@tass.be 149:5f4cb161cec3 67 #define PICO_ICMP6_MAX_RTR_SOL_DELAY 1000
tass picotcp@tass.be 149:5f4cb161cec3 68
tass picotcp@tass.be 149:5f4cb161cec3 69 #define PICO_SIZE_ICMP6HDR ((sizeof(struct pico_icmp6_hdr)))
tass picotcp@tass.be 149:5f4cb161cec3 70
tass picotcp@tass.be 149:5f4cb161cec3 71 extern struct pico_protocol pico_proto_icmp6;
tass picotcp@tass.be 149:5f4cb161cec3 72
tass picotcp@tass.be 149:5f4cb161cec3 73 PACKED_STRUCT_DEF pico_icmp6_hdr {
tass picotcp@tass.be 149:5f4cb161cec3 74 uint8_t type;
tass picotcp@tass.be 149:5f4cb161cec3 75 uint8_t code;
tass picotcp@tass.be 149:5f4cb161cec3 76 uint16_t crc;
tass picotcp@tass.be 149:5f4cb161cec3 77
tass picotcp@tass.be 149:5f4cb161cec3 78 union icmp6_msg_u {
tass picotcp@tass.be 149:5f4cb161cec3 79 /* error messages */
tass picotcp@tass.be 149:5f4cb161cec3 80 union icmp6_err_u {
tass picotcp@tass.be 149:5f4cb161cec3 81 struct {
tass picotcp@tass.be 149:5f4cb161cec3 82 uint32_t unused;
tass picotcp@tass.be 149:5f4cb161cec3 83 uint8_t data[0];
tass picotcp@tass.be 149:5f4cb161cec3 84 } dest_unreach;
tass picotcp@tass.be 149:5f4cb161cec3 85 struct {
tass picotcp@tass.be 149:5f4cb161cec3 86 uint32_t mtu;
tass picotcp@tass.be 149:5f4cb161cec3 87 uint8_t data[0];
tass picotcp@tass.be 149:5f4cb161cec3 88 } pkt_too_big;
tass picotcp@tass.be 149:5f4cb161cec3 89 struct {
tass picotcp@tass.be 149:5f4cb161cec3 90 uint32_t unused;
tass picotcp@tass.be 149:5f4cb161cec3 91 uint8_t data[0];
tass picotcp@tass.be 149:5f4cb161cec3 92 } time_exceeded;
tass picotcp@tass.be 149:5f4cb161cec3 93 struct {
tass picotcp@tass.be 149:5f4cb161cec3 94 uint32_t ptr;
tass picotcp@tass.be 149:5f4cb161cec3 95 uint8_t data[0];
tass picotcp@tass.be 149:5f4cb161cec3 96 } param_problem;
tass picotcp@tass.be 149:5f4cb161cec3 97 } err;
tass picotcp@tass.be 149:5f4cb161cec3 98
tass picotcp@tass.be 149:5f4cb161cec3 99 /* informational messages */
tass picotcp@tass.be 149:5f4cb161cec3 100 union icmp6_info_u {
tass picotcp@tass.be 149:5f4cb161cec3 101 struct {
tass picotcp@tass.be 149:5f4cb161cec3 102 uint16_t id;
tass picotcp@tass.be 149:5f4cb161cec3 103 uint16_t seq;
tass picotcp@tass.be 149:5f4cb161cec3 104 uint8_t data[0];
tass picotcp@tass.be 149:5f4cb161cec3 105 } echo_request;
tass picotcp@tass.be 149:5f4cb161cec3 106 struct {
tass picotcp@tass.be 149:5f4cb161cec3 107 uint16_t id;
tass picotcp@tass.be 149:5f4cb161cec3 108 uint16_t seq;
tass picotcp@tass.be 149:5f4cb161cec3 109 uint8_t data[0];
tass picotcp@tass.be 149:5f4cb161cec3 110 } echo_reply;
tass picotcp@tass.be 149:5f4cb161cec3 111 struct {
tass picotcp@tass.be 149:5f4cb161cec3 112 uint32_t unused;
tass picotcp@tass.be 149:5f4cb161cec3 113 uint8_t options[0];
tass picotcp@tass.be 149:5f4cb161cec3 114 } router_sol;
tass picotcp@tass.be 149:5f4cb161cec3 115 struct {
tass picotcp@tass.be 149:5f4cb161cec3 116 uint8_t hop;
tass picotcp@tass.be 149:5f4cb161cec3 117 uint8_t mor;
tass picotcp@tass.be 149:5f4cb161cec3 118 uint16_t life_time;
tass picotcp@tass.be 149:5f4cb161cec3 119 uint32_t reachable_time;
tass picotcp@tass.be 149:5f4cb161cec3 120 uint32_t retrans_time;
tass picotcp@tass.be 149:5f4cb161cec3 121 uint8_t options[0];
tass picotcp@tass.be 149:5f4cb161cec3 122 } router_adv;
tass picotcp@tass.be 149:5f4cb161cec3 123 struct {
tass picotcp@tass.be 149:5f4cb161cec3 124 uint32_t unused;
tass picotcp@tass.be 149:5f4cb161cec3 125 struct pico_ip6 target;
tass picotcp@tass.be 149:5f4cb161cec3 126 uint8_t options[0];
tass picotcp@tass.be 149:5f4cb161cec3 127 } neigh_sol;
tass picotcp@tass.be 149:5f4cb161cec3 128 struct {
tass picotcp@tass.be 149:5f4cb161cec3 129 uint32_t rsor;
tass picotcp@tass.be 149:5f4cb161cec3 130 struct pico_ip6 target;
tass picotcp@tass.be 149:5f4cb161cec3 131 uint8_t options[0];
tass picotcp@tass.be 149:5f4cb161cec3 132 } neigh_adv;
tass picotcp@tass.be 149:5f4cb161cec3 133 struct {
tass picotcp@tass.be 149:5f4cb161cec3 134 uint32_t reserved;
tass picotcp@tass.be 149:5f4cb161cec3 135 struct pico_ip6 target;
tass picotcp@tass.be 149:5f4cb161cec3 136 struct pico_ip6 dest;
tass picotcp@tass.be 149:5f4cb161cec3 137 uint8_t options[0];
tass picotcp@tass.be 149:5f4cb161cec3 138 } redirect;
tass picotcp@tass.be 149:5f4cb161cec3 139 } info;
tass picotcp@tass.be 149:5f4cb161cec3 140 } msg;
tass picotcp@tass.be 149:5f4cb161cec3 141 };
tass picotcp@tass.be 149:5f4cb161cec3 142
tass picotcp@tass.be 149:5f4cb161cec3 143 PACKED_STRUCT_DEF pico_icmp6_opt_lladdr
tass picotcp@tass.be 149:5f4cb161cec3 144 {
tass picotcp@tass.be 149:5f4cb161cec3 145 uint8_t type;
tass picotcp@tass.be 149:5f4cb161cec3 146 uint8_t len;
tass picotcp@tass.be 149:5f4cb161cec3 147 union icmp6_opt_hw_addr_u {
tass picotcp@tass.be 149:5f4cb161cec3 148 struct pico_eth mac;
tass picotcp@tass.be 149:5f4cb161cec3 149 } addr;
tass picotcp@tass.be 149:5f4cb161cec3 150 };
tass picotcp@tass.be 149:5f4cb161cec3 151
tass picotcp@tass.be 149:5f4cb161cec3 152 PACKED_STRUCT_DEF pico_icmp6_opt_prefix
tass picotcp@tass.be 149:5f4cb161cec3 153 {
tass picotcp@tass.be 149:5f4cb161cec3 154 uint8_t type;
tass picotcp@tass.be 149:5f4cb161cec3 155 uint8_t len;
tass picotcp@tass.be 149:5f4cb161cec3 156 uint8_t prefix_len;
tass picotcp@tass.be 149:5f4cb161cec3 157 uint8_t res : 6;
tass picotcp@tass.be 149:5f4cb161cec3 158 uint8_t aac : 1;
tass picotcp@tass.be 149:5f4cb161cec3 159 uint8_t onlink : 1;
tass picotcp@tass.be 149:5f4cb161cec3 160 uint32_t val_lifetime;
tass picotcp@tass.be 149:5f4cb161cec3 161 uint32_t pref_lifetime;
tass picotcp@tass.be 149:5f4cb161cec3 162 uint32_t reserved;
tass picotcp@tass.be 149:5f4cb161cec3 163 struct pico_ip6 prefix;
tass picotcp@tass.be 149:5f4cb161cec3 164 };
tass picotcp@tass.be 149:5f4cb161cec3 165
tass picotcp@tass.be 149:5f4cb161cec3 166 PACKED_STRUCT_DEF pico_icmp6_opt_mtu
tass picotcp@tass.be 149:5f4cb161cec3 167 {
tass picotcp@tass.be 149:5f4cb161cec3 168 uint8_t type;
tass picotcp@tass.be 149:5f4cb161cec3 169 uint8_t len;
tass picotcp@tass.be 149:5f4cb161cec3 170 uint16_t res;
tass picotcp@tass.be 149:5f4cb161cec3 171 uint32_t mtu;
tass picotcp@tass.be 149:5f4cb161cec3 172 };
tass picotcp@tass.be 149:5f4cb161cec3 173
tass picotcp@tass.be 149:5f4cb161cec3 174 PACKED_STRUCT_DEF pico_icmp6_opt_redirect
tass picotcp@tass.be 149:5f4cb161cec3 175 {
tass picotcp@tass.be 149:5f4cb161cec3 176 uint8_t type;
tass picotcp@tass.be 149:5f4cb161cec3 177 uint8_t len;
tass picotcp@tass.be 149:5f4cb161cec3 178 uint16_t res0;
tass picotcp@tass.be 149:5f4cb161cec3 179 uint32_t res1;
tass picotcp@tass.be 149:5f4cb161cec3 180 uint8_t data[0];
tass picotcp@tass.be 149:5f4cb161cec3 181 };
tass picotcp@tass.be 149:5f4cb161cec3 182
tass picotcp@tass.be 149:5f4cb161cec3 183 PACKED_STRUCT_DEF pico_icmp6_opt_na
tass picotcp@tass.be 149:5f4cb161cec3 184 {
tass picotcp@tass.be 149:5f4cb161cec3 185 uint8_t type;
tass picotcp@tass.be 149:5f4cb161cec3 186 uint8_t len;
tass picotcp@tass.be 149:5f4cb161cec3 187 uint8_t options[0];
tass picotcp@tass.be 149:5f4cb161cec3 188 };
tass picotcp@tass.be 149:5f4cb161cec3 189
tass picotcp@tass.be 149:5f4cb161cec3 190 struct pico_icmp6_stats
tass picotcp@tass.be 149:5f4cb161cec3 191 {
tass picotcp@tass.be 149:5f4cb161cec3 192 unsigned long size;
tass picotcp@tass.be 149:5f4cb161cec3 193 unsigned long seq;
tass picotcp@tass.be 149:5f4cb161cec3 194 pico_time time;
tass picotcp@tass.be 149:5f4cb161cec3 195 unsigned long ttl;
tass picotcp@tass.be 149:5f4cb161cec3 196 int err;
tass picotcp@tass.be 149:5f4cb161cec3 197 struct pico_ip6 dst;
tass picotcp@tass.be 149:5f4cb161cec3 198 };
tass picotcp@tass.be 149:5f4cb161cec3 199
tass picotcp@tass.be 149:5f4cb161cec3 200 int pico_icmp6_ping(char *dst, int count, int interval, int timeout, int size, void (*cb)(struct pico_icmp6_stats *));
tass picotcp@tass.be 149:5f4cb161cec3 201
tass picotcp@tass.be 149:5f4cb161cec3 202 int pico_icmp6_neighbor_solicitation(struct pico_device *dev, struct pico_ip6 *dst, uint8_t type);
tass picotcp@tass.be 149:5f4cb161cec3 203 int pico_icmp6_neighbor_advertisement(struct pico_frame *f, struct pico_ip6 *target);
tass picotcp@tass.be 149:5f4cb161cec3 204 int pico_icmp6_router_solicitation(struct pico_device *dev, struct pico_ip6 *src);
tass picotcp@tass.be 149:5f4cb161cec3 205
tass picotcp@tass.be 149:5f4cb161cec3 206 int pico_icmp6_port_unreachable(struct pico_frame *f);
tass picotcp@tass.be 149:5f4cb161cec3 207 int pico_icmp6_proto_unreachable(struct pico_frame *f);
tass picotcp@tass.be 149:5f4cb161cec3 208 int pico_icmp6_dest_unreachable(struct pico_frame *f);
tass picotcp@tass.be 149:5f4cb161cec3 209 int pico_icmp6_ttl_expired(struct pico_frame *f);
tass picotcp@tass.be 149:5f4cb161cec3 210 int pico_icmp6_packet_filtered(struct pico_frame *f);
tass picotcp@tass.be 149:5f4cb161cec3 211
tass picotcp@tass.be 149:5f4cb161cec3 212 uint16_t pico_icmp6_checksum(struct pico_frame *f);
tass picotcp@tass.be 149:5f4cb161cec3 213
tass picotcp@tass.be 149:5f4cb161cec3 214 #endif