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
Parent:
131:4758606c9316
Child:
152:a3d286bf94e5
Update from git masterbranch

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 .
tass 68:0847e35d08a6 6
TASS Belgium NV 131:4758606c9316 7 *********************************************************************/
tass picotcp@tass.be 149:5f4cb161cec3 8 #ifndef INCLUDE_PICO_DHCP_COMMON
tass picotcp@tass.be 149:5f4cb161cec3 9 #define INCLUDE_PICO_DHCP_COMMON
tass picotcp@tass.be 149:5f4cb161cec3 10 #include "pico_config.h"
tass 68:0847e35d08a6 11 #include "pico_addressing.h"
tass 68:0847e35d08a6 12
tass 68:0847e35d08a6 13 #define PICO_DHCPD_PORT (short_be(67))
tass 68:0847e35d08a6 14 #define PICO_DHCP_CLIENT_PORT (short_be(68))
tass 68:0847e35d08a6 15 #define PICO_DHCPD_MAGIC_COOKIE (long_be(0x63825363))
tass 68:0847e35d08a6 16 #define PICO_DHCP_HTYPE_ETH 1
tass 68:0847e35d08a6 17
tass 68:0847e35d08a6 18 /* flags */
tass 68:0847e35d08a6 19 #define PICO_DHCP_FLAG_BROADCAST 0x8000
tass 68:0847e35d08a6 20
tass 68:0847e35d08a6 21 /* options */
tass 68:0847e35d08a6 22 #define PICO_DHCP_OPT_PAD 0x00
tass 68:0847e35d08a6 23 #define PICO_DHCP_OPT_NETMASK 0x01
tass 68:0847e35d08a6 24 #define PICO_DHCP_OPT_TIME 0x02
tass 68:0847e35d08a6 25 #define PICO_DHCP_OPT_ROUTER 0x03
tass 68:0847e35d08a6 26 #define PICO_DHCP_OPT_DNS 0x06
tass 68:0847e35d08a6 27 #define PICO_DHCP_OPT_HOSTNAME 0x0c
tass 68:0847e35d08a6 28 #define PICO_DHCP_OPT_DOMAINNAME 0x0f
tass 68:0847e35d08a6 29 #define PICO_DHCP_OPT_MTU 0x1a
tass 68:0847e35d08a6 30 #define PICO_DHCP_OPT_BROADCAST 0x1c
tass 68:0847e35d08a6 31 #define PICO_DHCP_OPT_NETBIOSNS 0x2c
tass 68:0847e35d08a6 32 #define PICO_DHCP_OPT_NETBIOSSCOPE 0x2f
tass 68:0847e35d08a6 33 #define PICO_DHCP_OPT_REQIP 0x32
tass 68:0847e35d08a6 34 #define PICO_DHCP_OPT_LEASETIME 0x33
tass 68:0847e35d08a6 35 #define PICO_DHCP_OPT_OPTOVERLOAD 0x34
tass 68:0847e35d08a6 36 #define PICO_DHCP_OPT_MSGTYPE 0x35
tass 68:0847e35d08a6 37 #define PICO_DHCP_OPT_SERVERID 0x36
tass 68:0847e35d08a6 38 #define PICO_DHCP_OPT_PARAMLIST 0x37
tass 68:0847e35d08a6 39 #define PICO_DHCP_OPT_MESSAGE 0x38
tass 68:0847e35d08a6 40 #define PICO_DHCP_OPT_MAXMSGSIZE 0x39
tass 68:0847e35d08a6 41 #define PICO_DHCP_OPT_RENEWALTIME 0x3a
tass 68:0847e35d08a6 42 #define PICO_DHCP_OPT_REBINDINGTIME 0x3b
tass 68:0847e35d08a6 43 #define PICO_DHCP_OPT_VENDORID 0x3c
tass 68:0847e35d08a6 44 #define PICO_DHCP_OPT_CLIENTID 0x3d
tass 68:0847e35d08a6 45 #define PICO_DHCP_OPT_DOMAINSEARCH 0x77
tass 68:0847e35d08a6 46 #define PICO_DHCP_OPT_STATICROUTE 0x79
tass 68:0847e35d08a6 47 #define PICO_DHCP_OPT_END 0xFF
tass 68:0847e35d08a6 48
tass 68:0847e35d08a6 49 /* options len */
tass 68:0847e35d08a6 50 #define PICO_DHCP_OPTLEN_HDR 2 /* account for code and len field */
tass 68:0847e35d08a6 51 #define PICO_DHCP_OPTLEN_NETMASK 6
tass 68:0847e35d08a6 52 #define PICO_DHCP_OPTLEN_ROUTER 6
tass 68:0847e35d08a6 53 #define PICO_DHCP_OPTLEN_DNS 6
tass 68:0847e35d08a6 54 #define PICO_DHCP_OPTLEN_BROADCAST 6
tass 68:0847e35d08a6 55 #define PICO_DHCP_OPTLEN_REQIP 6
tass 68:0847e35d08a6 56 #define PICO_DHCP_OPTLEN_LEASETIME 6
tass 68:0847e35d08a6 57 #define PICO_DHCP_OPTLEN_OPTOVERLOAD 3
tass 68:0847e35d08a6 58 #define PICO_DHCP_OPTLEN_MSGTYPE 3
tass 68:0847e35d08a6 59 #define PICO_DHCP_OPTLEN_SERVERID 6
tass 68:0847e35d08a6 60 #define PICO_DHCP_OPTLEN_PARAMLIST 8 /* PicoTCP specific */
tass 68:0847e35d08a6 61 #define PICO_DHCP_OPTLEN_MAXMSGSIZE 4
tass 68:0847e35d08a6 62 #define PICO_DHCP_OPTLEN_RENEWALTIME 6
tass 68:0847e35d08a6 63 #define PICO_DHCP_OPTLEN_REBINDINGTIME 6
tass 68:0847e35d08a6 64 #define PICO_DHCP_OPTLEN_END 1
tass 68:0847e35d08a6 65
tass 68:0847e35d08a6 66 /* op codes */
tass 68:0847e35d08a6 67 #define PICO_DHCP_OP_REQUEST 1
tass 68:0847e35d08a6 68 #define PICO_DHCP_OP_REPLY 2
tass 68:0847e35d08a6 69
tass 68:0847e35d08a6 70 /* rfc message types */
tass 68:0847e35d08a6 71 #define PICO_DHCP_MSG_DISCOVER 1
tass 68:0847e35d08a6 72 #define PICO_DHCP_MSG_OFFER 2
tass 68:0847e35d08a6 73 #define PICO_DHCP_MSG_REQUEST 3
tass 68:0847e35d08a6 74 #define PICO_DHCP_MSG_DECLINE 4
tass 68:0847e35d08a6 75 #define PICO_DHCP_MSG_ACK 5
tass 68:0847e35d08a6 76 #define PICO_DHCP_MSG_NAK 6
tass 68:0847e35d08a6 77 #define PICO_DHCP_MSG_RELEASE 7
tass 68:0847e35d08a6 78 #define PICO_DHCP_MSG_INFORM 8
tass 68:0847e35d08a6 79
tass 68:0847e35d08a6 80 /* custom message types */
tass 68:0847e35d08a6 81 #define PICO_DHCP_EVENT_T1 9
tass 68:0847e35d08a6 82 #define PICO_DHCP_EVENT_T2 10
tass 68:0847e35d08a6 83 #define PICO_DHCP_EVENT_LEASE 11
tass 68:0847e35d08a6 84 #define PICO_DHCP_EVENT_RETRANSMIT 12
tass 68:0847e35d08a6 85
tass picotcp@tass.be 149:5f4cb161cec3 86 PACKED_STRUCT_DEF pico_dhcp_hdr
tass 68:0847e35d08a6 87 {
TASS Belgium NV 131:4758606c9316 88 uint8_t op;
TASS Belgium NV 131:4758606c9316 89 uint8_t htype;
TASS Belgium NV 131:4758606c9316 90 uint8_t hlen;
TASS Belgium NV 131:4758606c9316 91 uint8_t hops; /* zero */
TASS Belgium NV 131:4758606c9316 92 uint32_t xid; /* store this in the request */
TASS Belgium NV 131:4758606c9316 93 uint16_t secs; /* ignore */
TASS Belgium NV 131:4758606c9316 94 uint16_t flags;
TASS Belgium NV 131:4758606c9316 95 uint32_t ciaddr; /* client address - if asking for renewal */
TASS Belgium NV 131:4758606c9316 96 uint32_t yiaddr; /* your address (client) */
TASS Belgium NV 131:4758606c9316 97 uint32_t siaddr; /* dhcp offered address */
TASS Belgium NV 131:4758606c9316 98 uint32_t giaddr; /* relay agent, bootp. */
TASS Belgium NV 131:4758606c9316 99 uint8_t hwaddr[6];
TASS Belgium NV 131:4758606c9316 100 uint8_t hwaddr_padding[10];
TASS Belgium NV 131:4758606c9316 101 char hostname[64];
TASS Belgium NV 131:4758606c9316 102 char bootp_filename[128];
TASS Belgium NV 131:4758606c9316 103 uint32_t dhcp_magic;
tass picotcp@tass.be 149:5f4cb161cec3 104 uint8_t options[0];
tass 68:0847e35d08a6 105 };
tass 68:0847e35d08a6 106
tass picotcp@tass.be 149:5f4cb161cec3 107 PACKED_STRUCT_DEF pico_dhcp_opt
tass 68:0847e35d08a6 108 {
TASS Belgium NV 131:4758606c9316 109 uint8_t code;
TASS Belgium NV 131:4758606c9316 110 uint8_t len;
tass picotcp@tass.be 149:5f4cb161cec3 111 union dhcp_opt_ext_u {
TASS Belgium NV 131:4758606c9316 112 struct {
TASS Belgium NV 131:4758606c9316 113 struct pico_ip4 ip;
TASS Belgium NV 131:4758606c9316 114 } netmask;
TASS Belgium NV 131:4758606c9316 115 struct {
TASS Belgium NV 131:4758606c9316 116 struct pico_ip4 ip;
TASS Belgium NV 131:4758606c9316 117 } router;
TASS Belgium NV 131:4758606c9316 118 struct {
TASS Belgium NV 131:4758606c9316 119 struct pico_ip4 ip;
TASS Belgium NV 131:4758606c9316 120 } dns;
TASS Belgium NV 131:4758606c9316 121 struct {
TASS Belgium NV 131:4758606c9316 122 struct pico_ip4 ip;
TASS Belgium NV 131:4758606c9316 123 } broadcast;
TASS Belgium NV 131:4758606c9316 124 struct {
TASS Belgium NV 131:4758606c9316 125 struct pico_ip4 ip;
TASS Belgium NV 131:4758606c9316 126 } req_ip;
TASS Belgium NV 131:4758606c9316 127 struct {
TASS Belgium NV 131:4758606c9316 128 uint32_t time;
TASS Belgium NV 131:4758606c9316 129 } lease_time;
TASS Belgium NV 131:4758606c9316 130 struct {
TASS Belgium NV 131:4758606c9316 131 uint8_t value;
TASS Belgium NV 131:4758606c9316 132 } opt_overload;
TASS Belgium NV 131:4758606c9316 133 struct {
TASS Belgium NV 131:4758606c9316 134 char name[1];
TASS Belgium NV 131:4758606c9316 135 } tftp_server;
TASS Belgium NV 131:4758606c9316 136 struct {
TASS Belgium NV 131:4758606c9316 137 char name[1];
TASS Belgium NV 131:4758606c9316 138 } bootfile;
TASS Belgium NV 131:4758606c9316 139 struct {
TASS Belgium NV 131:4758606c9316 140 uint8_t type;
TASS Belgium NV 131:4758606c9316 141 } msg_type;
TASS Belgium NV 131:4758606c9316 142 struct {
TASS Belgium NV 131:4758606c9316 143 struct pico_ip4 ip;
TASS Belgium NV 131:4758606c9316 144 } server_id;
TASS Belgium NV 131:4758606c9316 145 struct {
TASS Belgium NV 131:4758606c9316 146 uint8_t code[1];
TASS Belgium NV 131:4758606c9316 147 } param_list;
TASS Belgium NV 131:4758606c9316 148 struct {
TASS Belgium NV 131:4758606c9316 149 char error[1];
TASS Belgium NV 131:4758606c9316 150 } message;
TASS Belgium NV 131:4758606c9316 151 struct {
TASS Belgium NV 131:4758606c9316 152 uint16_t size;
TASS Belgium NV 131:4758606c9316 153 } max_msg_size;
TASS Belgium NV 131:4758606c9316 154 struct {
TASS Belgium NV 131:4758606c9316 155 uint32_t time;
TASS Belgium NV 131:4758606c9316 156 } renewal_time;
TASS Belgium NV 131:4758606c9316 157 struct {
TASS Belgium NV 131:4758606c9316 158 uint32_t time;
TASS Belgium NV 131:4758606c9316 159 } rebinding_time;
TASS Belgium NV 131:4758606c9316 160 struct {
TASS Belgium NV 131:4758606c9316 161 uint8_t id[1];
TASS Belgium NV 131:4758606c9316 162 } vendor_id;
TASS Belgium NV 131:4758606c9316 163 struct {
TASS Belgium NV 131:4758606c9316 164 uint8_t id[1];
TASS Belgium NV 131:4758606c9316 165 } client_id;
TASS Belgium NV 131:4758606c9316 166 } ext;
tass 68:0847e35d08a6 167 };
tass 68:0847e35d08a6 168
tass 68:0847e35d08a6 169 uint8_t dhcp_get_next_option(uint8_t *begin, uint8_t *data, int *len, uint8_t **nextopt);
tass 68:0847e35d08a6 170 struct pico_dhcp_opt *pico_dhcp_next_option(struct pico_dhcp_opt **ptr);
tass 70:cd218dd180e5 171 uint8_t pico_dhcp_are_options_valid(void *ptr, int32_t len);
tass 68:0847e35d08a6 172
tass 70:cd218dd180e5 173 uint8_t pico_dhcp_opt_netmask(void *ptr, struct pico_ip4 *ip);
tass 70:cd218dd180e5 174 uint8_t pico_dhcp_opt_router(void *ptr, struct pico_ip4 *ip);
tass 70:cd218dd180e5 175 uint8_t pico_dhcp_opt_dns(void *ptr, struct pico_ip4 *ip);
tass 70:cd218dd180e5 176 uint8_t pico_dhcp_opt_broadcast(void *ptr, struct pico_ip4 *ip);
tass 70:cd218dd180e5 177 uint8_t pico_dhcp_opt_reqip(void *ptr, struct pico_ip4 *ip);
tass 70:cd218dd180e5 178 uint8_t pico_dhcp_opt_leasetime(void *ptr, uint32_t time);
tass 70:cd218dd180e5 179 uint8_t pico_dhcp_opt_msgtype(void *ptr, uint8_t type);
tass 70:cd218dd180e5 180 uint8_t pico_dhcp_opt_serverid(void *ptr, struct pico_ip4 *ip);
tass 70:cd218dd180e5 181 uint8_t pico_dhcp_opt_paramlist(void *ptr);
tass 70:cd218dd180e5 182 uint8_t pico_dhcp_opt_maxmsgsize(void *ptr, uint16_t size);
tass 70:cd218dd180e5 183 uint8_t pico_dhcp_opt_end(void *ptr);
tass 68:0847e35d08a6 184 #endif