LwIP with PPP & Ethernet integration

Dependents:   NetworkingCoreLib

This is the mbed port of the LwIP stack: http://savannah.nongnu.org/projects/lwip/

It includes contributed content from NXP's port for LPCxxxx devices: http://www.lpcware.com/content/project/lightweight-ip-lwip-networking-stack

Licence

LwIP is licenced under the BSD licence:

Copyright (c) 2001-2004 Swedish Institute of Computer Science. 
All rights reserved. 
Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met: 
1. Redistributions of source code must retain the above copyright notice, 
this list of conditions and the following disclaimer. 
2. Redistributions in binary form must reproduce the above copyright notice, 
this list of conditions and the following disclaimer in the documentation 
and/or other materials provided with the distribution. 
3. The name of the author may not be used to endorse or promote products 
derived from this software without specific prior written permission. 
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
Committer:
donatien
Date:
Thu May 24 15:53:48 2012 +0000
Revision:
0:8e01dca41002
Merge with Emilio's LwIp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:8e01dca41002 1 /*
donatien 0:8e01dca41002 2 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
donatien 0:8e01dca41002 3 * All rights reserved.
donatien 0:8e01dca41002 4 *
donatien 0:8e01dca41002 5 * Redistribution and use in source and binary forms, with or without modification,
donatien 0:8e01dca41002 6 * are permitted provided that the following conditions are met:
donatien 0:8e01dca41002 7 *
donatien 0:8e01dca41002 8 * 1. Redistributions of source code must retain the above copyright notice,
donatien 0:8e01dca41002 9 * this list of conditions and the following disclaimer.
donatien 0:8e01dca41002 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
donatien 0:8e01dca41002 11 * this list of conditions and the following disclaimer in the documentation
donatien 0:8e01dca41002 12 * and/or other materials provided with the distribution.
donatien 0:8e01dca41002 13 * 3. The name of the author may not be used to endorse or promote products
donatien 0:8e01dca41002 14 * derived from this software without specific prior written permission.
donatien 0:8e01dca41002 15 *
donatien 0:8e01dca41002 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
donatien 0:8e01dca41002 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
donatien 0:8e01dca41002 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
donatien 0:8e01dca41002 19 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
donatien 0:8e01dca41002 20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
donatien 0:8e01dca41002 21 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
donatien 0:8e01dca41002 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
donatien 0:8e01dca41002 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
donatien 0:8e01dca41002 24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
donatien 0:8e01dca41002 25 * OF SUCH DAMAGE.
donatien 0:8e01dca41002 26 *
donatien 0:8e01dca41002 27 * This file is part of the lwIP TCP/IP stack.
donatien 0:8e01dca41002 28 *
donatien 0:8e01dca41002 29 * Author: Adam Dunkels <adam@sics.se>
donatien 0:8e01dca41002 30 *
donatien 0:8e01dca41002 31 */
donatien 0:8e01dca41002 32 #ifndef __LWIP_IP_H__
donatien 0:8e01dca41002 33 #define __LWIP_IP_H__
donatien 0:8e01dca41002 34
donatien 0:8e01dca41002 35 #include "lwip/opt.h"
donatien 0:8e01dca41002 36
donatien 0:8e01dca41002 37 #include "lwip/def.h"
donatien 0:8e01dca41002 38 #include "lwip/pbuf.h"
donatien 0:8e01dca41002 39 #include "lwip/ip_addr.h"
donatien 0:8e01dca41002 40 #include "lwip/err.h"
donatien 0:8e01dca41002 41 #include "lwip/netif.h"
donatien 0:8e01dca41002 42
donatien 0:8e01dca41002 43 #ifdef __cplusplus
donatien 0:8e01dca41002 44 extern "C" {
donatien 0:8e01dca41002 45 #endif
donatien 0:8e01dca41002 46
donatien 0:8e01dca41002 47 /** Currently, the function ip_output_if_opt() is only used with IGMP */
donatien 0:8e01dca41002 48 #define IP_OPTIONS_SEND LWIP_IGMP
donatien 0:8e01dca41002 49
donatien 0:8e01dca41002 50 #define IP_HLEN 20
donatien 0:8e01dca41002 51
donatien 0:8e01dca41002 52 #define IP_PROTO_ICMP 1
donatien 0:8e01dca41002 53 #define IP_PROTO_IGMP 2
donatien 0:8e01dca41002 54 #define IP_PROTO_UDP 17
donatien 0:8e01dca41002 55 #define IP_PROTO_UDPLITE 136
donatien 0:8e01dca41002 56 #define IP_PROTO_TCP 6
donatien 0:8e01dca41002 57
donatien 0:8e01dca41002 58 /* This is passed as the destination address to ip_output_if (not
donatien 0:8e01dca41002 59 to ip_output), meaning that an IP header already is constructed
donatien 0:8e01dca41002 60 in the pbuf. This is used when TCP retransmits. */
donatien 0:8e01dca41002 61 #ifdef IP_HDRINCL
donatien 0:8e01dca41002 62 #undef IP_HDRINCL
donatien 0:8e01dca41002 63 #endif /* IP_HDRINCL */
donatien 0:8e01dca41002 64 #define IP_HDRINCL NULL
donatien 0:8e01dca41002 65
donatien 0:8e01dca41002 66 #if LWIP_NETIF_HWADDRHINT
donatien 0:8e01dca41002 67 #define IP_PCB_ADDRHINT ;u8_t addr_hint
donatien 0:8e01dca41002 68 #else
donatien 0:8e01dca41002 69 #define IP_PCB_ADDRHINT
donatien 0:8e01dca41002 70 #endif /* LWIP_NETIF_HWADDRHINT */
donatien 0:8e01dca41002 71
donatien 0:8e01dca41002 72 /* This is the common part of all PCB types. It needs to be at the
donatien 0:8e01dca41002 73 beginning of a PCB type definition. It is located here so that
donatien 0:8e01dca41002 74 changes to this common part are made in one location instead of
donatien 0:8e01dca41002 75 having to change all PCB structs. */
donatien 0:8e01dca41002 76 #define IP_PCB \
donatien 0:8e01dca41002 77 /* ip addresses in network byte order */ \
donatien 0:8e01dca41002 78 ip_addr_t local_ip; \
donatien 0:8e01dca41002 79 ip_addr_t remote_ip; \
donatien 0:8e01dca41002 80 /* Socket options */ \
donatien 0:8e01dca41002 81 u8_t so_options; \
donatien 0:8e01dca41002 82 /* Type Of Service */ \
donatien 0:8e01dca41002 83 u8_t tos; \
donatien 0:8e01dca41002 84 /* Time To Live */ \
donatien 0:8e01dca41002 85 u8_t ttl \
donatien 0:8e01dca41002 86 /* link layer address resolution hint */ \
donatien 0:8e01dca41002 87 IP_PCB_ADDRHINT
donatien 0:8e01dca41002 88
donatien 0:8e01dca41002 89 struct ip_pcb {
donatien 0:8e01dca41002 90 /* Common members of all PCB types */
donatien 0:8e01dca41002 91 IP_PCB;
donatien 0:8e01dca41002 92 };
donatien 0:8e01dca41002 93
donatien 0:8e01dca41002 94 /*
donatien 0:8e01dca41002 95 * Option flags per-socket. These are the same like SO_XXX.
donatien 0:8e01dca41002 96 */
donatien 0:8e01dca41002 97 /*#define SOF_DEBUG (u8_t)0x01U Unimplemented: turn on debugging info recording */
donatien 0:8e01dca41002 98 #define SOF_ACCEPTCONN (u8_t)0x02U /* socket has had listen() */
donatien 0:8e01dca41002 99 #define SOF_REUSEADDR (u8_t)0x04U /* allow local address reuse */
donatien 0:8e01dca41002 100 #define SOF_KEEPALIVE (u8_t)0x08U /* keep connections alive */
donatien 0:8e01dca41002 101 /*#define SOF_DONTROUTE (u8_t)0x10U Unimplemented: just use interface addresses */
donatien 0:8e01dca41002 102 #define SOF_BROADCAST (u8_t)0x20U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
donatien 0:8e01dca41002 103 /*#define SOF_USELOOPBACK (u8_t)0x40U Unimplemented: bypass hardware when possible */
donatien 0:8e01dca41002 104 #define SOF_LINGER (u8_t)0x80U /* linger on close if data present */
donatien 0:8e01dca41002 105 /*#define SOF_OOBINLINE (u16_t)0x0100U Unimplemented: leave received OOB data in line */
donatien 0:8e01dca41002 106 /*#define SOF_REUSEPORT (u16_t)0x0200U Unimplemented: allow local address & port reuse */
donatien 0:8e01dca41002 107
donatien 0:8e01dca41002 108 /* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */
donatien 0:8e01dca41002 109 #define SOF_INHERITED (SOF_REUSEADDR|SOF_KEEPALIVE|SOF_LINGER/*|SOF_DEBUG|SOF_DONTROUTE|SOF_OOBINLINE*/)
donatien 0:8e01dca41002 110
donatien 0:8e01dca41002 111
donatien 0:8e01dca41002 112 #ifdef PACK_STRUCT_USE_INCLUDES
donatien 0:8e01dca41002 113 # include "arch/bpstruct.h"
donatien 0:8e01dca41002 114 #endif
donatien 0:8e01dca41002 115 PACK_STRUCT_BEGIN
donatien 0:8e01dca41002 116 struct ip_hdr {
donatien 0:8e01dca41002 117 /* version / header length / type of service */
donatien 0:8e01dca41002 118 PACK_STRUCT_FIELD(u16_t _v_hl_tos);
donatien 0:8e01dca41002 119 /* total length */
donatien 0:8e01dca41002 120 PACK_STRUCT_FIELD(u16_t _len);
donatien 0:8e01dca41002 121 /* identification */
donatien 0:8e01dca41002 122 PACK_STRUCT_FIELD(u16_t _id);
donatien 0:8e01dca41002 123 /* fragment offset field */
donatien 0:8e01dca41002 124 PACK_STRUCT_FIELD(u16_t _offset);
donatien 0:8e01dca41002 125 #define IP_RF 0x8000U /* reserved fragment flag */
donatien 0:8e01dca41002 126 #define IP_DF 0x4000U /* dont fragment flag */
donatien 0:8e01dca41002 127 #define IP_MF 0x2000U /* more fragments flag */
donatien 0:8e01dca41002 128 #define IP_OFFMASK 0x1fffU /* mask for fragmenting bits */
donatien 0:8e01dca41002 129 /* time to live */
donatien 0:8e01dca41002 130 PACK_STRUCT_FIELD(u8_t _ttl);
donatien 0:8e01dca41002 131 /* protocol*/
donatien 0:8e01dca41002 132 PACK_STRUCT_FIELD(u8_t _proto);
donatien 0:8e01dca41002 133 /* checksum */
donatien 0:8e01dca41002 134 PACK_STRUCT_FIELD(u16_t _chksum);
donatien 0:8e01dca41002 135 /* source and destination IP addresses */
donatien 0:8e01dca41002 136 PACK_STRUCT_FIELD(ip_addr_p_t src);
donatien 0:8e01dca41002 137 PACK_STRUCT_FIELD(ip_addr_p_t dest);
donatien 0:8e01dca41002 138 } PACK_STRUCT_STRUCT;
donatien 0:8e01dca41002 139 PACK_STRUCT_END
donatien 0:8e01dca41002 140 #ifdef PACK_STRUCT_USE_INCLUDES
donatien 0:8e01dca41002 141 # include "arch/epstruct.h"
donatien 0:8e01dca41002 142 #endif
donatien 0:8e01dca41002 143
donatien 0:8e01dca41002 144 #define IPH_V(hdr) (ntohs((hdr)->_v_hl_tos) >> 12)
donatien 0:8e01dca41002 145 #define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f)
donatien 0:8e01dca41002 146 #define IPH_TOS(hdr) (ntohs((hdr)->_v_hl_tos) & 0xff)
donatien 0:8e01dca41002 147 #define IPH_LEN(hdr) ((hdr)->_len)
donatien 0:8e01dca41002 148 #define IPH_ID(hdr) ((hdr)->_id)
donatien 0:8e01dca41002 149 #define IPH_OFFSET(hdr) ((hdr)->_offset)
donatien 0:8e01dca41002 150 #define IPH_TTL(hdr) ((hdr)->_ttl)
donatien 0:8e01dca41002 151 #define IPH_PROTO(hdr) ((hdr)->_proto)
donatien 0:8e01dca41002 152 #define IPH_CHKSUM(hdr) ((hdr)->_chksum)
donatien 0:8e01dca41002 153
donatien 0:8e01dca41002 154 #define IPH_VHLTOS_SET(hdr, v, hl, tos) (hdr)->_v_hl_tos = (htons(((v) << 12) | ((hl) << 8) | (tos)))
donatien 0:8e01dca41002 155 #define IPH_LEN_SET(hdr, len) (hdr)->_len = (len)
donatien 0:8e01dca41002 156 #define IPH_ID_SET(hdr, id) (hdr)->_id = (id)
donatien 0:8e01dca41002 157 #define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off)
donatien 0:8e01dca41002 158 #define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl)
donatien 0:8e01dca41002 159 #define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto)
donatien 0:8e01dca41002 160 #define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum)
donatien 0:8e01dca41002 161
donatien 0:8e01dca41002 162 /** The interface that provided the packet for the current callback invocation. */
donatien 0:8e01dca41002 163 extern struct netif *current_netif;
donatien 0:8e01dca41002 164 /** Header of the input packet currently being processed. */
donatien 0:8e01dca41002 165 extern const struct ip_hdr *current_header;
donatien 0:8e01dca41002 166 /** Source IP address of current_header */
donatien 0:8e01dca41002 167 extern ip_addr_t current_iphdr_src;
donatien 0:8e01dca41002 168 /** Destination IP address of current_header */
donatien 0:8e01dca41002 169 extern ip_addr_t current_iphdr_dest;
donatien 0:8e01dca41002 170
donatien 0:8e01dca41002 171 #define ip_init() /* Compatibility define, not init needed. */
donatien 0:8e01dca41002 172 struct netif *ip_route(ip_addr_t *dest);
donatien 0:8e01dca41002 173 err_t ip_input(struct pbuf *p, struct netif *inp);
donatien 0:8e01dca41002 174 err_t ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
donatien 0:8e01dca41002 175 u8_t ttl, u8_t tos, u8_t proto);
donatien 0:8e01dca41002 176 err_t ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
donatien 0:8e01dca41002 177 u8_t ttl, u8_t tos, u8_t proto,
donatien 0:8e01dca41002 178 struct netif *netif);
donatien 0:8e01dca41002 179 #if LWIP_NETIF_HWADDRHINT
donatien 0:8e01dca41002 180 err_t ip_output_hinted(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
donatien 0:8e01dca41002 181 u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint);
donatien 0:8e01dca41002 182 #endif /* LWIP_NETIF_HWADDRHINT */
donatien 0:8e01dca41002 183 #if IP_OPTIONS_SEND
donatien 0:8e01dca41002 184 err_t ip_output_if_opt(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
donatien 0:8e01dca41002 185 u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
donatien 0:8e01dca41002 186 u16_t optlen);
donatien 0:8e01dca41002 187 #endif /* IP_OPTIONS_SEND */
donatien 0:8e01dca41002 188 /** Get the interface that received the current packet.
donatien 0:8e01dca41002 189 * This function must only be called from a receive callback (udp_recv,
donatien 0:8e01dca41002 190 * raw_recv, tcp_accept). It will return NULL otherwise. */
donatien 0:8e01dca41002 191 #define ip_current_netif() (current_netif)
donatien 0:8e01dca41002 192 /** Get the IP header of the current packet.
donatien 0:8e01dca41002 193 * This function must only be called from a receive callback (udp_recv,
donatien 0:8e01dca41002 194 * raw_recv, tcp_accept). It will return NULL otherwise. */
donatien 0:8e01dca41002 195 #define ip_current_header() (current_header)
donatien 0:8e01dca41002 196 /** Source IP address of current_header */
donatien 0:8e01dca41002 197 #define ip_current_src_addr() (&current_iphdr_src)
donatien 0:8e01dca41002 198 /** Destination IP address of current_header */
donatien 0:8e01dca41002 199 #define ip_current_dest_addr() (&current_iphdr_dest)
donatien 0:8e01dca41002 200
donatien 0:8e01dca41002 201 #if IP_DEBUG
donatien 0:8e01dca41002 202 void ip_debug_print(struct pbuf *p);
donatien 0:8e01dca41002 203 #else
donatien 0:8e01dca41002 204 #define ip_debug_print(p)
donatien 0:8e01dca41002 205 #endif /* IP_DEBUG */
donatien 0:8e01dca41002 206
donatien 0:8e01dca41002 207 #ifdef __cplusplus
donatien 0:8e01dca41002 208 }
donatien 0:8e01dca41002 209 #endif
donatien 0:8e01dca41002 210
donatien 0:8e01dca41002 211 #endif /* __LWIP_IP_H__ */
donatien 0:8e01dca41002 212
donatien 0:8e01dca41002 213