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:
Thu Jan 28 15:12:00 2016 +0100
Revision:
155:a70f34550c34
Parent:
154:6c0e92a80c4a
Adding TCP flag for FIN.

Who changed what in which revision?

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