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