Replace lwip SDK blob with lwip 1.4.1 upstream source
Compiles but won't work yet
This commit is contained in:
parent
496c5a8330
commit
806962d5c7
75 changed files with 1203 additions and 13257 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "lwip/lwip"]
|
||||||
|
path = lwip/lwip
|
||||||
|
url = git://git.savannah.nongnu.org/lwip.git
|
|
@ -70,7 +70,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "esp_common.h"
|
#include "espressif/esp8266/ets_sys.h"
|
||||||
|
#include <stdint.h>
|
||||||
#include <xtruntime.h>
|
#include <xtruntime.h>
|
||||||
#include "xtensa_rtos.h"
|
#include "xtensa_rtos.h"
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ OBJCOPY = $(CROSS)objcopy
|
||||||
|
|
||||||
# Source components to compile and link. Each of these are subdirectories
|
# Source components to compile and link. Each of these are subdirectories
|
||||||
# of the root, with a 'component.mk' file.
|
# of the root, with a 'component.mk' file.
|
||||||
COMPONENTS ?= FreeRTOS
|
COMPONENTS ?= FreeRTOS lwip
|
||||||
|
|
||||||
# libraries to link, mainly blobs provided by the esp-iot-rtos SDK
|
# libraries to link, mainly blobs provided by the esp-iot-rtos SDK
|
||||||
LIBS ?= gcc json main net80211 phy pp ssl udhcp wpa hal
|
LIBS ?= gcc json main net80211 phy pp ssl udhcp wpa hal
|
||||||
|
|
|
@ -84,7 +84,7 @@
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 100 )
|
#define configTICK_RATE_HZ ( ( portTickType ) 100 )
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 15 )
|
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 15 )
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short )156 )
|
#define configMINIMAL_STACK_SIZE ( ( unsigned short )156 )
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 32 * 1024 ) )
|
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 24 * 1024 ) )
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||||
#define configUSE_TRACE_FACILITY 0
|
#define configUSE_TRACE_FACILITY 0
|
||||||
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
|
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
#include "esp_common.h"
|
#include "espressif/esp_common.h"
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
#include "lwip/sockets.h"
|
#include "lwip/sockets.h"
|
||||||
#include "lwip/dns.h"
|
#include "lwip/sys.h"
|
||||||
#include "lwip/netdb.h"
|
#include "lwip/netdb.h"
|
||||||
|
#include "lwip/dns.h"
|
||||||
|
|
||||||
#include "espressif/blob_prototypes.h"
|
#include "espressif/blob_prototypes.h"
|
||||||
|
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001, 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. Neither the name of the Institute nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE OR CONTRIBUTORS 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_CC_H__
|
|
||||||
#define __ARCH_CC_H__
|
|
||||||
|
|
||||||
#define EFAULT 14
|
|
||||||
|
|
||||||
#define LWIP_PROVIDE_ERRNO
|
|
||||||
|
|
||||||
#if (1)
|
|
||||||
#define BYTE_ORDER LITTLE_ENDIAN
|
|
||||||
#else
|
|
||||||
#define BYTE_ORDER BIG_ENDIAN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef unsigned char u8_t;
|
|
||||||
typedef signed char s8_t;
|
|
||||||
typedef unsigned short u16_t;
|
|
||||||
typedef signed short s16_t;
|
|
||||||
typedef unsigned long u32_t;
|
|
||||||
typedef signed long s32_t;
|
|
||||||
typedef unsigned long mem_ptr_t;
|
|
||||||
typedef int sys_prot_t;
|
|
||||||
|
|
||||||
#define S16_F "d"
|
|
||||||
#define U16_F "d"
|
|
||||||
#define X16_F "x"
|
|
||||||
|
|
||||||
#define S32_F "d"
|
|
||||||
#define U32_F "d"
|
|
||||||
#define X32_F "x"
|
|
||||||
|
|
||||||
//#define PACK_STRUCT_FIELD(x) x __attribute__((packed))
|
|
||||||
#define PACK_STRUCT_FIELD(x) x
|
|
||||||
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
|
||||||
#define PACK_STRUCT_BEGIN
|
|
||||||
#define PACK_STRUCT_END
|
|
||||||
|
|
||||||
//#define LWIP_DEBUG
|
|
||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
#define LWIP_PLATFORM_DIAG(x) do {os_printf x;} while(0)
|
|
||||||
#define LWIP_PLATFORM_ASSERT(x) do {os_printf(x); sys_arch_assert(__FILE__, __LINE__);} while(0)
|
|
||||||
#else
|
|
||||||
#define LWIP_PLATFORM_DIAG(x)
|
|
||||||
#define LWIP_PLATFORM_ASSERT(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LWIP_PLATFORM_BYTESWAP
|
|
||||||
#define LWIP_PLATFORM_BYTESWAP 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LWIP_PLATFORM_HTONS(_n) ((u16_t)((((_n) & 0xff) << 8) | (((_n) >> 8) & 0xff)))
|
|
||||||
#define LWIP_PLATFORM_HTONL(_n) ((u32_t)( (((_n) & 0xff) << 24) | (((_n) & 0xff00) << 8) | (((_n) >> 8) & 0xff00) | (((_n) >> 24) & 0xff) ))
|
|
||||||
|
|
||||||
#endif /* __ARCH_CC_H__ */
|
|
|
@ -1,118 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* AutoIP Automatic LinkLocal IP Configuration
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Author: Dominik Spies <kontakt@dspies.de>
|
|
||||||
*
|
|
||||||
* This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform
|
|
||||||
* with RFC 3927.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Dominik Spies
|
|
||||||
* <kontakt@dspies.de>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_AUTOIP_H__
|
|
||||||
#define __LWIP_AUTOIP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/udp.h"
|
|
||||||
#include "netif/etharp.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* AutoIP Timing */
|
|
||||||
#define AUTOIP_TMR_INTERVAL 100
|
|
||||||
#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL)
|
|
||||||
|
|
||||||
/* RFC 3927 Constants */
|
|
||||||
#define PROBE_WAIT 1 /* second (initial random delay) */
|
|
||||||
#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */
|
|
||||||
#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */
|
|
||||||
#define PROBE_NUM 3 /* (number of probe packets) */
|
|
||||||
#define ANNOUNCE_NUM 2 /* (number of announcement packets) */
|
|
||||||
#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */
|
|
||||||
#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */
|
|
||||||
#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */
|
|
||||||
#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */
|
|
||||||
#define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */
|
|
||||||
|
|
||||||
/* AutoIP client states */
|
|
||||||
#define AUTOIP_STATE_OFF 0
|
|
||||||
#define AUTOIP_STATE_PROBING 1
|
|
||||||
#define AUTOIP_STATE_ANNOUNCING 2
|
|
||||||
#define AUTOIP_STATE_BOUND 3
|
|
||||||
|
|
||||||
struct autoip
|
|
||||||
{
|
|
||||||
ip_addr_t llipaddr; /* the currently selected, probed, announced or used LL IP-Address */
|
|
||||||
u8_t state; /* current AutoIP state machine state */
|
|
||||||
u8_t sent_num; /* sent number of probes or announces, dependent on state */
|
|
||||||
u16_t ttw; /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */
|
|
||||||
u8_t lastconflict; /* ticks until a conflict can be solved by defending */
|
|
||||||
u8_t tried_llipaddr; /* total number of probed/used Link Local IP-Addresses */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define autoip_init() /* Compatibility define, no init needed. */
|
|
||||||
|
|
||||||
/** Set a struct autoip allocated by the application to work with */
|
|
||||||
void autoip_set_struct(struct netif *netif, struct autoip *autoip);
|
|
||||||
|
|
||||||
/** Start AutoIP client */
|
|
||||||
err_t autoip_start(struct netif *netif);
|
|
||||||
|
|
||||||
/** Stop AutoIP client */
|
|
||||||
err_t autoip_stop(struct netif *netif);
|
|
||||||
|
|
||||||
/** Handles every incoming ARP Packet, called by etharp_arp_input */
|
|
||||||
void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
|
|
||||||
|
|
||||||
/** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */
|
|
||||||
void autoip_tmr(void);
|
|
||||||
|
|
||||||
/** Handle a possible change in the network configuration */
|
|
||||||
void autoip_network_changed(struct netif *netif);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_AUTOIP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_AUTOIP_H__ */
|
|
|
@ -1,125 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_ICMP_H__
|
|
||||||
#define __LWIP_ICMP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_ICMP6
|
|
||||||
#include "lwip/icmp6.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ICMP_ER 0 /* echo reply */
|
|
||||||
#define ICMP_DUR 3 /* destination unreachable */
|
|
||||||
#define ICMP_SQ 4 /* source quench */
|
|
||||||
#define ICMP_RD 5 /* redirect */
|
|
||||||
#define ICMP_ECHO 8 /* echo */
|
|
||||||
#define ICMP_TE 11 /* time exceeded */
|
|
||||||
#define ICMP_PP 12 /* parameter problem */
|
|
||||||
#define ICMP_TS 13 /* timestamp */
|
|
||||||
#define ICMP_TSR 14 /* timestamp reply */
|
|
||||||
#define ICMP_IRQ 15 /* information request */
|
|
||||||
#define ICMP_IR 16 /* information reply */
|
|
||||||
|
|
||||||
enum icmp_dur_type {
|
|
||||||
ICMP_DUR_NET = 0, /* net unreachable */
|
|
||||||
ICMP_DUR_HOST = 1, /* host unreachable */
|
|
||||||
ICMP_DUR_PROTO = 2, /* protocol unreachable */
|
|
||||||
ICMP_DUR_PORT = 3, /* port unreachable */
|
|
||||||
ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */
|
|
||||||
ICMP_DUR_SR = 5 /* source route failed */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum icmp_te_type {
|
|
||||||
ICMP_TE_TTL = 0, /* time to live exceeded in transit */
|
|
||||||
ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
/** This is the standard ICMP header only that the u32_t data
|
|
||||||
* is splitted to two u16_t like ICMP echo needs it.
|
|
||||||
* This header is also used for other ICMP types that do not
|
|
||||||
* use the data part.
|
|
||||||
*/
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct icmp_echo_hdr {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u16_t id);
|
|
||||||
PACK_STRUCT_FIELD(u16_t seqno);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ICMPH_TYPE(hdr) ((hdr)->type)
|
|
||||||
#define ICMPH_CODE(hdr) ((hdr)->code)
|
|
||||||
|
|
||||||
/** Combines type and code to an u16_t */
|
|
||||||
#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t))
|
|
||||||
#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c))
|
|
||||||
|
|
||||||
|
|
||||||
#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
void icmp_input(struct pbuf *p, struct netif *inp);
|
|
||||||
void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
|
|
||||||
void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);
|
|
||||||
|
|
||||||
#endif /* LWIP_ICMP */
|
|
||||||
|
|
||||||
#if (LWIP_IPV6 && LWIP_ICMP6)
|
|
||||||
#define icmp_port_unreach(isipv6, pbuf) ((isipv6) ? \
|
|
||||||
icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT) : \
|
|
||||||
icmp_dest_unreach(pbuf, ICMP_DUR_PORT))
|
|
||||||
#elif LWIP_ICMP
|
|
||||||
#define icmp_port_unreach(isipv6, pbuf) icmp_dest_unreach(pbuf, ICMP_DUR_PORT)
|
|
||||||
#else /* (LWIP_IPV6 && LWIP_ICMP6) || LWIP_ICMP*/
|
|
||||||
#define icmp_port_unreach(isipv6, pbuf)
|
|
||||||
#endif /* (LWIP_IPV6 && LWIP_ICMP6) || LWIP_ICMP*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_ICMP_H__ */
|
|
|
@ -1,106 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2002 CITEL Technologies Ltd.
|
|
||||||
* 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. Neither the name of CITEL Technologies Ltd nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``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 CITEL TECHNOLOGIES OR CONTRIBUTORS 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.
|
|
||||||
*
|
|
||||||
* This file is a contribution to the lwIP TCP/IP stack.
|
|
||||||
* The Swedish Institute of Computer Science and Adam Dunkels
|
|
||||||
* are specifically granted permission to redistribute this
|
|
||||||
* source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_IGMP_H__
|
|
||||||
#define __LWIP_IGMP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
|
|
||||||
#if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* IGMP timer */
|
|
||||||
#define IGMP_TMR_INTERVAL 100 /* Milliseconds */
|
|
||||||
#define IGMP_V1_DELAYING_MEMBER_TMR (1000/IGMP_TMR_INTERVAL)
|
|
||||||
#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL)
|
|
||||||
|
|
||||||
/* MAC Filter Actions, these are passed to a netif's
|
|
||||||
* igmp_mac_filter callback function. */
|
|
||||||
#define IGMP_DEL_MAC_FILTER 0
|
|
||||||
#define IGMP_ADD_MAC_FILTER 1
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* igmp group structure - there is
|
|
||||||
* a list of groups for each interface
|
|
||||||
* these should really be linked from the interface, but
|
|
||||||
* if we keep them separate we will not affect the lwip original code
|
|
||||||
* too much
|
|
||||||
*
|
|
||||||
* There will be a group for the all systems group address but this
|
|
||||||
* will not run the state machine as it is used to kick off reports
|
|
||||||
* from all the other groups
|
|
||||||
*/
|
|
||||||
struct igmp_group {
|
|
||||||
/** next link */
|
|
||||||
struct igmp_group *next;
|
|
||||||
/** interface on which the group is active */
|
|
||||||
struct netif *netif;
|
|
||||||
/** multicast address */
|
|
||||||
ip_addr_t group_address;
|
|
||||||
/** signifies we were the last person to report */
|
|
||||||
u8_t last_reporter_flag;
|
|
||||||
/** current state of the group */
|
|
||||||
u8_t group_state;
|
|
||||||
/** timer for reporting, negative is OFF */
|
|
||||||
u16_t timer;
|
|
||||||
/** counter of simultaneous uses */
|
|
||||||
u8_t use;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Prototypes */
|
|
||||||
void igmp_init(void);
|
|
||||||
err_t igmp_start(struct netif *netif);
|
|
||||||
err_t igmp_stop(struct netif *netif);
|
|
||||||
void igmp_report_groups(struct netif *netif);
|
|
||||||
struct igmp_group *igmp_lookfor_group(struct netif *ifp, ip_addr_t *addr);
|
|
||||||
void igmp_input(struct pbuf *p, struct netif *inp, ip_addr_t *dest);
|
|
||||||
err_t igmp_joingroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr);
|
|
||||||
err_t igmp_leavegroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr);
|
|
||||||
void igmp_tmr(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_IGMP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_IGMP_H__ */
|
|
|
@ -1,112 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_INET_H__
|
|
||||||
#define __LWIP_INET_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED
|
|
||||||
to prevent this code from redefining it. */
|
|
||||||
#if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED)
|
|
||||||
typedef u32_t in_addr_t;
|
|
||||||
#endif
|
|
||||||
/** For compatibility with BSD code */
|
|
||||||
struct in_addr {
|
|
||||||
in_addr_t s_addr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** 255.255.255.255 */
|
|
||||||
#define INADDR_NONE IPADDR_NONE
|
|
||||||
/** 127.0.0.1 */
|
|
||||||
#define INADDR_LOOPBACK IPADDR_LOOPBACK
|
|
||||||
/** 0.0.0.0 */
|
|
||||||
#define INADDR_ANY IPADDR_ANY
|
|
||||||
/** 255.255.255.255 */
|
|
||||||
#define INADDR_BROADCAST IPADDR_BROADCAST
|
|
||||||
|
|
||||||
/* Definitions of the bits in an Internet address integer.
|
|
||||||
|
|
||||||
On subnets, host and network parts are found according to
|
|
||||||
the subnet mask, not these masks. */
|
|
||||||
#define IN_CLASSA(a) IP_CLASSA(a)
|
|
||||||
#define IN_CLASSA_NET IP_CLASSA_NET
|
|
||||||
#define IN_CLASSA_NSHIFT IP_CLASSA_NSHIFT
|
|
||||||
#define IN_CLASSA_HOST IP_CLASSA_HOST
|
|
||||||
#define IN_CLASSA_MAX IP_CLASSA_MAX
|
|
||||||
|
|
||||||
#define IN_CLASSB(b) IP_CLASSB(b)
|
|
||||||
#define IN_CLASSB_NET IP_CLASSB_NET
|
|
||||||
#define IN_CLASSB_NSHIFT IP_CLASSB_NSHIFT
|
|
||||||
#define IN_CLASSB_HOST IP_CLASSB_HOST
|
|
||||||
#define IN_CLASSB_MAX IP_CLASSB_MAX
|
|
||||||
|
|
||||||
#define IN_CLASSC(c) IP_CLASSC(c)
|
|
||||||
#define IN_CLASSC_NET IP_CLASSC_NET
|
|
||||||
#define IN_CLASSC_NSHIFT IP_CLASSC_NSHIFT
|
|
||||||
#define IN_CLASSC_HOST IP_CLASSC_HOST
|
|
||||||
#define IN_CLASSC_MAX IP_CLASSC_MAX
|
|
||||||
|
|
||||||
#define IN_CLASSD(d) IP_CLASSD(d)
|
|
||||||
#define IN_CLASSD_NET IP_CLASSD_NET /* These ones aren't really */
|
|
||||||
#define IN_CLASSD_NSHIFT IP_CLASSD_NSHIFT /* net and host fields, but */
|
|
||||||
#define IN_CLASSD_HOST IP_CLASSD_HOST /* routing needn't know. */
|
|
||||||
#define IN_CLASSD_MAX IP_CLASSD_MAX
|
|
||||||
|
|
||||||
#define IN_MULTICAST(a) IP_MULTICAST(a)
|
|
||||||
|
|
||||||
#define IN_EXPERIMENTAL(a) IP_EXPERIMENTAL(a)
|
|
||||||
#define IN_BADCLASS(a) IP_BADCLASS(a)
|
|
||||||
|
|
||||||
#define IN_LOOPBACKNET IP_LOOPBACKNET
|
|
||||||
|
|
||||||
#define inet_addr_from_ipaddr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
|
|
||||||
#define inet_addr_to_ipaddr(target_ipaddr, source_inaddr) (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))
|
|
||||||
/* ATTENTION: the next define only works because both s_addr and ip_addr_t are an u32_t effectively! */
|
|
||||||
#define inet_addr_to_ipaddr_p(target_ipaddr_p, source_inaddr) ((target_ipaddr_p) = (ip_addr_t*)&((source_inaddr)->s_addr))
|
|
||||||
|
|
||||||
/* directly map this to the lwip internal functions */
|
|
||||||
#define inet_addr(cp) ipaddr_addr(cp)
|
|
||||||
#define inet_aton(cp, addr) ipaddr_aton(cp, (ip_addr_t*)addr)
|
|
||||||
#define inet_ntoa(addr) ipaddr_ntoa((ip_addr_t*)&(addr))
|
|
||||||
#define inet_ntoa_r(addr, buf, buflen) ipaddr_ntoa_r((ip_addr_t*)&(addr), buf, buflen)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_INET_H__ */
|
|
|
@ -1,146 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_IP4_H__
|
|
||||||
#define __LWIP_IP4_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Currently, the function ip_output_if_opt() is only used with IGMP */
|
|
||||||
#define IP_OPTIONS_SEND LWIP_IGMP
|
|
||||||
|
|
||||||
#define IP_HLEN 20
|
|
||||||
|
|
||||||
#define IP_PROTO_ICMP 1
|
|
||||||
#define IP_PROTO_IGMP 2
|
|
||||||
#define IP_PROTO_UDP 17
|
|
||||||
#define IP_PROTO_UDPLITE 136
|
|
||||||
#define IP_PROTO_TCP 6
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip_hdr {
|
|
||||||
/* version / header length */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _v_hl);
|
|
||||||
/* type of service */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _tos);
|
|
||||||
/* total length */
|
|
||||||
PACK_STRUCT_FIELD(u16_t _len);
|
|
||||||
/* identification */
|
|
||||||
PACK_STRUCT_FIELD(u16_t _id);
|
|
||||||
/* fragment offset field */
|
|
||||||
PACK_STRUCT_FIELD(u16_t _offset);
|
|
||||||
#define IP_RF 0x8000U /* reserved fragment flag */
|
|
||||||
#define IP_DF 0x4000U /* dont fragment flag */
|
|
||||||
#define IP_MF 0x2000U /* more fragments flag */
|
|
||||||
#define IP_OFFMASK 0x1fffU /* mask for fragmenting bits */
|
|
||||||
/* time to live */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _ttl);
|
|
||||||
/* protocol*/
|
|
||||||
PACK_STRUCT_FIELD(u8_t _proto);
|
|
||||||
/* checksum */
|
|
||||||
PACK_STRUCT_FIELD(u16_t _chksum);
|
|
||||||
/* source and destination IP addresses */
|
|
||||||
PACK_STRUCT_FIELD(ip_addr_p_t src);
|
|
||||||
PACK_STRUCT_FIELD(ip_addr_p_t dest);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define IPH_V(hdr) ((hdr)->_v_hl >> 4)
|
|
||||||
#define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f)
|
|
||||||
#define IPH_TOS(hdr) ((hdr)->_tos)
|
|
||||||
#define IPH_LEN(hdr) ((hdr)->_len)
|
|
||||||
#define IPH_ID(hdr) ((hdr)->_id)
|
|
||||||
#define IPH_OFFSET(hdr) ((hdr)->_offset)
|
|
||||||
#define IPH_TTL(hdr) ((hdr)->_ttl)
|
|
||||||
#define IPH_PROTO(hdr) ((hdr)->_proto)
|
|
||||||
#define IPH_CHKSUM(hdr) ((hdr)->_chksum)
|
|
||||||
|
|
||||||
#define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (((v) << 4) | (hl))
|
|
||||||
#define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos)
|
|
||||||
#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len)
|
|
||||||
#define IPH_ID_SET(hdr, id) (hdr)->_id = (id)
|
|
||||||
#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off)
|
|
||||||
#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl)
|
|
||||||
#define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto)
|
|
||||||
#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum)
|
|
||||||
|
|
||||||
|
|
||||||
#define ip_init() /* Compatibility define, no init needed. */
|
|
||||||
struct netif *ip_route(ip_addr_t *dest);
|
|
||||||
err_t ip_input(struct pbuf *p, struct netif *inp);
|
|
||||||
err_t ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
|
||||||
u8_t ttl, u8_t tos, u8_t proto);
|
|
||||||
err_t ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
|
||||||
u8_t ttl, u8_t tos, u8_t proto,
|
|
||||||
struct netif *netif);
|
|
||||||
#if LWIP_NETIF_HWADDRHINT
|
|
||||||
err_t ip_output_hinted(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
|
||||||
u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint);
|
|
||||||
#endif /* LWIP_NETIF_HWADDRHINT */
|
|
||||||
#if IP_OPTIONS_SEND
|
|
||||||
err_t ip_output_if_opt(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
|
||||||
u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
|
|
||||||
u16_t optlen);
|
|
||||||
#endif /* IP_OPTIONS_SEND */
|
|
||||||
|
|
||||||
#define ip_netif_get_local_ipX(netif) (((netif) != NULL) ? ip_2_ipX(&((netif)->ip_addr)) : NULL)
|
|
||||||
|
|
||||||
#if IP_DEBUG
|
|
||||||
void ip_debug_print(struct pbuf *p);
|
|
||||||
#else
|
|
||||||
#define ip_debug_print(p)
|
|
||||||
#endif /* IP_DEBUG */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP_H__ */
|
|
||||||
|
|
||||||
|
|
|
@ -1,244 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_IP4_ADDR_H__
|
|
||||||
#define __LWIP_IP4_ADDR_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This is the aligned version of ip_addr_t,
|
|
||||||
used as local variable, on the stack, etc. */
|
|
||||||
struct ip_addr {
|
|
||||||
u32_t addr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* This is the packed version of ip_addr_t,
|
|
||||||
used in network headers that are itself packed */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip_addr_packed {
|
|
||||||
PACK_STRUCT_FIELD(u32_t addr);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** ip_addr_t uses a struct for convenience only, so that the same defines can
|
|
||||||
* operate both on ip_addr_t as well as on ip_addr_p_t. */
|
|
||||||
typedef struct ip_addr ip_addr_t;
|
|
||||||
typedef struct ip_addr_packed ip_addr_p_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* struct ipaddr2 is used in the definition of the ARP packet format in
|
|
||||||
* order to support compilers that don't have structure packing.
|
|
||||||
*/
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip_addr2 {
|
|
||||||
PACK_STRUCT_FIELD(u16_t addrw[2]);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Forward declaration to not include netif.h */
|
|
||||||
struct netif;
|
|
||||||
|
|
||||||
extern const ip_addr_t ip_addr_any;
|
|
||||||
extern const ip_addr_t ip_addr_broadcast;
|
|
||||||
|
|
||||||
/** IP_ADDR_ can be used as a fixed IP address
|
|
||||||
* for the wildcard and the broadcast address
|
|
||||||
*/
|
|
||||||
#define IP_ADDR_ANY ((ip_addr_t *)&ip_addr_any)
|
|
||||||
#define IP_ADDR_BROADCAST ((ip_addr_t *)&ip_addr_broadcast)
|
|
||||||
|
|
||||||
/** 255.255.255.255 */
|
|
||||||
#define IPADDR_NONE ((u32_t)0xffffffffUL)
|
|
||||||
/** 127.0.0.1 */
|
|
||||||
#define IPADDR_LOOPBACK ((u32_t)0x7f000001UL)
|
|
||||||
/** 0.0.0.0 */
|
|
||||||
#define IPADDR_ANY ((u32_t)0x00000000UL)
|
|
||||||
/** 255.255.255.255 */
|
|
||||||
#define IPADDR_BROADCAST ((u32_t)0xffffffffUL)
|
|
||||||
|
|
||||||
/* Definitions of the bits in an Internet address integer.
|
|
||||||
|
|
||||||
On subnets, host and network parts are found according to
|
|
||||||
the subnet mask, not these masks. */
|
|
||||||
#define IP_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0)
|
|
||||||
#define IP_CLASSA_NET 0xff000000
|
|
||||||
#define IP_CLASSA_NSHIFT 24
|
|
||||||
#define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET)
|
|
||||||
#define IP_CLASSA_MAX 128
|
|
||||||
|
|
||||||
#define IP_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL)
|
|
||||||
#define IP_CLASSB_NET 0xffff0000
|
|
||||||
#define IP_CLASSB_NSHIFT 16
|
|
||||||
#define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET)
|
|
||||||
#define IP_CLASSB_MAX 65536
|
|
||||||
|
|
||||||
#define IP_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL)
|
|
||||||
#define IP_CLASSC_NET 0xffffff00
|
|
||||||
#define IP_CLASSC_NSHIFT 8
|
|
||||||
#define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET)
|
|
||||||
|
|
||||||
#define IP_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL)
|
|
||||||
#define IP_CLASSD_NET 0xf0000000 /* These ones aren't really */
|
|
||||||
#define IP_CLASSD_NSHIFT 28 /* net and host fields, but */
|
|
||||||
#define IP_CLASSD_HOST 0x0fffffff /* routing needn't know. */
|
|
||||||
#define IP_MULTICAST(a) IP_CLASSD(a)
|
|
||||||
|
|
||||||
#define IP_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
|
|
||||||
#define IP_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
|
|
||||||
|
|
||||||
#define IP_LOOPBACKNET 127 /* official! */
|
|
||||||
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
/** Set an IP address given by the four byte-parts */
|
|
||||||
#define IP4_ADDR(ipaddr, a,b,c,d) \
|
|
||||||
(ipaddr)->addr = ((u32_t)((a) & 0xff) << 24) | \
|
|
||||||
((u32_t)((b) & 0xff) << 16) | \
|
|
||||||
((u32_t)((c) & 0xff) << 8) | \
|
|
||||||
(u32_t)((d) & 0xff)
|
|
||||||
#else
|
|
||||||
/** Set an IP address given by the four byte-parts.
|
|
||||||
Little-endian version that prevents the use of htonl. */
|
|
||||||
#define IP4_ADDR(ipaddr, a,b,c,d) \
|
|
||||||
(ipaddr)->addr = ((u32_t)((d) & 0xff) << 24) | \
|
|
||||||
((u32_t)((c) & 0xff) << 16) | \
|
|
||||||
((u32_t)((b) & 0xff) << 8) | \
|
|
||||||
(u32_t)((a) & 0xff)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** MEMCPY-like copying of IP addresses where addresses are known to be
|
|
||||||
* 16-bit-aligned if the port is correctly configured (so a port could define
|
|
||||||
* this to copying 2 u16_t's) - no NULL-pointer-checking needed. */
|
|
||||||
#ifndef IPADDR2_COPY
|
|
||||||
#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip_addr_t))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Copy IP address - faster than ip_addr_set: no NULL check */
|
|
||||||
#define ip_addr_copy(dest, src) ((dest).addr = (src).addr)
|
|
||||||
/** Safely copy one IP address to another (src may be NULL) */
|
|
||||||
#define ip_addr_set(dest, src) ((dest)->addr = \
|
|
||||||
((src) == NULL ? 0 : \
|
|
||||||
(src)->addr))
|
|
||||||
/** Set complete address to zero */
|
|
||||||
#define ip_addr_set_zero(ipaddr) ((ipaddr)->addr = 0)
|
|
||||||
/** Set address to IPADDR_ANY (no need for htonl()) */
|
|
||||||
#define ip_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY)
|
|
||||||
/** Set address to loopback address */
|
|
||||||
#define ip_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK))
|
|
||||||
/** Safely copy one IP address to another and change byte order
|
|
||||||
* from host- to network-order. */
|
|
||||||
#define ip_addr_set_hton(dest, src) ((dest)->addr = \
|
|
||||||
((src) == NULL ? 0:\
|
|
||||||
htonl((src)->addr)))
|
|
||||||
/** IPv4 only: set the IP address given as an u32_t */
|
|
||||||
#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
|
|
||||||
/** IPv4 only: get the IP address as an u32_t */
|
|
||||||
#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)
|
|
||||||
|
|
||||||
/** Get the network address by combining host address with netmask */
|
|
||||||
#define ip_addr_get_network(target, host, netmask) ((target)->addr = ((host)->addr) & ((netmask)->addr))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine if two address are on the same network.
|
|
||||||
*
|
|
||||||
* @arg addr1 IP address 1
|
|
||||||
* @arg addr2 IP address 2
|
|
||||||
* @arg mask network identifier mask
|
|
||||||
* @return !0 if the network identifiers of both address match
|
|
||||||
*/
|
|
||||||
#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
|
|
||||||
(mask)->addr) == \
|
|
||||||
((addr2)->addr & \
|
|
||||||
(mask)->addr))
|
|
||||||
#define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
|
|
||||||
|
|
||||||
#define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == IPADDR_ANY)
|
|
||||||
|
|
||||||
#define ip_addr_isbroadcast(ipaddr, netif) ip4_addr_isbroadcast((ipaddr)->addr, (netif))
|
|
||||||
u8_t ip4_addr_isbroadcast(u32_t addr, const struct netif *netif);
|
|
||||||
|
|
||||||
#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr)
|
|
||||||
u8_t ip4_addr_netmask_valid(u32_t netmask);
|
|
||||||
|
|
||||||
#define ip_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL))
|
|
||||||
|
|
||||||
#define ip_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))
|
|
||||||
|
|
||||||
#define ip_addr_debug_print(debug, ipaddr) \
|
|
||||||
LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \
|
|
||||||
ipaddr != NULL ? ip4_addr1_16(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? ip4_addr2_16(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? ip4_addr3_16(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? ip4_addr4_16(ipaddr) : 0))
|
|
||||||
|
|
||||||
/* Get one byte from the 4-byte address */
|
|
||||||
#define ip4_addr1(ipaddr) (((u8_t*)(ipaddr))[0])
|
|
||||||
#define ip4_addr2(ipaddr) (((u8_t*)(ipaddr))[1])
|
|
||||||
#define ip4_addr3(ipaddr) (((u8_t*)(ipaddr))[2])
|
|
||||||
#define ip4_addr4(ipaddr) (((u8_t*)(ipaddr))[3])
|
|
||||||
/* These are cast to u16_t, with the intent that they are often arguments
|
|
||||||
* to printf using the U16_F format from cc.h. */
|
|
||||||
#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr))
|
|
||||||
#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr))
|
|
||||||
#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr))
|
|
||||||
#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr))
|
|
||||||
|
|
||||||
/** For backwards compatibility */
|
|
||||||
#define ip_ntoa(ipaddr) ipaddr_ntoa(ipaddr)
|
|
||||||
|
|
||||||
u32_t ipaddr_addr(const char *cp);
|
|
||||||
int ipaddr_aton(const char *cp, ip_addr_t *addr);
|
|
||||||
/** returns ptr to static buffer; not reentrant! */
|
|
||||||
char *ipaddr_ntoa(const ip_addr_t *addr);
|
|
||||||
char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP_ADDR_H__ */
|
|
|
@ -1,91 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Jani Monoses <jani@iv.ro>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_IP_FRAG_H__
|
|
||||||
#define __LWIP_IP_FRAG_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IP_REASSEMBLY
|
|
||||||
/* The IP reassembly timer interval in milliseconds. */
|
|
||||||
#define IP_TMR_INTERVAL 1000
|
|
||||||
|
|
||||||
/* IP reassembly helper struct.
|
|
||||||
* This is exported because memp needs to know the size.
|
|
||||||
*/
|
|
||||||
struct ip_reassdata {
|
|
||||||
struct ip_reassdata *next;
|
|
||||||
struct pbuf *p;
|
|
||||||
struct ip_hdr iphdr;
|
|
||||||
u16_t datagram_len;
|
|
||||||
u8_t flags;
|
|
||||||
u8_t timer;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ip_reass_init(void);
|
|
||||||
void ip_reass_tmr(void);
|
|
||||||
struct pbuf * ip_reass(struct pbuf *p);
|
|
||||||
#endif /* IP_REASSEMBLY */
|
|
||||||
|
|
||||||
#if IP_FRAG
|
|
||||||
#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF
|
|
||||||
/** A custom pbuf that holds a reference to another pbuf, which is freed
|
|
||||||
* when this custom pbuf is freed. This is used to create a custom PBUF_REF
|
|
||||||
* that points into the original pbuf. */
|
|
||||||
#ifndef __LWIP_PBUF_CUSTOM_REF__
|
|
||||||
#define __LWIP_PBUF_CUSTOM_REF__
|
|
||||||
struct pbuf_custom_ref {
|
|
||||||
/** 'base class' */
|
|
||||||
struct pbuf_custom pc;
|
|
||||||
/** pointer to the original pbuf that is referenced */
|
|
||||||
struct pbuf *original;
|
|
||||||
};
|
|
||||||
#endif /* __LWIP_PBUF_CUSTOM_REF__ */
|
|
||||||
#endif /* !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */
|
|
||||||
|
|
||||||
err_t ip_frag(struct pbuf *p, struct netif *netif, ip_addr_t *dest);
|
|
||||||
#endif /* IP_FRAG */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP_FRAG_H__ */
|
|
|
@ -1,58 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* IPv6 address autoconfiguration as per RFC 4862.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
* IPv6 address autoconfiguration as per RFC 4862.
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_IP6_DHCP6_H__
|
|
||||||
#define __LWIP_IP6_DHCP6_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
|
|
||||||
struct dhcp6
|
|
||||||
{
|
|
||||||
/*TODO: implement DHCP6*/
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6_DHCP6 */
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP6_DHCP6_H__ */
|
|
|
@ -1,68 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* Ethernet output for IPv6. Uses ND tables for link-layer addressing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_ETHIP6_H__
|
|
||||||
#define __LWIP_ETHIP6_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip6.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
err_t ethip6_output(struct netif *netif, struct pbuf *q, ip6_addr_t *ip6addr);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_ETHERNET */
|
|
||||||
|
|
||||||
#endif /* __LWIP_ETHIP6_H__ */
|
|
|
@ -1,152 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* IPv6 version of ICMP, as per RFC 4443.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_ICMP6_H__
|
|
||||||
#define __LWIP_ICMP6_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum icmp6_type {
|
|
||||||
ICMP6_TYPE_DUR = 1, /* Destination unreachable */
|
|
||||||
ICMP6_TYPE_PTB = 2, /* Packet too big */
|
|
||||||
ICMP6_TYPE_TE = 3, /* Time exceeded */
|
|
||||||
ICMP6_TYPE_PP = 4, /* Parameter problem */
|
|
||||||
ICMP6_TYPE_PE1 = 100, /* Private experimentation */
|
|
||||||
ICMP6_TYPE_PE2 = 101, /* Private experimentation */
|
|
||||||
ICMP6_TYPE_RSV_ERR = 127, /* Reserved for expansion of error messages */
|
|
||||||
|
|
||||||
ICMP6_TYPE_EREQ = 128, /* Echo request */
|
|
||||||
ICMP6_TYPE_EREP = 129, /* Echo reply */
|
|
||||||
ICMP6_TYPE_MLQ = 130, /* Multicast listener query */
|
|
||||||
ICMP6_TYPE_MLR = 131, /* Multicast listener report */
|
|
||||||
ICMP6_TYPE_MLD = 132, /* Multicast listener done */
|
|
||||||
ICMP6_TYPE_RS = 133, /* Router solicitation */
|
|
||||||
ICMP6_TYPE_RA = 134, /* Router advertisement */
|
|
||||||
ICMP6_TYPE_NS = 135, /* Neighbor solicitation */
|
|
||||||
ICMP6_TYPE_NA = 136, /* Neighbor advertisement */
|
|
||||||
ICMP6_TYPE_RD = 137, /* Redirect */
|
|
||||||
ICMP6_TYPE_MRA = 151, /* Multicast router advertisement */
|
|
||||||
ICMP6_TYPE_MRS = 152, /* Multicast router solicitation */
|
|
||||||
ICMP6_TYPE_MRT = 153, /* Multicast router termination */
|
|
||||||
ICMP6_TYPE_PE3 = 200, /* Private experimentation */
|
|
||||||
ICMP6_TYPE_PE4 = 201, /* Private experimentation */
|
|
||||||
ICMP6_TYPE_RSV_INF = 255 /* Reserved for expansion of informational messages */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum icmp6_dur_code {
|
|
||||||
ICMP6_DUR_NO_ROUTE = 0, /* No route to destination */
|
|
||||||
ICMP6_DUR_PROHIBITED = 1, /* Communication with destination administratively prohibited */
|
|
||||||
ICMP6_DUR_SCOPE = 2, /* Beyond scope of source address */
|
|
||||||
ICMP6_DUR_ADDRESS = 3, /* Address unreachable */
|
|
||||||
ICMP6_DUR_PORT = 4, /* Port unreachable */
|
|
||||||
ICMP6_DUR_POLICY = 5, /* Source address failed ingress/egress policy */
|
|
||||||
ICMP6_DUR_REJECT_ROUTE = 6 /* Reject route to destination */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum icmp6_te_code {
|
|
||||||
ICMP6_TE_HL = 0, /* Hop limit exceeded in transit */
|
|
||||||
ICMP6_TE_FRAG = 1 /* Fragment reassembly time exceeded */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum icmp6_pp_code {
|
|
||||||
ICMP6_PP_FIELD = 0, /* Erroneous header field encountered */
|
|
||||||
ICMP6_PP_HEADER = 1, /* Unrecognized next header type encountered */
|
|
||||||
ICMP6_PP_OPTION = 2 /* Unrecognized IPv6 option encountered */
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This is the standard ICMP6 header. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct icmp6_hdr {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u32_t data);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** This is the ICMP6 header adapted for echo req/resp. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct icmp6_echo_hdr {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u16_t id);
|
|
||||||
PACK_STRUCT_FIELD(u16_t seqno);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
void icmp6_input(struct pbuf *p, struct netif *inp);
|
|
||||||
void icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c);
|
|
||||||
void icmp6_packet_too_big(struct pbuf *p, u32_t mtu);
|
|
||||||
void icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c);
|
|
||||||
void icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer);
|
|
||||||
|
|
||||||
#endif /* LWIP_ICMP6 && LWIP_IPV6 */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __LWIP_ICMP6_H__ */
|
|
|
@ -1,92 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* INET v6 addresses.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_INET6_H__
|
|
||||||
#define __LWIP_INET6_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** For compatibility with BSD code */
|
|
||||||
struct in6_addr {
|
|
||||||
union {
|
|
||||||
u8_t u8_addr[16];
|
|
||||||
u32_t u32_addr[4];
|
|
||||||
} un;
|
|
||||||
#define s6_addr un.u8_addr
|
|
||||||
};
|
|
||||||
|
|
||||||
#define IN6ADDR_ANY_INIT {0,0,0,0}
|
|
||||||
#define IN6ADDR_LOOPBACK_INIT {0,0,0,PP_HTONL(1)}
|
|
||||||
|
|
||||||
|
|
||||||
#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->un.u32_addr[0] = (source_ip6addr)->addr[0]; \
|
|
||||||
(target_in6addr)->un.u32_addr[1] = (source_ip6addr)->addr[1]; \
|
|
||||||
(target_in6addr)->un.u32_addr[2] = (source_ip6addr)->addr[2]; \
|
|
||||||
(target_in6addr)->un.u32_addr[3] = (source_ip6addr)->addr[3];}
|
|
||||||
#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr) {(target_ip6addr)->addr[0] = (source_in6addr)->un.u32_addr[0]; \
|
|
||||||
(target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \
|
|
||||||
(target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \
|
|
||||||
(target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3];}
|
|
||||||
/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */
|
|
||||||
#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr) ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))
|
|
||||||
|
|
||||||
/* directly map this to the lwip internal functions */
|
|
||||||
#define inet6_aton(cp, addr) ip6addr_aton(cp, (ip6_addr_t*)addr)
|
|
||||||
#define inet6_ntoa(addr) ip6addr_ntoa((ip6_addr_t*)&(addr))
|
|
||||||
#define inet6_ntoa_r(addr, buf, buflen) ip6addr_ntoa_r((ip6_addr_t*)&(addr), buf, buflen)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#endif /* __LWIP_INET6_H__ */
|
|
||||||
|
|
|
@ -1,196 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* IPv6 layer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_IP6_H__
|
|
||||||
#define __LWIP_IP6_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define IP6_HLEN 40
|
|
||||||
|
|
||||||
#define IP6_NEXTH_HOPBYHOP 0
|
|
||||||
#define IP6_NEXTH_TCP 6
|
|
||||||
#define IP6_NEXTH_UDP 17
|
|
||||||
#define IP6_NEXTH_ENCAPS 41
|
|
||||||
#define IP6_NEXTH_ROUTING 43
|
|
||||||
#define IP6_NEXTH_FRAGMENT 44
|
|
||||||
#define IP6_NEXTH_ICMP6 58
|
|
||||||
#define IP6_NEXTH_NONE 59
|
|
||||||
#define IP6_NEXTH_DESTOPTS 60
|
|
||||||
#define IP6_NEXTH_UDPLITE 136
|
|
||||||
|
|
||||||
|
|
||||||
/* The IPv6 header. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip6_hdr {
|
|
||||||
/* version / traffic class / flow label */
|
|
||||||
PACK_STRUCT_FIELD(u32_t _v_tc_fl);
|
|
||||||
/* payload length */
|
|
||||||
PACK_STRUCT_FIELD(u16_t _plen);
|
|
||||||
/* next header */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _nexth);
|
|
||||||
/* hop limit */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _hoplim);
|
|
||||||
/* source and destination IP addresses */
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t src);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t dest);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Hop-by-hop router alert option. */
|
|
||||||
#define IP6_HBH_HLEN 8
|
|
||||||
#define IP6_PAD1_OPTION 0
|
|
||||||
#define IP6_PADN_ALERT_OPTION 1
|
|
||||||
#define IP6_ROUTER_ALERT_OPTION 5
|
|
||||||
#define IP6_ROUTER_ALERT_VALUE_MLD 0
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip6_hbh_hdr {
|
|
||||||
/* next header */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _nexth);
|
|
||||||
/* header length */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _hlen);
|
|
||||||
/* router alert option type */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _ra_opt_type);
|
|
||||||
/* router alert option data len */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _ra_opt_dlen);
|
|
||||||
/* router alert option data */
|
|
||||||
PACK_STRUCT_FIELD(u16_t _ra_opt_data);
|
|
||||||
/* PadN option type */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _padn_opt_type);
|
|
||||||
/* PadN option data len */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _padn_opt_dlen);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Fragment header. */
|
|
||||||
#define IP6_FRAG_HLEN 8
|
|
||||||
#define IP6_FRAG_OFFSET_MASK 0xfff8
|
|
||||||
#define IP6_FRAG_MORE_FLAG 0x0001
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip6_frag_hdr {
|
|
||||||
/* next header */
|
|
||||||
PACK_STRUCT_FIELD(u8_t _nexth);
|
|
||||||
/* reserved */
|
|
||||||
PACK_STRUCT_FIELD(u8_t reserved);
|
|
||||||
/* fragment offset */
|
|
||||||
PACK_STRUCT_FIELD(u16_t _fragment_offset);
|
|
||||||
/* fragmented packet identification */
|
|
||||||
PACK_STRUCT_FIELD(u32_t _identification);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define IP6H_V(hdr) ((ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f)
|
|
||||||
#define IP6H_TC(hdr) ((ntohl((hdr)->_v_tc_fl) >> 20) & 0xff)
|
|
||||||
#define IP6H_FL(hdr) (ntohl((hdr)->_v_tc_fl) & 0x000fffff)
|
|
||||||
#define IP6H_PLEN(hdr) (ntohs((hdr)->_plen))
|
|
||||||
#define IP6H_NEXTH(hdr) ((hdr)->_nexth)
|
|
||||||
#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6)
|
|
||||||
#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim)
|
|
||||||
|
|
||||||
#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (htonl(((v) << 28) | ((tc) << 20) | (fl)))
|
|
||||||
#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = htons(plen)
|
|
||||||
#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth)
|
|
||||||
#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl)
|
|
||||||
|
|
||||||
|
|
||||||
#define ip6_init() /* TODO should we init current addresses and header pointer? */
|
|
||||||
struct netif *ip6_route(struct ip6_addr *src, struct ip6_addr *dest);
|
|
||||||
ip6_addr_t *ip6_select_source_address(struct netif *netif, ip6_addr_t * dest);
|
|
||||||
err_t ip6_input(struct pbuf *p, struct netif *inp);
|
|
||||||
err_t ip6_output(struct pbuf *p, struct ip6_addr *src, struct ip6_addr *dest,
|
|
||||||
u8_t hl, u8_t tc, u8_t nexth);
|
|
||||||
err_t ip6_output_if(struct pbuf *p, struct ip6_addr *src, struct ip6_addr *dest,
|
|
||||||
u8_t hl, u8_t tc, u8_t nexth, struct netif *netif);
|
|
||||||
#if LWIP_NETIF_HWADDRHINT
|
|
||||||
err_t ip6_output_hinted(struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest,
|
|
||||||
u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint);
|
|
||||||
#endif /* LWIP_NETIF_HWADDRHINT */
|
|
||||||
#if LWIP_IPV6_MLD
|
|
||||||
err_t ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value);
|
|
||||||
#endif /* LWIP_IPV6_MLD */
|
|
||||||
|
|
||||||
#define ip6_netif_get_local_ipX(netif, dest) (((netif) != NULL) ? \
|
|
||||||
ip6_2_ipX(ip6_select_source_address(netif, dest)) : NULL)
|
|
||||||
|
|
||||||
#if IP6_DEBUG
|
|
||||||
void ip6_debug_print(struct pbuf *p);
|
|
||||||
#else
|
|
||||||
#define ip6_debug_print(p)
|
|
||||||
#endif /* IP6_DEBUG */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP6_H__ */
|
|
|
@ -1,286 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* IPv6 addresses.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
* Structs and macros for handling IPv6 addresses.
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_IP6_ADDR_H__
|
|
||||||
#define __LWIP_IP6_ADDR_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* This is the aligned version of ip6_addr_t,
|
|
||||||
used as local variable, on the stack, etc. */
|
|
||||||
struct ip6_addr {
|
|
||||||
u32_t addr[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* This is the packed version of ip6_addr_t,
|
|
||||||
used in network headers that are itself packed */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip6_addr_packed {
|
|
||||||
PACK_STRUCT_FIELD(u32_t addr[4]);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** ip6_addr_t uses a struct for convenience only, so that the same defines can
|
|
||||||
* operate both on ip6_addr_t as well as on ip6_addr_p_t. */
|
|
||||||
typedef struct ip6_addr ip6_addr_t;
|
|
||||||
typedef struct ip6_addr_packed ip6_addr_p_t;
|
|
||||||
|
|
||||||
|
|
||||||
/** IP6_ADDR_ANY can be used as a fixed IPv6 address
|
|
||||||
* for the wildcard
|
|
||||||
*/
|
|
||||||
extern const ip6_addr_t ip6_addr_any;
|
|
||||||
#define IP6_ADDR_ANY ((ip6_addr_t *)&ip6_addr_any)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
/** Set an IPv6 partial address given by byte-parts. */
|
|
||||||
#define IP6_ADDR(ip6addr, index, a,b,c,d) \
|
|
||||||
(ip6addr)->addr[index] = ((u32_t)((a) & 0xff) << 24) | \
|
|
||||||
((u32_t)((b) & 0xff) << 16) | \
|
|
||||||
((u32_t)((c) & 0xff) << 8) | \
|
|
||||||
(u32_t)((d) & 0xff)
|
|
||||||
#else
|
|
||||||
/** Set an IPv6 partial address given by byte-parts.
|
|
||||||
Little-endian version, stored in network order (no htonl). */
|
|
||||||
#define IP6_ADDR(ip6addr, index, a,b,c,d) \
|
|
||||||
(ip6addr)->addr[index] = ((u32_t)((d) & 0xff) << 24) | \
|
|
||||||
((u32_t)((c) & 0xff) << 16) | \
|
|
||||||
((u32_t)((b) & 0xff) << 8) | \
|
|
||||||
(u32_t)((a) & 0xff)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Access address in 16-bit block */
|
|
||||||
#define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)(htonl((ip6addr)->addr[0]) >> 16) & 0xffff)
|
|
||||||
#define IP6_ADDR_BLOCK2(ip6addr) ((u16_t)(htonl((ip6addr)->addr[0])) & 0xffff)
|
|
||||||
#define IP6_ADDR_BLOCK3(ip6addr) ((u16_t)(htonl((ip6addr)->addr[1]) >> 16) & 0xffff)
|
|
||||||
#define IP6_ADDR_BLOCK4(ip6addr) ((u16_t)(htonl((ip6addr)->addr[1])) & 0xffff)
|
|
||||||
#define IP6_ADDR_BLOCK5(ip6addr) ((u16_t)(htonl((ip6addr)->addr[2]) >> 16) & 0xffff)
|
|
||||||
#define IP6_ADDR_BLOCK6(ip6addr) ((u16_t)(htonl((ip6addr)->addr[2])) & 0xffff)
|
|
||||||
#define IP6_ADDR_BLOCK7(ip6addr) ((u16_t)(htonl((ip6addr)->addr[3]) >> 16) & 0xffff)
|
|
||||||
#define IP6_ADDR_BLOCK8(ip6addr) ((u16_t)(htonl((ip6addr)->addr[3])) & 0xffff)
|
|
||||||
|
|
||||||
/** Copy IPv6 address - faster than ip6_addr_set: no NULL check */
|
|
||||||
#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \
|
|
||||||
(dest).addr[1] = (src).addr[1]; \
|
|
||||||
(dest).addr[2] = (src).addr[2]; \
|
|
||||||
(dest).addr[3] = (src).addr[3];}while(0)
|
|
||||||
/** Safely copy one IPv6 address to another (src may be NULL) */
|
|
||||||
#define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \
|
|
||||||
(dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \
|
|
||||||
(dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \
|
|
||||||
(dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0)
|
|
||||||
|
|
||||||
/** Set complete address to zero */
|
|
||||||
#define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \
|
|
||||||
(ip6addr)->addr[1] = 0; \
|
|
||||||
(ip6addr)->addr[2] = 0; \
|
|
||||||
(ip6addr)->addr[3] = 0;}while(0)
|
|
||||||
|
|
||||||
/** Set address to ipv6 'any' (no need for htonl()) */
|
|
||||||
#define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr)
|
|
||||||
/** Set address to ipv6 loopback address */
|
|
||||||
#define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \
|
|
||||||
(ip6addr)->addr[1] = 0; \
|
|
||||||
(ip6addr)->addr[2] = 0; \
|
|
||||||
(ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
|
|
||||||
/** Safely copy one IPv6 address to another and change byte order
|
|
||||||
* from host- to network-order. */
|
|
||||||
#define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : htonl((src)->addr[0]); \
|
|
||||||
(dest)->addr[1] = (src) == NULL ? 0 : htonl((src)->addr[1]); \
|
|
||||||
(dest)->addr[2] = (src) == NULL ? 0 : htonl((src)->addr[2]); \
|
|
||||||
(dest)->addr[3] = (src) == NULL ? 0 : htonl((src)->addr[3]);}while(0)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine if two IPv6 address are on the same network.
|
|
||||||
*
|
|
||||||
* @arg addr1 IPv6 address 1
|
|
||||||
* @arg addr2 IPv6 address 2
|
|
||||||
* @return !0 if the network identifiers of both address match
|
|
||||||
*/
|
|
||||||
#define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
|
|
||||||
((addr1)->addr[1] == (addr2)->addr[1]))
|
|
||||||
|
|
||||||
#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
|
|
||||||
((addr1)->addr[1] == (addr2)->addr[1]) && \
|
|
||||||
((addr1)->addr[2] == (addr2)->addr[2]) && \
|
|
||||||
((addr1)->addr[3] == (addr2)->addr[3]))
|
|
||||||
|
|
||||||
#define ip6_get_subnet_id(ip6addr) (htonl((ip6addr)->addr[2]) & 0x0000ffffUL)
|
|
||||||
|
|
||||||
#define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || \
|
|
||||||
(((ip6addr)->addr[0] == 0) && \
|
|
||||||
((ip6addr)->addr[1] == 0) && \
|
|
||||||
((ip6addr)->addr[2] == 0) && \
|
|
||||||
((ip6addr)->addr[3] == 0)))
|
|
||||||
|
|
||||||
|
|
||||||
#define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL))
|
|
||||||
|
|
||||||
#define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL))
|
|
||||||
|
|
||||||
#define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL))
|
|
||||||
|
|
||||||
#define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL))
|
|
||||||
|
|
||||||
#define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL))
|
|
||||||
#define ip6_addr_multicast_transient_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL))
|
|
||||||
#define ip6_addr_multicast_prefix_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL))
|
|
||||||
#define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL))
|
|
||||||
#define ip6_addr_multicast_scope(ip6addr) ((htonl((ip6addr)->addr[0]) >> 16) & 0xf)
|
|
||||||
#define IP6_MULTICAST_SCOPE_RESERVED 0x0
|
|
||||||
#define IP6_MULTICAST_SCOPE_RESERVED0 0x0
|
|
||||||
#define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL 0x1
|
|
||||||
#define IP6_MULTICAST_SCOPE_LINK_LOCAL 0x2
|
|
||||||
#define IP6_MULTICAST_SCOPE_RESERVED3 0x3
|
|
||||||
#define IP6_MULTICAST_SCOPE_ADMIN_LOCAL 0x4
|
|
||||||
#define IP6_MULTICAST_SCOPE_SITE_LOCAL 0x5
|
|
||||||
#define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL 0x8
|
|
||||||
#define IP6_MULTICAST_SCOPE_GLOBAL 0xe
|
|
||||||
#define IP6_MULTICAST_SCOPE_RESERVEDF 0xf
|
|
||||||
#define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff010000UL))
|
|
||||||
#define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff020000UL))
|
|
||||||
#define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff040000UL))
|
|
||||||
#define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff050000UL))
|
|
||||||
#define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff080000UL))
|
|
||||||
#define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff0e0000UL))
|
|
||||||
|
|
||||||
/* TODO define get/set for well-know multicast addresses, e.g. ff02::1 */
|
|
||||||
#define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \
|
|
||||||
((ip6addr)->addr[1] == 0UL) && \
|
|
||||||
((ip6addr)->addr[2] == 0UL) && \
|
|
||||||
((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
|
|
||||||
|
|
||||||
#define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
|
|
||||||
((ip6addr)->addr[1] == 0UL) && \
|
|
||||||
((ip6addr)->addr[2] == 0UL) && \
|
|
||||||
((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
|
|
||||||
#define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
|
|
||||||
(ip6addr)->addr[1] = 0; \
|
|
||||||
(ip6addr)->addr[2] = 0; \
|
|
||||||
(ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
|
|
||||||
|
|
||||||
#define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
|
|
||||||
((ip6addr)->addr[1] == 0UL) && \
|
|
||||||
((ip6addr)->addr[2] == 0UL) && \
|
|
||||||
((ip6addr)->addr[3] == PP_HTONL(0x00000002UL)))
|
|
||||||
#define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
|
|
||||||
(ip6addr)->addr[1] = 0; \
|
|
||||||
(ip6addr)->addr[2] = 0; \
|
|
||||||
(ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0)
|
|
||||||
|
|
||||||
#define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
|
|
||||||
((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
|
|
||||||
(((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) )
|
|
||||||
|
|
||||||
#define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
|
|
||||||
(ip6addr)->addr[1] = 0; \
|
|
||||||
(ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \
|
|
||||||
(ip6addr)->addr[3] = htonl(0xff000000UL | (htonl(if_id) & 0x00ffffffUL));}while(0)
|
|
||||||
|
|
||||||
#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
|
|
||||||
((ip6addr)->addr[1] == 0) && \
|
|
||||||
((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
|
|
||||||
((ip6addr)->addr[3] == htonl(0xff000000UL | (htonl((sn_addr)->addr[3]) & 0x00ffffffUL))))
|
|
||||||
|
|
||||||
/* IPv6 address states. */
|
|
||||||
#define IP6_ADDR_INVALID 0x00
|
|
||||||
#define IP6_ADDR_TENTATIVE 0x08
|
|
||||||
#define IP6_ADDR_TENTATIVE_1 0x09 /* 1 probe sent */
|
|
||||||
#define IP6_ADDR_TENTATIVE_2 0x0a /* 2 probes sent */
|
|
||||||
#define IP6_ADDR_TENTATIVE_3 0x0b /* 3 probes sent */
|
|
||||||
#define IP6_ADDR_TENTATIVE_4 0x0c /* 4 probes sent */
|
|
||||||
#define IP6_ADDR_TENTATIVE_5 0x0d /* 5 probes sent */
|
|
||||||
#define IP6_ADDR_TENTATIVE_6 0x0e /* 6 probes sent */
|
|
||||||
#define IP6_ADDR_TENTATIVE_7 0x0f /* 7 probes sent */
|
|
||||||
#define IP6_ADDR_VALID 0x10
|
|
||||||
#define IP6_ADDR_PREFERRED 0x30
|
|
||||||
#define IP6_ADDR_DEPRECATED 0x50
|
|
||||||
|
|
||||||
#define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID)
|
|
||||||
#define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE)
|
|
||||||
#define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */
|
|
||||||
#define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED)
|
|
||||||
#define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED)
|
|
||||||
|
|
||||||
#define ip6_addr_debug_print(debug, ipaddr) \
|
|
||||||
LWIP_DEBUGF(debug, ("%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0, \
|
|
||||||
ipaddr != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0))
|
|
||||||
|
|
||||||
int ip6addr_aton(const char *cp, ip6_addr_t *addr);
|
|
||||||
/** returns ptr to static buffer; not reentrant! */
|
|
||||||
char *ip6addr_ntoa(const ip6_addr_t *addr);
|
|
||||||
char *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP6_ADDR_H__ */
|
|
|
@ -1,102 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* IPv6 fragmentation and reassembly.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_IP6_FRAG_H__
|
|
||||||
#define __LWIP_IP6_FRAG_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_IPV6_REASS /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
/* The IPv6 reassembly timer interval in milliseconds. */
|
|
||||||
#define IP6_REASS_TMR_INTERVAL 1000
|
|
||||||
|
|
||||||
/* IPv6 reassembly helper struct.
|
|
||||||
* This is exported because memp needs to know the size.
|
|
||||||
*/
|
|
||||||
struct ip6_reassdata {
|
|
||||||
struct ip6_reassdata *next;
|
|
||||||
struct pbuf *p;
|
|
||||||
struct ip6_hdr * iphdr;
|
|
||||||
u32_t identification;
|
|
||||||
u16_t datagram_len;
|
|
||||||
u8_t nexth;
|
|
||||||
u8_t timer;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ip6_reass_init() /* Compatibility define */
|
|
||||||
void ip6_reass_tmr(void);
|
|
||||||
struct pbuf * ip6_reass(struct pbuf *p);
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_IPV6_FRAG /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
/** A custom pbuf that holds a reference to another pbuf, which is freed
|
|
||||||
* when this custom pbuf is freed. This is used to create a custom PBUF_REF
|
|
||||||
* that points into the original pbuf. */
|
|
||||||
#ifndef __LWIP_PBUF_CUSTOM_REF__
|
|
||||||
#define __LWIP_PBUF_CUSTOM_REF__
|
|
||||||
struct pbuf_custom_ref {
|
|
||||||
/** 'base class' */
|
|
||||||
struct pbuf_custom pc;
|
|
||||||
/** pointer to the original pbuf that is referenced */
|
|
||||||
struct pbuf *original;
|
|
||||||
};
|
|
||||||
#endif /* __LWIP_PBUF_CUSTOM_REF__ */
|
|
||||||
|
|
||||||
err_t ip6_frag(struct pbuf *p, struct netif *netif, ip6_addr_t *dest);
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP6_FRAG_H__ */
|
|
|
@ -1,118 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710.
|
|
||||||
* No support for MLDv2.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_MLD6_H__
|
|
||||||
#define __LWIP_MLD6_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6_MLD && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct mld_group {
|
|
||||||
/** next link */
|
|
||||||
struct mld_group *next;
|
|
||||||
/** interface on which the group is active */
|
|
||||||
struct netif *netif;
|
|
||||||
/** multicast address */
|
|
||||||
ip6_addr_t group_address;
|
|
||||||
/** signifies we were the last person to report */
|
|
||||||
u8_t last_reporter_flag;
|
|
||||||
/** current state of the group */
|
|
||||||
u8_t group_state;
|
|
||||||
/** timer for reporting */
|
|
||||||
u16_t timer;
|
|
||||||
/** counter of simultaneous uses */
|
|
||||||
u8_t use;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Multicast listener report/query/done message header. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct mld_header {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u16_t max_resp_delay);
|
|
||||||
PACK_STRUCT_FIELD(u16_t reserved);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t multicast_address);
|
|
||||||
/* Options follow. */
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MLD6_TMR_INTERVAL 100 /* Milliseconds */
|
|
||||||
|
|
||||||
/* MAC Filter Actions, these are passed to a netif's
|
|
||||||
* mld_mac_filter callback function. */
|
|
||||||
#define MLD6_DEL_MAC_FILTER 0
|
|
||||||
#define MLD6_ADD_MAC_FILTER 1
|
|
||||||
|
|
||||||
|
|
||||||
#define mld6_init() /* TODO should we init tables? */
|
|
||||||
err_t mld6_stop(struct netif *netif);
|
|
||||||
void mld6_report_groups(struct netif *netif);
|
|
||||||
void mld6_tmr(void);
|
|
||||||
struct mld_group *mld6_lookfor_group(struct netif *ifp, ip6_addr_t *addr);
|
|
||||||
void mld6_input(struct pbuf *p, struct netif *inp);
|
|
||||||
err_t mld6_joingroup(ip6_addr_t *srcaddr, ip6_addr_t *groupaddr);
|
|
||||||
err_t mld6_leavegroup(ip6_addr_t *srcaddr, ip6_addr_t *groupaddr);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6_MLD && LWIP_IPV6 */
|
|
||||||
|
|
||||||
#endif /* __LWIP_MLD6_H__ */
|
|
|
@ -1,369 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* Neighbor discovery and stateless address autoconfiguration for IPv6.
|
|
||||||
* Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862
|
|
||||||
* (Address autoconfiguration).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Inico Technologies Ltd.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Ivan Delamer <delamer@inicotech.com>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Please coordinate changes and requests with Ivan Delamer
|
|
||||||
* <delamer@inicotech.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_ND6_H__
|
|
||||||
#define __LWIP_ND6_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip6.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Struct for tables. */
|
|
||||||
struct nd6_neighbor_cache_entry {
|
|
||||||
ip6_addr_t next_hop_address;
|
|
||||||
struct netif * netif;
|
|
||||||
u8_t lladdr[NETIF_MAX_HWADDR_LEN];
|
|
||||||
/*u32_t pmtu;*/
|
|
||||||
#if LWIP_ND6_QUEUEING
|
|
||||||
/** Pointer to queue of pending outgoing packets on this entry. */
|
|
||||||
struct nd6_q_entry *q;
|
|
||||||
#else /* LWIP_ND6_QUEUEING */
|
|
||||||
/** Pointer to a single pending outgoing packet on this entry. */
|
|
||||||
struct pbuf *q;
|
|
||||||
#endif /* LWIP_ND6_QUEUEING */
|
|
||||||
u8_t state;
|
|
||||||
u8_t isrouter;
|
|
||||||
union {
|
|
||||||
u32_t reachable_time;
|
|
||||||
u32_t delay_time;
|
|
||||||
u32_t probes_sent;
|
|
||||||
u32_t stale_time;
|
|
||||||
} counter;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nd6_destination_cache_entry {
|
|
||||||
ip6_addr_t destination_addr;
|
|
||||||
ip6_addr_t next_hop_addr;
|
|
||||||
u32_t pmtu;
|
|
||||||
u32_t age;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nd6_prefix_list_entry {
|
|
||||||
ip6_addr_t prefix;
|
|
||||||
struct netif * netif;
|
|
||||||
u32_t invalidation_timer;
|
|
||||||
#if LWIP_IPV6_AUTOCONFIG
|
|
||||||
u8_t flags;
|
|
||||||
#define ND6_PREFIX_AUTOCONFIG_AUTONOMOUS 0x01
|
|
||||||
#define ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED 0x02
|
|
||||||
#define ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE 0x04
|
|
||||||
#endif /* LWIP_IPV6_AUTOCONFIG */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nd6_router_list_entry {
|
|
||||||
struct nd6_neighbor_cache_entry * neighbor_entry;
|
|
||||||
u32_t invalidation_timer;
|
|
||||||
u8_t flags;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum nd6_neighbor_cache_entry_state {
|
|
||||||
ND6_NO_ENTRY = 0,
|
|
||||||
ND6_INCOMPLETE,
|
|
||||||
ND6_REACHABLE,
|
|
||||||
ND6_STALE,
|
|
||||||
ND6_DELAY,
|
|
||||||
ND6_PROBE
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_ND6_QUEUEING
|
|
||||||
/** struct for queueing outgoing packets for unknown address
|
|
||||||
* defined here to be accessed by memp.h
|
|
||||||
*/
|
|
||||||
struct nd6_q_entry {
|
|
||||||
struct nd6_q_entry *next;
|
|
||||||
struct pbuf *p;
|
|
||||||
};
|
|
||||||
#endif /* LWIP_ND6_QUEUEING */
|
|
||||||
|
|
||||||
/** Neighbor solicitation message header. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ns_header {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u32_t reserved);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t target_address);
|
|
||||||
/* Options follow. */
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Neighbor advertisement message header. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct na_header {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u8_t flags);
|
|
||||||
PACK_STRUCT_FIELD(u8_t reserved[3]);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t target_address);
|
|
||||||
/* Options follow. */
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
#define ND6_FLAG_ROUTER (0x80)
|
|
||||||
#define ND6_FLAG_SOLICITED (0x40)
|
|
||||||
#define ND6_FLAG_OVERRIDE (0x20)
|
|
||||||
|
|
||||||
/** Router solicitation message header. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct rs_header {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u32_t reserved);
|
|
||||||
/* Options follow. */
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Router advertisement message header. */
|
|
||||||
#define ND6_RA_FLAG_MANAGED_ADDR_CONFIG (0x80)
|
|
||||||
#define ND6_RA_FLAG_OTHER_STATEFUL_CONFIG (0x40)
|
|
||||||
#define ND6_RA_FLAG_HOME_AGENT (0x20)
|
|
||||||
#define ND6_RA_PREFERENCE_MASK (0x18)
|
|
||||||
#define ND6_RA_PREFERENCE_HIGH (0x08)
|
|
||||||
#define ND6_RA_PREFERENCE_MEDIUM (0x00)
|
|
||||||
#define ND6_RA_PREFERENCE_LOW (0x18)
|
|
||||||
#define ND6_RA_PREFERENCE_DISABLED (0x10)
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ra_header {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u8_t current_hop_limit);
|
|
||||||
PACK_STRUCT_FIELD(u8_t flags);
|
|
||||||
PACK_STRUCT_FIELD(u16_t router_lifetime);
|
|
||||||
PACK_STRUCT_FIELD(u32_t reachable_time);
|
|
||||||
PACK_STRUCT_FIELD(u32_t retrans_timer);
|
|
||||||
/* Options follow. */
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Redirect message header. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct redirect_header {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u32_t reserved);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t target_address);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t destination_address);
|
|
||||||
/* Options follow. */
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Link-layer address option. */
|
|
||||||
#define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01)
|
|
||||||
#define ND6_OPTION_TYPE_TARGET_LLADDR (0x02)
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct lladdr_option {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t length);
|
|
||||||
PACK_STRUCT_FIELD(u8_t addr[NETIF_MAX_HWADDR_LEN]);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Prefix information option. */
|
|
||||||
#define ND6_OPTION_TYPE_PREFIX_INFO (0x03)
|
|
||||||
#define ND6_PREFIX_FLAG_ON_LINK (0x80)
|
|
||||||
#define ND6_PREFIX_FLAG_AUTONOMOUS (0x40)
|
|
||||||
#define ND6_PREFIX_FLAG_ROUTER_ADDRESS (0x20)
|
|
||||||
#define ND6_PREFIX_FLAG_SITE_PREFIX (0x10)
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct prefix_option {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t length);
|
|
||||||
PACK_STRUCT_FIELD(u8_t prefix_length);
|
|
||||||
PACK_STRUCT_FIELD(u8_t flags);
|
|
||||||
PACK_STRUCT_FIELD(u32_t valid_lifetime);
|
|
||||||
PACK_STRUCT_FIELD(u32_t preferred_lifetime);
|
|
||||||
PACK_STRUCT_FIELD(u8_t reserved2[3]);
|
|
||||||
PACK_STRUCT_FIELD(u8_t site_prefix_length);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t prefix);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Redirected header option. */
|
|
||||||
#define ND6_OPTION_TYPE_REDIR_HDR (0x04)
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct redirected_header_option {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t length);
|
|
||||||
PACK_STRUCT_FIELD(u8_t reserved[6]);
|
|
||||||
/* Portion of redirected packet follows. */
|
|
||||||
/* PACK_STRUCT_FIELD(u8_t redirected[8]); */
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** MTU option. */
|
|
||||||
#define ND6_OPTION_TYPE_MTU (0x05)
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct mtu_option {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t length);
|
|
||||||
PACK_STRUCT_FIELD(u16_t reserved);
|
|
||||||
PACK_STRUCT_FIELD(u32_t mtu);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Route information option. */
|
|
||||||
#define ND6_OPTION_TYPE_ROUTE_INFO (24)
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct route_option {
|
|
||||||
PACK_STRUCT_FIELD(u8_t type);
|
|
||||||
PACK_STRUCT_FIELD(u8_t length);
|
|
||||||
PACK_STRUCT_FIELD(u8_t prefix_length);
|
|
||||||
PACK_STRUCT_FIELD(u8_t preference);
|
|
||||||
PACK_STRUCT_FIELD(u32_t route_lifetime);
|
|
||||||
PACK_STRUCT_FIELD(ip6_addr_p_t prefix);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* the possible states of an IP address */
|
|
||||||
#define IP6_ADDRESS_STATE_INVALID (0)
|
|
||||||
#define IP6_ADDRESS_STATE_VALID (0x4)
|
|
||||||
#define IP6_ADDRESS_STATE_PREFERRED (0x5) /* includes valid */
|
|
||||||
#define IP6_ADDRESS_STATE_DEPRECATED (0x6) /* includes valid */
|
|
||||||
#define IP6_ADDRESS_STATE_TENTATIV (0x8)
|
|
||||||
|
|
||||||
/** 1 second period */
|
|
||||||
#define ND6_TMR_INTERVAL 1000
|
|
||||||
|
|
||||||
/* Router tables. */
|
|
||||||
/* TODO make these static? and entries accessible through API? */
|
|
||||||
extern struct nd6_neighbor_cache_entry neighbor_cache[];
|
|
||||||
extern struct nd6_destination_cache_entry destination_cache[];
|
|
||||||
extern struct nd6_prefix_list_entry prefix_list[];
|
|
||||||
extern struct nd6_router_list_entry default_router_list[];
|
|
||||||
|
|
||||||
/* Default values, can be updated by a RA message. */
|
|
||||||
extern u32_t reachable_time;
|
|
||||||
extern u32_t retrans_timer;
|
|
||||||
|
|
||||||
#define nd6_init() /* TODO should we init tables? */
|
|
||||||
void nd6_tmr(void);
|
|
||||||
void nd6_input(struct pbuf *p, struct netif *inp);
|
|
||||||
s8_t nd6_get_next_hop_entry(ip6_addr_t * ip6addr, struct netif * netif);
|
|
||||||
s8_t nd6_select_router(ip6_addr_t * ip6addr, struct netif * netif);
|
|
||||||
u16_t nd6_get_destination_mtu(ip6_addr_t * ip6addr, struct netif * netif);
|
|
||||||
err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf * p);
|
|
||||||
#if LWIP_ND6_TCP_REACHABILITY_HINTS
|
|
||||||
void nd6_reachability_hint(ip6_addr_t * ip6addr);
|
|
||||||
#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#endif /* __LWIP_ND6_H__ */
|
|
|
@ -1,343 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_API_H__
|
|
||||||
#define __LWIP_API_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include <stddef.h> /* for size_t */
|
|
||||||
|
|
||||||
#include "lwip/netbuf.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Throughout this file, IP addresses and port numbers are expected to be in
|
|
||||||
* the same byte order as in the corresponding pcb.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Flags for netconn_write (u8_t) */
|
|
||||||
#define NETCONN_NOFLAG 0x00
|
|
||||||
#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */
|
|
||||||
#define NETCONN_COPY 0x01
|
|
||||||
#define NETCONN_MORE 0x02
|
|
||||||
#define NETCONN_DONTBLOCK 0x04
|
|
||||||
|
|
||||||
/* Flags for struct netconn.flags (u8_t) */
|
|
||||||
/** TCP: when data passed to netconn_write doesn't fit into the send buffer,
|
|
||||||
this temporarily stores whether to wake up the original application task
|
|
||||||
if data couldn't be sent in the first try. */
|
|
||||||
#define NETCONN_FLAG_WRITE_DELAYED 0x01
|
|
||||||
/** Should this netconn avoid blocking? */
|
|
||||||
#define NETCONN_FLAG_NON_BLOCKING 0x02
|
|
||||||
/** Was the last connect action a non-blocking one? */
|
|
||||||
#define NETCONN_FLAG_IN_NONBLOCKING_CONNECT 0x04
|
|
||||||
/** If this is set, a TCP netconn must call netconn_recved() to update
|
|
||||||
the TCP receive window (done automatically if not set). */
|
|
||||||
#define NETCONN_FLAG_NO_AUTO_RECVED 0x08
|
|
||||||
/** If a nonblocking write has been rejected before, poll_tcp needs to
|
|
||||||
check if the netconn is writable again */
|
|
||||||
#define NETCONN_FLAG_CHECK_WRITESPACE 0x10
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** If this flag is set then only IPv6 communication is allowed on the
|
|
||||||
netconn. As per RFC#3493 this features defaults to OFF allowing
|
|
||||||
dual-stack usage by default. */
|
|
||||||
#define NETCONN_FLAG_IPV6_V6ONLY 0x20
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
//***********Code for WIFI_BLOCK from upper**************
|
|
||||||
#define NETCONN_FLAG_RECV_HOLD 0x80
|
|
||||||
|
|
||||||
|
|
||||||
/* Helpers to process several netconn_types by the same code */
|
|
||||||
#define NETCONNTYPE_GROUP(t) ((t)&0xF0)
|
|
||||||
#define NETCONNTYPE_DATAGRAM(t) ((t)&0xE0)
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define NETCONN_TYPE_IPV6 0x08
|
|
||||||
#define NETCONNTYPE_ISIPV6(t) ((t)&0x08)
|
|
||||||
#define NETCONNTYPE_ISUDPLITE(t) (((t)&0xF7) == NETCONN_UDPLITE)
|
|
||||||
#define NETCONNTYPE_ISUDPNOCHKSUM(t) (((t)&0xF7) == NETCONN_UDPNOCHKSUM)
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
#define NETCONNTYPE_ISUDPLITE(t) ((t) == NETCONN_UDPLITE)
|
|
||||||
#define NETCONNTYPE_ISUDPNOCHKSUM(t) ((t) == NETCONN_UDPNOCHKSUM)
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
/** Protocol family and type of the netconn */
|
|
||||||
enum netconn_type {
|
|
||||||
NETCONN_INVALID = 0,
|
|
||||||
/* NETCONN_TCP Group */
|
|
||||||
NETCONN_TCP = 0x10,
|
|
||||||
#if LWIP_IPV6
|
|
||||||
NETCONN_TCP_IPV6 = NETCONN_TCP | NETCONN_TYPE_IPV6 /* 0x18 */,
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
/* NETCONN_UDP Group */
|
|
||||||
NETCONN_UDP = 0x20,
|
|
||||||
NETCONN_UDPLITE = 0x21,
|
|
||||||
NETCONN_UDPNOCHKSUM = 0x22,
|
|
||||||
#if LWIP_IPV6
|
|
||||||
NETCONN_UDP_IPV6 = NETCONN_UDP | NETCONN_TYPE_IPV6 /* 0x28 */,
|
|
||||||
NETCONN_UDPLITE_IPV6 = NETCONN_UDPLITE | NETCONN_TYPE_IPV6 /* 0x29 */,
|
|
||||||
NETCONN_UDPNOCHKSUM_IPV6 = NETCONN_UDPNOCHKSUM | NETCONN_TYPE_IPV6 /* 0x2a */,
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
/* NETCONN_RAW Group */
|
|
||||||
NETCONN_RAW = 0x40
|
|
||||||
#if LWIP_IPV6
|
|
||||||
,
|
|
||||||
NETCONN_RAW_IPV6 = NETCONN_RAW | NETCONN_TYPE_IPV6 /* 0x48 */
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Current state of the netconn. Non-TCP netconns are always
|
|
||||||
* in state NETCONN_NONE! */
|
|
||||||
enum netconn_state {
|
|
||||||
NETCONN_NONE,
|
|
||||||
NETCONN_WRITE,
|
|
||||||
NETCONN_LISTEN,
|
|
||||||
NETCONN_CONNECT,
|
|
||||||
NETCONN_CLOSE
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Use to inform the callback function about changes */
|
|
||||||
enum netconn_evt {
|
|
||||||
NETCONN_EVT_RCVPLUS,
|
|
||||||
NETCONN_EVT_RCVMINUS,
|
|
||||||
NETCONN_EVT_SENDPLUS,
|
|
||||||
NETCONN_EVT_SENDMINUS,
|
|
||||||
NETCONN_EVT_ERROR
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
|
|
||||||
/** Used for netconn_join_leave_group() */
|
|
||||||
enum netconn_igmp {
|
|
||||||
NETCONN_JOIN,
|
|
||||||
NETCONN_LEAVE
|
|
||||||
};
|
|
||||||
#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
|
|
||||||
|
|
||||||
/* forward-declare some structs to avoid to include their headers */
|
|
||||||
struct ip_pcb;
|
|
||||||
struct tcp_pcb;
|
|
||||||
struct udp_pcb;
|
|
||||||
struct raw_pcb;
|
|
||||||
struct netconn;
|
|
||||||
struct api_msg_msg;
|
|
||||||
|
|
||||||
/** A callback prototype to inform about events for a netconn */
|
|
||||||
typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len);
|
|
||||||
|
|
||||||
/** A netconn descriptor */
|
|
||||||
struct netconn {
|
|
||||||
/** type of the netconn (TCP, UDP or RAW) */
|
|
||||||
enum netconn_type type;
|
|
||||||
/** current state of the netconn */
|
|
||||||
enum netconn_state state;
|
|
||||||
/** the lwIP internal protocol control block */
|
|
||||||
union {
|
|
||||||
struct ip_pcb *ip;
|
|
||||||
struct tcp_pcb *tcp;
|
|
||||||
struct udp_pcb *udp;
|
|
||||||
struct raw_pcb *raw;
|
|
||||||
} pcb;
|
|
||||||
/** the last error this netconn had */
|
|
||||||
err_t last_err;
|
|
||||||
/** sem that is used to synchroneously execute functions in the core context */
|
|
||||||
sys_sem_t op_completed;
|
|
||||||
/** mbox where received packets are stored until they are fetched
|
|
||||||
by the netconn application thread (can grow quite big) */
|
|
||||||
sys_mbox_t recvmbox;
|
|
||||||
#if LWIP_TCP
|
|
||||||
/** mbox where new connections are stored until processed
|
|
||||||
by the application thread */
|
|
||||||
sys_mbox_t acceptmbox;
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
/** only used for socket layer */
|
|
||||||
#if LWIP_SOCKET
|
|
||||||
int socket;
|
|
||||||
#endif /* LWIP_SOCKET */
|
|
||||||
#if LWIP_SO_SNDTIMEO
|
|
||||||
/** timeout to wait for sending data (which means enqueueing data for sending
|
|
||||||
in internal buffers) */
|
|
||||||
s32_t send_timeout;
|
|
||||||
#endif /* LWIP_SO_RCVTIMEO */
|
|
||||||
#if LWIP_SO_RCVTIMEO
|
|
||||||
/** timeout to wait for new data to be received
|
|
||||||
(or connections to arrive for listening netconns) */
|
|
||||||
int recv_timeout;
|
|
||||||
#endif /* LWIP_SO_RCVTIMEO */
|
|
||||||
#if LWIP_SO_RCVBUF
|
|
||||||
/** maximum amount of bytes queued in recvmbox
|
|
||||||
not used for TCP: adjust TCP_WND instead! */
|
|
||||||
int recv_bufsize;
|
|
||||||
/** number of bytes currently in recvmbox to be received,
|
|
||||||
tested against recv_bufsize to limit bytes on recvmbox
|
|
||||||
for UDP and RAW, used for FIONREAD */
|
|
||||||
s16_t recv_avail;
|
|
||||||
#endif /* LWIP_SO_RCVBUF */
|
|
||||||
/** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */
|
|
||||||
u8_t flags;
|
|
||||||
#if LWIP_TCP
|
|
||||||
//***********Code for WIFI_BLOCK from upper**************
|
|
||||||
u32_t recv_holded_buf_Len;
|
|
||||||
/** TCP: when data passed to netconn_write doesn't fit into the send buffer,
|
|
||||||
this temporarily stores how much is already sent. */
|
|
||||||
size_t write_offset;
|
|
||||||
/** TCP: when data passed to netconn_write doesn't fit into the send buffer,
|
|
||||||
this temporarily stores the message.
|
|
||||||
Also used during connect and close. */
|
|
||||||
struct api_msg_msg *current_msg;
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
/** A callback function that is informed about events for this netconn */
|
|
||||||
netconn_callback callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Register an Network connection event */
|
|
||||||
#define API_EVENT(c,e,l) if (c->callback) { \
|
|
||||||
(*c->callback)(c, e, l); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Set conn->last_err to err but don't overwrite fatal errors */
|
|
||||||
#define NETCONN_SET_SAFE_ERR(conn, err) do { \
|
|
||||||
SYS_ARCH_DECL_PROTECT(lev); \
|
|
||||||
SYS_ARCH_PROTECT(lev); \
|
|
||||||
if (!ERR_IS_FATAL((conn)->last_err)) { \
|
|
||||||
(conn)->last_err = err; \
|
|
||||||
} \
|
|
||||||
SYS_ARCH_UNPROTECT(lev); \
|
|
||||||
} while(0);
|
|
||||||
|
|
||||||
/* Network connection functions: */
|
|
||||||
#define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL)
|
|
||||||
#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c)
|
|
||||||
struct
|
|
||||||
netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto,
|
|
||||||
netconn_callback callback);
|
|
||||||
err_t netconn_delete(struct netconn *conn);
|
|
||||||
/** Get the type of a netconn (as enum netconn_type). */
|
|
||||||
#define netconn_type(conn) (conn->type)
|
|
||||||
|
|
||||||
err_t netconn_getaddr(struct netconn *conn, ip_addr_t *addr,
|
|
||||||
u16_t *port, u8_t local);
|
|
||||||
#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0)
|
|
||||||
#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1)
|
|
||||||
|
|
||||||
err_t netconn_bind(struct netconn *conn, ip_addr_t *addr, u16_t port);
|
|
||||||
err_t netconn_connect(struct netconn *conn, ip_addr_t *addr, u16_t port);
|
|
||||||
err_t netconn_disconnect (struct netconn *conn);
|
|
||||||
err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog);
|
|
||||||
#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG)
|
|
||||||
err_t netconn_accept(struct netconn *conn, struct netconn **new_conn);
|
|
||||||
err_t netconn_recv(struct netconn *conn, struct netbuf **new_buf);
|
|
||||||
err_t netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf);
|
|
||||||
void netconn_recved(struct netconn *conn, u32_t length);
|
|
||||||
err_t netconn_sendto(struct netconn *conn, struct netbuf *buf,
|
|
||||||
ip_addr_t *addr, u16_t port);
|
|
||||||
err_t netconn_send(struct netconn *conn, struct netbuf *buf);
|
|
||||||
err_t netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,
|
|
||||||
u8_t apiflags, size_t *bytes_written);
|
|
||||||
#define netconn_write(conn, dataptr, size, apiflags) \
|
|
||||||
netconn_write_partly(conn, dataptr, size, apiflags, NULL)
|
|
||||||
err_t netconn_close(struct netconn *conn);
|
|
||||||
err_t netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx);
|
|
||||||
|
|
||||||
#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
|
|
||||||
err_t netconn_join_leave_group(struct netconn *conn, ip_addr_t *multiaddr,
|
|
||||||
ip_addr_t *netif_addr, enum netconn_igmp join_or_leave);
|
|
||||||
#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
|
|
||||||
#if LWIP_DNS
|
|
||||||
err_t netconn_gethostbyname(const char *name, ip_addr_t *addr);
|
|
||||||
#endif /* LWIP_DNS */
|
|
||||||
#if LWIP_IPV6
|
|
||||||
|
|
||||||
#define netconn_bind_ip6(conn, ip6addr, port) (NETCONNTYPE_ISIPV6((conn)->type) ? \
|
|
||||||
netconn_bind(conn, ip6_2_ip(ip6addr), port) : ERR_VAL)
|
|
||||||
#define netconn_connect_ip6(conn, ip6addr, port) (NETCONNTYPE_ISIPV6((conn)->type) ? \
|
|
||||||
netconn_connect(conn, ip6_2_ip(ip6addr), port) : ERR_VAL)
|
|
||||||
#define netconn_sendto_ip6(conn, buf, ip6addr, port) (NETCONNTYPE_ISIPV6((conn)->type) ? \
|
|
||||||
netconn_sendto(conn, buf, ip6_2_ip(ip6addr), port) : ERR_VAL)
|
|
||||||
#if LWIP_IPV6_MLD
|
|
||||||
#define netconn_join_leave_group_ip6(conn, multiaddr, srcaddr, join_or_leave) (NETCONNTYPE_ISIPV6((conn)->type) ? \
|
|
||||||
netconn_join_leave_group(conn, ip6_2_ip(multiaddr), ip6_2_ip(srcaddr), join_or_leave) :\
|
|
||||||
ERR_VAL)
|
|
||||||
#endif /* LWIP_IPV6_MLD*/
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#define netconn_err(conn) ((conn)->last_err)
|
|
||||||
#define netconn_recv_bufsize(conn) ((conn)->recv_bufsize)
|
|
||||||
|
|
||||||
/** Set the blocking status of netconn calls (@todo: write/send is missing) */
|
|
||||||
#define netconn_set_nonblocking(conn, val) do { if(val) { \
|
|
||||||
(conn)->flags |= NETCONN_FLAG_NON_BLOCKING; \
|
|
||||||
} else { \
|
|
||||||
(conn)->flags &= ~ NETCONN_FLAG_NON_BLOCKING; }} while(0)
|
|
||||||
/** Get the blocking status of netconn calls (@todo: write/send is missing) */
|
|
||||||
#define netconn_is_nonblocking(conn) (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0)
|
|
||||||
|
|
||||||
/** TCP: Set the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */
|
|
||||||
#define netconn_set_noautorecved(conn, val) do { if(val) { \
|
|
||||||
(conn)->flags |= NETCONN_FLAG_NO_AUTO_RECVED; \
|
|
||||||
} else { \
|
|
||||||
(conn)->flags &= ~ NETCONN_FLAG_NO_AUTO_RECVED; }} while(0)
|
|
||||||
/** TCP: Get the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */
|
|
||||||
#define netconn_get_noautorecved(conn) (((conn)->flags & NETCONN_FLAG_NO_AUTO_RECVED) != 0)
|
|
||||||
|
|
||||||
#if LWIP_SO_SNDTIMEO
|
|
||||||
/** Set the send timeout in milliseconds */
|
|
||||||
#define netconn_set_sendtimeout(conn, timeout) ((conn)->send_timeout = (timeout))
|
|
||||||
/** Get the send timeout in milliseconds */
|
|
||||||
#define netconn_get_sendtimeout(conn) ((conn)->send_timeout)
|
|
||||||
#endif /* LWIP_SO_SNDTIMEO */
|
|
||||||
#if LWIP_SO_RCVTIMEO
|
|
||||||
/** Set the receive timeout in milliseconds */
|
|
||||||
#define netconn_set_recvtimeout(conn, timeout) ((conn)->recv_timeout = (timeout))
|
|
||||||
/** Get the receive timeout in milliseconds */
|
|
||||||
#define netconn_get_recvtimeout(conn) ((conn)->recv_timeout)
|
|
||||||
#endif /* LWIP_SO_RCVTIMEO */
|
|
||||||
#if LWIP_SO_RCVBUF
|
|
||||||
/** Set the receive buffer in bytes */
|
|
||||||
#define netconn_set_recvbufsize(conn, recvbufsize) ((conn)->recv_bufsize = (recvbufsize))
|
|
||||||
/** Get the receive buffer in bytes */
|
|
||||||
#define netconn_get_recvbufsize(conn) ((conn)->recv_bufsize)
|
|
||||||
#endif /* LWIP_SO_RCVBUF*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
|
|
||||||
#endif /* __LWIP_API_H__ */
|
|
|
@ -1,177 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_API_MSG_H__
|
|
||||||
#define __LWIP_API_MSG_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include <stddef.h> /* for size_t */
|
|
||||||
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/igmp.h"
|
|
||||||
#include "lwip/api.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For the netconn API, these values are use as a bitmask! */
|
|
||||||
#define NETCONN_SHUT_RD 1
|
|
||||||
#define NETCONN_SHUT_WR 2
|
|
||||||
#define NETCONN_SHUT_RDWR (NETCONN_SHUT_RD | NETCONN_SHUT_WR)
|
|
||||||
|
|
||||||
/* IP addresses and port numbers are expected to be in
|
|
||||||
* the same byte order as in the corresponding pcb.
|
|
||||||
*/
|
|
||||||
/** This struct includes everything that is necessary to execute a function
|
|
||||||
for a netconn in another thread context (mainly used to process netconns
|
|
||||||
in the tcpip_thread context to be thread safe). */
|
|
||||||
struct api_msg_msg {
|
|
||||||
/** The netconn which to process - always needed: it includes the semaphore
|
|
||||||
which is used to block the application thread until the function finished. */
|
|
||||||
struct netconn *conn;
|
|
||||||
/** The return value of the function executed in tcpip_thread. */
|
|
||||||
err_t err;
|
|
||||||
/** Depending on the executed function, one of these union members is used */
|
|
||||||
union {
|
|
||||||
/** used for lwip_netconn_do_send */
|
|
||||||
struct netbuf *b;
|
|
||||||
/** used for lwip_netconn_do_newconn */
|
|
||||||
struct {
|
|
||||||
u8_t proto;
|
|
||||||
} n;
|
|
||||||
/** used for lwip_netconn_do_bind and lwip_netconn_do_connect */
|
|
||||||
struct {
|
|
||||||
ip_addr_t *ipaddr;
|
|
||||||
u16_t port;
|
|
||||||
} bc;
|
|
||||||
/** used for lwip_netconn_do_getaddr */
|
|
||||||
struct {
|
|
||||||
ipX_addr_t *ipaddr;
|
|
||||||
u16_t *port;
|
|
||||||
u8_t local;
|
|
||||||
} ad;
|
|
||||||
/** used for lwip_netconn_do_write */
|
|
||||||
struct {
|
|
||||||
const void *dataptr;
|
|
||||||
size_t len;
|
|
||||||
u8_t apiflags;
|
|
||||||
#if LWIP_SO_SNDTIMEO
|
|
||||||
u32_t time_started;
|
|
||||||
#endif /* LWIP_SO_SNDTIMEO */
|
|
||||||
} w;
|
|
||||||
/** used for lwip_netconn_do_recv */
|
|
||||||
struct {
|
|
||||||
u32_t len;
|
|
||||||
} r;
|
|
||||||
/** used for lwip_netconn_do_close (/shutdown) */
|
|
||||||
struct {
|
|
||||||
u8_t shut;
|
|
||||||
} sd;
|
|
||||||
#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
|
|
||||||
/** used for lwip_netconn_do_join_leave_group */
|
|
||||||
struct {
|
|
||||||
ipX_addr_t *multiaddr;
|
|
||||||
ipX_addr_t *netif_addr;
|
|
||||||
enum netconn_igmp join_or_leave;
|
|
||||||
} jl;
|
|
||||||
#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
|
|
||||||
#if TCP_LISTEN_BACKLOG
|
|
||||||
struct {
|
|
||||||
u8_t backlog;
|
|
||||||
} lb;
|
|
||||||
#endif /* TCP_LISTEN_BACKLOG */
|
|
||||||
} msg;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This struct contains a function to execute in another thread context and
|
|
||||||
a struct api_msg_msg that serves as an argument for this function.
|
|
||||||
This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */
|
|
||||||
struct api_msg {
|
|
||||||
/** function to execute in tcpip_thread context */
|
|
||||||
void (* function)(struct api_msg_msg *msg);
|
|
||||||
/** arguments for this function */
|
|
||||||
struct api_msg_msg msg;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_DNS
|
|
||||||
/** As lwip_netconn_do_gethostbyname requires more arguments but doesn't require a netconn,
|
|
||||||
it has its own struct (to avoid struct api_msg getting bigger than necessary).
|
|
||||||
lwip_netconn_do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg
|
|
||||||
(see netconn_gethostbyname). */
|
|
||||||
struct dns_api_msg {
|
|
||||||
/** Hostname to query or dotted IP address string */
|
|
||||||
const char *name;
|
|
||||||
/** Rhe resolved address is stored here */
|
|
||||||
ip_addr_t *addr;
|
|
||||||
/** This semaphore is posted when the name is resolved, the application thread
|
|
||||||
should wait on it. */
|
|
||||||
sys_sem_t *sem;
|
|
||||||
/** Errors are given back here */
|
|
||||||
err_t *err;
|
|
||||||
};
|
|
||||||
#endif /* LWIP_DNS */
|
|
||||||
|
|
||||||
void lwip_netconn_do_newconn ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_delconn ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_bind ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_connect ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_disconnect ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_listen ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_send ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_recv ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_write ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_getaddr ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_close ( struct api_msg_msg *msg);
|
|
||||||
void lwip_netconn_do_shutdown ( struct api_msg_msg *msg);
|
|
||||||
#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
|
|
||||||
void lwip_netconn_do_join_leave_group( struct api_msg_msg *msg);
|
|
||||||
#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
|
|
||||||
|
|
||||||
#if LWIP_DNS
|
|
||||||
void lwip_netconn_do_gethostbyname(void *arg);
|
|
||||||
#endif /* LWIP_DNS */
|
|
||||||
|
|
||||||
struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback);
|
|
||||||
void netconn_free(struct netconn *conn);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
|
|
||||||
#endif /* __LWIP_API_MSG_H__ */
|
|
|
@ -1,217 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_ARCH_H__
|
|
||||||
#define __LWIP_ARCH_H__
|
|
||||||
|
|
||||||
#ifndef LITTLE_ENDIAN
|
|
||||||
#define LITTLE_ENDIAN 1234
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BIG_ENDIAN
|
|
||||||
#define BIG_ENDIAN 4321
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "arch/cc.h"
|
|
||||||
|
|
||||||
/** Temporary: define format string for size_t if not defined in cc.h */
|
|
||||||
#ifndef SZT_F
|
|
||||||
#define SZT_F U32_F
|
|
||||||
#endif /* SZT_F */
|
|
||||||
/** Temporary upgrade helper: define format string for u8_t as hex if not
|
|
||||||
defined in cc.h */
|
|
||||||
#ifndef X8_F
|
|
||||||
#define X8_F "02x"
|
|
||||||
#endif /* X8_F */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PACK_STRUCT_BEGIN
|
|
||||||
#define PACK_STRUCT_BEGIN
|
|
||||||
#endif /* PACK_STRUCT_BEGIN */
|
|
||||||
|
|
||||||
#ifndef PACK_STRUCT_END
|
|
||||||
#define PACK_STRUCT_END
|
|
||||||
#endif /* PACK_STRUCT_END */
|
|
||||||
|
|
||||||
#ifndef PACK_STRUCT_FIELD
|
|
||||||
#define PACK_STRUCT_FIELD(x) x
|
|
||||||
#endif /* PACK_STRUCT_FIELD */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LWIP_UNUSED_ARG
|
|
||||||
#define LWIP_UNUSED_ARG(x) (void)x
|
|
||||||
#endif /* LWIP_UNUSED_ARG */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LWIP_PROVIDE_ERRNO
|
|
||||||
|
|
||||||
#define EPERM 1 /* Operation not permitted */
|
|
||||||
#define ENOENT 2 /* No such file or directory */
|
|
||||||
#define ESRCH 3 /* No such process */
|
|
||||||
#define EINTR 4 /* Interrupted system call */
|
|
||||||
#define EIO 5 /* I/O error */
|
|
||||||
#define ENXIO 6 /* No such device or address */
|
|
||||||
#define E2BIG 7 /* Arg list too long */
|
|
||||||
#define ENOEXEC 8 /* Exec format error */
|
|
||||||
#define EBADF 9 /* Bad file number */
|
|
||||||
#define ECHILD 10 /* No child processes */
|
|
||||||
#define EAGAIN 11 /* Try again */
|
|
||||||
#define ENOMEM 12 /* Out of memory */
|
|
||||||
#define EACCES 13 /* Permission denied */
|
|
||||||
#define EFAULT 14 /* Bad address */
|
|
||||||
#define ENOTBLK 15 /* Block device required */
|
|
||||||
#define EBUSY 16 /* Device or resource busy */
|
|
||||||
#define EEXIST 17 /* File exists */
|
|
||||||
#define EXDEV 18 /* Cross-device link */
|
|
||||||
#define ENODEV 19 /* No such device */
|
|
||||||
#define ENOTDIR 20 /* Not a directory */
|
|
||||||
#define EISDIR 21 /* Is a directory */
|
|
||||||
#define EINVAL 22 /* Invalid argument */
|
|
||||||
#define ENFILE 23 /* File table overflow */
|
|
||||||
#define EMFILE 24 /* Too many open files */
|
|
||||||
#define ENOTTY 25 /* Not a typewriter */
|
|
||||||
#define ETXTBSY 26 /* Text file busy */
|
|
||||||
#define EFBIG 27 /* File too large */
|
|
||||||
#define ENOSPC 28 /* No space left on device */
|
|
||||||
#define ESPIPE 29 /* Illegal seek */
|
|
||||||
#define EROFS 30 /* Read-only file system */
|
|
||||||
#define EMLINK 31 /* Too many links */
|
|
||||||
#define EPIPE 32 /* Broken pipe */
|
|
||||||
#define EDOM 33 /* Math argument out of domain of func */
|
|
||||||
#define ERANGE 34 /* Math result not representable */
|
|
||||||
#define EDEADLK 35 /* Resource deadlock would occur */
|
|
||||||
#define ENAMETOOLONG 36 /* File name too long */
|
|
||||||
#define ENOLCK 37 /* No record locks available */
|
|
||||||
#define ENOSYS 38 /* Function not implemented */
|
|
||||||
#define ENOTEMPTY 39 /* Directory not empty */
|
|
||||||
#define ELOOP 40 /* Too many symbolic links encountered */
|
|
||||||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
|
||||||
#define ENOMSG 42 /* No message of desired type */
|
|
||||||
#define EIDRM 43 /* Identifier removed */
|
|
||||||
#define ECHRNG 44 /* Channel number out of range */
|
|
||||||
#define EL2NSYNC 45 /* Level 2 not synchronized */
|
|
||||||
#define EL3HLT 46 /* Level 3 halted */
|
|
||||||
#define EL3RST 47 /* Level 3 reset */
|
|
||||||
#define ELNRNG 48 /* Link number out of range */
|
|
||||||
#define EUNATCH 49 /* Protocol driver not attached */
|
|
||||||
#define ENOCSI 50 /* No CSI structure available */
|
|
||||||
#define EL2HLT 51 /* Level 2 halted */
|
|
||||||
#define EBADE 52 /* Invalid exchange */
|
|
||||||
#define EBADR 53 /* Invalid request descriptor */
|
|
||||||
#define EXFULL 54 /* Exchange full */
|
|
||||||
#define ENOANO 55 /* No anode */
|
|
||||||
#define EBADRQC 56 /* Invalid request code */
|
|
||||||
#define EBADSLT 57 /* Invalid slot */
|
|
||||||
|
|
||||||
#define EDEADLOCK EDEADLK
|
|
||||||
|
|
||||||
#define EBFONT 59 /* Bad font file format */
|
|
||||||
#define ENOSTR 60 /* Device not a stream */
|
|
||||||
#define ENODATA 61 /* No data available */
|
|
||||||
#define ETIME 62 /* Timer expired */
|
|
||||||
#define ENOSR 63 /* Out of streams resources */
|
|
||||||
#define ENONET 64 /* Machine is not on the network */
|
|
||||||
#define ENOPKG 65 /* Package not installed */
|
|
||||||
#define EREMOTE 66 /* Object is remote */
|
|
||||||
#define ENOLINK 67 /* Link has been severed */
|
|
||||||
#define EADV 68 /* Advertise error */
|
|
||||||
#define ESRMNT 69 /* Srmount error */
|
|
||||||
#define ECOMM 70 /* Communication error on send */
|
|
||||||
#define EPROTO 71 /* Protocol error */
|
|
||||||
#define EMULTIHOP 72 /* Multihop attempted */
|
|
||||||
#define EDOTDOT 73 /* RFS specific error */
|
|
||||||
#define EBADMSG 74 /* Not a data message */
|
|
||||||
#define EOVERFLOW 75 /* Value too large for defined data type */
|
|
||||||
#define ENOTUNIQ 76 /* Name not unique on network */
|
|
||||||
#define EBADFD 77 /* File descriptor in bad state */
|
|
||||||
#define EREMCHG 78 /* Remote address changed */
|
|
||||||
#define ELIBACC 79 /* Can not access a needed shared library */
|
|
||||||
#define ELIBBAD 80 /* Accessing a corrupted shared library */
|
|
||||||
#define ELIBSCN 81 /* .lib section in a.out corrupted */
|
|
||||||
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
|
|
||||||
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
|
|
||||||
#define EILSEQ 84 /* Illegal byte sequence */
|
|
||||||
#define ERESTART 85 /* Interrupted system call should be restarted */
|
|
||||||
#define ESTRPIPE 86 /* Streams pipe error */
|
|
||||||
#define EUSERS 87 /* Too many users */
|
|
||||||
#define ENOTSOCK 88 /* Socket operation on non-socket */
|
|
||||||
#define EDESTADDRREQ 89 /* Destination address required */
|
|
||||||
#define EMSGSIZE 90 /* Message too long */
|
|
||||||
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
|
|
||||||
#define ENOPROTOOPT 92 /* Protocol not available */
|
|
||||||
#define EPROTONOSUPPORT 93 /* Protocol not supported */
|
|
||||||
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
|
|
||||||
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
|
|
||||||
#define EPFNOSUPPORT 96 /* Protocol family not supported */
|
|
||||||
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
|
|
||||||
#define EADDRINUSE 98 /* Address already in use */
|
|
||||||
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
|
|
||||||
#define ENETDOWN 100 /* Network is down */
|
|
||||||
#define ENETUNREACH 101 /* Network is unreachable */
|
|
||||||
#define ENETRESET 102 /* Network dropped connection because of reset */
|
|
||||||
#define ECONNABORTED 103 /* Software caused connection abort */
|
|
||||||
#define ECONNRESET 104 /* Connection reset by peer */
|
|
||||||
#define ENOBUFS 105 /* No buffer space available */
|
|
||||||
#define EISCONN 106 /* Transport endpoint is already connected */
|
|
||||||
#define ENOTCONN 107 /* Transport endpoint is not connected */
|
|
||||||
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
|
|
||||||
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
|
|
||||||
#define ETIMEDOUT 110 /* Connection timed out */
|
|
||||||
#define ECONNREFUSED 111 /* Connection refused */
|
|
||||||
#define EHOSTDOWN 112 /* Host is down */
|
|
||||||
#define EHOSTUNREACH 113 /* No route to host */
|
|
||||||
#define EALREADY 114 /* Operation already in progress */
|
|
||||||
#define EINPROGRESS 115 /* Operation now in progress */
|
|
||||||
#define ESTALE 116 /* Stale NFS file handle */
|
|
||||||
#define EUCLEAN 117 /* Structure needs cleaning */
|
|
||||||
#define ENOTNAM 118 /* Not a XENIX named type file */
|
|
||||||
#define ENAVAIL 119 /* No XENIX semaphores available */
|
|
||||||
#define EISNAM 120 /* Is a named type file */
|
|
||||||
#define EREMOTEIO 121 /* Remote I/O error */
|
|
||||||
#define EDQUOT 122 /* Quota exceeded */
|
|
||||||
|
|
||||||
#define ENOMEDIUM 123 /* No medium found */
|
|
||||||
#define EMEDIUMTYPE 124 /* Wrong medium type */
|
|
||||||
|
|
||||||
#ifndef errno
|
|
||||||
extern int errno;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_PROVIDE_ERRNO */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_ARCH_H__ */
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_DEBUG_H__
|
|
||||||
#define __LWIP_DEBUG_H__
|
|
||||||
|
|
||||||
#include "lwip/arch.h"
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
/** lower two bits indicate debug level
|
|
||||||
* - 0 all
|
|
||||||
* - 1 warning
|
|
||||||
* - 2 serious
|
|
||||||
* - 3 severe
|
|
||||||
*/
|
|
||||||
#define LWIP_DBG_LEVEL_ALL 0x00
|
|
||||||
#define LWIP_DBG_LEVEL_OFF LWIP_DBG_LEVEL_ALL /* compatibility define only */
|
|
||||||
#define LWIP_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */
|
|
||||||
#define LWIP_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */
|
|
||||||
#define LWIP_DBG_LEVEL_SEVERE 0x03
|
|
||||||
#define LWIP_DBG_MASK_LEVEL 0x03
|
|
||||||
|
|
||||||
/** flag for LWIP_DEBUGF to enable that debug message */
|
|
||||||
#define LWIP_DBG_ON 0x80U
|
|
||||||
/** flag for LWIP_DEBUGF to disable that debug message */
|
|
||||||
#define LWIP_DBG_OFF 0x00U
|
|
||||||
|
|
||||||
/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */
|
|
||||||
#define LWIP_DBG_TRACE 0x40U
|
|
||||||
/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */
|
|
||||||
#define LWIP_DBG_STATE 0x20U
|
|
||||||
/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */
|
|
||||||
#define LWIP_DBG_FRESH 0x10U
|
|
||||||
/** flag for LWIP_DEBUGF to halt after printing this debug message */
|
|
||||||
#define LWIP_DBG_HALT 0x08U
|
|
||||||
|
|
||||||
#ifndef LWIP_NOASSERT
|
|
||||||
#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \
|
|
||||||
LWIP_PLATFORM_ASSERT(message); } while(0)
|
|
||||||
#else /* LWIP_NOASSERT */
|
|
||||||
#define LWIP_ASSERT(message, assertion)
|
|
||||||
#endif /* LWIP_NOASSERT */
|
|
||||||
|
|
||||||
/** if "expression" isn't true, then print "message" and execute "handler" expression */
|
|
||||||
#ifndef LWIP_ERROR
|
|
||||||
#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
|
|
||||||
LWIP_PLATFORM_ASSERT(message); handler;}} while(0)
|
|
||||||
#endif /* LWIP_ERROR */
|
|
||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
/** print debug message only if debug message type is enabled...
|
|
||||||
* AND is of correct type AND is at least LWIP_DBG_LEVEL
|
|
||||||
*/
|
|
||||||
#define LWIP_DEBUGF(debug, message) do { \
|
|
||||||
if ( \
|
|
||||||
((debug) & LWIP_DBG_ON) && \
|
|
||||||
((debug) & LWIP_DBG_TYPES_ON) && \
|
|
||||||
((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
|
|
||||||
LWIP_PLATFORM_DIAG(message); \
|
|
||||||
if ((debug) & LWIP_DBG_HALT) { \
|
|
||||||
while(1); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#else /* LWIP_DEBUG */
|
|
||||||
#define LWIP_DEBUGF(debug, message)
|
|
||||||
#endif /* LWIP_DEBUG */
|
|
||||||
|
|
||||||
#endif /* __LWIP_DEBUG_H__ */
|
|
||||||
|
|
|
@ -1,127 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_DEF_H__
|
|
||||||
#define __LWIP_DEF_H__
|
|
||||||
|
|
||||||
/* arch.h might define NULL already */
|
|
||||||
#include "lwip/arch.h"
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LWIP_MAX(x , y) (((x) > (y)) ? (x) : (y))
|
|
||||||
#define LWIP_MIN(x , y) (((x) < (y)) ? (x) : (y))
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL ((void *)0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Get the absolute difference between 2 u32_t values (correcting overflows)
|
|
||||||
* 'a' is expected to be 'higher' (without overflow) than 'b'. */
|
|
||||||
#define LWIP_U32_DIFF(a, b) (((a) >= (b)) ? ((a) - (b)) : (((a) + ((b) ^ 0xFFFFFFFF) + 1)))
|
|
||||||
|
|
||||||
/* Endianess-optimized shifting of two u8_t to create one u16_t */
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
#define LWIP_MAKE_U16(a, b) ((a << 8) | b)
|
|
||||||
#else
|
|
||||||
#define LWIP_MAKE_U16(a, b) ((b << 8) | a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LWIP_PLATFORM_BYTESWAP
|
|
||||||
#define LWIP_PLATFORM_BYTESWAP 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LWIP_PREFIX_BYTEORDER_FUNCS
|
|
||||||
/* workaround for naming collisions on some platforms */
|
|
||||||
|
|
||||||
#ifdef htons
|
|
||||||
#undef htons
|
|
||||||
#endif /* htons */
|
|
||||||
#ifdef htonl
|
|
||||||
#undef htonl
|
|
||||||
#endif /* htonl */
|
|
||||||
#ifdef ntohs
|
|
||||||
#undef ntohs
|
|
||||||
#endif /* ntohs */
|
|
||||||
#ifdef ntohl
|
|
||||||
#undef ntohl
|
|
||||||
#endif /* ntohl */
|
|
||||||
|
|
||||||
#define htons(x) lwip_htons(x)
|
|
||||||
#define ntohs(x) lwip_ntohs(x)
|
|
||||||
#define htonl(x) lwip_htonl(x)
|
|
||||||
#define ntohl(x) lwip_ntohl(x)
|
|
||||||
#endif /* LWIP_PREFIX_BYTEORDER_FUNCS */
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
#define lwip_htons(x) (x)
|
|
||||||
#define lwip_ntohs(x) (x)
|
|
||||||
#define lwip_htonl(x) (x)
|
|
||||||
#define lwip_ntohl(x) (x)
|
|
||||||
#define PP_HTONS(x) (x)
|
|
||||||
#define PP_NTOHS(x) (x)
|
|
||||||
#define PP_HTONL(x) (x)
|
|
||||||
#define PP_NTOHL(x) (x)
|
|
||||||
#else /* BYTE_ORDER != BIG_ENDIAN */
|
|
||||||
#if LWIP_PLATFORM_BYTESWAP
|
|
||||||
#define lwip_htons(x) LWIP_PLATFORM_HTONS(x)
|
|
||||||
#define lwip_ntohs(x) LWIP_PLATFORM_HTONS(x)
|
|
||||||
#define lwip_htonl(x) LWIP_PLATFORM_HTONL(x)
|
|
||||||
#define lwip_ntohl(x) LWIP_PLATFORM_HTONL(x)
|
|
||||||
#else /* LWIP_PLATFORM_BYTESWAP */
|
|
||||||
u16_t lwip_htons(u16_t x);
|
|
||||||
u16_t lwip_ntohs(u16_t x);
|
|
||||||
u32_t lwip_htonl(u32_t x);
|
|
||||||
u32_t lwip_ntohl(u32_t x);
|
|
||||||
#endif /* LWIP_PLATFORM_BYTESWAP */
|
|
||||||
|
|
||||||
/* These macros should be calculated by the preprocessor and are used
|
|
||||||
with compile-time constants only (so that there is no little-endian
|
|
||||||
overhead at runtime). */
|
|
||||||
#define PP_HTONS(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
|
|
||||||
#define PP_NTOHS(x) PP_HTONS(x)
|
|
||||||
#define PP_HTONL(x) ((((x) & 0xff) << 24) | \
|
|
||||||
(((x) & 0xff00) << 8) | \
|
|
||||||
(((x) & 0xff0000UL) >> 8) | \
|
|
||||||
(((x) & 0xff000000UL) >> 24))
|
|
||||||
#define PP_NTOHL(x) PP_HTONL(x)
|
|
||||||
|
|
||||||
#endif /* BYTE_ORDER == BIG_ENDIAN */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_DEF_H__ */
|
|
||||||
|
|
|
@ -1,242 +0,0 @@
|
||||||
/** @file
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_DHCP_H__
|
|
||||||
#define __LWIP_DHCP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/udp.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** period (in seconds) of the application calling dhcp_coarse_tmr() */
|
|
||||||
#define DHCP_COARSE_TIMER_SECS 60
|
|
||||||
/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */
|
|
||||||
#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL)
|
|
||||||
/** period (in milliseconds) of the application calling dhcp_fine_tmr() */
|
|
||||||
#define DHCP_FINE_TIMER_MSECS 500
|
|
||||||
|
|
||||||
#define DHCP_CHADDR_LEN 16U
|
|
||||||
#define DHCP_SNAME_LEN 64U
|
|
||||||
#define DHCP_FILE_LEN 128U
|
|
||||||
|
|
||||||
struct dhcp
|
|
||||||
{
|
|
||||||
/** transaction identifier of last sent request */
|
|
||||||
u32_t xid;
|
|
||||||
/** our connection to the DHCP server */
|
|
||||||
struct udp_pcb *pcb;
|
|
||||||
/** incoming msg */
|
|
||||||
struct dhcp_msg *msg_in;
|
|
||||||
/** current DHCP state machine state */
|
|
||||||
u8_t state;
|
|
||||||
/** retries of current request */
|
|
||||||
u8_t tries;
|
|
||||||
#if LWIP_DHCP_AUTOIP_COOP
|
|
||||||
u8_t autoip_coop_state;
|
|
||||||
#endif
|
|
||||||
u8_t subnet_mask_given;
|
|
||||||
|
|
||||||
struct pbuf *p_out; /* pbuf of outcoming msg */
|
|
||||||
struct dhcp_msg *msg_out; /* outgoing msg */
|
|
||||||
u16_t options_out_len; /* outgoing msg options length */
|
|
||||||
u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
|
|
||||||
u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
|
|
||||||
u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
|
|
||||||
ip_addr_t server_ip_addr; /* dhcp server address that offered this lease */
|
|
||||||
ip_addr_t offered_ip_addr;
|
|
||||||
ip_addr_t offered_sn_mask;
|
|
||||||
ip_addr_t offered_gw_addr;
|
|
||||||
|
|
||||||
u32_t offered_t0_lease; /* lease period (in seconds) */
|
|
||||||
u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
|
|
||||||
u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */
|
|
||||||
/* @todo: LWIP_DHCP_BOOTP_FILE configuration option?
|
|
||||||
integrate with possible TFTP-client for booting? */
|
|
||||||
#if LWIP_DHCP_BOOTP_FILE
|
|
||||||
ip_addr_t offered_si_addr;
|
|
||||||
char boot_file_name[DHCP_FILE_LEN];
|
|
||||||
#endif /* LWIP_DHCP_BOOTPFILE */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* MUST be compiled with "pack structs" or equivalent! */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
/** minimum set of fields of any DHCP message */
|
|
||||||
struct dhcp_msg
|
|
||||||
{
|
|
||||||
PACK_STRUCT_FIELD(u8_t op);
|
|
||||||
PACK_STRUCT_FIELD(u8_t htype);
|
|
||||||
PACK_STRUCT_FIELD(u8_t hlen);
|
|
||||||
PACK_STRUCT_FIELD(u8_t hops);
|
|
||||||
PACK_STRUCT_FIELD(u32_t xid);
|
|
||||||
PACK_STRUCT_FIELD(u16_t secs);
|
|
||||||
PACK_STRUCT_FIELD(u16_t flags);
|
|
||||||
PACK_STRUCT_FIELD(ip_addr_p_t ciaddr);
|
|
||||||
PACK_STRUCT_FIELD(ip_addr_p_t yiaddr);
|
|
||||||
PACK_STRUCT_FIELD(ip_addr_p_t siaddr);
|
|
||||||
PACK_STRUCT_FIELD(ip_addr_p_t giaddr);
|
|
||||||
PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]);
|
|
||||||
PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]);
|
|
||||||
PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]);
|
|
||||||
PACK_STRUCT_FIELD(u32_t cookie);
|
|
||||||
#define DHCP_MIN_OPTIONS_LEN 68U
|
|
||||||
/** make sure user does not configure this too small */
|
|
||||||
#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))
|
|
||||||
# undef DHCP_OPTIONS_LEN
|
|
||||||
#endif
|
|
||||||
/** allow this to be configured in lwipopts.h, but not too small */
|
|
||||||
#if (!defined(DHCP_OPTIONS_LEN))
|
|
||||||
/** set this to be sufficient for your options in outgoing DHCP msgs */
|
|
||||||
# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp);
|
|
||||||
/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */
|
|
||||||
#define dhcp_remove_struct(netif) do { (netif)->dhcp = NULL; } while(0)
|
|
||||||
void dhcp_cleanup(struct netif *netif);
|
|
||||||
/** start DHCP configuration */
|
|
||||||
err_t dhcp_start(struct netif *netif);
|
|
||||||
/** enforce early lease renewal (not needed normally)*/
|
|
||||||
err_t dhcp_renew(struct netif *netif);
|
|
||||||
/** release the DHCP lease, usually called before dhcp_stop()*/
|
|
||||||
err_t dhcp_release(struct netif *netif);
|
|
||||||
/** stop DHCP configuration */
|
|
||||||
void dhcp_stop(struct netif *netif);
|
|
||||||
/** inform server of our manual IP address */
|
|
||||||
void dhcp_inform(struct netif *netif);
|
|
||||||
/** Handle a possible change in the network configuration */
|
|
||||||
void dhcp_network_changed(struct netif *netif);
|
|
||||||
|
|
||||||
/** if enabled, check whether the offered IP address is not in use, using ARP */
|
|
||||||
#if DHCP_DOES_ARP_CHECK
|
|
||||||
void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** to be called every minute */
|
|
||||||
void dhcp_coarse_tmr(void);
|
|
||||||
/** to be called every half second */
|
|
||||||
void dhcp_fine_tmr(void);
|
|
||||||
|
|
||||||
/** DHCP message item offsets and length */
|
|
||||||
#define DHCP_OP_OFS 0
|
|
||||||
#define DHCP_HTYPE_OFS 1
|
|
||||||
#define DHCP_HLEN_OFS 2
|
|
||||||
#define DHCP_HOPS_OFS 3
|
|
||||||
#define DHCP_XID_OFS 4
|
|
||||||
#define DHCP_SECS_OFS 8
|
|
||||||
#define DHCP_FLAGS_OFS 10
|
|
||||||
#define DHCP_CIADDR_OFS 12
|
|
||||||
#define DHCP_YIADDR_OFS 16
|
|
||||||
#define DHCP_SIADDR_OFS 20
|
|
||||||
#define DHCP_GIADDR_OFS 24
|
|
||||||
#define DHCP_CHADDR_OFS 28
|
|
||||||
#define DHCP_SNAME_OFS 44
|
|
||||||
#define DHCP_FILE_OFS 108
|
|
||||||
#define DHCP_MSG_LEN 236
|
|
||||||
|
|
||||||
#define DHCP_COOKIE_OFS DHCP_MSG_LEN
|
|
||||||
#define DHCP_OPTIONS_OFS (DHCP_MSG_LEN + 4)
|
|
||||||
|
|
||||||
#define DHCP_CLIENT_PORT 68
|
|
||||||
#define DHCP_SERVER_PORT 67
|
|
||||||
|
|
||||||
/** DHCP client states */
|
|
||||||
#define DHCP_OFF 0
|
|
||||||
#define DHCP_REQUESTING 1
|
|
||||||
#define DHCP_INIT 2
|
|
||||||
#define DHCP_REBOOTING 3
|
|
||||||
#define DHCP_REBINDING 4
|
|
||||||
#define DHCP_RENEWING 5
|
|
||||||
#define DHCP_SELECTING 6
|
|
||||||
#define DHCP_INFORMING 7
|
|
||||||
#define DHCP_CHECKING 8
|
|
||||||
#define DHCP_PERMANENT 9
|
|
||||||
#define DHCP_BOUND 10
|
|
||||||
/** not yet implemented #define DHCP_RELEASING 11 */
|
|
||||||
#define DHCP_BACKING_OFF 12
|
|
||||||
|
|
||||||
/** AUTOIP cooperatation flags */
|
|
||||||
#define DHCP_AUTOIP_COOP_STATE_OFF 0
|
|
||||||
#define DHCP_AUTOIP_COOP_STATE_ON 1
|
|
||||||
|
|
||||||
#define DHCP_BOOTREQUEST 1
|
|
||||||
#define DHCP_BOOTREPLY 2
|
|
||||||
|
|
||||||
/** DHCP message types */
|
|
||||||
#define DHCP_DISCOVER 1
|
|
||||||
#define DHCP_OFFER 2
|
|
||||||
#define DHCP_REQUEST 3
|
|
||||||
#define DHCP_DECLINE 4
|
|
||||||
#define DHCP_ACK 5
|
|
||||||
#define DHCP_NAK 6
|
|
||||||
#define DHCP_RELEASE 7
|
|
||||||
#define DHCP_INFORM 8
|
|
||||||
|
|
||||||
/** DHCP hardware type, currently only ethernet is supported */
|
|
||||||
#define DHCP_HTYPE_ETH 1
|
|
||||||
|
|
||||||
#define DHCP_MAGIC_COOKIE 0x63825363UL
|
|
||||||
|
|
||||||
/* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */
|
|
||||||
|
|
||||||
/** BootP options */
|
|
||||||
#define DHCP_OPTION_PAD 0
|
|
||||||
#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */
|
|
||||||
#define DHCP_OPTION_ROUTER 3
|
|
||||||
#define DHCP_OPTION_DNS_SERVER 6
|
|
||||||
#define DHCP_OPTION_HOSTNAME 12
|
|
||||||
#define DHCP_OPTION_IP_TTL 23
|
|
||||||
#define DHCP_OPTION_MTU 26
|
|
||||||
#define DHCP_OPTION_BROADCAST 28
|
|
||||||
#define DHCP_OPTION_TCP_TTL 37
|
|
||||||
#define DHCP_OPTION_END 255
|
|
||||||
|
|
||||||
/** DHCP options */
|
|
||||||
#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */
|
|
||||||
#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */
|
|
||||||
#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */
|
|
||||||
|
|
||||||
#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */
|
|
||||||
#define DHCP_OPTION_MESSAGE_TYPE_LEN 1
|
|
||||||
|
|
||||||
#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */
|
|
||||||
#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */
|
|
||||||
|
|
||||||
#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */
|
|
||||||
#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2
|
|
||||||
|
|
||||||
#define DHCP_OPTION_T1 58 /* T1 renewal time */
|
|
||||||
#define DHCP_OPTION_T2 59 /* T2 rebinding time */
|
|
||||||
#define DHCP_OPTION_US 60
|
|
||||||
#define DHCP_OPTION_CLIENT_ID 61
|
|
||||||
#define DHCP_OPTION_TFTP_SERVERNAME 66
|
|
||||||
#define DHCP_OPTION_BOOTFILE 67
|
|
||||||
|
|
||||||
/** possible combinations of overloading the file and sname fields with options */
|
|
||||||
#define DHCP_OVERLOAD_NONE 0
|
|
||||||
#define DHCP_OVERLOAD_FILE 1
|
|
||||||
#define DHCP_OVERLOAD_SNAME 2
|
|
||||||
#define DHCP_OVERLOAD_SNAME_FILE 3
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_DHCP */
|
|
||||||
|
|
||||||
#endif /*__LWIP_DHCP_H__*/
|
|
|
@ -1,125 +0,0 @@
|
||||||
/**
|
|
||||||
* lwip DNS resolver header file.
|
|
||||||
|
|
||||||
* Author: Jim Pettinato
|
|
||||||
* April 2007
|
|
||||||
|
|
||||||
* ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_DNS_H__
|
|
||||||
#define __LWIP_DNS_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** DNS timer period */
|
|
||||||
#define DNS_TMR_INTERVAL 1000
|
|
||||||
|
|
||||||
/** DNS field TYPE used for "Resource Records" */
|
|
||||||
#define DNS_RRTYPE_A 1 /* a host address */
|
|
||||||
#define DNS_RRTYPE_NS 2 /* an authoritative name server */
|
|
||||||
#define DNS_RRTYPE_MD 3 /* a mail destination (Obsolete - use MX) */
|
|
||||||
#define DNS_RRTYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */
|
|
||||||
#define DNS_RRTYPE_CNAME 5 /* the canonical name for an alias */
|
|
||||||
#define DNS_RRTYPE_SOA 6 /* marks the start of a zone of authority */
|
|
||||||
#define DNS_RRTYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */
|
|
||||||
#define DNS_RRTYPE_MG 8 /* a mail group member (EXPERIMENTAL) */
|
|
||||||
#define DNS_RRTYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */
|
|
||||||
#define DNS_RRTYPE_NULL 10 /* a null RR (EXPERIMENTAL) */
|
|
||||||
#define DNS_RRTYPE_WKS 11 /* a well known service description */
|
|
||||||
#define DNS_RRTYPE_PTR 12 /* a domain name pointer */
|
|
||||||
#define DNS_RRTYPE_HINFO 13 /* host information */
|
|
||||||
#define DNS_RRTYPE_MINFO 14 /* mailbox or mail list information */
|
|
||||||
#define DNS_RRTYPE_MX 15 /* mail exchange */
|
|
||||||
#define DNS_RRTYPE_TXT 16 /* text strings */
|
|
||||||
|
|
||||||
/** DNS field CLASS used for "Resource Records" */
|
|
||||||
#define DNS_RRCLASS_IN 1 /* the Internet */
|
|
||||||
#define DNS_RRCLASS_CS 2 /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */
|
|
||||||
#define DNS_RRCLASS_CH 3 /* the CHAOS class */
|
|
||||||
#define DNS_RRCLASS_HS 4 /* Hesiod [Dyer 87] */
|
|
||||||
#define DNS_RRCLASS_FLUSH 0x800 /* Flush bit */
|
|
||||||
|
|
||||||
/* The size used for the next line is rather a hack, but it prevents including socket.h in all files
|
|
||||||
that include memp.h, and that would possibly break portability (since socket.h defines some types
|
|
||||||
and constants possibly already define by the OS).
|
|
||||||
Calculation rule:
|
|
||||||
sizeof(struct addrinfo) + sizeof(struct sockaddr_in) + DNS_MAX_NAME_LENGTH + 1 byte zero-termination */
|
|
||||||
#define NETDB_ELEM_SIZE (32 + 16 + DNS_MAX_NAME_LENGTH + 1)
|
|
||||||
|
|
||||||
#if DNS_LOCAL_HOSTLIST
|
|
||||||
/** struct used for local host-list */
|
|
||||||
struct local_hostlist_entry {
|
|
||||||
/** static hostname */
|
|
||||||
const char *name;
|
|
||||||
/** static host address in network byteorder */
|
|
||||||
ip_addr_t addr;
|
|
||||||
struct local_hostlist_entry *next;
|
|
||||||
};
|
|
||||||
#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
|
||||||
#ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN
|
|
||||||
#define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH
|
|
||||||
#endif
|
|
||||||
#define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1))
|
|
||||||
#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
|
||||||
#endif /* DNS_LOCAL_HOSTLIST */
|
|
||||||
|
|
||||||
/** Callback which is invoked when a hostname is found.
|
|
||||||
* A function of this type must be implemented by the application using the DNS resolver.
|
|
||||||
* @param name pointer to the name that was looked up.
|
|
||||||
* @param ipaddr pointer to an ip_addr_t containing the IP address of the hostname,
|
|
||||||
* or NULL if the name could not be found (or on any other error).
|
|
||||||
* @param callback_arg a user-specified callback argument passed to dns_gethostbyname
|
|
||||||
*/
|
|
||||||
typedef void (*dns_found_callback)(const char *name, ip_addr_t *ipaddr, void *callback_arg);
|
|
||||||
|
|
||||||
void dns_init(void);
|
|
||||||
void dns_tmr(void);
|
|
||||||
void dns_setserver(u8_t numdns, ip_addr_t *dnsserver);
|
|
||||||
ip_addr_t dns_getserver(u8_t numdns);
|
|
||||||
err_t dns_gethostbyname(const char *hostname, ip_addr_t *addr,
|
|
||||||
dns_found_callback found, void *callback_arg);
|
|
||||||
|
|
||||||
#if DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
|
||||||
int dns_local_removehost(const char *hostname, const ip_addr_t *addr);
|
|
||||||
err_t dns_local_addhost(const char *hostname, const ip_addr_t *addr);
|
|
||||||
#endif /* DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_DNS */
|
|
||||||
|
|
||||||
#endif /* __LWIP_DNS_H__ */
|
|
|
@ -1,85 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_ERR_H__
|
|
||||||
#define __LWIP_ERR_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/arch.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Define LWIP_ERR_T in cc.h if you want to use
|
|
||||||
* a different type for your platform (must be signed). */
|
|
||||||
#ifdef LWIP_ERR_T
|
|
||||||
typedef LWIP_ERR_T err_t;
|
|
||||||
#else /* LWIP_ERR_T */
|
|
||||||
typedef s8_t err_t;
|
|
||||||
#endif /* LWIP_ERR_T*/
|
|
||||||
|
|
||||||
/* Definitions for error constants. */
|
|
||||||
|
|
||||||
#define ERR_OK 0 /* No error, everything OK. */
|
|
||||||
#define ERR_MEM -1 /* Out of memory error. */
|
|
||||||
#define ERR_BUF -2 /* Buffer error. */
|
|
||||||
#define ERR_TIMEOUT -3 /* Timeout. */
|
|
||||||
#define ERR_RTE -4 /* Routing problem. */
|
|
||||||
#define ERR_INPROGRESS -5 /* Operation in progress */
|
|
||||||
#define ERR_VAL -6 /* Illegal value. */
|
|
||||||
#define ERR_WOULDBLOCK -7 /* Operation would block. */
|
|
||||||
#define ERR_USE -8 /* Address in use. */
|
|
||||||
#define ERR_ISCONN -9 /* Already connected. */
|
|
||||||
|
|
||||||
#define ERR_IS_FATAL(e) ((e) < ERR_ISCONN)
|
|
||||||
|
|
||||||
#define ERR_ABRT -10 /* Connection aborted. */
|
|
||||||
#define ERR_RST -11 /* Connection reset. */
|
|
||||||
#define ERR_CLSD -12 /* Connection closed. */
|
|
||||||
#define ERR_CONN -13 /* Not connected. */
|
|
||||||
|
|
||||||
#define ERR_ARG -14 /* Illegal argument. */
|
|
||||||
|
|
||||||
#define ERR_IF -15 /* Low-level netif error */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
extern const char *lwip_strerr(err_t err);
|
|
||||||
#else
|
|
||||||
#define lwip_strerr(x) ""
|
|
||||||
#endif /* LWIP_DEBUG */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_ERR_H__ */
|
|
|
@ -1,112 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_INET_CHKSUM_H__
|
|
||||||
#define __LWIP_INET_CHKSUM_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
|
|
||||||
/** Swap the bytes in an u16_t: much like htons() for little-endian */
|
|
||||||
#ifndef SWAP_BYTES_IN_WORD
|
|
||||||
#if LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)
|
|
||||||
/* little endian and PLATFORM_BYTESWAP defined */
|
|
||||||
#define SWAP_BYTES_IN_WORD(w) LWIP_PLATFORM_HTONS(w)
|
|
||||||
#else /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) */
|
|
||||||
/* can't use htons on big endian (or PLATFORM_BYTESWAP not defined)... */
|
|
||||||
#define SWAP_BYTES_IN_WORD(w) (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8)
|
|
||||||
#endif /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)*/
|
|
||||||
#endif /* SWAP_BYTES_IN_WORD */
|
|
||||||
|
|
||||||
/** Split an u32_t in two u16_ts and add them up */
|
|
||||||
#ifndef FOLD_U32T
|
|
||||||
#define FOLD_U32T(u) (((u) >> 16) + ((u) & 0x0000ffffUL))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_CHECKSUM_ON_COPY
|
|
||||||
/** Function-like macro: same as MEMCPY but returns the checksum of copied data
|
|
||||||
as u16_t */
|
|
||||||
#ifndef LWIP_CHKSUM_COPY
|
|
||||||
#define LWIP_CHKSUM_COPY(dst, src, len) lwip_chksum_copy(dst, src, len)
|
|
||||||
#ifndef LWIP_CHKSUM_COPY_ALGORITHM
|
|
||||||
#define LWIP_CHKSUM_COPY_ALGORITHM 1
|
|
||||||
#endif /* LWIP_CHKSUM_COPY_ALGORITHM */
|
|
||||||
#endif /* LWIP_CHKSUM_COPY */
|
|
||||||
#else /* LWIP_CHECKSUM_ON_COPY */
|
|
||||||
#define LWIP_CHKSUM_COPY_ALGORITHM 0
|
|
||||||
#endif /* LWIP_CHECKSUM_ON_COPY */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
u16_t inet_chksum(void *dataptr, u16_t len);
|
|
||||||
u16_t inet_chksum_pbuf(struct pbuf *p);
|
|
||||||
u16_t inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,
|
|
||||||
ip_addr_t *src, ip_addr_t *dest);
|
|
||||||
u16_t inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto,
|
|
||||||
u16_t proto_len, u16_t chksum_len, ip_addr_t *src, ip_addr_t *dest);
|
|
||||||
#if LWIP_CHKSUM_COPY_ALGORITHM
|
|
||||||
u16_t lwip_chksum_copy(void *dst, const void *src, u16_t len);
|
|
||||||
#endif /* LWIP_CHKSUM_COPY_ALGORITHM */
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
u16_t ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,
|
|
||||||
ip6_addr_t *src, ip6_addr_t *dest);
|
|
||||||
u16_t ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,
|
|
||||||
u16_t chksum_len, ip6_addr_t *src, ip6_addr_t *dest);
|
|
||||||
|
|
||||||
#define ipX_chksum_pseudo(isipv6, p, proto, proto_len, src, dest) \
|
|
||||||
((isipv6) ? \
|
|
||||||
ip6_chksum_pseudo(p, proto, proto_len, ipX_2_ip6(src), ipX_2_ip6(dest)) :\
|
|
||||||
inet_chksum_pseudo(p, proto, proto_len, ipX_2_ip(src), ipX_2_ip(dest)))
|
|
||||||
#define ipX_chksum_pseudo_partial(isipv6, p, proto, proto_len, chksum_len, src, dest) \
|
|
||||||
((isipv6) ? \
|
|
||||||
ip6_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ipX_2_ip6(src), ipX_2_ip6(dest)) :\
|
|
||||||
inet_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ipX_2_ip(src), ipX_2_ip(dest)))
|
|
||||||
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#define ipX_chksum_pseudo(isipv6, p, proto, proto_len, src, dest) \
|
|
||||||
inet_chksum_pseudo(p, proto, proto_len, src, dest)
|
|
||||||
#define ipX_chksum_pseudo_partial(isipv6, p, proto, proto_len, chksum_len, src, dest) \
|
|
||||||
inet_chksum_pseudo_partial(p, proto, proto_len, chksum_len, src, dest)
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_INET_H__ */
|
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_INIT_H__
|
|
||||||
#define __LWIP_INIT_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** X.x.x: Major version of the stack */
|
|
||||||
#define LWIP_VERSION_MAJOR 1U
|
|
||||||
/** x.X.x: Minor version of the stack */
|
|
||||||
#define LWIP_VERSION_MINOR 4U
|
|
||||||
/** x.x.X: Revision of the stack */
|
|
||||||
#define LWIP_VERSION_REVISION 1U
|
|
||||||
/** For release candidates, this is set to 1..254
|
|
||||||
* For official releases, this is set to 255 (LWIP_RC_RELEASE)
|
|
||||||
* For development versions (CVS), this is set to 0 (LWIP_RC_DEVELOPMENT) */
|
|
||||||
#define LWIP_VERSION_RC 0U
|
|
||||||
|
|
||||||
/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */
|
|
||||||
#define LWIP_RC_RELEASE 255U
|
|
||||||
/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for CVS versions */
|
|
||||||
#define LWIP_RC_DEVELOPMENT 0U
|
|
||||||
|
|
||||||
#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE)
|
|
||||||
#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT)
|
|
||||||
#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT))
|
|
||||||
|
|
||||||
/** Provides the version of the stack */
|
|
||||||
#define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \
|
|
||||||
LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC)
|
|
||||||
|
|
||||||
/* Modules initialization */
|
|
||||||
void lwip_init(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_INIT_H__ */
|
|
|
@ -1,254 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_IP_H__
|
|
||||||
#define __LWIP_IP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/ip4.h"
|
|
||||||
#include "lwip/ip6.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This is passed as the destination address to ip_output_if (not
|
|
||||||
to ip_output), meaning that an IP header already is constructed
|
|
||||||
in the pbuf. This is used when TCP retransmits. */
|
|
||||||
#ifdef IP_HDRINCL
|
|
||||||
#undef IP_HDRINCL
|
|
||||||
#endif /* IP_HDRINCL */
|
|
||||||
#define IP_HDRINCL NULL
|
|
||||||
|
|
||||||
#if LWIP_NETIF_HWADDRHINT
|
|
||||||
#define IP_PCB_ADDRHINT ;u8_t addr_hint
|
|
||||||
#else
|
|
||||||
#define IP_PCB_ADDRHINT
|
|
||||||
#endif /* LWIP_NETIF_HWADDRHINT */
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define IP_PCB_ISIPV6_MEMBER u8_t isipv6;
|
|
||||||
#define IP_PCB_IPVER_EQ(pcb1, pcb2) ((pcb1)->isipv6 == (pcb2)->isipv6)
|
|
||||||
#define IP_PCB_IPVER_INPUT_MATCH(pcb) (ip_current_is_v6() ? \
|
|
||||||
((pcb)->isipv6 != 0) : \
|
|
||||||
((pcb)->isipv6 == 0))
|
|
||||||
#define PCB_ISIPV6(pcb) ((pcb)->isipv6)
|
|
||||||
#else
|
|
||||||
#define IP_PCB_ISIPV6_MEMBER
|
|
||||||
#define IP_PCB_IPVER_EQ(pcb1, pcb2) 1
|
|
||||||
#define IP_PCB_IPVER_INPUT_MATCH(pcb) 1
|
|
||||||
#define PCB_ISIPV6(pcb) 0
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
/* This is the common part of all PCB types. It needs to be at the
|
|
||||||
beginning of a PCB type definition. It is located here so that
|
|
||||||
changes to this common part are made in one location instead of
|
|
||||||
having to change all PCB structs. */
|
|
||||||
#define IP_PCB \
|
|
||||||
IP_PCB_ISIPV6_MEMBER \
|
|
||||||
/* ip addresses in network byte order */ \
|
|
||||||
ipX_addr_t local_ip; \
|
|
||||||
ipX_addr_t remote_ip; \
|
|
||||||
/* Socket options */ \
|
|
||||||
u8_t so_options; \
|
|
||||||
/* Type Of Service */ \
|
|
||||||
u8_t tos; \
|
|
||||||
/* Time To Live */ \
|
|
||||||
u8_t ttl \
|
|
||||||
/* link layer address resolution hint */ \
|
|
||||||
IP_PCB_ADDRHINT
|
|
||||||
|
|
||||||
struct ip_pcb {
|
|
||||||
/* Common members of all PCB types */
|
|
||||||
IP_PCB;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Option flags per-socket. These are the same like SO_XXX.
|
|
||||||
*/
|
|
||||||
/*#define SOF_DEBUG 0x01U Unimplemented: turn on debugging info recording */
|
|
||||||
#define SOF_ACCEPTCONN 0x02U /* socket has had listen() */
|
|
||||||
#define SOF_REUSEADDR 0x04U /* allow local address reuse */
|
|
||||||
#define SOF_KEEPALIVE 0x08U /* keep connections alive */
|
|
||||||
/*#define SOF_DONTROUTE 0x10U Unimplemented: just use interface addresses */
|
|
||||||
#define SOF_BROADCAST 0x20U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
|
|
||||||
/*#define SOF_USELOOPBACK 0x40U Unimplemented: bypass hardware when possible */
|
|
||||||
#define SOF_LINGER 0x80U /* linger on close if data present */
|
|
||||||
/*#define SOF_OOBINLINE 0x0100U Unimplemented: leave received OOB data in line */
|
|
||||||
/*#define SOF_REUSEPORT 0x0200U Unimplemented: allow local address & port reuse */
|
|
||||||
|
|
||||||
/* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */
|
|
||||||
#define SOF_INHERITED (SOF_REUSEADDR|SOF_KEEPALIVE|SOF_LINGER/*|SOF_DEBUG|SOF_DONTROUTE|SOF_OOBINLINE*/)
|
|
||||||
|
|
||||||
/* Global variables of this module, kept in a struct for efficient access using base+index. */
|
|
||||||
struct ip_globals
|
|
||||||
{
|
|
||||||
/** The interface that provided the packet for the current callback invocation. */
|
|
||||||
struct netif *current_netif;
|
|
||||||
/** Header of the input packet currently being processed. */
|
|
||||||
const struct ip_hdr *current_ip4_header;
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** Header of the input IPv6 packet currently being processed. */
|
|
||||||
const struct ip6_hdr *current_ip6_header;
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
/** Total header length of current_ip4/6_header (i.e. after this, the UDP/TCP header starts) */
|
|
||||||
u16_t current_ip_header_tot_len;
|
|
||||||
/** Source IP address of current_header */
|
|
||||||
ipX_addr_t current_iphdr_src;
|
|
||||||
/** Destination IP address of current_header */
|
|
||||||
ipX_addr_t current_iphdr_dest;
|
|
||||||
};
|
|
||||||
extern struct ip_globals ip_data;
|
|
||||||
|
|
||||||
|
|
||||||
/** Get the interface that received the current packet.
|
|
||||||
* This function must only be called from a receive callback (udp_recv,
|
|
||||||
* raw_recv, tcp_accept). It will return NULL otherwise. */
|
|
||||||
#define ip_current_netif() (ip_data.current_netif)
|
|
||||||
/** Get the IP header of the current packet.
|
|
||||||
* This function must only be called from a receive callback (udp_recv,
|
|
||||||
* raw_recv, tcp_accept). It will return NULL otherwise. */
|
|
||||||
#define ip_current_header() (ip_data.current_ip4_header)
|
|
||||||
/** Total header length of ip(6)_current_header() (i.e. after this, the UDP/TCP header starts) */
|
|
||||||
#define ip_current_header_tot_len() (ip_data.current_ip_header_tot_len)
|
|
||||||
/** Source IP address of current_header */
|
|
||||||
#define ipX_current_src_addr() (&ip_data.current_iphdr_src)
|
|
||||||
/** Destination IP address of current_header */
|
|
||||||
#define ipX_current_dest_addr() (&ip_data.current_iphdr_dest)
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** Get the IPv6 header of the current packet.
|
|
||||||
* This function must only be called from a receive callback (udp_recv,
|
|
||||||
* raw_recv, tcp_accept). It will return NULL otherwise. */
|
|
||||||
#define ip6_current_header() (ip_data.current_ip6_header)
|
|
||||||
/** Returns TRUE if the current IP input packet is IPv6, FALSE if it is IPv4 */
|
|
||||||
#define ip_current_is_v6() (ip6_current_header() != NULL)
|
|
||||||
/** Source IPv6 address of current_header */
|
|
||||||
#define ip6_current_src_addr() (ipX_2_ip6(&ip_data.current_iphdr_src))
|
|
||||||
/** Destination IPv6 address of current_header */
|
|
||||||
#define ip6_current_dest_addr() (ipX_2_ip6(&ip_data.current_iphdr_dest))
|
|
||||||
/** Get the transport layer protocol */
|
|
||||||
#define ip_current_header_proto() (ip_current_is_v6() ? \
|
|
||||||
IP6H_NEXTH(ip6_current_header()) :\
|
|
||||||
IPH_PROTO(ip_current_header()))
|
|
||||||
/** Get the transport layer header */
|
|
||||||
#define ipX_next_header_ptr() ((void*)((ip_current_is_v6() ? \
|
|
||||||
(u8_t*)ip6_current_header() : (u8_t*)ip_current_header()) + ip_current_header_tot_len()))
|
|
||||||
|
|
||||||
/** Set an IP_PCB to IPv6 (IPv4 is the default) */
|
|
||||||
#define ip_set_v6(pcb, val) do{if(pcb != NULL) { pcb->isipv6 = val; }}while(0)
|
|
||||||
|
|
||||||
/** Source IP4 address of current_header */
|
|
||||||
#define ip_current_src_addr() (ipX_2_ip(&ip_data.current_iphdr_src))
|
|
||||||
/** Destination IP4 address of current_header */
|
|
||||||
#define ip_current_dest_addr() (ipX_2_ip(&ip_data.current_iphdr_dest))
|
|
||||||
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
/** Always returns FALSE when only supporting IPv4 */
|
|
||||||
#define ip_current_is_v6() 0
|
|
||||||
/** Get the transport layer protocol */
|
|
||||||
#define ip_current_header_proto() IPH_PROTO(ip_current_header())
|
|
||||||
/** Get the transport layer header */
|
|
||||||
#define ipX_next_header_ptr() ((void*)((u8_t*)ip_current_header() + ip_current_header_tot_len()))
|
|
||||||
/** Source IP4 address of current_header */
|
|
||||||
#define ip_current_src_addr() (&ip_data.current_iphdr_src)
|
|
||||||
/** Destination IP4 address of current_header */
|
|
||||||
#define ip_current_dest_addr() (&ip_data.current_iphdr_dest)
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
/** Union source address of current_header */
|
|
||||||
#define ipX_current_src_addr() (&ip_data.current_iphdr_src)
|
|
||||||
/** Union destination address of current_header */
|
|
||||||
#define ipX_current_dest_addr() (&ip_data.current_iphdr_dest)
|
|
||||||
|
|
||||||
/** Gets an IP pcb option (SOF_* flags) */
|
|
||||||
#define ip_get_option(pcb, opt) ((pcb)->so_options & (opt))
|
|
||||||
/** Sets an IP pcb option (SOF_* flags) */
|
|
||||||
#define ip_set_option(pcb, opt) ((pcb)->so_options |= (opt))
|
|
||||||
/** Resets an IP pcb option (SOF_* flags) */
|
|
||||||
#define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt))
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define ipX_output(isipv6, p, src, dest, ttl, tos, proto) \
|
|
||||||
((isipv6) ? \
|
|
||||||
ip6_output(p, ipX_2_ip6(src), ipX_2_ip6(dest), ttl, tos, proto) : \
|
|
||||||
ip_output(p, ipX_2_ip(src), ipX_2_ip(dest), ttl, tos, proto))
|
|
||||||
#define ipX_output_if(isipv6, p, src, dest, ttl, tos, proto, netif) \
|
|
||||||
((isipv6) ? \
|
|
||||||
ip6_output_if(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \
|
|
||||||
ip_output_if(p, (src), (dest), ttl, tos, proto, netif))
|
|
||||||
#define ipX_output_hinted(isipv6, p, src, dest, ttl, tos, proto, addr_hint) \
|
|
||||||
((isipv6) ? \
|
|
||||||
ip6_output_hinted(p, ipX_2_ip6(src), ipX_2_ip6(dest), ttl, tos, proto, addr_hint) : \
|
|
||||||
ip_output_hinted(p, ipX_2_ip(src), ipX_2_ip(dest), ttl, tos, proto, addr_hint))
|
|
||||||
#define ipX_route(isipv6, src, dest) \
|
|
||||||
((isipv6) ? \
|
|
||||||
ip6_route(ipX_2_ip6(src), ipX_2_ip6(dest)) : \
|
|
||||||
ip_route(ipX_2_ip(dest)))
|
|
||||||
#define ipX_netif_get_local_ipX(isipv6, netif, dest) \
|
|
||||||
((isipv6) ? \
|
|
||||||
ip6_netif_get_local_ipX(netif, ipX_2_ip6(dest)) : \
|
|
||||||
ip_netif_get_local_ipX(netif))
|
|
||||||
#define ipX_debug_print(is_ipv6, p) ((is_ipv6) ? ip6_debug_print(p) : ip_debug_print(p))
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
#define ipX_output(isipv6, p, src, dest, ttl, tos, proto) \
|
|
||||||
ip_output(p, src, dest, ttl, tos, proto)
|
|
||||||
#define ipX_output_if(isipv6, p, src, dest, ttl, tos, proto, netif) \
|
|
||||||
ip_output_if(p, src, dest, ttl, tos, proto, netif)
|
|
||||||
#define ipX_output_hinted(isipv6, p, src, dest, ttl, tos, proto, addr_hint) \
|
|
||||||
ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint)
|
|
||||||
#define ipX_route(isipv6, src, dest) \
|
|
||||||
ip_route(ipX_2_ip(dest))
|
|
||||||
#define ipX_netif_get_local_ipX(isipv6, netif, dest) \
|
|
||||||
ip_netif_get_local_ipX(netif)
|
|
||||||
#define ipX_debug_print(is_ipv6, p) ip_debug_print(p)
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#define ipX_route_get_local_ipX(isipv6, src, dest, netif, ipXaddr) do { \
|
|
||||||
(netif) = ipX_route(isipv6, src, dest); \
|
|
||||||
(ipXaddr) = ipX_netif_get_local_ipX(isipv6, netif, dest); \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP_H__ */
|
|
||||||
|
|
||||||
|
|
|
@ -1,130 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_IP_ADDR_H__
|
|
||||||
#define __LWIP_IP_ADDR_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
|
|
||||||
#include "lwip/ip4_addr.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/* A union struct for both IP version's addresses. */
|
|
||||||
typedef union {
|
|
||||||
ip_addr_t ip4;
|
|
||||||
ip6_addr_t ip6;
|
|
||||||
} ipX_addr_t;
|
|
||||||
|
|
||||||
/** These functions only exist for type-safe conversion from ip_addr_t to
|
|
||||||
ip6_addr_t and back */
|
|
||||||
#ifdef LWIP_ALLOW_STATIC_FN_IN_HEADER
|
|
||||||
static ip6_addr_t* ip_2_ip6(ip_addr_t *ipaddr)
|
|
||||||
{ return (ip6_addr_t*)ipaddr;}
|
|
||||||
static ip_addr_t* ip6_2_ip(ip6_addr_t *ip6addr)
|
|
||||||
{ return (ip_addr_t*)ip6addr; }
|
|
||||||
static ipX_addr_t* ip_2_ipX(ip_addr_t *ipaddr)
|
|
||||||
{ return (ipX_addr_t*)ipaddr; }
|
|
||||||
static ipX_addr_t* ip6_2_ipX(ip6_addr_t *ip6addr)
|
|
||||||
{ return (ipX_addr_t*)ip6addr; }
|
|
||||||
#else /* LWIP_ALLOW_STATIC_FN_IN_HEADER */
|
|
||||||
#define ip_2_ip6(ipaddr) ((ip6_addr_t*)(ipaddr))
|
|
||||||
#define ip6_2_ip(ip6addr) ((ip_addr_t*)(ip6addr))
|
|
||||||
#define ip_2_ipX(ipaddr) ((ipX_addr_t*)ipaddr)
|
|
||||||
#define ip6_2_ipX(ip6addr) ((ipX_addr_t*)ip6addr)
|
|
||||||
#endif /* LWIP_ALLOW_STATIC_FN_IN_HEADER*/
|
|
||||||
#define ipX_2_ip6(ip6addr) (&((ip6addr)->ip6))
|
|
||||||
#define ipX_2_ip(ipaddr) (&((ipaddr)->ip4))
|
|
||||||
|
|
||||||
#define ipX_addr_copy(is_ipv6, dest, src) do{if(is_ipv6){ \
|
|
||||||
ip6_addr_copy((dest).ip6, (src).ip6); }else{ \
|
|
||||||
ip_addr_copy((dest).ip4, (src).ip4); }}while(0)
|
|
||||||
#define ipX_addr_set(is_ipv6, dest, src) do{if(is_ipv6){ \
|
|
||||||
ip6_addr_set(ipX_2_ip6(dest), ipX_2_ip6(src)); }else{ \
|
|
||||||
ip_addr_set(ipX_2_ip(dest), ipX_2_ip(src)); }}while(0)
|
|
||||||
#define ipX_addr_set_ipaddr(is_ipv6, dest, src) do{if(is_ipv6){ \
|
|
||||||
ip6_addr_set(ipX_2_ip6(dest), ip_2_ip6(src)); }else{ \
|
|
||||||
ip_addr_set(ipX_2_ip(dest), src); }}while(0)
|
|
||||||
#define ipX_addr_set_zero(is_ipv6, ipaddr) do{if(is_ipv6){ \
|
|
||||||
ip6_addr_set_zero(ipX_2_ip6(ipaddr)); }else{ \
|
|
||||||
ip_addr_set_zero(ipX_2_ip(ipaddr)); }}while(0)
|
|
||||||
#define ipX_addr_set_any(is_ipv6, ipaddr) do{if(is_ipv6){ \
|
|
||||||
ip6_addr_set_any(ipX_2_ip6(ipaddr)); }else{ \
|
|
||||||
ip_addr_set_any(ipX_2_ip(ipaddr)); }}while(0)
|
|
||||||
#define ipX_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \
|
|
||||||
ip6_addr_set_loopback(ipX_2_ip6(ipaddr)); }else{ \
|
|
||||||
ip_addr_set_loopback(ipX_2_ip(ipaddr)); }}while(0)
|
|
||||||
#define ipX_addr_set_hton(is_ipv6, dest, src) do{if(is_ipv6){ \
|
|
||||||
ip6_addr_set_hton(ipX_2_ip6(ipaddr), (src)) ;}else{ \
|
|
||||||
ip_addr_set_hton(ipX_2_ip(ipaddr), (src));}}while(0)
|
|
||||||
#define ipX_addr_cmp(is_ipv6, addr1, addr2) ((is_ipv6) ? \
|
|
||||||
ip6_addr_cmp(ipX_2_ip6(addr1), ipX_2_ip6(addr2)) : \
|
|
||||||
ip_addr_cmp(ipX_2_ip(addr1), ipX_2_ip(addr2)))
|
|
||||||
#define ipX_addr_isany(is_ipv6, ipaddr) ((is_ipv6) ? \
|
|
||||||
ip6_addr_isany(ipX_2_ip6(ipaddr)) : \
|
|
||||||
ip_addr_isany(ipX_2_ip(ipaddr)))
|
|
||||||
#define ipX_addr_ismulticast(is_ipv6, ipaddr) ((is_ipv6) ? \
|
|
||||||
ip6_addr_ismulticast(ipX_2_ip6(ipaddr)) : \
|
|
||||||
ip_addr_ismulticast(ipX_2_ip(ipaddr)))
|
|
||||||
#define ipX_addr_debug_print(is_ipv6, debug, ipaddr) do { if(is_ipv6) { \
|
|
||||||
ip6_addr_debug_print(debug, ipX_2_ip6(ipaddr)); } else { \
|
|
||||||
ip_addr_debug_print(debug, ipX_2_ip(ipaddr)); }}while(0)
|
|
||||||
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
typedef ip_addr_t ipX_addr_t;
|
|
||||||
#define ipX_2_ip(ipaddr) (ipaddr)
|
|
||||||
#define ip_2_ipX(ipaddr) (ipaddr)
|
|
||||||
|
|
||||||
#define ipX_addr_copy(is_ipv6, dest, src) ip_addr_copy(dest, src)
|
|
||||||
#define ipX_addr_set(is_ipv6, dest, src) ip_addr_set(dest, src)
|
|
||||||
#define ipX_addr_set_ipaddr(is_ipv6, dest, src) ip_addr_set(dest, src)
|
|
||||||
#define ipX_addr_set_zero(is_ipv6, ipaddr) ip_addr_set_zero(ipaddr)
|
|
||||||
#define ipX_addr_set_any(is_ipv6, ipaddr) ip_addr_set_any(ipaddr)
|
|
||||||
#define ipX_addr_set_loopback(is_ipv6, ipaddr) ip_addr_set_loopback(ipaddr)
|
|
||||||
#define ipX_addr_set_hton(is_ipv6, dest, src) ip_addr_set_hton(dest, src)
|
|
||||||
#define ipX_addr_cmp(is_ipv6, addr1, addr2) ip_addr_cmp(addr1, addr2)
|
|
||||||
#define ipX_addr_isany(is_ipv6, ipaddr) ip_addr_isany(ipaddr)
|
|
||||||
#define ipX_addr_ismulticast(is_ipv6, ipaddr) ip_addr_ismulticast(ipaddr)
|
|
||||||
#define ipX_addr_debug_print(is_ipv6, debug, ipaddr) ip_addr_debug_print(debug, ipaddr)
|
|
||||||
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_IP_ADDR_H__ */
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_MEM_H__
|
|
||||||
#define __LWIP_MEM_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MEM_LIBC_MALLOC
|
|
||||||
|
|
||||||
#include <stddef.h> /* for size_t */
|
|
||||||
|
|
||||||
typedef size_t mem_size_t;
|
|
||||||
#define MEM_SIZE_F SZT_F
|
|
||||||
|
|
||||||
/* aliases for C library malloc() */
|
|
||||||
#define mem_init()
|
|
||||||
/* in case C library malloc() needs extra protection,
|
|
||||||
* allow these defines to be overridden.
|
|
||||||
*/
|
|
||||||
#ifndef mem_free
|
|
||||||
#define mem_free vPortFree
|
|
||||||
#endif
|
|
||||||
#ifndef mem_malloc
|
|
||||||
#define mem_malloc pvPortMalloc
|
|
||||||
#endif
|
|
||||||
#ifndef mem_calloc
|
|
||||||
#define mem_calloc pvPortCalloc
|
|
||||||
#endif
|
|
||||||
#ifndef mem_realloc
|
|
||||||
#define mem_realloc pvPortRealloc
|
|
||||||
#endif
|
|
||||||
#ifndef mem_zalloc
|
|
||||||
#define mem_zalloc pvPortZalloc
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Since there is no C library allocation function to shrink memory without
|
|
||||||
moving it, define this to nothing. */
|
|
||||||
#ifndef mem_trim
|
|
||||||
#define mem_trim(mem, size) (mem)
|
|
||||||
#endif
|
|
||||||
#else /* MEM_LIBC_MALLOC */
|
|
||||||
|
|
||||||
/* MEM_SIZE would have to be aligned, but using 64000 here instead of
|
|
||||||
* 65535 leaves some room for alignment...
|
|
||||||
*/
|
|
||||||
#if MEM_SIZE > 64000L
|
|
||||||
typedef u32_t mem_size_t;
|
|
||||||
#define MEM_SIZE_F U32_F
|
|
||||||
#else
|
|
||||||
typedef u16_t mem_size_t;
|
|
||||||
#define MEM_SIZE_F U16_F
|
|
||||||
#endif /* MEM_SIZE > 64000 */
|
|
||||||
|
|
||||||
#if MEM_USE_POOLS
|
|
||||||
/** mem_init is not used when using pools instead of a heap */
|
|
||||||
#define mem_init()
|
|
||||||
/** mem_trim is not used when using pools instead of a heap:
|
|
||||||
we can't free part of a pool element and don't want to copy the rest */
|
|
||||||
#define mem_trim(mem, size) (mem)
|
|
||||||
#else /* MEM_USE_POOLS */
|
|
||||||
/* lwIP alternative malloc */
|
|
||||||
void mem_init(void);
|
|
||||||
void *mem_trim(void *mem, mem_size_t size);
|
|
||||||
#endif /* MEM_USE_POOLS */
|
|
||||||
void *mem_malloc(mem_size_t size);
|
|
||||||
void *mem_calloc(mem_size_t count, mem_size_t size);
|
|
||||||
void mem_free(void *mem);
|
|
||||||
#endif /* MEM_LIBC_MALLOC */
|
|
||||||
|
|
||||||
/** Calculate memory size for an aligned buffer - returns the next highest
|
|
||||||
* multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and
|
|
||||||
* LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4).
|
|
||||||
*/
|
|
||||||
#ifndef LWIP_MEM_ALIGN_SIZE
|
|
||||||
#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Calculate safe memory size for an aligned buffer when using an unaligned
|
|
||||||
* type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the
|
|
||||||
* start (e.g. if buffer is u8_t[] and actual data will be u32_t*)
|
|
||||||
*/
|
|
||||||
#ifndef LWIP_MEM_ALIGN_BUFFER
|
|
||||||
#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT
|
|
||||||
* so that ADDR % MEM_ALIGNMENT == 0
|
|
||||||
*/
|
|
||||||
#ifndef LWIP_MEM_ALIGN
|
|
||||||
#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_MEM_H__ */
|
|
|
@ -1,116 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_MEMP_H__
|
|
||||||
#define __LWIP_MEMP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */
|
|
||||||
typedef enum {
|
|
||||||
#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name,
|
|
||||||
#include "lwip/memp_std.h"
|
|
||||||
MEMP_MAX
|
|
||||||
} memp_t;
|
|
||||||
|
|
||||||
#if MEM_USE_POOLS
|
|
||||||
/* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */
|
|
||||||
typedef enum {
|
|
||||||
/* Get the first (via:
|
|
||||||
MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/
|
|
||||||
MEMP_POOL_HELPER_FIRST = ((u8_t)
|
|
||||||
#define LWIP_MEMPOOL(name,num,size,desc)
|
|
||||||
#define LWIP_MALLOC_MEMPOOL_START 1
|
|
||||||
#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0
|
|
||||||
#define LWIP_MALLOC_MEMPOOL_END
|
|
||||||
#include "lwip/memp_std.h"
|
|
||||||
) ,
|
|
||||||
/* Get the last (via:
|
|
||||||
MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */
|
|
||||||
MEMP_POOL_HELPER_LAST = ((u8_t)
|
|
||||||
#define LWIP_MEMPOOL(name,num,size,desc)
|
|
||||||
#define LWIP_MALLOC_MEMPOOL_START
|
|
||||||
#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size *
|
|
||||||
#define LWIP_MALLOC_MEMPOOL_END 1
|
|
||||||
#include "lwip/memp_std.h"
|
|
||||||
)
|
|
||||||
} memp_pool_helper_t;
|
|
||||||
|
|
||||||
/* The actual start and stop values are here (cast them over)
|
|
||||||
We use this helper type and these defines so we can avoid using const memp_t values */
|
|
||||||
#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST)
|
|
||||||
#define MEMP_POOL_LAST ((memp_t) MEMP_POOL_HELPER_LAST)
|
|
||||||
#endif /* MEM_USE_POOLS */
|
|
||||||
|
|
||||||
#if MEMP_MEM_MALLOC || MEM_USE_POOLS
|
|
||||||
extern const u16_t memp_sizes[MEMP_MAX];
|
|
||||||
#endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */
|
|
||||||
|
|
||||||
#if MEMP_MEM_MALLOC
|
|
||||||
|
|
||||||
#include "mem.h"
|
|
||||||
|
|
||||||
#define memp_init()
|
|
||||||
#define memp_malloc(type) mem_malloc(memp_sizes[type])
|
|
||||||
#define memp_free(type, mem) mem_free(mem)
|
|
||||||
|
|
||||||
#else /* MEMP_MEM_MALLOC */
|
|
||||||
|
|
||||||
#if MEM_USE_POOLS
|
|
||||||
/** This structure is used to save the pool one element came from. */
|
|
||||||
struct memp_malloc_helper
|
|
||||||
{
|
|
||||||
memp_t poolnr;
|
|
||||||
};
|
|
||||||
#endif /* MEM_USE_POOLS */
|
|
||||||
|
|
||||||
void memp_init(void);
|
|
||||||
|
|
||||||
#if MEMP_OVERFLOW_CHECK
|
|
||||||
void *memp_malloc_fn(memp_t type, const char* file, const int line);
|
|
||||||
#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__)
|
|
||||||
#else
|
|
||||||
void *memp_malloc(memp_t type);
|
|
||||||
#endif
|
|
||||||
void memp_free(memp_t type, void *mem);
|
|
||||||
|
|
||||||
#endif /* MEMP_MEM_MALLOC */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_MEMP_H__ */
|
|
|
@ -1,135 +0,0 @@
|
||||||
/*
|
|
||||||
* SETUP: Make sure we define everything we will need.
|
|
||||||
*
|
|
||||||
* We have create three types of pools:
|
|
||||||
* 1) MEMPOOL - standard pools
|
|
||||||
* 2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c
|
|
||||||
* 3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct
|
|
||||||
*
|
|
||||||
* If the include'r doesn't require any special treatment of each of the types
|
|
||||||
* above, then will declare #2 & #3 to be just standard mempools.
|
|
||||||
*/
|
|
||||||
#ifndef LWIP_MALLOC_MEMPOOL
|
|
||||||
/* This treats "malloc pools" just like any other pool.
|
|
||||||
The pools are a little bigger to provide 'size' as the amount of user data. */
|
|
||||||
#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + sizeof(struct memp_malloc_helper)), "MALLOC_"#size)
|
|
||||||
#define LWIP_MALLOC_MEMPOOL_START
|
|
||||||
#define LWIP_MALLOC_MEMPOOL_END
|
|
||||||
#endif /* LWIP_MALLOC_MEMPOOL */
|
|
||||||
|
|
||||||
#ifndef LWIP_PBUF_MEMPOOL
|
|
||||||
/* This treats "pbuf pools" just like any other pool.
|
|
||||||
* Allocates buffers for a pbuf struct AND a payload size */
|
|
||||||
#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc)
|
|
||||||
#endif /* LWIP_PBUF_MEMPOOL */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A list of internal pools used by LWIP.
|
|
||||||
*
|
|
||||||
* LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description)
|
|
||||||
* creates a pool name MEMP_pool_name. description is used in stats.c
|
|
||||||
*/
|
|
||||||
#if LWIP_RAW
|
|
||||||
LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB")
|
|
||||||
#endif /* LWIP_RAW */
|
|
||||||
|
|
||||||
#if LWIP_UDP
|
|
||||||
LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB")
|
|
||||||
#endif /* LWIP_UDP */
|
|
||||||
|
|
||||||
#if LWIP_TCP
|
|
||||||
LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB")
|
|
||||||
LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN")
|
|
||||||
LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG")
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
|
|
||||||
#if IP_REASSEMBLY
|
|
||||||
LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA")
|
|
||||||
#endif /* IP_REASSEMBLY */
|
|
||||||
#if (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF) || LWIP_IPV6_FRAG
|
|
||||||
LWIP_MEMPOOL(FRAG_PBUF, MEMP_NUM_FRAG_PBUF, sizeof(struct pbuf_custom_ref),"FRAG_PBUF")
|
|
||||||
#endif /* IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */
|
|
||||||
|
|
||||||
#if LWIP_NETCONN
|
|
||||||
LWIP_MEMPOOL(NETBUF, MEMP_NUM_NETBUF, sizeof(struct netbuf), "NETBUF")
|
|
||||||
LWIP_MEMPOOL(NETCONN, MEMP_NUM_NETCONN, sizeof(struct netconn), "NETCONN")
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
|
|
||||||
#if NO_SYS==0
|
|
||||||
LWIP_MEMPOOL(TCPIP_MSG_API, MEMP_NUM_TCPIP_MSG_API, sizeof(struct tcpip_msg), "TCPIP_MSG_API")
|
|
||||||
#if !LWIP_TCPIP_CORE_LOCKING_INPUT
|
|
||||||
LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg), "TCPIP_MSG_INPKT")
|
|
||||||
#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
|
|
||||||
#endif /* NO_SYS==0 */
|
|
||||||
|
|
||||||
#if LWIP_ARP && ARP_QUEUEING
|
|
||||||
LWIP_MEMPOOL(ARP_QUEUE, MEMP_NUM_ARP_QUEUE, sizeof(struct etharp_q_entry), "ARP_QUEUE")
|
|
||||||
#endif /* LWIP_ARP && ARP_QUEUEING */
|
|
||||||
|
|
||||||
#if LWIP_IGMP
|
|
||||||
LWIP_MEMPOOL(IGMP_GROUP, MEMP_NUM_IGMP_GROUP, sizeof(struct igmp_group), "IGMP_GROUP")
|
|
||||||
#endif /* LWIP_IGMP */
|
|
||||||
|
|
||||||
#if (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) /* LWIP_TIMERS */
|
|
||||||
LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT")
|
|
||||||
#endif /* LWIP_TIMERS */
|
|
||||||
|
|
||||||
#if LWIP_SNMP
|
|
||||||
LWIP_MEMPOOL(SNMP_ROOTNODE, MEMP_NUM_SNMP_ROOTNODE, sizeof(struct mib_list_rootnode), "SNMP_ROOTNODE")
|
|
||||||
LWIP_MEMPOOL(SNMP_NODE, MEMP_NUM_SNMP_NODE, sizeof(struct mib_list_node), "SNMP_NODE")
|
|
||||||
LWIP_MEMPOOL(SNMP_VARBIND, MEMP_NUM_SNMP_VARBIND, sizeof(struct snmp_varbind), "SNMP_VARBIND")
|
|
||||||
LWIP_MEMPOOL(SNMP_VALUE, MEMP_NUM_SNMP_VALUE, SNMP_MAX_VALUE_SIZE, "SNMP_VALUE")
|
|
||||||
#endif /* LWIP_SNMP */
|
|
||||||
#if LWIP_DNS && LWIP_SOCKET
|
|
||||||
LWIP_MEMPOOL(NETDB, MEMP_NUM_NETDB, NETDB_ELEM_SIZE, "NETDB")
|
|
||||||
#endif /* LWIP_DNS && LWIP_SOCKET */
|
|
||||||
#if LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
|
||||||
LWIP_MEMPOOL(LOCALHOSTLIST, MEMP_NUM_LOCALHOSTLIST, LOCALHOSTLIST_ELEM_SIZE, "LOCALHOSTLIST")
|
|
||||||
#endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
|
||||||
#if PPP_SUPPORT && PPPOE_SUPPORT
|
|
||||||
LWIP_MEMPOOL(PPPOE_IF, MEMP_NUM_PPPOE_INTERFACES, sizeof(struct pppoe_softc), "PPPOE_IF")
|
|
||||||
#endif /* PPP_SUPPORT && PPPOE_SUPPORT */
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_ND6_QUEUEING
|
|
||||||
LWIP_MEMPOOL(ND6_QUEUE, MEMP_NUM_ND6_QUEUE, sizeof(struct nd6_q_entry), "ND6_QUEUE")
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_ND6_QUEUEING */
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_IPV6_REASS
|
|
||||||
LWIP_MEMPOOL(IP6_REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip6_reassdata), "IP6_REASSDATA")
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */
|
|
||||||
|
|
||||||
#if LWIP_IPV6 && LWIP_IPV6_MLD
|
|
||||||
LWIP_MEMPOOL(MLD6_GROUP, MEMP_NUM_MLD6_GROUP, sizeof(struct mld_group), "MLD6_GROUP")
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A list of pools of pbuf's used by LWIP.
|
|
||||||
*
|
|
||||||
* LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description)
|
|
||||||
* creates a pool name MEMP_pool_name. description is used in stats.c
|
|
||||||
* This allocates enough space for the pbuf struct and a payload.
|
|
||||||
* (Example: pbuf_payload_size=0 allocates only size for the struct)
|
|
||||||
*/
|
|
||||||
LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM")
|
|
||||||
LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL")
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allow for user-defined pools; this must be explicitly set in lwipopts.h
|
|
||||||
* since the default is to NOT look for lwippools.h
|
|
||||||
*/
|
|
||||||
#if MEMP_USE_CUSTOM_POOLS
|
|
||||||
#include "lwippools.h"
|
|
||||||
#endif /* MEMP_USE_CUSTOM_POOLS */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later
|
|
||||||
* (#undef is ignored for something that is not defined)
|
|
||||||
*/
|
|
||||||
#undef LWIP_MEMPOOL
|
|
||||||
#undef LWIP_MALLOC_MEMPOOL
|
|
||||||
#undef LWIP_MALLOC_MEMPOOL_START
|
|
||||||
#undef LWIP_MALLOC_MEMPOOL_END
|
|
||||||
#undef LWIP_PBUF_MEMPOOL
|
|
|
@ -1,112 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_NETBUF_H__
|
|
||||||
#define __LWIP_NETBUF_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** This netbuf has dest-addr/port set */
|
|
||||||
#define NETBUF_FLAG_DESTADDR 0x01
|
|
||||||
/** This netbuf includes a checksum */
|
|
||||||
#define NETBUF_FLAG_CHKSUM 0x02
|
|
||||||
|
|
||||||
struct netbuf {
|
|
||||||
struct pbuf *p, *ptr;
|
|
||||||
ipX_addr_t addr;
|
|
||||||
u16_t port;
|
|
||||||
#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY
|
|
||||||
#if LWIP_CHECKSUM_ON_COPY
|
|
||||||
u8_t flags;
|
|
||||||
#endif /* LWIP_CHECKSUM_ON_COPY */
|
|
||||||
u16_t toport_chksum;
|
|
||||||
#if LWIP_NETBUF_RECVINFO
|
|
||||||
ipX_addr_t toaddr;
|
|
||||||
#endif /* LWIP_NETBUF_RECVINFO */
|
|
||||||
#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Network buffer functions: */
|
|
||||||
struct netbuf * netbuf_new (void);
|
|
||||||
void netbuf_delete (struct netbuf *buf);
|
|
||||||
void * netbuf_alloc (struct netbuf *buf, u16_t size);
|
|
||||||
void netbuf_free (struct netbuf *buf);
|
|
||||||
err_t netbuf_ref (struct netbuf *buf,
|
|
||||||
const void *dataptr, u16_t size);
|
|
||||||
void netbuf_chain (struct netbuf *head,
|
|
||||||
struct netbuf *tail);
|
|
||||||
|
|
||||||
err_t netbuf_data (struct netbuf *buf,
|
|
||||||
void **dataptr, u16_t *len);
|
|
||||||
s8_t netbuf_next (struct netbuf *buf);
|
|
||||||
void netbuf_first (struct netbuf *buf);
|
|
||||||
|
|
||||||
|
|
||||||
#define netbuf_copy_partial(buf, dataptr, len, offset) \
|
|
||||||
pbuf_copy_partial((buf)->p, (dataptr), (len), (offset))
|
|
||||||
#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0)
|
|
||||||
#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len)
|
|
||||||
#define netbuf_len(buf) ((buf)->p->tot_len)
|
|
||||||
#define netbuf_fromaddr(buf) (ipX_2_ip(&((buf)->addr)))
|
|
||||||
#define netbuf_set_fromaddr(buf, fromaddr) ip_addr_set(ipX_2_ip(&((buf)->addr)), fromaddr)
|
|
||||||
#define netbuf_fromport(buf) ((buf)->port)
|
|
||||||
#if LWIP_NETBUF_RECVINFO
|
|
||||||
#define netbuf_destaddr(buf) (ipX_2_ip(&((buf)->toaddr)))
|
|
||||||
#define netbuf_set_destaddr(buf, destaddr) ip_addr_set(ipX_2_ip(&((buf)->toaddr)), destaddr)
|
|
||||||
#define netbuf_destport(buf) (((buf)->flags & NETBUF_FLAG_DESTADDR) ? (buf)->toport_chksum : 0)
|
|
||||||
#endif /* LWIP_NETBUF_RECVINFO */
|
|
||||||
#if LWIP_CHECKSUM_ON_COPY
|
|
||||||
#define netbuf_set_chksum(buf, chksum) do { (buf)->flags = NETBUF_FLAG_CHKSUM; \
|
|
||||||
(buf)->toport_chksum = chksum; } while(0)
|
|
||||||
#endif /* LWIP_CHECKSUM_ON_COPY */
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define netbuf_fromaddr_ip6(buf) (ipX_2_ip6(&((buf)->addr)))
|
|
||||||
#define netbuf_set_fromaddr_ip6(buf, fromaddr) ip6_addr_set(ipX_2_ip6(&((buf)->addr)), fromaddr)
|
|
||||||
#define netbuf_destaddr_ip6(buf) (ipX_2_ip6(&((buf)->toaddr)))
|
|
||||||
#define netbuf_set_destaddr_ip6(buf, destaddr) ip6_addr_set(ipX_2_ip6(&((buf)->toaddr)), destaddr)
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#define netbuf_fromaddr_ipX(buf) (&((buf)->addr))
|
|
||||||
#define netbuf_destaddr_ipX(buf) (&((buf)->toaddr))
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_NETBUF_H__ */
|
|
|
@ -1,124 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Simon Goldschmidt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_NETDB_H__
|
|
||||||
#define __LWIP_NETDB_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_DNS && LWIP_SOCKET
|
|
||||||
|
|
||||||
#include <stddef.h> /* for size_t */
|
|
||||||
|
|
||||||
#include "lwip/inet.h"
|
|
||||||
#include "lwip/sockets.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* some rarely used options */
|
|
||||||
#ifndef LWIP_DNS_API_DECLARE_H_ERRNO
|
|
||||||
#define LWIP_DNS_API_DECLARE_H_ERRNO 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LWIP_DNS_API_DEFINE_ERRORS
|
|
||||||
#define LWIP_DNS_API_DEFINE_ERRORS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LWIP_DNS_API_DECLARE_STRUCTS
|
|
||||||
#define LWIP_DNS_API_DECLARE_STRUCTS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_DNS_API_DEFINE_ERRORS
|
|
||||||
/** Errors used by the DNS API functions, h_errno can be one of them */
|
|
||||||
#define EAI_NONAME 200
|
|
||||||
#define EAI_SERVICE 201
|
|
||||||
#define EAI_FAIL 202
|
|
||||||
#define EAI_MEMORY 203
|
|
||||||
|
|
||||||
#define HOST_NOT_FOUND 210
|
|
||||||
#define NO_DATA 211
|
|
||||||
#define NO_RECOVERY 212
|
|
||||||
#define TRY_AGAIN 213
|
|
||||||
#endif /* LWIP_DNS_API_DEFINE_ERRORS */
|
|
||||||
|
|
||||||
#if LWIP_DNS_API_DECLARE_STRUCTS
|
|
||||||
struct hostent {
|
|
||||||
char *h_name; /* Official name of the host. */
|
|
||||||
char **h_aliases; /* A pointer to an array of pointers to alternative host names,
|
|
||||||
terminated by a null pointer. */
|
|
||||||
int h_addrtype; /* Address type. */
|
|
||||||
int h_length; /* The length, in bytes, of the address. */
|
|
||||||
char **h_addr_list; /* A pointer to an array of pointers to network addresses (in
|
|
||||||
network byte order) for the host, terminated by a null pointer. */
|
|
||||||
#define h_addr h_addr_list[0] /* for backward compatibility */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct addrinfo {
|
|
||||||
int ai_flags; /* Input flags. */
|
|
||||||
int ai_family; /* Address family of socket. */
|
|
||||||
int ai_socktype; /* Socket type. */
|
|
||||||
int ai_protocol; /* Protocol of socket. */
|
|
||||||
socklen_t ai_addrlen; /* Length of socket address. */
|
|
||||||
struct sockaddr *ai_addr; /* Socket address of socket. */
|
|
||||||
char *ai_canonname; /* Canonical name of service location. */
|
|
||||||
struct addrinfo *ai_next; /* Pointer to next in list. */
|
|
||||||
};
|
|
||||||
#endif /* LWIP_DNS_API_DECLARE_STRUCTS */
|
|
||||||
|
|
||||||
#if LWIP_DNS_API_DECLARE_H_ERRNO
|
|
||||||
/* application accessable error code set by the DNS API functions */
|
|
||||||
extern int h_errno;
|
|
||||||
#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/
|
|
||||||
|
|
||||||
struct hostent *lwip_gethostbyname(const char *name);
|
|
||||||
int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
|
|
||||||
size_t buflen, struct hostent **result, int *h_errnop);
|
|
||||||
void lwip_freeaddrinfo(struct addrinfo *ai);
|
|
||||||
int lwip_getaddrinfo(const char *nodename,
|
|
||||||
const char *servname,
|
|
||||||
const struct addrinfo *hints,
|
|
||||||
struct addrinfo **res);
|
|
||||||
|
|
||||||
#if LWIP_COMPAT_SOCKETS
|
|
||||||
#define gethostbyname(name) lwip_gethostbyname(name)
|
|
||||||
#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \
|
|
||||||
lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop)
|
|
||||||
#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo)
|
|
||||||
#define getaddrinfo(nodname, servname, hints, res) \
|
|
||||||
lwip_getaddrinfo(nodname, servname, hints, res)
|
|
||||||
#endif /* LWIP_COMPAT_SOCKETS */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_DNS && LWIP_SOCKET */
|
|
||||||
|
|
||||||
#endif /* __LWIP_NETDB_H__ */
|
|
|
@ -1,387 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_NETIF_H__
|
|
||||||
#define __LWIP_NETIF_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF)
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#if LWIP_DHCP
|
|
||||||
struct dhcp;
|
|
||||||
#endif
|
|
||||||
#if LWIP_AUTOIP
|
|
||||||
struct autoip;
|
|
||||||
#endif
|
|
||||||
#if LWIP_IPV6_DHCP6
|
|
||||||
#include "lwip/dhcp6.h"
|
|
||||||
#endif /* LWIP_IPV6_DHCP6 */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Throughout this file, IP addresses are expected to be in
|
|
||||||
* the same byte order as in IP_PCB. */
|
|
||||||
|
|
||||||
/** must be the maximum of all used hardware address lengths
|
|
||||||
across all types of interfaces in use */
|
|
||||||
#define NETIF_MAX_HWADDR_LEN 6U
|
|
||||||
|
|
||||||
/** Whether the network interface is 'up'. This is
|
|
||||||
* a software flag used to control whether this network
|
|
||||||
* interface is enabled and processes traffic.
|
|
||||||
* It is set by the startup code (for static IP configuration) or
|
|
||||||
* by dhcp/autoip when an address has been assigned.
|
|
||||||
*/
|
|
||||||
#define NETIF_FLAG_UP 0x01U
|
|
||||||
/** If set, the netif has broadcast capability.
|
|
||||||
* Set by the netif driver in its init function. */
|
|
||||||
#define NETIF_FLAG_BROADCAST 0x02U
|
|
||||||
/** If set, the netif is one end of a point-to-point connection.
|
|
||||||
* Set by the netif driver in its init function. */
|
|
||||||
#define NETIF_FLAG_POINTTOPOINT 0x04U
|
|
||||||
/** If set, the interface is configured using DHCP.
|
|
||||||
* Set by the DHCP code when starting or stopping DHCP. */
|
|
||||||
#define NETIF_FLAG_DHCP 0x08U
|
|
||||||
/** If set, the interface has an active link
|
|
||||||
* (set by the network interface driver).
|
|
||||||
* Either set by the netif driver in its init function (if the link
|
|
||||||
* is up at that time) or at a later point once the link comes up
|
|
||||||
* (if link detection is supported by the hardware). */
|
|
||||||
#define NETIF_FLAG_LINK_UP 0x10U
|
|
||||||
/** If set, the netif is an ethernet device using ARP.
|
|
||||||
* Set by the netif driver in its init function.
|
|
||||||
* Used to check input packet types and use of DHCP. */
|
|
||||||
#define NETIF_FLAG_ETHARP 0x20U
|
|
||||||
/** If set, the netif is an ethernet device. It might not use
|
|
||||||
* ARP or TCP/IP if it is used for PPPoE only.
|
|
||||||
*/
|
|
||||||
#define NETIF_FLAG_ETHERNET 0x40U
|
|
||||||
/** If set, the netif has IGMP capability.
|
|
||||||
* Set by the netif driver in its init function. */
|
|
||||||
#define NETIF_FLAG_IGMP 0x80U
|
|
||||||
|
|
||||||
/** Function prototype for netif init functions. Set up flags and output/linkoutput
|
|
||||||
* callback functions in this function.
|
|
||||||
*
|
|
||||||
* @param netif The netif to initialize
|
|
||||||
*/
|
|
||||||
typedef err_t (*netif_init_fn)(struct netif *netif);
|
|
||||||
/** Function prototype for netif->input functions. This function is saved as 'input'
|
|
||||||
* callback function in the netif struct. Call it when a packet has been received.
|
|
||||||
*
|
|
||||||
* @param p The received packet, copied into a pbuf
|
|
||||||
* @param inp The netif which received the packet
|
|
||||||
*/
|
|
||||||
typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);
|
|
||||||
/** Function prototype for netif->output functions. Called by lwIP when a packet
|
|
||||||
* shall be sent. For ethernet netif, set this to 'etharp_output' and set
|
|
||||||
* 'linkoutput'.
|
|
||||||
*
|
|
||||||
* @param netif The netif which shall send a packet
|
|
||||||
* @param p The packet to send (p->payload points to IP header)
|
|
||||||
* @param ipaddr The IP address to which the packet shall be sent
|
|
||||||
*/
|
|
||||||
typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p,
|
|
||||||
ip_addr_t *ipaddr);
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** Function prototype for netif->output_ip6 functions. Called by lwIP when a packet
|
|
||||||
* shall be sent. For ethernet netif, set this to 'nd_output' and set
|
|
||||||
* 'linkoutput'.
|
|
||||||
*
|
|
||||||
* @param netif The netif which shall send a packet
|
|
||||||
* @param p The packet to send (p->payload points to IP header)
|
|
||||||
* @param ipaddr The IPv6 address to which the packet shall be sent
|
|
||||||
*/
|
|
||||||
typedef err_t (*netif_output_ip6_fn)(struct netif *netif, struct pbuf *p,
|
|
||||||
ip6_addr_t *ipaddr);
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
/** Function prototype for netif->linkoutput functions. Only used for ethernet
|
|
||||||
* netifs. This function is called by ARP when a packet shall be sent.
|
|
||||||
*
|
|
||||||
* @param netif The netif which shall send a packet
|
|
||||||
* @param p The packet to send (raw ethernet packet)
|
|
||||||
*/
|
|
||||||
typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p);
|
|
||||||
/** Function prototype for netif status- or link-callback functions. */
|
|
||||||
typedef void (*netif_status_callback_fn)(struct netif *netif);
|
|
||||||
/** Function prototype for netif igmp_mac_filter functions */
|
|
||||||
typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif,
|
|
||||||
ip_addr_t *group, u8_t action);
|
|
||||||
#if LWIP_IPV6 && LWIP_IPV6_MLD
|
|
||||||
/** Function prototype for netif mld_mac_filter functions */
|
|
||||||
typedef err_t (*netif_mld_mac_filter_fn)(struct netif *netif,
|
|
||||||
ip6_addr_t *group, u8_t action);
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
|
|
||||||
|
|
||||||
/** Generic data structure used for all lwIP network interfaces.
|
|
||||||
* The following fields should be filled in by the initialization
|
|
||||||
* function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
|
|
||||||
struct netif {
|
|
||||||
/** pointer to next in linked list */
|
|
||||||
struct netif *next;
|
|
||||||
|
|
||||||
/** IP address configuration in network byte order */
|
|
||||||
ip_addr_t ip_addr;
|
|
||||||
ip_addr_t netmask;
|
|
||||||
ip_addr_t gw;
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** Array of IPv6 addresses for this netif. */
|
|
||||||
ip6_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES];
|
|
||||||
/** The state of each IPv6 address (Tentative, Preferred, etc).
|
|
||||||
* @see ip6_addr.h */
|
|
||||||
u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
/** This function is called by the network device driver
|
|
||||||
* to pass a packet up the TCP/IP stack. */
|
|
||||||
netif_input_fn input;
|
|
||||||
/** This function is called by the IP module when it wants
|
|
||||||
* to send a packet on the interface. This function typically
|
|
||||||
* first resolves the hardware address, then sends the packet. */
|
|
||||||
netif_output_fn output;
|
|
||||||
/** This function is called by the ARP module when it wants
|
|
||||||
* to send a packet on the interface. This function outputs
|
|
||||||
* the pbuf as-is on the link medium. */
|
|
||||||
netif_linkoutput_fn linkoutput;
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** This function is called by the IPv6 module when it wants
|
|
||||||
* to send a packet on the interface. This function typically
|
|
||||||
* first resolves the hardware address, then sends the packet. */
|
|
||||||
netif_output_ip6_fn output_ip6;
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
#if LWIP_NETIF_STATUS_CALLBACK
|
|
||||||
/** This function is called when the netif state is set to up or down
|
|
||||||
*/
|
|
||||||
netif_status_callback_fn status_callback;
|
|
||||||
#endif /* LWIP_NETIF_STATUS_CALLBACK */
|
|
||||||
#if LWIP_NETIF_LINK_CALLBACK
|
|
||||||
/** This function is called when the netif link is set to up or down
|
|
||||||
*/
|
|
||||||
netif_status_callback_fn link_callback;
|
|
||||||
#endif /* LWIP_NETIF_LINK_CALLBACK */
|
|
||||||
#if LWIP_NETIF_REMOVE_CALLBACK
|
|
||||||
/** This function is called when the netif has been removed */
|
|
||||||
netif_status_callback_fn remove_callback;
|
|
||||||
#endif /* LWIP_NETIF_REMOVE_CALLBACK */
|
|
||||||
/** This field can be set by the device driver and could point
|
|
||||||
* to state information for the device. */
|
|
||||||
void *state;
|
|
||||||
#if LWIP_DHCP
|
|
||||||
/** the DHCP client state information for this netif */
|
|
||||||
struct dhcp *dhcp;
|
|
||||||
#endif /* LWIP_DHCP */
|
|
||||||
#if LWIP_AUTOIP
|
|
||||||
/** the AutoIP client state information for this netif */
|
|
||||||
struct autoip *autoip;
|
|
||||||
#endif
|
|
||||||
#if LWIP_IPV6_AUTOCONFIG
|
|
||||||
/** is this netif enabled for IPv6 autoconfiguration */
|
|
||||||
u8_t ip6_autoconfig_enabled;
|
|
||||||
#endif /* LWIP_IPV6_AUTOCONFIG */
|
|
||||||
#if LWIP_IPV6_SEND_ROUTER_SOLICIT
|
|
||||||
/** Number of Router Solicitation messages that remain to be sent. */
|
|
||||||
u8_t rs_count;
|
|
||||||
#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
|
|
||||||
#if LWIP_IPV6_DHCP6
|
|
||||||
/** the DHCPv6 client state information for this netif */
|
|
||||||
struct dhcp6 *dhcp6;
|
|
||||||
#endif /* LWIP_IPV6_DHCP6 */
|
|
||||||
#if LWIP_NETIF_HOSTNAME
|
|
||||||
/* the hostname for this netif, NULL is a valid value */
|
|
||||||
char* hostname;
|
|
||||||
#endif /* LWIP_NETIF_HOSTNAME */
|
|
||||||
/** maximum transfer unit (in bytes) */
|
|
||||||
u16_t mtu;
|
|
||||||
/** number of bytes used in hwaddr */
|
|
||||||
u8_t hwaddr_len;
|
|
||||||
/** link level hardware address of this interface */
|
|
||||||
u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
|
|
||||||
/** flags (see NETIF_FLAG_ above) */
|
|
||||||
u8_t flags;
|
|
||||||
/** descriptive abbreviation */
|
|
||||||
char name[2];
|
|
||||||
/** number of this interface */
|
|
||||||
u8_t num;
|
|
||||||
#if LWIP_SNMP
|
|
||||||
/** link type (from "snmp_ifType" enum from snmp.h) */
|
|
||||||
u8_t link_type;
|
|
||||||
/** (estimate) link speed */
|
|
||||||
u32_t link_speed;
|
|
||||||
/** timestamp at last change made (up/down) */
|
|
||||||
u32_t ts;
|
|
||||||
/** counters */
|
|
||||||
u32_t ifinoctets;
|
|
||||||
u32_t ifinucastpkts;
|
|
||||||
u32_t ifinnucastpkts;
|
|
||||||
u32_t ifindiscards;
|
|
||||||
u32_t ifoutoctets;
|
|
||||||
u32_t ifoutucastpkts;
|
|
||||||
u32_t ifoutnucastpkts;
|
|
||||||
u32_t ifoutdiscards;
|
|
||||||
#endif /* LWIP_SNMP */
|
|
||||||
#if LWIP_IGMP
|
|
||||||
/** This function could be called to add or delete an entry in the multicast
|
|
||||||
filter table of the ethernet MAC.*/
|
|
||||||
netif_igmp_mac_filter_fn igmp_mac_filter;
|
|
||||||
#endif /* LWIP_IGMP */
|
|
||||||
#if LWIP_IPV6 && LWIP_IPV6_MLD
|
|
||||||
/** This function could be called to add or delete an entry in the IPv6 multicast
|
|
||||||
filter table of the ethernet MAC. */
|
|
||||||
netif_mld_mac_filter_fn mld_mac_filter;
|
|
||||||
#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
|
|
||||||
#if LWIP_NETIF_HWADDRHINT
|
|
||||||
u8_t *addr_hint;
|
|
||||||
#endif /* LWIP_NETIF_HWADDRHINT */
|
|
||||||
#if ENABLE_LOOPBACK
|
|
||||||
/* List of packets to be queued for ourselves. */
|
|
||||||
struct pbuf *loop_first;
|
|
||||||
struct pbuf *loop_last;
|
|
||||||
#if LWIP_LOOPBACK_MAX_PBUFS
|
|
||||||
u16_t loop_cnt_current;
|
|
||||||
#endif /* LWIP_LOOPBACK_MAX_PBUFS */
|
|
||||||
#endif /* ENABLE_LOOPBACK */
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_SNMP
|
|
||||||
#define NETIF_INIT_SNMP(netif, type, speed) \
|
|
||||||
/* use "snmp_ifType" enum from snmp.h for "type", snmp_ifType_ethernet_csmacd by example */ \
|
|
||||||
(netif)->link_type = (type); \
|
|
||||||
/* your link speed here (units: bits per second) */ \
|
|
||||||
(netif)->link_speed = (speed); \
|
|
||||||
(netif)->ts = 0; \
|
|
||||||
(netif)->ifinoctets = 0; \
|
|
||||||
(netif)->ifinucastpkts = 0; \
|
|
||||||
(netif)->ifinnucastpkts = 0; \
|
|
||||||
(netif)->ifindiscards = 0; \
|
|
||||||
(netif)->ifoutoctets = 0; \
|
|
||||||
(netif)->ifoutucastpkts = 0; \
|
|
||||||
(netif)->ifoutnucastpkts = 0; \
|
|
||||||
(netif)->ifoutdiscards = 0
|
|
||||||
#else /* LWIP_SNMP */
|
|
||||||
#define NETIF_INIT_SNMP(netif, type, speed)
|
|
||||||
#endif /* LWIP_SNMP */
|
|
||||||
|
|
||||||
|
|
||||||
/** The list of network interfaces. */
|
|
||||||
extern struct netif *netif_list;
|
|
||||||
/** The default network interface. */
|
|
||||||
extern struct netif *netif_default;
|
|
||||||
|
|
||||||
void netif_init(void);
|
|
||||||
|
|
||||||
struct netif *netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
|
|
||||||
ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input);
|
|
||||||
|
|
||||||
void
|
|
||||||
netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
|
|
||||||
ip_addr_t *gw);
|
|
||||||
void netif_remove(struct netif * netif);
|
|
||||||
|
|
||||||
/* Returns a network interface given its name. The name is of the form
|
|
||||||
"et0", where the first two letters are the "name" field in the
|
|
||||||
netif structure, and the digit is in the num field in the same
|
|
||||||
structure. */
|
|
||||||
struct netif *netif_find(char *name);
|
|
||||||
|
|
||||||
void netif_set_default(struct netif *netif);
|
|
||||||
|
|
||||||
void netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr);
|
|
||||||
void netif_set_netmask(struct netif *netif, ip_addr_t *netmask);
|
|
||||||
void netif_set_gw(struct netif *netif, ip_addr_t *gw);
|
|
||||||
|
|
||||||
void netif_set_up(struct netif *netif);
|
|
||||||
void netif_set_down(struct netif *netif);
|
|
||||||
/** Ask if an interface is up */
|
|
||||||
#define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8_t)1 : (u8_t)0)
|
|
||||||
|
|
||||||
#if LWIP_NETIF_STATUS_CALLBACK
|
|
||||||
void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback);
|
|
||||||
#endif /* LWIP_NETIF_STATUS_CALLBACK */
|
|
||||||
#if LWIP_NETIF_REMOVE_CALLBACK
|
|
||||||
void netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback);
|
|
||||||
#endif /* LWIP_NETIF_REMOVE_CALLBACK */
|
|
||||||
|
|
||||||
void netif_set_link_up(struct netif *netif);
|
|
||||||
void netif_set_link_down(struct netif *netif);
|
|
||||||
/** Ask if a link is up */
|
|
||||||
#define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8_t)1 : (u8_t)0)
|
|
||||||
|
|
||||||
#if LWIP_NETIF_LINK_CALLBACK
|
|
||||||
void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback);
|
|
||||||
#endif /* LWIP_NETIF_LINK_CALLBACK */
|
|
||||||
|
|
||||||
#if LWIP_NETIF_HOSTNAME
|
|
||||||
#define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0)
|
|
||||||
#define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL)
|
|
||||||
#endif /* LWIP_NETIF_HOSTNAME */
|
|
||||||
|
|
||||||
#if LWIP_IGMP
|
|
||||||
#define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0)
|
|
||||||
#define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)
|
|
||||||
#endif /* LWIP_IGMP */
|
|
||||||
|
|
||||||
#if ENABLE_LOOPBACK
|
|
||||||
err_t netif_loop_output(struct netif *netif, struct pbuf *p, ip_addr_t *dest_ip);
|
|
||||||
void netif_poll(struct netif *netif);
|
|
||||||
#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
|
|
||||||
void netif_poll_all(void);
|
|
||||||
#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
|
|
||||||
#endif /* ENABLE_LOOPBACK */
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define netif_ip6_addr(netif, i) (&((netif)->ip6_addr[(i)]))
|
|
||||||
#define netif_ip6_addr_state(netif, i) ((netif)->ip6_addr_state[(i)])
|
|
||||||
#define netif_ip6_addr_set_state(netif, i, state) ((netif)->ip6_addr_state[(i)] = (state))
|
|
||||||
s8_t netif_matches_ip6_addr(struct netif * netif, ip6_addr_t * ip6addr);
|
|
||||||
void netif_create_ip6_linklocal_address(struct netif * netif, u8_t from_mac_48bit);
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#if LWIP_NETIF_HWADDRHINT
|
|
||||||
#define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint))
|
|
||||||
#else /* LWIP_NETIF_HWADDRHINT */
|
|
||||||
#define NETIF_SET_HWADDRHINT(netif, hint)
|
|
||||||
#endif /* LWIP_NETIF_HWADDRHINT */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_NETIF_H__ */
|
|
|
@ -1,108 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_NETIFAPI_H__
|
|
||||||
#define __LWIP_NETIFAPI_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/dhcp.h"
|
|
||||||
#include "lwip/autoip.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef void (*netifapi_void_fn)(struct netif *netif);
|
|
||||||
typedef err_t (*netifapi_errt_fn)(struct netif *netif);
|
|
||||||
|
|
||||||
struct netifapi_msg_msg {
|
|
||||||
#if !LWIP_TCPIP_CORE_LOCKING
|
|
||||||
sys_sem_t sem;
|
|
||||||
#endif /* !LWIP_TCPIP_CORE_LOCKING */
|
|
||||||
err_t err;
|
|
||||||
struct netif *netif;
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
ip_addr_t *ipaddr;
|
|
||||||
ip_addr_t *netmask;
|
|
||||||
ip_addr_t *gw;
|
|
||||||
void *state;
|
|
||||||
netif_init_fn init;
|
|
||||||
netif_input_fn input;
|
|
||||||
} add;
|
|
||||||
struct {
|
|
||||||
netifapi_void_fn voidfunc;
|
|
||||||
netifapi_errt_fn errtfunc;
|
|
||||||
} common;
|
|
||||||
} msg;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct netifapi_msg {
|
|
||||||
void (* function)(struct netifapi_msg_msg *msg);
|
|
||||||
struct netifapi_msg_msg msg;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* API for application */
|
|
||||||
err_t netifapi_netif_add ( struct netif *netif,
|
|
||||||
ip_addr_t *ipaddr,
|
|
||||||
ip_addr_t *netmask,
|
|
||||||
ip_addr_t *gw,
|
|
||||||
void *state,
|
|
||||||
netif_init_fn init,
|
|
||||||
netif_input_fn input);
|
|
||||||
|
|
||||||
err_t netifapi_netif_set_addr ( struct netif *netif,
|
|
||||||
ip_addr_t *ipaddr,
|
|
||||||
ip_addr_t *netmask,
|
|
||||||
ip_addr_t *gw );
|
|
||||||
|
|
||||||
err_t netifapi_netif_common ( struct netif *netif,
|
|
||||||
netifapi_void_fn voidfunc,
|
|
||||||
netifapi_errt_fn errtfunc);
|
|
||||||
|
|
||||||
#define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL)
|
|
||||||
#define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL)
|
|
||||||
#define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL)
|
|
||||||
#define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL)
|
|
||||||
#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start)
|
|
||||||
#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL)
|
|
||||||
#define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start)
|
|
||||||
#define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_NETIF_API */
|
|
||||||
|
|
||||||
#endif /* __LWIP_NETIFAPI_H__ */
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,191 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_PBUF_H__
|
|
||||||
#define __LWIP_PBUF_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Currently, the pbuf_custom code is only needed for one specific configuration
|
|
||||||
* of IP_FRAG */
|
|
||||||
#define LWIP_SUPPORT_CUSTOM_PBUF (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF)
|
|
||||||
|
|
||||||
/* @todo: We need a mechanism to prevent wasting memory in every pbuf
|
|
||||||
(TCP vs. UDP, IPv4 vs. IPv6: UDP/IPv4 packets may waste up to 28 bytes) */
|
|
||||||
|
|
||||||
#define PBUF_TRANSPORT_HLEN 20
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define PBUF_IP_HLEN 40
|
|
||||||
#else
|
|
||||||
#define PBUF_IP_HLEN 20
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
PBUF_TRANSPORT,
|
|
||||||
PBUF_IP,
|
|
||||||
PBUF_LINK,
|
|
||||||
PBUF_RAW
|
|
||||||
} pbuf_layer;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
PBUF_RAM, /* pbuf data is stored in RAM */
|
|
||||||
PBUF_ROM, /* pbuf data is stored in ROM */
|
|
||||||
PBUF_REF, /* pbuf comes from the pbuf pool */
|
|
||||||
PBUF_POOL, /* pbuf payload refers to RAM */
|
|
||||||
#ifdef EBUF_LWIP
|
|
||||||
PBUF_ESF_RX /* pbuf payload is from WLAN */
|
|
||||||
#endif /* ESF_LWIP */
|
|
||||||
} pbuf_type;
|
|
||||||
|
|
||||||
|
|
||||||
/** indicates this packet's data should be immediately passed to the application */
|
|
||||||
#define PBUF_FLAG_PUSH 0x01U
|
|
||||||
/** indicates this is a custom pbuf: pbuf_free and pbuf_header handle such a
|
|
||||||
a pbuf differently */
|
|
||||||
#define PBUF_FLAG_IS_CUSTOM 0x02U
|
|
||||||
/** indicates this pbuf is UDP multicast to be looped back */
|
|
||||||
#define PBUF_FLAG_MCASTLOOP 0x04U
|
|
||||||
/** indicates this pbuf was received as link-level broadcast */
|
|
||||||
#define PBUF_FLAG_LLBCAST 0x08U
|
|
||||||
/** indicates this pbuf was received as link-level multicast */
|
|
||||||
#define PBUF_FLAG_LLMCAST 0x10U
|
|
||||||
/** indicates this pbuf includes a TCP FIN flag */
|
|
||||||
#define PBUF_FLAG_TCP_FIN 0x20U
|
|
||||||
|
|
||||||
struct pbuf {
|
|
||||||
/** next pbuf in singly linked pbuf chain */
|
|
||||||
struct pbuf *next;
|
|
||||||
|
|
||||||
/** pointer to the actual data in the buffer */
|
|
||||||
void *payload;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* total length of this buffer and all next buffers in chain
|
|
||||||
* belonging to the same packet.
|
|
||||||
*
|
|
||||||
* For non-queue packet chains this is the invariant:
|
|
||||||
* p->tot_len == p->len + (p->next? p->next->tot_len: 0)
|
|
||||||
*/
|
|
||||||
u16_t tot_len;
|
|
||||||
|
|
||||||
/** length of this buffer */
|
|
||||||
u16_t len;
|
|
||||||
|
|
||||||
/** pbuf_type as u8_t instead of enum to save space */
|
|
||||||
u8_t /*pbuf_type*/ type;
|
|
||||||
|
|
||||||
/** misc flags */
|
|
||||||
u8_t flags;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the reference count always equals the number of pointers
|
|
||||||
* that refer to this pbuf. This can be pointers from an application,
|
|
||||||
* the stack itself, or pbuf->next pointers from a chain.
|
|
||||||
*/
|
|
||||||
u16_t ref;
|
|
||||||
|
|
||||||
/* add a pointer for esf_buf */
|
|
||||||
void * eb;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_SUPPORT_CUSTOM_PBUF
|
|
||||||
/** Prototype for a function to free a custom pbuf */
|
|
||||||
typedef void (*pbuf_free_custom_fn)(struct pbuf *p);
|
|
||||||
|
|
||||||
/** A custom pbuf: like a pbuf, but following a function pointer to free it. */
|
|
||||||
struct pbuf_custom {
|
|
||||||
/** The actual pbuf */
|
|
||||||
struct pbuf pbuf;
|
|
||||||
/** This function is called when pbuf_free deallocates this pbuf(_custom) */
|
|
||||||
pbuf_free_custom_fn custom_free_function;
|
|
||||||
};
|
|
||||||
#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
|
|
||||||
|
|
||||||
#if LWIP_TCP && TCP_QUEUE_OOSEQ
|
|
||||||
/** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */
|
|
||||||
#ifndef PBUF_POOL_FREE_OOSEQ
|
|
||||||
#define PBUF_POOL_FREE_OOSEQ 1
|
|
||||||
#endif /* PBUF_POOL_FREE_OOSEQ */
|
|
||||||
#if NO_SYS && PBUF_POOL_FREE_OOSEQ
|
|
||||||
extern volatile u8_t pbuf_free_ooseq_pending;
|
|
||||||
void pbuf_free_ooseq(void);
|
|
||||||
/** When not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ()
|
|
||||||
at regular intervals from main level to check if ooseq pbufs need to be
|
|
||||||
freed! */
|
|
||||||
#define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \
|
|
||||||
/* pbuf_alloc() reported PBUF_POOL to be empty -> try to free some \
|
|
||||||
ooseq queued pbufs now */ \
|
|
||||||
pbuf_free_ooseq(); }}while(0)
|
|
||||||
#endif /* NO_SYS && PBUF_POOL_FREE_OOSEQ*/
|
|
||||||
#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ */
|
|
||||||
|
|
||||||
/* Initializes the pbuf module. This call is empty for now, but may not be in future. */
|
|
||||||
#define pbuf_init()
|
|
||||||
|
|
||||||
struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type);
|
|
||||||
#if LWIP_SUPPORT_CUSTOM_PBUF
|
|
||||||
struct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type,
|
|
||||||
struct pbuf_custom *p, void *payload_mem,
|
|
||||||
u16_t payload_mem_len);
|
|
||||||
#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
|
|
||||||
void pbuf_realloc(struct pbuf *p, u16_t size);
|
|
||||||
u8_t pbuf_header(struct pbuf *p, s16_t header_size);
|
|
||||||
void pbuf_ref(struct pbuf *p);
|
|
||||||
u8_t pbuf_free(struct pbuf *p);
|
|
||||||
u8_t pbuf_clen(struct pbuf *p);
|
|
||||||
void pbuf_cat(struct pbuf *head, struct pbuf *tail);
|
|
||||||
void pbuf_chain(struct pbuf *head, struct pbuf *tail);
|
|
||||||
struct pbuf *pbuf_dechain(struct pbuf *p);
|
|
||||||
err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from);
|
|
||||||
u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset);
|
|
||||||
err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len);
|
|
||||||
struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer);
|
|
||||||
#if LWIP_CHECKSUM_ON_COPY
|
|
||||||
err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr,
|
|
||||||
u16_t len, u16_t *chksum);
|
|
||||||
#endif /* LWIP_CHECKSUM_ON_COPY */
|
|
||||||
|
|
||||||
u8_t pbuf_get_at(struct pbuf* p, u16_t offset);
|
|
||||||
u16_t pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n);
|
|
||||||
u16_t pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset);
|
|
||||||
u16_t pbuf_strstr(struct pbuf* p, const char* substr);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_PBUF_H__ */
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_RAW_H__
|
|
||||||
#define __LWIP_RAW_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct raw_pcb;
|
|
||||||
|
|
||||||
/** Function prototype for raw pcb receive callback functions.
|
|
||||||
* @param arg user supplied argument (raw_pcb.recv_arg)
|
|
||||||
* @param pcb the raw_pcb which received data
|
|
||||||
* @param p the packet buffer that was received
|
|
||||||
* @param addr the remote IP address from which the packet was received
|
|
||||||
* @return 1 if the packet was 'eaten' (aka. deleted),
|
|
||||||
* 0 if the packet lives on
|
|
||||||
* If returning 1, the callback is responsible for freeing the pbuf
|
|
||||||
* if it's not used any more.
|
|
||||||
*/
|
|
||||||
typedef u8_t (*raw_recv_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p,
|
|
||||||
ip_addr_t *addr);
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** Function prototype for raw pcb IPv6 receive callback functions.
|
|
||||||
* @param arg user supplied argument (raw_pcb.recv_arg)
|
|
||||||
* @param pcb the raw_pcb which received data
|
|
||||||
* @param p the packet buffer that was received
|
|
||||||
* @param addr the remote IPv6 address from which the packet was received
|
|
||||||
* @return 1 if the packet was 'eaten' (aka. deleted),
|
|
||||||
* 0 if the packet lives on
|
|
||||||
* If returning 1, the callback is responsible for freeing the pbuf
|
|
||||||
* if it's not used any more.
|
|
||||||
*/
|
|
||||||
typedef u8_t (*raw_recv_ip6_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p,
|
|
||||||
ip6_addr_t *addr);
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define RAW_PCB_RECV_IP6 raw_recv_ip6_fn ip6;
|
|
||||||
#else
|
|
||||||
#define RAW_PCB_RECV_IP6
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
struct raw_pcb {
|
|
||||||
/* Common members of all PCB types */
|
|
||||||
IP_PCB;
|
|
||||||
|
|
||||||
struct raw_pcb *next;
|
|
||||||
|
|
||||||
u8_t protocol;
|
|
||||||
|
|
||||||
/** receive callback function */
|
|
||||||
union {
|
|
||||||
raw_recv_fn ip4;
|
|
||||||
RAW_PCB_RECV_IP6
|
|
||||||
} recv;
|
|
||||||
/* user-supplied argument for the recv callback */
|
|
||||||
void *recv_arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The following functions is the application layer interface to the
|
|
||||||
RAW code. */
|
|
||||||
struct raw_pcb * raw_new (u8_t proto);
|
|
||||||
void raw_remove (struct raw_pcb *pcb);
|
|
||||||
err_t raw_bind (struct raw_pcb *pcb, ip_addr_t *ipaddr);
|
|
||||||
err_t raw_connect (struct raw_pcb *pcb, ip_addr_t *ipaddr);
|
|
||||||
|
|
||||||
void raw_recv (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg);
|
|
||||||
err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *ipaddr);
|
|
||||||
err_t raw_send (struct raw_pcb *pcb, struct pbuf *p);
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
struct raw_pcb * raw_new_ip6 (u8_t proto);
|
|
||||||
#define raw_bind_ip6(pcb, ip6addr) raw_bind(pcb, ip6_2_ip(ip6addr))
|
|
||||||
#define raw_connect_ip6(pcb, ip6addr) raw_connect(pcb, ip6_2_ip(ip6addr))
|
|
||||||
#define raw_recv_ip6(pcb, recv_ip6_fn, recv_arg) raw_recv(pcb, (raw_recv_fn)recv_ip6_fn, recv_arg)
|
|
||||||
#define raw_sendto_ip6(pcb, pbuf, ip6addr) raw_sendto(pcb, pbuf, ip6_2_ip(ip6addr))
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
/* The following functions are the lower layer interface to RAW. */
|
|
||||||
u8_t raw_input (struct pbuf *p, struct netif *inp);
|
|
||||||
#define raw_init() /* Compatibility define, not init needed. */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_RAW */
|
|
||||||
|
|
||||||
#endif /* __LWIP_RAW_H__ */
|
|
|
@ -1,141 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the interface to the platform specific serial IO module
|
|
||||||
* It needs to be implemented by those platforms which need SLIP or PPP
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SIO_H__
|
|
||||||
#define __SIO_H__
|
|
||||||
|
|
||||||
#include "lwip/arch.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If you want to define sio_fd_t elsewhere or differently,
|
|
||||||
define this in your cc.h file. */
|
|
||||||
#ifndef __sio_fd_t_defined
|
|
||||||
typedef void * sio_fd_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The following functions can be defined to something else in your cc.h file
|
|
||||||
or be implemented in your custom sio.c file. */
|
|
||||||
|
|
||||||
#ifndef sio_open
|
|
||||||
/**
|
|
||||||
* Opens a serial device for communication.
|
|
||||||
*
|
|
||||||
* @param devnum device number
|
|
||||||
* @return handle to serial device if successful, NULL otherwise
|
|
||||||
*/
|
|
||||||
sio_fd_t sio_open(u8_t devnum);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef sio_send
|
|
||||||
/**
|
|
||||||
* Sends a single character to the serial device.
|
|
||||||
*
|
|
||||||
* @param c character to send
|
|
||||||
* @param fd serial device handle
|
|
||||||
*
|
|
||||||
* @note This function will block until the character can be sent.
|
|
||||||
*/
|
|
||||||
void sio_send(u8_t c, sio_fd_t fd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef sio_recv
|
|
||||||
/**
|
|
||||||
* Receives a single character from the serial device.
|
|
||||||
*
|
|
||||||
* @param fd serial device handle
|
|
||||||
*
|
|
||||||
* @note This function will block until a character is received.
|
|
||||||
*/
|
|
||||||
u8_t sio_recv(sio_fd_t fd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef sio_read
|
|
||||||
/**
|
|
||||||
* Reads from the serial device.
|
|
||||||
*
|
|
||||||
* @param fd serial device handle
|
|
||||||
* @param data pointer to data buffer for receiving
|
|
||||||
* @param len maximum length (in bytes) of data to receive
|
|
||||||
* @return number of bytes actually received - may be 0 if aborted by sio_read_abort
|
|
||||||
*
|
|
||||||
* @note This function will block until data can be received. The blocking
|
|
||||||
* can be cancelled by calling sio_read_abort().
|
|
||||||
*/
|
|
||||||
u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef sio_tryread
|
|
||||||
/**
|
|
||||||
* Tries to read from the serial device. Same as sio_read but returns
|
|
||||||
* immediately if no data is available and never blocks.
|
|
||||||
*
|
|
||||||
* @param fd serial device handle
|
|
||||||
* @param data pointer to data buffer for receiving
|
|
||||||
* @param len maximum length (in bytes) of data to receive
|
|
||||||
* @return number of bytes actually received
|
|
||||||
*/
|
|
||||||
u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef sio_write
|
|
||||||
/**
|
|
||||||
* Writes to the serial device.
|
|
||||||
*
|
|
||||||
* @param fd serial device handle
|
|
||||||
* @param data pointer to data to send
|
|
||||||
* @param len length (in bytes) of data to send
|
|
||||||
* @return number of bytes actually sent
|
|
||||||
*
|
|
||||||
* @note This function will block until all data can be sent.
|
|
||||||
*/
|
|
||||||
u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef sio_read_abort
|
|
||||||
/**
|
|
||||||
* Aborts a blocking sio_read() call.
|
|
||||||
*
|
|
||||||
* @param fd serial device handle
|
|
||||||
*/
|
|
||||||
void sio_read_abort(sio_fd_t fd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __SIO_H__ */
|
|
|
@ -1,367 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001, 2002 Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
* Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_SNMP_H__
|
|
||||||
#define __LWIP_SNMP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
|
|
||||||
struct udp_pcb;
|
|
||||||
struct netif;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see RFC1213, "MIB-II, 6. Definitions"
|
|
||||||
*/
|
|
||||||
enum snmp_ifType {
|
|
||||||
snmp_ifType_other=1, /* none of the following */
|
|
||||||
snmp_ifType_regular1822,
|
|
||||||
snmp_ifType_hdh1822,
|
|
||||||
snmp_ifType_ddn_x25,
|
|
||||||
snmp_ifType_rfc877_x25,
|
|
||||||
snmp_ifType_ethernet_csmacd,
|
|
||||||
snmp_ifType_iso88023_csmacd,
|
|
||||||
snmp_ifType_iso88024_tokenBus,
|
|
||||||
snmp_ifType_iso88025_tokenRing,
|
|
||||||
snmp_ifType_iso88026_man,
|
|
||||||
snmp_ifType_starLan,
|
|
||||||
snmp_ifType_proteon_10Mbit,
|
|
||||||
snmp_ifType_proteon_80Mbit,
|
|
||||||
snmp_ifType_hyperchannel,
|
|
||||||
snmp_ifType_fddi,
|
|
||||||
snmp_ifType_lapb,
|
|
||||||
snmp_ifType_sdlc,
|
|
||||||
snmp_ifType_ds1, /* T-1 */
|
|
||||||
snmp_ifType_e1, /* european equiv. of T-1 */
|
|
||||||
snmp_ifType_basicISDN,
|
|
||||||
snmp_ifType_primaryISDN, /* proprietary serial */
|
|
||||||
snmp_ifType_propPointToPointSerial,
|
|
||||||
snmp_ifType_ppp,
|
|
||||||
snmp_ifType_softwareLoopback,
|
|
||||||
snmp_ifType_eon, /* CLNP over IP [11] */
|
|
||||||
snmp_ifType_ethernet_3Mbit,
|
|
||||||
snmp_ifType_nsip, /* XNS over IP */
|
|
||||||
snmp_ifType_slip, /* generic SLIP */
|
|
||||||
snmp_ifType_ultra, /* ULTRA technologies */
|
|
||||||
snmp_ifType_ds3, /* T-3 */
|
|
||||||
snmp_ifType_sip, /* SMDS */
|
|
||||||
snmp_ifType_frame_relay
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
/** SNMP "sysuptime" Interval */
|
|
||||||
#define SNMP_SYSUPTIME_INTERVAL 10
|
|
||||||
|
|
||||||
/** fixed maximum length for object identifier type */
|
|
||||||
#define LWIP_SNMP_OBJ_ID_LEN 32
|
|
||||||
|
|
||||||
/** internal object identifier representation */
|
|
||||||
struct snmp_obj_id
|
|
||||||
{
|
|
||||||
u8_t len;
|
|
||||||
s32_t id[LWIP_SNMP_OBJ_ID_LEN];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* system */
|
|
||||||
void snmp_set_sysdesr(u8_t* str, u8_t* len);
|
|
||||||
void snmp_set_sysobjid(struct snmp_obj_id *oid);
|
|
||||||
void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid);
|
|
||||||
void snmp_inc_sysuptime(void);
|
|
||||||
void snmp_add_sysuptime(u32_t value);
|
|
||||||
void snmp_get_sysuptime(u32_t *value);
|
|
||||||
void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen);
|
|
||||||
void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen);
|
|
||||||
void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen);
|
|
||||||
|
|
||||||
/* network interface */
|
|
||||||
void snmp_add_ifinoctets(struct netif *ni, u32_t value);
|
|
||||||
void snmp_inc_ifinucastpkts(struct netif *ni);
|
|
||||||
void snmp_inc_ifinnucastpkts(struct netif *ni);
|
|
||||||
void snmp_inc_ifindiscards(struct netif *ni);
|
|
||||||
void snmp_add_ifoutoctets(struct netif *ni, u32_t value);
|
|
||||||
void snmp_inc_ifoutucastpkts(struct netif *ni);
|
|
||||||
void snmp_inc_ifoutnucastpkts(struct netif *ni);
|
|
||||||
void snmp_inc_ifoutdiscards(struct netif *ni);
|
|
||||||
void snmp_inc_iflist(void);
|
|
||||||
void snmp_dec_iflist(void);
|
|
||||||
|
|
||||||
/* ARP (for atTable and ipNetToMediaTable) */
|
|
||||||
void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip);
|
|
||||||
void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip);
|
|
||||||
|
|
||||||
/* IP */
|
|
||||||
void snmp_inc_ipinreceives(void);
|
|
||||||
void snmp_inc_ipinhdrerrors(void);
|
|
||||||
void snmp_inc_ipinaddrerrors(void);
|
|
||||||
void snmp_inc_ipforwdatagrams(void);
|
|
||||||
void snmp_inc_ipinunknownprotos(void);
|
|
||||||
void snmp_inc_ipindiscards(void);
|
|
||||||
void snmp_inc_ipindelivers(void);
|
|
||||||
void snmp_inc_ipoutrequests(void);
|
|
||||||
void snmp_inc_ipoutdiscards(void);
|
|
||||||
void snmp_inc_ipoutnoroutes(void);
|
|
||||||
void snmp_inc_ipreasmreqds(void);
|
|
||||||
void snmp_inc_ipreasmoks(void);
|
|
||||||
void snmp_inc_ipreasmfails(void);
|
|
||||||
void snmp_inc_ipfragoks(void);
|
|
||||||
void snmp_inc_ipfragfails(void);
|
|
||||||
void snmp_inc_ipfragcreates(void);
|
|
||||||
void snmp_inc_iproutingdiscards(void);
|
|
||||||
void snmp_insert_ipaddridx_tree(struct netif *ni);
|
|
||||||
void snmp_delete_ipaddridx_tree(struct netif *ni);
|
|
||||||
void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni);
|
|
||||||
void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni);
|
|
||||||
|
|
||||||
/* ICMP */
|
|
||||||
void snmp_inc_icmpinmsgs(void);
|
|
||||||
void snmp_inc_icmpinerrors(void);
|
|
||||||
void snmp_inc_icmpindestunreachs(void);
|
|
||||||
void snmp_inc_icmpintimeexcds(void);
|
|
||||||
void snmp_inc_icmpinparmprobs(void);
|
|
||||||
void snmp_inc_icmpinsrcquenchs(void);
|
|
||||||
void snmp_inc_icmpinredirects(void);
|
|
||||||
void snmp_inc_icmpinechos(void);
|
|
||||||
void snmp_inc_icmpinechoreps(void);
|
|
||||||
void snmp_inc_icmpintimestamps(void);
|
|
||||||
void snmp_inc_icmpintimestampreps(void);
|
|
||||||
void snmp_inc_icmpinaddrmasks(void);
|
|
||||||
void snmp_inc_icmpinaddrmaskreps(void);
|
|
||||||
void snmp_inc_icmpoutmsgs(void);
|
|
||||||
void snmp_inc_icmpouterrors(void);
|
|
||||||
void snmp_inc_icmpoutdestunreachs(void);
|
|
||||||
void snmp_inc_icmpouttimeexcds(void);
|
|
||||||
void snmp_inc_icmpoutparmprobs(void);
|
|
||||||
void snmp_inc_icmpoutsrcquenchs(void);
|
|
||||||
void snmp_inc_icmpoutredirects(void);
|
|
||||||
void snmp_inc_icmpoutechos(void);
|
|
||||||
void snmp_inc_icmpoutechoreps(void);
|
|
||||||
void snmp_inc_icmpouttimestamps(void);
|
|
||||||
void snmp_inc_icmpouttimestampreps(void);
|
|
||||||
void snmp_inc_icmpoutaddrmasks(void);
|
|
||||||
void snmp_inc_icmpoutaddrmaskreps(void);
|
|
||||||
|
|
||||||
/* TCP */
|
|
||||||
void snmp_inc_tcpactiveopens(void);
|
|
||||||
void snmp_inc_tcppassiveopens(void);
|
|
||||||
void snmp_inc_tcpattemptfails(void);
|
|
||||||
void snmp_inc_tcpestabresets(void);
|
|
||||||
void snmp_inc_tcpinsegs(void);
|
|
||||||
void snmp_inc_tcpoutsegs(void);
|
|
||||||
void snmp_inc_tcpretranssegs(void);
|
|
||||||
void snmp_inc_tcpinerrs(void);
|
|
||||||
void snmp_inc_tcpoutrsts(void);
|
|
||||||
|
|
||||||
/* UDP */
|
|
||||||
void snmp_inc_udpindatagrams(void);
|
|
||||||
void snmp_inc_udpnoports(void);
|
|
||||||
void snmp_inc_udpinerrors(void);
|
|
||||||
void snmp_inc_udpoutdatagrams(void);
|
|
||||||
void snmp_insert_udpidx_tree(struct udp_pcb *pcb);
|
|
||||||
void snmp_delete_udpidx_tree(struct udp_pcb *pcb);
|
|
||||||
|
|
||||||
/* SNMP */
|
|
||||||
void snmp_inc_snmpinpkts(void);
|
|
||||||
void snmp_inc_snmpoutpkts(void);
|
|
||||||
void snmp_inc_snmpinbadversions(void);
|
|
||||||
void snmp_inc_snmpinbadcommunitynames(void);
|
|
||||||
void snmp_inc_snmpinbadcommunityuses(void);
|
|
||||||
void snmp_inc_snmpinasnparseerrs(void);
|
|
||||||
void snmp_inc_snmpintoobigs(void);
|
|
||||||
void snmp_inc_snmpinnosuchnames(void);
|
|
||||||
void snmp_inc_snmpinbadvalues(void);
|
|
||||||
void snmp_inc_snmpinreadonlys(void);
|
|
||||||
void snmp_inc_snmpingenerrs(void);
|
|
||||||
void snmp_add_snmpintotalreqvars(u8_t value);
|
|
||||||
void snmp_add_snmpintotalsetvars(u8_t value);
|
|
||||||
void snmp_inc_snmpingetrequests(void);
|
|
||||||
void snmp_inc_snmpingetnexts(void);
|
|
||||||
void snmp_inc_snmpinsetrequests(void);
|
|
||||||
void snmp_inc_snmpingetresponses(void);
|
|
||||||
void snmp_inc_snmpintraps(void);
|
|
||||||
void snmp_inc_snmpouttoobigs(void);
|
|
||||||
void snmp_inc_snmpoutnosuchnames(void);
|
|
||||||
void snmp_inc_snmpoutbadvalues(void);
|
|
||||||
void snmp_inc_snmpoutgenerrs(void);
|
|
||||||
void snmp_inc_snmpoutgetrequests(void);
|
|
||||||
void snmp_inc_snmpoutgetnexts(void);
|
|
||||||
void snmp_inc_snmpoutsetrequests(void);
|
|
||||||
void snmp_inc_snmpoutgetresponses(void);
|
|
||||||
void snmp_inc_snmpouttraps(void);
|
|
||||||
void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid);
|
|
||||||
void snmp_set_snmpenableauthentraps(u8_t *value);
|
|
||||||
void snmp_get_snmpenableauthentraps(u8_t *value);
|
|
||||||
|
|
||||||
/* LWIP_SNMP support not available */
|
|
||||||
/* define everything to be empty */
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* system */
|
|
||||||
#define snmp_set_sysdesr(str, len)
|
|
||||||
#define snmp_set_sysobjid(oid);
|
|
||||||
#define snmp_get_sysobjid_ptr(oid)
|
|
||||||
#define snmp_inc_sysuptime()
|
|
||||||
#define snmp_add_sysuptime(value)
|
|
||||||
#define snmp_get_sysuptime(value)
|
|
||||||
#define snmp_set_syscontact(ocstr, ocstrlen);
|
|
||||||
#define snmp_set_sysname(ocstr, ocstrlen);
|
|
||||||
#define snmp_set_syslocation(ocstr, ocstrlen);
|
|
||||||
|
|
||||||
/* network interface */
|
|
||||||
#define snmp_add_ifinoctets(ni,value)
|
|
||||||
#define snmp_inc_ifinucastpkts(ni)
|
|
||||||
#define snmp_inc_ifinnucastpkts(ni)
|
|
||||||
#define snmp_inc_ifindiscards(ni)
|
|
||||||
#define snmp_add_ifoutoctets(ni,value)
|
|
||||||
#define snmp_inc_ifoutucastpkts(ni)
|
|
||||||
#define snmp_inc_ifoutnucastpkts(ni)
|
|
||||||
#define snmp_inc_ifoutdiscards(ni)
|
|
||||||
#define snmp_inc_iflist()
|
|
||||||
#define snmp_dec_iflist()
|
|
||||||
|
|
||||||
/* ARP */
|
|
||||||
#define snmp_insert_arpidx_tree(ni,ip)
|
|
||||||
#define snmp_delete_arpidx_tree(ni,ip)
|
|
||||||
|
|
||||||
/* IP */
|
|
||||||
#define snmp_inc_ipinreceives()
|
|
||||||
#define snmp_inc_ipinhdrerrors()
|
|
||||||
#define snmp_inc_ipinaddrerrors()
|
|
||||||
#define snmp_inc_ipforwdatagrams()
|
|
||||||
#define snmp_inc_ipinunknownprotos()
|
|
||||||
#define snmp_inc_ipindiscards()
|
|
||||||
#define snmp_inc_ipindelivers()
|
|
||||||
#define snmp_inc_ipoutrequests()
|
|
||||||
#define snmp_inc_ipoutdiscards()
|
|
||||||
#define snmp_inc_ipoutnoroutes()
|
|
||||||
#define snmp_inc_ipreasmreqds()
|
|
||||||
#define snmp_inc_ipreasmoks()
|
|
||||||
#define snmp_inc_ipreasmfails()
|
|
||||||
#define snmp_inc_ipfragoks()
|
|
||||||
#define snmp_inc_ipfragfails()
|
|
||||||
#define snmp_inc_ipfragcreates()
|
|
||||||
#define snmp_inc_iproutingdiscards()
|
|
||||||
#define snmp_insert_ipaddridx_tree(ni)
|
|
||||||
#define snmp_delete_ipaddridx_tree(ni)
|
|
||||||
#define snmp_insert_iprteidx_tree(dflt, ni)
|
|
||||||
#define snmp_delete_iprteidx_tree(dflt, ni)
|
|
||||||
|
|
||||||
/* ICMP */
|
|
||||||
#define snmp_inc_icmpinmsgs()
|
|
||||||
#define snmp_inc_icmpinerrors()
|
|
||||||
#define snmp_inc_icmpindestunreachs()
|
|
||||||
#define snmp_inc_icmpintimeexcds()
|
|
||||||
#define snmp_inc_icmpinparmprobs()
|
|
||||||
#define snmp_inc_icmpinsrcquenchs()
|
|
||||||
#define snmp_inc_icmpinredirects()
|
|
||||||
#define snmp_inc_icmpinechos()
|
|
||||||
#define snmp_inc_icmpinechoreps()
|
|
||||||
#define snmp_inc_icmpintimestamps()
|
|
||||||
#define snmp_inc_icmpintimestampreps()
|
|
||||||
#define snmp_inc_icmpinaddrmasks()
|
|
||||||
#define snmp_inc_icmpinaddrmaskreps()
|
|
||||||
#define snmp_inc_icmpoutmsgs()
|
|
||||||
#define snmp_inc_icmpouterrors()
|
|
||||||
#define snmp_inc_icmpoutdestunreachs()
|
|
||||||
#define snmp_inc_icmpouttimeexcds()
|
|
||||||
#define snmp_inc_icmpoutparmprobs()
|
|
||||||
#define snmp_inc_icmpoutsrcquenchs()
|
|
||||||
#define snmp_inc_icmpoutredirects()
|
|
||||||
#define snmp_inc_icmpoutechos()
|
|
||||||
#define snmp_inc_icmpoutechoreps()
|
|
||||||
#define snmp_inc_icmpouttimestamps()
|
|
||||||
#define snmp_inc_icmpouttimestampreps()
|
|
||||||
#define snmp_inc_icmpoutaddrmasks()
|
|
||||||
#define snmp_inc_icmpoutaddrmaskreps()
|
|
||||||
/* TCP */
|
|
||||||
#define snmp_inc_tcpactiveopens()
|
|
||||||
#define snmp_inc_tcppassiveopens()
|
|
||||||
#define snmp_inc_tcpattemptfails()
|
|
||||||
#define snmp_inc_tcpestabresets()
|
|
||||||
#define snmp_inc_tcpinsegs()
|
|
||||||
#define snmp_inc_tcpoutsegs()
|
|
||||||
#define snmp_inc_tcpretranssegs()
|
|
||||||
#define snmp_inc_tcpinerrs()
|
|
||||||
#define snmp_inc_tcpoutrsts()
|
|
||||||
|
|
||||||
/* UDP */
|
|
||||||
#define snmp_inc_udpindatagrams()
|
|
||||||
#define snmp_inc_udpnoports()
|
|
||||||
#define snmp_inc_udpinerrors()
|
|
||||||
#define snmp_inc_udpoutdatagrams()
|
|
||||||
#define snmp_insert_udpidx_tree(pcb)
|
|
||||||
#define snmp_delete_udpidx_tree(pcb)
|
|
||||||
|
|
||||||
/* SNMP */
|
|
||||||
#define snmp_inc_snmpinpkts()
|
|
||||||
#define snmp_inc_snmpoutpkts()
|
|
||||||
#define snmp_inc_snmpinbadversions()
|
|
||||||
#define snmp_inc_snmpinbadcommunitynames()
|
|
||||||
#define snmp_inc_snmpinbadcommunityuses()
|
|
||||||
#define snmp_inc_snmpinasnparseerrs()
|
|
||||||
#define snmp_inc_snmpintoobigs()
|
|
||||||
#define snmp_inc_snmpinnosuchnames()
|
|
||||||
#define snmp_inc_snmpinbadvalues()
|
|
||||||
#define snmp_inc_snmpinreadonlys()
|
|
||||||
#define snmp_inc_snmpingenerrs()
|
|
||||||
#define snmp_add_snmpintotalreqvars(value)
|
|
||||||
#define snmp_add_snmpintotalsetvars(value)
|
|
||||||
#define snmp_inc_snmpingetrequests()
|
|
||||||
#define snmp_inc_snmpingetnexts()
|
|
||||||
#define snmp_inc_snmpinsetrequests()
|
|
||||||
#define snmp_inc_snmpingetresponses()
|
|
||||||
#define snmp_inc_snmpintraps()
|
|
||||||
#define snmp_inc_snmpouttoobigs()
|
|
||||||
#define snmp_inc_snmpoutnosuchnames()
|
|
||||||
#define snmp_inc_snmpoutbadvalues()
|
|
||||||
#define snmp_inc_snmpoutgenerrs()
|
|
||||||
#define snmp_inc_snmpoutgetrequests()
|
|
||||||
#define snmp_inc_snmpoutgetnexts()
|
|
||||||
#define snmp_inc_snmpoutsetrequests()
|
|
||||||
#define snmp_inc_snmpoutgetresponses()
|
|
||||||
#define snmp_inc_snmpouttraps()
|
|
||||||
#define snmp_get_snmpgrpid_ptr(oid)
|
|
||||||
#define snmp_set_snmpenableauthentraps(value)
|
|
||||||
#define snmp_get_snmpenableauthentraps(value)
|
|
||||||
|
|
||||||
#endif /* LWIP_SNMP */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_SNMP_H__ */
|
|
|
@ -1,101 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* Abstract Syntax Notation One (ISO 8824, 8825) codec.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_SNMP_ASN1_H__
|
|
||||||
#define __LWIP_SNMP_ASN1_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/snmp.h"
|
|
||||||
|
|
||||||
#if LWIP_SNMP
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SNMP_ASN1_UNIV (0) /* (!0x80 | !0x40) */
|
|
||||||
#define SNMP_ASN1_APPLIC (0x40) /* (!0x80 | 0x40) */
|
|
||||||
#define SNMP_ASN1_CONTXT (0x80) /* ( 0x80 | !0x40) */
|
|
||||||
|
|
||||||
#define SNMP_ASN1_CONSTR (0x20) /* ( 0x20) */
|
|
||||||
#define SNMP_ASN1_PRIMIT (0) /* (!0x20) */
|
|
||||||
|
|
||||||
/* universal tags */
|
|
||||||
#define SNMP_ASN1_INTEG 2
|
|
||||||
#define SNMP_ASN1_OC_STR 4
|
|
||||||
#define SNMP_ASN1_NUL 5
|
|
||||||
#define SNMP_ASN1_OBJ_ID 6
|
|
||||||
#define SNMP_ASN1_SEQ 16
|
|
||||||
|
|
||||||
/* application specific (SNMP) tags */
|
|
||||||
#define SNMP_ASN1_IPADDR 0 /* octet string size(4) */
|
|
||||||
#define SNMP_ASN1_COUNTER 1 /* u32_t */
|
|
||||||
#define SNMP_ASN1_GAUGE 2 /* u32_t */
|
|
||||||
#define SNMP_ASN1_TIMETICKS 3 /* u32_t */
|
|
||||||
#define SNMP_ASN1_OPAQUE 4 /* octet string */
|
|
||||||
|
|
||||||
/* context specific (SNMP) tags */
|
|
||||||
#define SNMP_ASN1_PDU_GET_REQ 0
|
|
||||||
#define SNMP_ASN1_PDU_GET_NEXT_REQ 1
|
|
||||||
#define SNMP_ASN1_PDU_GET_RESP 2
|
|
||||||
#define SNMP_ASN1_PDU_SET_REQ 3
|
|
||||||
#define SNMP_ASN1_PDU_TRAP 4
|
|
||||||
|
|
||||||
err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type);
|
|
||||||
err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length);
|
|
||||||
err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value);
|
|
||||||
err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value);
|
|
||||||
err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid);
|
|
||||||
err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw);
|
|
||||||
|
|
||||||
void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed);
|
|
||||||
void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed);
|
|
||||||
void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed);
|
|
||||||
void snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed);
|
|
||||||
err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type);
|
|
||||||
err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length);
|
|
||||||
err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value);
|
|
||||||
err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value);
|
|
||||||
err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident);
|
|
||||||
err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_SNMP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_SNMP_ASN1_H__ */
|
|
|
@ -1,315 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* SNMP Agent message handling structures.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_SNMP_MSG_H__
|
|
||||||
#define __LWIP_SNMP_MSG_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/snmp.h"
|
|
||||||
#include "lwip/snmp_structs.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
#if LWIP_SNMP
|
|
||||||
|
|
||||||
#if SNMP_PRIVATE_MIB
|
|
||||||
/* When using a private MIB, you have to create a file 'private_mib.h' that contains
|
|
||||||
* a 'struct mib_array_node mib_private' which contains your MIB. */
|
|
||||||
#include "private_mib.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The listen port of the SNMP agent. Clients have to make their requests to
|
|
||||||
this port. Most standard clients won't work if you change this! */
|
|
||||||
#ifndef SNMP_IN_PORT
|
|
||||||
#define SNMP_IN_PORT 161
|
|
||||||
#endif
|
|
||||||
/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't
|
|
||||||
work if you change this! */
|
|
||||||
#ifndef SNMP_TRAP_PORT
|
|
||||||
#define SNMP_TRAP_PORT 162
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SNMP_ES_NOERROR 0
|
|
||||||
#define SNMP_ES_TOOBIG 1
|
|
||||||
#define SNMP_ES_NOSUCHNAME 2
|
|
||||||
#define SNMP_ES_BADVALUE 3
|
|
||||||
#define SNMP_ES_READONLY 4
|
|
||||||
#define SNMP_ES_GENERROR 5
|
|
||||||
|
|
||||||
#define SNMP_GENTRAP_COLDSTART 0
|
|
||||||
#define SNMP_GENTRAP_WARMSTART 1
|
|
||||||
#define SNMP_GENTRAP_AUTHFAIL 4
|
|
||||||
#define SNMP_GENTRAP_ENTERPRISESPC 6
|
|
||||||
|
|
||||||
struct snmp_varbind
|
|
||||||
{
|
|
||||||
/* next pointer, NULL for last in list */
|
|
||||||
struct snmp_varbind *next;
|
|
||||||
/* previous pointer, NULL for first in list */
|
|
||||||
struct snmp_varbind *prev;
|
|
||||||
|
|
||||||
/* object identifier length (in s32_t) */
|
|
||||||
u8_t ident_len;
|
|
||||||
/* object identifier array */
|
|
||||||
s32_t *ident;
|
|
||||||
|
|
||||||
/* object value ASN1 type */
|
|
||||||
u8_t value_type;
|
|
||||||
/* object value length (in u8_t) */
|
|
||||||
u8_t value_len;
|
|
||||||
/* object value */
|
|
||||||
void *value;
|
|
||||||
|
|
||||||
/* encoding varbind seq length length */
|
|
||||||
u8_t seqlenlen;
|
|
||||||
/* encoding object identifier length length */
|
|
||||||
u8_t olenlen;
|
|
||||||
/* encoding object value length length */
|
|
||||||
u8_t vlenlen;
|
|
||||||
/* encoding varbind seq length */
|
|
||||||
u16_t seqlen;
|
|
||||||
/* encoding object identifier length */
|
|
||||||
u16_t olen;
|
|
||||||
/* encoding object value length */
|
|
||||||
u16_t vlen;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct snmp_varbind_root
|
|
||||||
{
|
|
||||||
struct snmp_varbind *head;
|
|
||||||
struct snmp_varbind *tail;
|
|
||||||
/* number of variable bindings in list */
|
|
||||||
u8_t count;
|
|
||||||
/* encoding varbind-list seq length length */
|
|
||||||
u8_t seqlenlen;
|
|
||||||
/* encoding varbind-list seq length */
|
|
||||||
u16_t seqlen;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** output response message header length fields */
|
|
||||||
struct snmp_resp_header_lengths
|
|
||||||
{
|
|
||||||
/* encoding error-index length length */
|
|
||||||
u8_t erridxlenlen;
|
|
||||||
/* encoding error-status length length */
|
|
||||||
u8_t errstatlenlen;
|
|
||||||
/* encoding request id length length */
|
|
||||||
u8_t ridlenlen;
|
|
||||||
/* encoding pdu length length */
|
|
||||||
u8_t pdulenlen;
|
|
||||||
/* encoding community length length */
|
|
||||||
u8_t comlenlen;
|
|
||||||
/* encoding version length length */
|
|
||||||
u8_t verlenlen;
|
|
||||||
/* encoding sequence length length */
|
|
||||||
u8_t seqlenlen;
|
|
||||||
|
|
||||||
/* encoding error-index length */
|
|
||||||
u16_t erridxlen;
|
|
||||||
/* encoding error-status length */
|
|
||||||
u16_t errstatlen;
|
|
||||||
/* encoding request id length */
|
|
||||||
u16_t ridlen;
|
|
||||||
/* encoding pdu length */
|
|
||||||
u16_t pdulen;
|
|
||||||
/* encoding community length */
|
|
||||||
u16_t comlen;
|
|
||||||
/* encoding version length */
|
|
||||||
u16_t verlen;
|
|
||||||
/* encoding sequence length */
|
|
||||||
u16_t seqlen;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** output response message header length fields */
|
|
||||||
struct snmp_trap_header_lengths
|
|
||||||
{
|
|
||||||
/* encoding timestamp length length */
|
|
||||||
u8_t tslenlen;
|
|
||||||
/* encoding specific-trap length length */
|
|
||||||
u8_t strplenlen;
|
|
||||||
/* encoding generic-trap length length */
|
|
||||||
u8_t gtrplenlen;
|
|
||||||
/* encoding agent-addr length length */
|
|
||||||
u8_t aaddrlenlen;
|
|
||||||
/* encoding enterprise-id length length */
|
|
||||||
u8_t eidlenlen;
|
|
||||||
/* encoding pdu length length */
|
|
||||||
u8_t pdulenlen;
|
|
||||||
/* encoding community length length */
|
|
||||||
u8_t comlenlen;
|
|
||||||
/* encoding version length length */
|
|
||||||
u8_t verlenlen;
|
|
||||||
/* encoding sequence length length */
|
|
||||||
u8_t seqlenlen;
|
|
||||||
|
|
||||||
/* encoding timestamp length */
|
|
||||||
u16_t tslen;
|
|
||||||
/* encoding specific-trap length */
|
|
||||||
u16_t strplen;
|
|
||||||
/* encoding generic-trap length */
|
|
||||||
u16_t gtrplen;
|
|
||||||
/* encoding agent-addr length */
|
|
||||||
u16_t aaddrlen;
|
|
||||||
/* encoding enterprise-id length */
|
|
||||||
u16_t eidlen;
|
|
||||||
/* encoding pdu length */
|
|
||||||
u16_t pdulen;
|
|
||||||
/* encoding community length */
|
|
||||||
u16_t comlen;
|
|
||||||
/* encoding version length */
|
|
||||||
u16_t verlen;
|
|
||||||
/* encoding sequence length */
|
|
||||||
u16_t seqlen;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Accepting new SNMP messages. */
|
|
||||||
#define SNMP_MSG_EMPTY 0
|
|
||||||
/* Search for matching object for variable binding. */
|
|
||||||
#define SNMP_MSG_SEARCH_OBJ 1
|
|
||||||
/* Perform SNMP operation on in-memory object.
|
|
||||||
Pass-through states, for symmetry only. */
|
|
||||||
#define SNMP_MSG_INTERNAL_GET_OBJDEF 2
|
|
||||||
#define SNMP_MSG_INTERNAL_GET_VALUE 3
|
|
||||||
#define SNMP_MSG_INTERNAL_SET_TEST 4
|
|
||||||
#define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5
|
|
||||||
#define SNMP_MSG_INTERNAL_SET_VALUE 6
|
|
||||||
/* Perform SNMP operation on object located externally.
|
|
||||||
In theory this could be used for building a proxy agent.
|
|
||||||
Practical use is for an enterprise spc. app. gateway. */
|
|
||||||
#define SNMP_MSG_EXTERNAL_GET_OBJDEF 7
|
|
||||||
#define SNMP_MSG_EXTERNAL_GET_VALUE 8
|
|
||||||
#define SNMP_MSG_EXTERNAL_SET_TEST 9
|
|
||||||
#define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10
|
|
||||||
#define SNMP_MSG_EXTERNAL_SET_VALUE 11
|
|
||||||
|
|
||||||
#define SNMP_COMMUNITY_STR_LEN 64
|
|
||||||
struct snmp_msg_pstat
|
|
||||||
{
|
|
||||||
/* lwIP local port (161) binding */
|
|
||||||
struct udp_pcb *pcb;
|
|
||||||
/* source IP address */
|
|
||||||
ip_addr_t sip;
|
|
||||||
/* source UDP port */
|
|
||||||
u16_t sp;
|
|
||||||
/* request type */
|
|
||||||
u8_t rt;
|
|
||||||
/* request ID */
|
|
||||||
s32_t rid;
|
|
||||||
/* error status */
|
|
||||||
s32_t error_status;
|
|
||||||
/* error index */
|
|
||||||
s32_t error_index;
|
|
||||||
/* community name (zero terminated) */
|
|
||||||
u8_t community[SNMP_COMMUNITY_STR_LEN + 1];
|
|
||||||
/* community string length (exclusive zero term) */
|
|
||||||
u8_t com_strlen;
|
|
||||||
/* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */
|
|
||||||
u8_t state;
|
|
||||||
/* saved arguments for MSG_EXTERNAL_x */
|
|
||||||
struct mib_external_node *ext_mib_node;
|
|
||||||
struct snmp_name_ptr ext_name_ptr;
|
|
||||||
struct obj_def ext_object_def;
|
|
||||||
struct snmp_obj_id ext_oid;
|
|
||||||
/* index into input variable binding list */
|
|
||||||
u8_t vb_idx;
|
|
||||||
/* ptr into input variable binding list */
|
|
||||||
struct snmp_varbind *vb_ptr;
|
|
||||||
/* list of variable bindings from input */
|
|
||||||
struct snmp_varbind_root invb;
|
|
||||||
/* list of variable bindings to output */
|
|
||||||
struct snmp_varbind_root outvb;
|
|
||||||
/* output response lengths used in ASN encoding */
|
|
||||||
struct snmp_resp_header_lengths rhl;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct snmp_msg_trap
|
|
||||||
{
|
|
||||||
/* lwIP local port (161) binding */
|
|
||||||
struct udp_pcb *pcb;
|
|
||||||
/* destination IP address in network order */
|
|
||||||
ip_addr_t dip;
|
|
||||||
|
|
||||||
/* source enterprise ID (sysObjectID) */
|
|
||||||
struct snmp_obj_id *enterprise;
|
|
||||||
/* source IP address, raw network order format */
|
|
||||||
u8_t sip_raw[4];
|
|
||||||
/* generic trap code */
|
|
||||||
u32_t gen_trap;
|
|
||||||
/* specific trap code */
|
|
||||||
u32_t spc_trap;
|
|
||||||
/* timestamp */
|
|
||||||
u32_t ts;
|
|
||||||
/* list of variable bindings to output */
|
|
||||||
struct snmp_varbind_root outvb;
|
|
||||||
/* output trap lengths used in ASN encoding */
|
|
||||||
struct snmp_trap_header_lengths thl;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Agent Version constant, 0 = v1 oddity */
|
|
||||||
extern const s32_t snmp_version;
|
|
||||||
/** Agent default "public" community string */
|
|
||||||
extern const char snmp_publiccommunity[7];
|
|
||||||
|
|
||||||
extern struct snmp_msg_trap trap_msg;
|
|
||||||
|
|
||||||
/** Agent setup, start listening to port 161. */
|
|
||||||
void snmp_init(void);
|
|
||||||
void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable);
|
|
||||||
void snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst);
|
|
||||||
|
|
||||||
/** Varbind-list functions. */
|
|
||||||
struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len);
|
|
||||||
void snmp_varbind_free(struct snmp_varbind *vb);
|
|
||||||
void snmp_varbind_list_free(struct snmp_varbind_root *root);
|
|
||||||
void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb);
|
|
||||||
struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root);
|
|
||||||
|
|
||||||
/** Handle an internal (recv) or external (private response) event. */
|
|
||||||
void snmp_msg_event(u8_t request_id);
|
|
||||||
err_t snmp_send_response(struct snmp_msg_pstat *m_stat);
|
|
||||||
err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap);
|
|
||||||
void snmp_coldstart_trap(void);
|
|
||||||
void snmp_authfail_trap(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_SNMP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_SNMP_MSG_H__ */
|
|
|
@ -1,268 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* Generic MIB tree structures.
|
|
||||||
*
|
|
||||||
* @todo namespace prefixes
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LWIP_SNMP_STRUCTS_H__
|
|
||||||
#define __LWIP_SNMP_STRUCTS_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/snmp.h"
|
|
||||||
|
|
||||||
#if SNMP_PRIVATE_MIB
|
|
||||||
/* When using a private MIB, you have to create a file 'private_mib.h' that contains
|
|
||||||
* a 'struct mib_array_node mib_private' which contains your MIB. */
|
|
||||||
#include "private_mib.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* MIB object instance */
|
|
||||||
#define MIB_OBJECT_NONE 0
|
|
||||||
#define MIB_OBJECT_SCALAR 1
|
|
||||||
#define MIB_OBJECT_TAB 2
|
|
||||||
|
|
||||||
/* MIB access types */
|
|
||||||
#define MIB_ACCESS_READ 1
|
|
||||||
#define MIB_ACCESS_WRITE 2
|
|
||||||
|
|
||||||
/* MIB object access */
|
|
||||||
#define MIB_OBJECT_READ_ONLY MIB_ACCESS_READ
|
|
||||||
#define MIB_OBJECT_READ_WRITE (MIB_ACCESS_READ | MIB_ACCESS_WRITE)
|
|
||||||
#define MIB_OBJECT_WRITE_ONLY MIB_ACCESS_WRITE
|
|
||||||
#define MIB_OBJECT_NOT_ACCESSIBLE 0
|
|
||||||
|
|
||||||
/** object definition returned by (get_object_def)() */
|
|
||||||
struct obj_def
|
|
||||||
{
|
|
||||||
/* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */
|
|
||||||
u8_t instance;
|
|
||||||
/* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */
|
|
||||||
u8_t access;
|
|
||||||
/* ASN type for this object */
|
|
||||||
u8_t asn_type;
|
|
||||||
/* value length (host length) */
|
|
||||||
u16_t v_len;
|
|
||||||
/* length of instance part of supplied object identifier */
|
|
||||||
u8_t id_inst_len;
|
|
||||||
/* instance part of supplied object identifier */
|
|
||||||
s32_t *id_inst_ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct snmp_name_ptr
|
|
||||||
{
|
|
||||||
u8_t ident_len;
|
|
||||||
s32_t *ident;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** MIB const scalar (.0) node */
|
|
||||||
#define MIB_NODE_SC 0x01
|
|
||||||
/** MIB const array node */
|
|
||||||
#define MIB_NODE_AR 0x02
|
|
||||||
/** MIB array node (mem_malloced from RAM) */
|
|
||||||
#define MIB_NODE_RA 0x03
|
|
||||||
/** MIB list root node (mem_malloced from RAM) */
|
|
||||||
#define MIB_NODE_LR 0x04
|
|
||||||
/** MIB node for external objects */
|
|
||||||
#define MIB_NODE_EX 0x05
|
|
||||||
|
|
||||||
/** node "base class" layout, the mandatory fields for a node */
|
|
||||||
struct mib_node
|
|
||||||
{
|
|
||||||
/** returns struct obj_def for the given object identifier */
|
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
|
||||||
/** returns object value for the given object identifier,
|
|
||||||
@note the caller must allocate at least len bytes for the value */
|
|
||||||
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
/** tests length and/or range BEFORE setting */
|
|
||||||
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
/** sets object value, only to be called when set_test() */
|
|
||||||
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
|
|
||||||
u8_t node_type;
|
|
||||||
/* array or max list length */
|
|
||||||
u16_t maxlength;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** derived node for scalars .0 index */
|
|
||||||
typedef struct mib_node mib_scalar_node;
|
|
||||||
|
|
||||||
/** derived node, points to a fixed size const array
|
|
||||||
of sub-identifiers plus a 'child' pointer */
|
|
||||||
struct mib_array_node
|
|
||||||
{
|
|
||||||
/* inherited "base class" members */
|
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
|
||||||
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
|
|
||||||
u8_t node_type;
|
|
||||||
u16_t maxlength;
|
|
||||||
|
|
||||||
/* additional struct members */
|
|
||||||
const s32_t *objid;
|
|
||||||
struct mib_node* const *nptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** derived node, points to a fixed size mem_malloced array
|
|
||||||
of sub-identifiers plus a 'child' pointer */
|
|
||||||
struct mib_ram_array_node
|
|
||||||
{
|
|
||||||
/* inherited "base class" members */
|
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
|
||||||
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
|
|
||||||
u8_t node_type;
|
|
||||||
u16_t maxlength;
|
|
||||||
|
|
||||||
/* aditional struct members */
|
|
||||||
s32_t *objid;
|
|
||||||
struct mib_node **nptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mib_list_node
|
|
||||||
{
|
|
||||||
struct mib_list_node *prev;
|
|
||||||
struct mib_list_node *next;
|
|
||||||
s32_t objid;
|
|
||||||
struct mib_node *nptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** derived node, points to a doubly linked list
|
|
||||||
of sub-identifiers plus a 'child' pointer */
|
|
||||||
struct mib_list_rootnode
|
|
||||||
{
|
|
||||||
/* inherited "base class" members */
|
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
|
||||||
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
|
|
||||||
u8_t node_type;
|
|
||||||
u16_t maxlength;
|
|
||||||
|
|
||||||
/* additional struct members */
|
|
||||||
struct mib_list_node *head;
|
|
||||||
struct mib_list_node *tail;
|
|
||||||
/* counts list nodes in list */
|
|
||||||
u16_t count;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** derived node, has access functions for mib object in external memory or device
|
|
||||||
using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */
|
|
||||||
struct mib_external_node
|
|
||||||
{
|
|
||||||
/* inherited "base class" members */
|
|
||||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
|
||||||
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
|
||||||
|
|
||||||
u8_t node_type;
|
|
||||||
u16_t maxlength;
|
|
||||||
|
|
||||||
/* additional struct members */
|
|
||||||
/** points to an external (in memory) record of some sort of addressing
|
|
||||||
information, passed to and interpreted by the funtions below */
|
|
||||||
void* addr_inf;
|
|
||||||
/** tree levels under this node */
|
|
||||||
u8_t tree_levels;
|
|
||||||
/** number of objects at this level */
|
|
||||||
u16_t (*level_length)(void* addr_inf, u8_t level);
|
|
||||||
/** compares object sub identifier with external id
|
|
||||||
return zero when equal, nonzero when unequal */
|
|
||||||
s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id);
|
|
||||||
void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id);
|
|
||||||
|
|
||||||
/** async Questions */
|
|
||||||
void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident);
|
|
||||||
void (*get_value_q)(u8_t rid, struct obj_def *od);
|
|
||||||
void (*set_test_q)(u8_t rid, struct obj_def *od);
|
|
||||||
void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
|
||||||
/** async Answers */
|
|
||||||
void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od);
|
|
||||||
void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
|
||||||
u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
|
||||||
void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
|
||||||
/** async Panic Close (agent returns error reply,
|
|
||||||
e.g. used for external transaction cleanup) */
|
|
||||||
void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident);
|
|
||||||
void (*get_value_pc)(u8_t rid, struct obj_def *od);
|
|
||||||
void (*set_test_pc)(u8_t rid, struct obj_def *od);
|
|
||||||
void (*set_value_pc)(u8_t rid, struct obj_def *od);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** export MIB tree from mib2.c */
|
|
||||||
extern const struct mib_array_node internet;
|
|
||||||
|
|
||||||
/** dummy function pointers for non-leaf MIB nodes from mib2.c */
|
|
||||||
void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
|
||||||
void noleafs_get_value(struct obj_def *od, u16_t len, void *value);
|
|
||||||
u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value);
|
|
||||||
void noleafs_set_value(struct obj_def *od, u16_t len, void *value);
|
|
||||||
|
|
||||||
void snmp_oidtoip(s32_t *ident, ip_addr_t *ip);
|
|
||||||
void snmp_iptooid(ip_addr_t *ip, s32_t *ident);
|
|
||||||
void snmp_ifindextonetif(s32_t ifindex, struct netif **netif);
|
|
||||||
void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx);
|
|
||||||
|
|
||||||
struct mib_list_node* snmp_mib_ln_alloc(s32_t id);
|
|
||||||
void snmp_mib_ln_free(struct mib_list_node *ln);
|
|
||||||
struct mib_list_rootnode* snmp_mib_lrn_alloc(void);
|
|
||||||
void snmp_mib_lrn_free(struct mib_list_rootnode *lrn);
|
|
||||||
|
|
||||||
s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn);
|
|
||||||
s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn);
|
|
||||||
struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n);
|
|
||||||
|
|
||||||
struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np);
|
|
||||||
struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
|
|
||||||
u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident);
|
|
||||||
u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_SNMP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_SNMP_STRUCTS_H__ */
|
|
|
@ -1,432 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __LWIP_SOCKETS_H__
|
|
||||||
#define __LWIP_SOCKETS_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include <stddef.h> /* for size_t */
|
|
||||||
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/inet.h"
|
|
||||||
#include "lwip/inet6.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED
|
|
||||||
to prevent this code from redefining it. */
|
|
||||||
#if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
|
|
||||||
typedef u8_t sa_family_t;
|
|
||||||
#endif
|
|
||||||
/* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED
|
|
||||||
to prevent this code from redefining it. */
|
|
||||||
#if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)
|
|
||||||
typedef u16_t in_port_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* members are in network byte order */
|
|
||||||
struct sockaddr_in {
|
|
||||||
u8_t sin_len;
|
|
||||||
sa_family_t sin_family;
|
|
||||||
in_port_t sin_port;
|
|
||||||
struct in_addr sin_addr;
|
|
||||||
#define SIN_ZERO_LEN 8
|
|
||||||
char sin_zero[SIN_ZERO_LEN];
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
struct sockaddr_in6 {
|
|
||||||
u8_t sin6_len; /* length of this structure */
|
|
||||||
sa_family_t sin6_family; /* AF_INET6 */
|
|
||||||
in_port_t sin6_port; /* Transport layer port # */
|
|
||||||
u32_t sin6_flowinfo; /* IPv6 flow information */
|
|
||||||
struct in6_addr sin6_addr; /* IPv6 address */
|
|
||||||
};
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
struct sockaddr {
|
|
||||||
u8_t sa_len;
|
|
||||||
sa_family_t sa_family;
|
|
||||||
#if LWIP_IPV6
|
|
||||||
char sa_data[22];
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
char sa_data[14];
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sockaddr_storage {
|
|
||||||
u8_t s2_len;
|
|
||||||
sa_family_t ss_family;
|
|
||||||
char s2_data1[2];
|
|
||||||
u32_t s2_data2[3];
|
|
||||||
#if LWIP_IPV6
|
|
||||||
u32_t s2_data3[2];
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED
|
|
||||||
to prevent this code from redefining it. */
|
|
||||||
#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
|
|
||||||
typedef u32_t socklen_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Socket protocol types (TCP/UDP/RAW) */
|
|
||||||
#define SOCK_STREAM 1
|
|
||||||
#define SOCK_DGRAM 2
|
|
||||||
#define SOCK_RAW 3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c)
|
|
||||||
*/
|
|
||||||
#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */
|
|
||||||
#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
|
|
||||||
#define SO_REUSEADDR 0x0004 /* Allow local address reuse */
|
|
||||||
#define SO_KEEPALIVE 0x0008 /* keep connections alive */
|
|
||||||
#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */
|
|
||||||
#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
|
|
||||||
#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
|
|
||||||
#define SO_LINGER 0x0080 /* linger on close if data present */
|
|
||||||
#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */
|
|
||||||
#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */
|
|
||||||
|
|
||||||
#define SO_DONTLINGER ((int)(~SO_LINGER))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Additional options, not kept in so_options.
|
|
||||||
*/
|
|
||||||
#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */
|
|
||||||
#define SO_RCVBUF 0x1002 /* receive buffer size */
|
|
||||||
#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */
|
|
||||||
#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */
|
|
||||||
#define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */
|
|
||||||
#define SO_RCVTIMEO 0x1006 /* receive timeout */
|
|
||||||
#define SO_ERROR 0x1007 /* get error status and clear */
|
|
||||||
#define SO_TYPE 0x1008 /* get socket type */
|
|
||||||
#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */
|
|
||||||
#define SO_NO_CHECK 0x100a /* don't create UDP checksum */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Structure used for manipulating linger option.
|
|
||||||
*/
|
|
||||||
struct linger {
|
|
||||||
int l_onoff; /* option on/off */
|
|
||||||
int l_linger; /* linger time */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Level number for (get/set)sockopt() to apply to socket itself.
|
|
||||||
*/
|
|
||||||
#define SOL_SOCKET 0xfff /* options for socket level */
|
|
||||||
|
|
||||||
|
|
||||||
#define AF_UNSPEC 0
|
|
||||||
#define AF_INET 2
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define AF_INET6 10
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
#define AF_INET6 AF_UNSPEC
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
#define PF_INET AF_INET
|
|
||||||
#define PF_INET6 AF_INET6
|
|
||||||
#define PF_UNSPEC AF_UNSPEC
|
|
||||||
|
|
||||||
#define IPPROTO_IP 0
|
|
||||||
#define IPPROTO_TCP 6
|
|
||||||
#define IPPROTO_UDP 17
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define IPPROTO_IPV6 41
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
#define IPPROTO_UDPLITE 136
|
|
||||||
|
|
||||||
/* Flags we can use with send and recv. */
|
|
||||||
#define MSG_PEEK 0x01 /* Peeks at an incoming message */
|
|
||||||
#define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
|
|
||||||
#define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
|
|
||||||
#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */
|
|
||||||
#define MSG_MORE 0x10 /* Sender will send more */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Options for level IPPROTO_IP
|
|
||||||
*/
|
|
||||||
#define IP_TOS 1
|
|
||||||
#define IP_TTL 2
|
|
||||||
|
|
||||||
#if LWIP_TCP
|
|
||||||
/*
|
|
||||||
* Options for level IPPROTO_TCP
|
|
||||||
*/
|
|
||||||
#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
|
|
||||||
#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
|
|
||||||
#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
|
|
||||||
#define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */
|
|
||||||
#define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/*
|
|
||||||
* Options for level IPPROTO_IPV6
|
|
||||||
*/
|
|
||||||
#define IPV6_V6ONLY 27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#if LWIP_UDP && LWIP_UDPLITE
|
|
||||||
/*
|
|
||||||
* Options for level IPPROTO_UDPLITE
|
|
||||||
*/
|
|
||||||
#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
|
|
||||||
#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
|
|
||||||
#endif /* LWIP_UDP && LWIP_UDPLITE*/
|
|
||||||
|
|
||||||
|
|
||||||
#if LWIP_IGMP
|
|
||||||
/*
|
|
||||||
* Options and types for UDP multicast traffic handling
|
|
||||||
*/
|
|
||||||
#define IP_ADD_MEMBERSHIP 3
|
|
||||||
#define IP_DROP_MEMBERSHIP 4
|
|
||||||
#define IP_MULTICAST_TTL 5
|
|
||||||
#define IP_MULTICAST_IF 6
|
|
||||||
#define IP_MULTICAST_LOOP 7
|
|
||||||
|
|
||||||
typedef struct ip_mreq {
|
|
||||||
struct in_addr imr_multiaddr; /* IP multicast address of group */
|
|
||||||
struct in_addr imr_interface; /* local IP address of interface */
|
|
||||||
} ip_mreq;
|
|
||||||
#endif /* LWIP_IGMP */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Type of Service provides an indication of the abstract
|
|
||||||
* parameters of the quality of service desired. These parameters are
|
|
||||||
* to be used to guide the selection of the actual service parameters
|
|
||||||
* when transmitting a datagram through a particular network. Several
|
|
||||||
* networks offer service precedence, which somehow treats high
|
|
||||||
* precedence traffic as more important than other traffic (generally
|
|
||||||
* by accepting only traffic above a certain precedence at time of high
|
|
||||||
* load). The major choice is a three way tradeoff between low-delay,
|
|
||||||
* high-reliability, and high-throughput.
|
|
||||||
* The use of the Delay, Throughput, and Reliability indications may
|
|
||||||
* increase the cost (in some sense) of the service. In many networks
|
|
||||||
* better performance for one of these parameters is coupled with worse
|
|
||||||
* performance on another. Except for very unusual cases at most two
|
|
||||||
* of these three indications should be set.
|
|
||||||
*/
|
|
||||||
#define IPTOS_TOS_MASK 0x1E
|
|
||||||
#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
|
|
||||||
#define IPTOS_LOWDELAY 0x10
|
|
||||||
#define IPTOS_THROUGHPUT 0x08
|
|
||||||
#define IPTOS_RELIABILITY 0x04
|
|
||||||
#define IPTOS_LOWCOST 0x02
|
|
||||||
#define IPTOS_MINCOST IPTOS_LOWCOST
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Network Control precedence designation is intended to be used
|
|
||||||
* within a network only. The actual use and control of that
|
|
||||||
* designation is up to each network. The Internetwork Control
|
|
||||||
* designation is intended for use by gateway control originators only.
|
|
||||||
* If the actual use of these precedence designations is of concern to
|
|
||||||
* a particular network, it is the responsibility of that network to
|
|
||||||
* control the access to, and use of, those precedence designations.
|
|
||||||
*/
|
|
||||||
#define IPTOS_PREC_MASK 0xe0
|
|
||||||
#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
|
|
||||||
#define IPTOS_PREC_NETCONTROL 0xe0
|
|
||||||
#define IPTOS_PREC_INTERNETCONTROL 0xc0
|
|
||||||
#define IPTOS_PREC_CRITIC_ECP 0xa0
|
|
||||||
#define IPTOS_PREC_FLASHOVERRIDE 0x80
|
|
||||||
#define IPTOS_PREC_FLASH 0x60
|
|
||||||
#define IPTOS_PREC_IMMEDIATE 0x40
|
|
||||||
#define IPTOS_PREC_PRIORITY 0x20
|
|
||||||
#define IPTOS_PREC_ROUTINE 0x00
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Commands for ioctlsocket(), taken from the BSD file fcntl.h.
|
|
||||||
* lwip_ioctl only supports FIONREAD and FIONBIO, for now
|
|
||||||
*
|
|
||||||
* Ioctl's have the command encoded in the lower word,
|
|
||||||
* and the size of any in or out parameters in the upper
|
|
||||||
* word. The high 2 bits of the upper word are used
|
|
||||||
* to encode the in/out status of the parameter; for now
|
|
||||||
* we restrict parameters to at most 128 bytes.
|
|
||||||
*/
|
|
||||||
#if !defined(FIONREAD) || !defined(FIONBIO)
|
|
||||||
#define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */
|
|
||||||
#define IOC_VOID 0x20000000UL /* no parameters */
|
|
||||||
#define IOC_OUT 0x40000000UL /* copy out parameters */
|
|
||||||
#define IOC_IN 0x80000000UL /* copy in parameters */
|
|
||||||
#define IOC_INOUT (IOC_IN|IOC_OUT)
|
|
||||||
/* 0x20000000 distinguishes new &
|
|
||||||
old ioctl's */
|
|
||||||
#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
|
|
||||||
|
|
||||||
#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
|
|
||||||
|
|
||||||
#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
|
|
||||||
#endif /* !defined(FIONREAD) || !defined(FIONBIO) */
|
|
||||||
|
|
||||||
#ifndef FIONREAD
|
|
||||||
#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */
|
|
||||||
#endif
|
|
||||||
#ifndef FIONBIO
|
|
||||||
#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Socket I/O Controls: unimplemented */
|
|
||||||
#ifndef SIOCSHIWAT
|
|
||||||
#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */
|
|
||||||
#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */
|
|
||||||
#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */
|
|
||||||
#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */
|
|
||||||
#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* commands for fnctl */
|
|
||||||
#ifndef F_GETFL
|
|
||||||
#define F_GETFL 3
|
|
||||||
#endif
|
|
||||||
#ifndef F_SETFL
|
|
||||||
#define F_SETFL 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* File status flags and file access modes for fnctl,
|
|
||||||
these are bits in an int. */
|
|
||||||
#ifndef O_NONBLOCK
|
|
||||||
#define O_NONBLOCK 1 /* nonblocking I/O */
|
|
||||||
#endif
|
|
||||||
#ifndef O_NDELAY
|
|
||||||
#define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SHUT_RD
|
|
||||||
#define SHUT_RD 0
|
|
||||||
#define SHUT_WR 1
|
|
||||||
#define SHUT_RDWR 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* FD_SET used for lwip_select */
|
|
||||||
#ifndef FD_SET
|
|
||||||
#undef FD_SETSIZE
|
|
||||||
/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
|
|
||||||
#define FD_SETSIZE MEMP_NUM_NETCONN
|
|
||||||
#define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7)))
|
|
||||||
#define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7)))
|
|
||||||
#define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7)))
|
|
||||||
#define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p)))
|
|
||||||
|
|
||||||
typedef struct fd_set {
|
|
||||||
unsigned char fd_bits [(FD_SETSIZE+7)/8];
|
|
||||||
} fd_set;
|
|
||||||
|
|
||||||
#endif /* FD_SET */
|
|
||||||
|
|
||||||
/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided
|
|
||||||
* by your system, set this to 0 and include <sys/time.h> in cc.h */
|
|
||||||
#ifndef LWIP_TIMEVAL_PRIVATE
|
|
||||||
#define LWIP_TIMEVAL_PRIVATE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_TIMEVAL_PRIVATE
|
|
||||||
struct timeval {
|
|
||||||
long tv_sec; /* seconds */
|
|
||||||
long tv_usec; /* and microseconds */
|
|
||||||
};
|
|
||||||
#endif /* LWIP_TIMEVAL_PRIVATE */
|
|
||||||
|
|
||||||
void lwip_socket_init(void);
|
|
||||||
|
|
||||||
int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
|
|
||||||
int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen);
|
|
||||||
int lwip_shutdown(int s, int how);
|
|
||||||
int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen);
|
|
||||||
int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen);
|
|
||||||
int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
|
|
||||||
int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);
|
|
||||||
int lwip_close(int s);
|
|
||||||
int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen);
|
|
||||||
int lwip_listen(int s, int backlog);
|
|
||||||
int lwip_recv(int s, void *mem, size_t len, int flags);
|
|
||||||
int lwip_read(int s, void *mem, size_t len);
|
|
||||||
int lwip_recvfrom(int s, void *mem, size_t len, int flags,
|
|
||||||
struct sockaddr *from, socklen_t *fromlen);
|
|
||||||
int lwip_send(int s, const void *dataptr, size_t size, int flags);
|
|
||||||
int lwip_sendto(int s, const void *dataptr, size_t size, int flags,
|
|
||||||
const struct sockaddr *to, socklen_t tolen);
|
|
||||||
int lwip_socket(int domain, int type, int protocol);
|
|
||||||
int lwip_write(int s, const void *dataptr, size_t size);
|
|
||||||
int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
|
|
||||||
struct timeval *timeout);
|
|
||||||
int lwip_ioctl(int s, long cmd, void *argp);
|
|
||||||
int lwip_fcntl(int s, int cmd, int val);
|
|
||||||
|
|
||||||
#if LWIP_COMPAT_SOCKETS
|
|
||||||
#define accept(a,b,c) lwip_accept(a,b,c)
|
|
||||||
#define bind(a,b,c) lwip_bind(a,b,c)
|
|
||||||
#define shutdown(a,b) lwip_shutdown(a,b)
|
|
||||||
#define closesocket(s) lwip_close(s)
|
|
||||||
#define connect(a,b,c) lwip_connect(a,b,c)
|
|
||||||
#define getsockname(a,b,c) lwip_getsockname(a,b,c)
|
|
||||||
#define getpeername(a,b,c) lwip_getpeername(a,b,c)
|
|
||||||
#define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e)
|
|
||||||
#define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e)
|
|
||||||
#define listen(a,b) lwip_listen(a,b)
|
|
||||||
#define recv(a,b,c,d) lwip_recv(a,b,c,d)
|
|
||||||
#define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f)
|
|
||||||
#define send(a,b,c,d) lwip_send(a,b,c,d)
|
|
||||||
#define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f)
|
|
||||||
#define socket(a,b,c) lwip_socket(a,b,c)
|
|
||||||
#define select(a,b,c,d,e) lwip_select(a,b,c,d,e)
|
|
||||||
#define ioctlsocket(a,b,c) lwip_ioctl(a,b,c)
|
|
||||||
|
|
||||||
#if LWIP_POSIX_SOCKETS_IO_NAMES
|
|
||||||
#define read(a,b,c) lwip_read(a,b,c)
|
|
||||||
#define write(a,b,c) lwip_write(a,b,c)
|
|
||||||
#define close(s) lwip_close(s)
|
|
||||||
#define fcntl(a,b,c) lwip_fcntl(a,b,c)
|
|
||||||
#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
|
|
||||||
|
|
||||||
#endif /* LWIP_COMPAT_SOCKETS */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_SOCKET */
|
|
||||||
|
|
||||||
#endif /* __LWIP_SOCKETS_H__ */
|
|
|
@ -1,347 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_STATS_H__
|
|
||||||
#define __LWIP_STATS_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_STATS
|
|
||||||
|
|
||||||
#ifndef LWIP_STATS_LARGE
|
|
||||||
#define LWIP_STATS_LARGE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_STATS_LARGE
|
|
||||||
#define STAT_COUNTER u32_t
|
|
||||||
#define STAT_COUNTER_F U32_F
|
|
||||||
#else
|
|
||||||
#define STAT_COUNTER u16_t
|
|
||||||
#define STAT_COUNTER_F U16_F
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct stats_proto {
|
|
||||||
STAT_COUNTER xmit; /* Transmitted packets. */
|
|
||||||
STAT_COUNTER recv; /* Received packets. */
|
|
||||||
STAT_COUNTER fw; /* Forwarded packets. */
|
|
||||||
STAT_COUNTER drop; /* Dropped packets. */
|
|
||||||
STAT_COUNTER chkerr; /* Checksum error. */
|
|
||||||
STAT_COUNTER lenerr; /* Invalid length error. */
|
|
||||||
STAT_COUNTER memerr; /* Out of memory error. */
|
|
||||||
STAT_COUNTER rterr; /* Routing error. */
|
|
||||||
STAT_COUNTER proterr; /* Protocol error. */
|
|
||||||
STAT_COUNTER opterr; /* Error in options. */
|
|
||||||
STAT_COUNTER err; /* Misc error. */
|
|
||||||
STAT_COUNTER cachehit;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stats_igmp {
|
|
||||||
STAT_COUNTER xmit; /* Transmitted packets. */
|
|
||||||
STAT_COUNTER recv; /* Received packets. */
|
|
||||||
STAT_COUNTER drop; /* Dropped packets. */
|
|
||||||
STAT_COUNTER chkerr; /* Checksum error. */
|
|
||||||
STAT_COUNTER lenerr; /* Invalid length error. */
|
|
||||||
STAT_COUNTER memerr; /* Out of memory error. */
|
|
||||||
STAT_COUNTER proterr; /* Protocol error. */
|
|
||||||
STAT_COUNTER rx_v1; /* Received v1 frames. */
|
|
||||||
STAT_COUNTER rx_group; /* Received group-specific queries. */
|
|
||||||
STAT_COUNTER rx_general; /* Received general queries. */
|
|
||||||
STAT_COUNTER rx_report; /* Received reports. */
|
|
||||||
STAT_COUNTER tx_join; /* Sent joins. */
|
|
||||||
STAT_COUNTER tx_leave; /* Sent leaves. */
|
|
||||||
STAT_COUNTER tx_report; /* Sent reports. */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stats_mem {
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
const char *name;
|
|
||||||
#endif /* LWIP_DEBUG */
|
|
||||||
mem_size_t avail;
|
|
||||||
mem_size_t used;
|
|
||||||
mem_size_t max;
|
|
||||||
STAT_COUNTER err;
|
|
||||||
STAT_COUNTER illegal;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stats_syselem {
|
|
||||||
STAT_COUNTER used;
|
|
||||||
STAT_COUNTER max;
|
|
||||||
STAT_COUNTER err;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stats_sys {
|
|
||||||
struct stats_syselem sem;
|
|
||||||
struct stats_syselem mutex;
|
|
||||||
struct stats_syselem mbox;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stats_ {
|
|
||||||
#if LINK_STATS
|
|
||||||
struct stats_proto link;
|
|
||||||
#endif
|
|
||||||
#if ETHARP_STATS
|
|
||||||
struct stats_proto etharp;
|
|
||||||
#endif
|
|
||||||
#if IPFRAG_STATS
|
|
||||||
struct stats_proto ip_frag;
|
|
||||||
#endif
|
|
||||||
#if IP_STATS
|
|
||||||
struct stats_proto ip;
|
|
||||||
#endif
|
|
||||||
#if ICMP_STATS
|
|
||||||
struct stats_proto icmp;
|
|
||||||
#endif
|
|
||||||
#if IGMP_STATS
|
|
||||||
struct stats_igmp igmp;
|
|
||||||
#endif
|
|
||||||
#if UDP_STATS
|
|
||||||
struct stats_proto udp;
|
|
||||||
#endif
|
|
||||||
#if TCP_STATS
|
|
||||||
struct stats_proto tcp;
|
|
||||||
#endif
|
|
||||||
#if MEM_STATS
|
|
||||||
struct stats_mem mem;
|
|
||||||
#endif
|
|
||||||
#if MEMP_STATS
|
|
||||||
struct stats_mem memp[MEMP_MAX];
|
|
||||||
#endif
|
|
||||||
#if SYS_STATS
|
|
||||||
struct stats_sys sys;
|
|
||||||
#endif
|
|
||||||
#if IP6_STATS
|
|
||||||
struct stats_proto ip6;
|
|
||||||
#endif
|
|
||||||
#if ICMP6_STATS
|
|
||||||
struct stats_proto icmp6;
|
|
||||||
#endif
|
|
||||||
#if IP6_FRAG_STATS
|
|
||||||
struct stats_proto ip6_frag;
|
|
||||||
#endif
|
|
||||||
#if MLD6_STATS
|
|
||||||
struct stats_igmp mld6;
|
|
||||||
#endif
|
|
||||||
#if ND6_STATS
|
|
||||||
struct stats_proto nd6;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct stats_ lwip_stats;
|
|
||||||
|
|
||||||
void stats_init(void);
|
|
||||||
|
|
||||||
#define STATS_INC(x) ++lwip_stats.x
|
|
||||||
#define STATS_DEC(x) --lwip_stats.x
|
|
||||||
#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \
|
|
||||||
if (lwip_stats.x.max < lwip_stats.x.used) { \
|
|
||||||
lwip_stats.x.max = lwip_stats.x.used; \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
#else /* LWIP_STATS */
|
|
||||||
#define stats_init()
|
|
||||||
#define STATS_INC(x)
|
|
||||||
#define STATS_DEC(x)
|
|
||||||
#define STATS_INC_USED(x)
|
|
||||||
#endif /* LWIP_STATS */
|
|
||||||
|
|
||||||
#if TCP_STATS
|
|
||||||
#define TCP_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP")
|
|
||||||
#else
|
|
||||||
#define TCP_STATS_INC(x)
|
|
||||||
#define TCP_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if UDP_STATS
|
|
||||||
#define UDP_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP")
|
|
||||||
#else
|
|
||||||
#define UDP_STATS_INC(x)
|
|
||||||
#define UDP_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ICMP_STATS
|
|
||||||
#define ICMP_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP")
|
|
||||||
#else
|
|
||||||
#define ICMP_STATS_INC(x)
|
|
||||||
#define ICMP_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IGMP_STATS
|
|
||||||
#define IGMP_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp, "IGMP")
|
|
||||||
#else
|
|
||||||
#define IGMP_STATS_INC(x)
|
|
||||||
#define IGMP_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IP_STATS
|
|
||||||
#define IP_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP")
|
|
||||||
#else
|
|
||||||
#define IP_STATS_INC(x)
|
|
||||||
#define IP_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IPFRAG_STATS
|
|
||||||
#define IPFRAG_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG")
|
|
||||||
#else
|
|
||||||
#define IPFRAG_STATS_INC(x)
|
|
||||||
#define IPFRAG_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ETHARP_STATS
|
|
||||||
#define ETHARP_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP")
|
|
||||||
#else
|
|
||||||
#define ETHARP_STATS_INC(x)
|
|
||||||
#define ETHARP_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LINK_STATS
|
|
||||||
#define LINK_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK")
|
|
||||||
#else
|
|
||||||
#define LINK_STATS_INC(x)
|
|
||||||
#define LINK_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MEM_STATS
|
|
||||||
#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y
|
|
||||||
#define MEM_STATS_INC(x) STATS_INC(mem.x)
|
|
||||||
#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y)
|
|
||||||
#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y
|
|
||||||
#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP")
|
|
||||||
#else
|
|
||||||
#define MEM_STATS_AVAIL(x, y)
|
|
||||||
#define MEM_STATS_INC(x)
|
|
||||||
#define MEM_STATS_INC_USED(x, y)
|
|
||||||
#define MEM_STATS_DEC_USED(x, y)
|
|
||||||
#define MEM_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MEMP_STATS
|
|
||||||
#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y
|
|
||||||
#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x)
|
|
||||||
#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x)
|
|
||||||
#define MEMP_STATS_INC_USED(x, i) STATS_INC_USED(memp[i], 1)
|
|
||||||
#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i)
|
|
||||||
#else
|
|
||||||
#define MEMP_STATS_AVAIL(x, i, y)
|
|
||||||
#define MEMP_STATS_INC(x, i)
|
|
||||||
#define MEMP_STATS_DEC(x, i)
|
|
||||||
#define MEMP_STATS_INC_USED(x, i)
|
|
||||||
#define MEMP_STATS_DISPLAY(i)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if SYS_STATS
|
|
||||||
#define SYS_STATS_INC(x) STATS_INC(sys.x)
|
|
||||||
#define SYS_STATS_DEC(x) STATS_DEC(sys.x)
|
|
||||||
#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1)
|
|
||||||
#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys)
|
|
||||||
#else
|
|
||||||
#define SYS_STATS_INC(x)
|
|
||||||
#define SYS_STATS_DEC(x)
|
|
||||||
#define SYS_STATS_INC_USED(x)
|
|
||||||
#define SYS_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IP6_STATS
|
|
||||||
#define IP6_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define IP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6, "IPv6")
|
|
||||||
#else
|
|
||||||
#define IP6_STATS_INC(x)
|
|
||||||
#define IP6_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ICMP6_STATS
|
|
||||||
#define ICMP6_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define ICMP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp6, "ICMPv6")
|
|
||||||
#else
|
|
||||||
#define ICMP6_STATS_INC(x)
|
|
||||||
#define ICMP6_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IP6_FRAG_STATS
|
|
||||||
#define IP6_FRAG_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define IP6_FRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6_frag, "IPv6 FRAG")
|
|
||||||
#else
|
|
||||||
#define IP6_FRAG_STATS_INC(x)
|
|
||||||
#define IP6_FRAG_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MLD6_STATS
|
|
||||||
#define MLD6_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define MLD6_STATS_DISPLAY() stats_display_igmp(&lwip_stats.mld6, "MLDv1")
|
|
||||||
#else
|
|
||||||
#define MLD6_STATS_INC(x)
|
|
||||||
#define MLD6_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ND6_STATS
|
|
||||||
#define ND6_STATS_INC(x) STATS_INC(x)
|
|
||||||
#define ND6_STATS_DISPLAY() stats_display_proto(&lwip_stats.nd6, "ND")
|
|
||||||
#else
|
|
||||||
#define ND6_STATS_INC(x)
|
|
||||||
#define ND6_STATS_DISPLAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Display of statistics */
|
|
||||||
#if LWIP_STATS_DISPLAY
|
|
||||||
void stats_display(void);
|
|
||||||
void stats_display_proto(struct stats_proto *proto, const char *name);
|
|
||||||
void stats_display_igmp(struct stats_igmp *igmp, const char *name);
|
|
||||||
void stats_display_mem(struct stats_mem *mem, const char *name);
|
|
||||||
void stats_display_memp(struct stats_mem *mem, int index);
|
|
||||||
void stats_display_sys(struct stats_sys *sys);
|
|
||||||
#else /* LWIP_STATS_DISPLAY */
|
|
||||||
#define stats_display()
|
|
||||||
#define stats_display_proto(proto, name)
|
|
||||||
#define stats_display_igmp(igmp, name)
|
|
||||||
#define stats_display_mem(mem, name)
|
|
||||||
#define stats_display_memp(mem, index)
|
|
||||||
#define stats_display_sys(sys)
|
|
||||||
#endif /* LWIP_STATS_DISPLAY */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_STATS_H__ */
|
|
|
@ -1,336 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_SYS_H__
|
|
||||||
#define __LWIP_SYS_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NO_SYS
|
|
||||||
|
|
||||||
/* For a totally minimal and standalone system, we provide null
|
|
||||||
definitions of the sys_ functions. */
|
|
||||||
typedef u8_t sys_sem_t;
|
|
||||||
typedef u8_t sys_mutex_t;
|
|
||||||
typedef u8_t sys_mbox_t;
|
|
||||||
|
|
||||||
#define sys_sem_new(s, c) ERR_OK
|
|
||||||
#define sys_sem_signal(s)
|
|
||||||
#define sys_sem_wait(s)
|
|
||||||
#define sys_arch_sem_wait(s,t)
|
|
||||||
#define sys_sem_free(s)
|
|
||||||
#define sys_sem_valid(s) 0
|
|
||||||
#define sys_sem_set_invalid(s)
|
|
||||||
#define sys_mutex_new(mu) ERR_OK
|
|
||||||
#define sys_mutex_lock(mu)
|
|
||||||
#define sys_mutex_unlock(mu)
|
|
||||||
#define sys_mutex_free(mu)
|
|
||||||
#define sys_mutex_valid(mu) 0
|
|
||||||
#define sys_mutex_set_invalid(mu)
|
|
||||||
#define sys_mbox_new(m, s) ERR_OK
|
|
||||||
#define sys_mbox_fetch(m,d)
|
|
||||||
#define sys_mbox_tryfetch(m,d)
|
|
||||||
#define sys_mbox_post(m,d)
|
|
||||||
#define sys_mbox_trypost(m,d)
|
|
||||||
#define sys_mbox_free(m)
|
|
||||||
#define sys_mbox_valid(m)
|
|
||||||
#define sys_mbox_set_invalid(m)
|
|
||||||
|
|
||||||
#define sys_thread_new(n,t,a,s,p)
|
|
||||||
|
|
||||||
#define sys_msleep(t)
|
|
||||||
|
|
||||||
#else /* NO_SYS */
|
|
||||||
|
|
||||||
/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */
|
|
||||||
#define SYS_ARCH_TIMEOUT 0xffffffffUL
|
|
||||||
|
|
||||||
/** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate.
|
|
||||||
* For now we use the same magic value, but we allow this to change in future.
|
|
||||||
*/
|
|
||||||
#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "arch/sys_arch.h"
|
|
||||||
|
|
||||||
/** Function prototype for thread functions */
|
|
||||||
typedef void (*lwip_thread_fn)(void *arg);
|
|
||||||
|
|
||||||
/* Function prototypes for functions to be implemented by platform ports
|
|
||||||
(in sys_arch.c) */
|
|
||||||
|
|
||||||
/* Mutex functions: */
|
|
||||||
|
|
||||||
/** Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores
|
|
||||||
should be used instead */
|
|
||||||
#if LWIP_COMPAT_MUTEX
|
|
||||||
/* for old ports that don't have mutexes: define them to binary semaphores */
|
|
||||||
#define sys_mutex_t sys_sem_t
|
|
||||||
#define sys_mutex_new(mutex) sys_sem_new(mutex, 1)
|
|
||||||
#define sys_mutex_lock(mutex) sys_sem_wait(mutex)
|
|
||||||
#define sys_mutex_unlock(mutex) sys_sem_signal(mutex)
|
|
||||||
#define sys_mutex_free(mutex) sys_sem_free(mutex)
|
|
||||||
#define sys_mutex_valid(mutex) sys_sem_valid(mutex)
|
|
||||||
#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex)
|
|
||||||
|
|
||||||
#else /* LWIP_COMPAT_MUTEX */
|
|
||||||
|
|
||||||
/** Create a new mutex
|
|
||||||
* @param mutex pointer to the mutex to create
|
|
||||||
* @return a new mutex */
|
|
||||||
err_t sys_mutex_new(sys_mutex_t *mutex);
|
|
||||||
/** Lock a mutex
|
|
||||||
* @param mutex the mutex to lock */
|
|
||||||
void sys_mutex_lock(sys_mutex_t *mutex);
|
|
||||||
/** Unlock a mutex
|
|
||||||
* @param mutex the mutex to unlock */
|
|
||||||
void sys_mutex_unlock(sys_mutex_t *mutex);
|
|
||||||
/** Delete a semaphore
|
|
||||||
* @param mutex the mutex to delete */
|
|
||||||
void sys_mutex_free(sys_mutex_t *mutex);
|
|
||||||
#ifndef sys_mutex_valid
|
|
||||||
/** Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid */
|
|
||||||
int sys_mutex_valid(sys_mutex_t *mutex);
|
|
||||||
#endif
|
|
||||||
#ifndef sys_mutex_set_invalid
|
|
||||||
/** Set a mutex invalid so that sys_mutex_valid returns 0 */
|
|
||||||
void sys_mutex_set_invalid(sys_mutex_t *mutex);
|
|
||||||
#endif
|
|
||||||
#endif /* LWIP_COMPAT_MUTEX */
|
|
||||||
|
|
||||||
/* Semaphore functions: */
|
|
||||||
|
|
||||||
/** Create a new semaphore
|
|
||||||
* @param sem pointer to the semaphore to create
|
|
||||||
* @param count initial count of the semaphore
|
|
||||||
* @return ERR_OK if successful, another err_t otherwise */
|
|
||||||
err_t sys_sem_new(sys_sem_t *sem, u8_t count);
|
|
||||||
/** Signals a semaphore
|
|
||||||
* @param sem the semaphore to signal */
|
|
||||||
void sys_sem_signal(sys_sem_t *sem);
|
|
||||||
/** Wait for a semaphore for the specified timeout
|
|
||||||
* @param sem the semaphore to wait for
|
|
||||||
* @param timeout timeout in milliseconds to wait (0 = wait forever)
|
|
||||||
* @return time (in milliseconds) waited for the semaphore
|
|
||||||
* or SYS_ARCH_TIMEOUT on timeout */
|
|
||||||
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout);
|
|
||||||
/** Delete a semaphore
|
|
||||||
* @param sem semaphore to delete */
|
|
||||||
void sys_sem_free(sys_sem_t *sem);
|
|
||||||
/** Wait for a semaphore - forever/no timeout */
|
|
||||||
#define sys_sem_wait(sem) sys_arch_sem_wait(sem, 0)
|
|
||||||
#ifndef sys_sem_valid
|
|
||||||
/** Check if a sempahore is valid/allocated: return 1 for valid, 0 for invalid */
|
|
||||||
int sys_sem_valid(sys_sem_t *sem);
|
|
||||||
#endif
|
|
||||||
#ifndef sys_sem_set_invalid
|
|
||||||
/** Set a semaphore invalid so that sys_sem_valid returns 0 */
|
|
||||||
void sys_sem_set_invalid(sys_sem_t *sem);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Time functions. */
|
|
||||||
#ifndef sys_msleep
|
|
||||||
void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Mailbox functions. */
|
|
||||||
|
|
||||||
/** Create a new mbox of specified size
|
|
||||||
* @param mbox pointer to the mbox to create
|
|
||||||
* @param size (miminum) number of messages in this mbox
|
|
||||||
* @return ERR_OK if successful, another err_t otherwise */
|
|
||||||
err_t sys_mbox_new(sys_mbox_t *mbox, int size);
|
|
||||||
/** Post a message to an mbox - may not fail
|
|
||||||
* -> blocks if full, only used from tasks not from ISR
|
|
||||||
* @param mbox mbox to posts the message
|
|
||||||
* @param msg message to post (ATTENTION: can be NULL) */
|
|
||||||
void sys_mbox_post(sys_mbox_t *mbox, void *msg);
|
|
||||||
/** Try to post a message to an mbox - may fail if full or ISR
|
|
||||||
* @param mbox mbox to posts the message
|
|
||||||
* @param msg message to post (ATTENTION: can be NULL) */
|
|
||||||
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg);
|
|
||||||
/** Wait for a new message to arrive in the mbox
|
|
||||||
* @param mbox mbox to get a message from
|
|
||||||
* @param msg pointer where the message is stored
|
|
||||||
* @param timeout maximum time (in milliseconds) to wait for a message (0 = wait forever)
|
|
||||||
* @return time (in milliseconds) waited for a message, may be 0 if not waited
|
|
||||||
or SYS_ARCH_TIMEOUT on timeout
|
|
||||||
* The returned time has to be accurate to prevent timer jitter! */
|
|
||||||
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout);
|
|
||||||
/* Allow port to override with a macro, e.g. special timout for sys_arch_mbox_fetch() */
|
|
||||||
#ifndef sys_arch_mbox_tryfetch
|
|
||||||
/** Wait for a new message to arrive in the mbox
|
|
||||||
* @param mbox mbox to get a message from
|
|
||||||
* @param msg pointer where the message is stored
|
|
||||||
* @return 0 (milliseconds) if a message has been received
|
|
||||||
* or SYS_MBOX_EMPTY if the mailbox is empty */
|
|
||||||
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg);
|
|
||||||
#endif
|
|
||||||
/** For now, we map straight to sys_arch implementation. */
|
|
||||||
#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)
|
|
||||||
/** Delete an mbox
|
|
||||||
* @param mbox mbox to delete */
|
|
||||||
void sys_mbox_free(sys_mbox_t *mbox);
|
|
||||||
#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0)
|
|
||||||
#ifndef sys_mbox_valid
|
|
||||||
/** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */
|
|
||||||
int sys_mbox_valid(sys_mbox_t *mbox);
|
|
||||||
#endif
|
|
||||||
#ifndef sys_mbox_set_invalid
|
|
||||||
/** Set an mbox invalid so that sys_mbox_valid returns 0 */
|
|
||||||
void sys_mbox_set_invalid(sys_mbox_t *mbox);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** The only thread function:
|
|
||||||
* Creates a new thread
|
|
||||||
* @param name human-readable name for the thread (used for debugging purposes)
|
|
||||||
* @param thread thread-function
|
|
||||||
* @param arg parameter passed to 'thread'
|
|
||||||
* @param stacksize stack size in bytes for the new thread (may be ignored by ports)
|
|
||||||
* @param prio priority of the new thread (may be ignored by ports) */
|
|
||||||
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio);
|
|
||||||
|
|
||||||
#endif /* NO_SYS */
|
|
||||||
|
|
||||||
/* sys_init() must be called before anthing else. */
|
|
||||||
void sys_init(void);
|
|
||||||
|
|
||||||
#ifndef sys_jiffies
|
|
||||||
/** Ticks/jiffies since power up. */
|
|
||||||
u32_t sys_jiffies(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Returns the current time in milliseconds,
|
|
||||||
* may be the same as sys_jiffies or at least based on it. */
|
|
||||||
u32_t sys_now(void);
|
|
||||||
|
|
||||||
/* Critical Region Protection */
|
|
||||||
/* These functions must be implemented in the sys_arch.c file.
|
|
||||||
In some implementations they can provide a more light-weight protection
|
|
||||||
mechanism than using semaphores. Otherwise semaphores can be used for
|
|
||||||
implementation */
|
|
||||||
#ifndef SYS_ARCH_PROTECT
|
|
||||||
/** SYS_LIGHTWEIGHT_PROT
|
|
||||||
* define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection
|
|
||||||
* for certain critical regions during buffer allocation, deallocation and memory
|
|
||||||
* allocation and deallocation.
|
|
||||||
*/
|
|
||||||
#if SYS_LIGHTWEIGHT_PROT
|
|
||||||
|
|
||||||
/** SYS_ARCH_DECL_PROTECT
|
|
||||||
* declare a protection variable. This macro will default to defining a variable of
|
|
||||||
* type sys_prot_t. If a particular port needs a different implementation, then
|
|
||||||
* this macro may be defined in sys_arch.h.
|
|
||||||
*/
|
|
||||||
#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev
|
|
||||||
/** SYS_ARCH_PROTECT
|
|
||||||
* Perform a "fast" protect. This could be implemented by
|
|
||||||
* disabling interrupts for an embedded system or by using a semaphore or
|
|
||||||
* mutex. The implementation should allow calling SYS_ARCH_PROTECT when
|
|
||||||
* already protected. The old protection level is returned in the variable
|
|
||||||
* "lev". This macro will default to calling the sys_arch_protect() function
|
|
||||||
* which should be implemented in sys_arch.c. If a particular port needs a
|
|
||||||
* different implementation, then this macro may be defined in sys_arch.h
|
|
||||||
*/
|
|
||||||
#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()
|
|
||||||
/** SYS_ARCH_UNPROTECT
|
|
||||||
* Perform a "fast" set of the protection level to "lev". This could be
|
|
||||||
* implemented by setting the interrupt level to "lev" within the MACRO or by
|
|
||||||
* using a semaphore or mutex. This macro will default to calling the
|
|
||||||
* sys_arch_unprotect() function which should be implemented in
|
|
||||||
* sys_arch.c. If a particular port needs a different implementation, then
|
|
||||||
* this macro may be defined in sys_arch.h
|
|
||||||
*/
|
|
||||||
#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)
|
|
||||||
sys_prot_t sys_arch_protect(void);
|
|
||||||
void sys_arch_unprotect(sys_prot_t pval);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define SYS_ARCH_DECL_PROTECT(lev)
|
|
||||||
#define SYS_ARCH_PROTECT(lev)
|
|
||||||
#define SYS_ARCH_UNPROTECT(lev)
|
|
||||||
|
|
||||||
#endif /* SYS_LIGHTWEIGHT_PROT */
|
|
||||||
|
|
||||||
#endif /* SYS_ARCH_PROTECT */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros to set/get and increase/decrease variables in a thread-safe way.
|
|
||||||
* Use these for accessing variable that are used from more than one thread.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SYS_ARCH_INC
|
|
||||||
#define SYS_ARCH_INC(var, val) do { \
|
|
||||||
SYS_ARCH_DECL_PROTECT(old_level); \
|
|
||||||
SYS_ARCH_PROTECT(old_level); \
|
|
||||||
var += val; \
|
|
||||||
SYS_ARCH_UNPROTECT(old_level); \
|
|
||||||
} while(0)
|
|
||||||
#endif /* SYS_ARCH_INC */
|
|
||||||
|
|
||||||
#ifndef SYS_ARCH_DEC
|
|
||||||
#define SYS_ARCH_DEC(var, val) do { \
|
|
||||||
SYS_ARCH_DECL_PROTECT(old_level); \
|
|
||||||
SYS_ARCH_PROTECT(old_level); \
|
|
||||||
var -= val; \
|
|
||||||
SYS_ARCH_UNPROTECT(old_level); \
|
|
||||||
} while(0)
|
|
||||||
#endif /* SYS_ARCH_DEC */
|
|
||||||
|
|
||||||
#ifndef SYS_ARCH_GET
|
|
||||||
#define SYS_ARCH_GET(var, ret) do { \
|
|
||||||
SYS_ARCH_DECL_PROTECT(old_level); \
|
|
||||||
SYS_ARCH_PROTECT(old_level); \
|
|
||||||
ret = var; \
|
|
||||||
SYS_ARCH_UNPROTECT(old_level); \
|
|
||||||
} while(0)
|
|
||||||
#endif /* SYS_ARCH_GET */
|
|
||||||
|
|
||||||
#ifndef SYS_ARCH_SET
|
|
||||||
#define SYS_ARCH_SET(var, val) do { \
|
|
||||||
SYS_ARCH_DECL_PROTECT(old_level); \
|
|
||||||
SYS_ARCH_PROTECT(old_level); \
|
|
||||||
var = val; \
|
|
||||||
SYS_ARCH_UNPROTECT(old_level); \
|
|
||||||
} while(0)
|
|
||||||
#endif /* SYS_ARCH_SET */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LWIP_SYS_H__ */
|
|
|
@ -1,397 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_TCP_H__
|
|
||||||
#define __LWIP_TCP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/icmp.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/ip6.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct tcp_pcb;
|
|
||||||
|
|
||||||
/** Function prototype for tcp accept callback functions. Called when a new
|
|
||||||
* connection can be accepted on a listening pcb.
|
|
||||||
*
|
|
||||||
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
|
||||||
* @param newpcb The new connection pcb
|
|
||||||
* @param err An error code if there has been an error accepting.
|
|
||||||
* Only return ERR_ABRT if you have called tcp_abort from within the
|
|
||||||
* callback function!
|
|
||||||
*/
|
|
||||||
typedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err);
|
|
||||||
|
|
||||||
/** Function prototype for tcp receive callback functions. Called when data has
|
|
||||||
* been received.
|
|
||||||
*
|
|
||||||
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
|
||||||
* @param tpcb The connection pcb which received data
|
|
||||||
* @param p The received data (or NULL when the connection has been closed!)
|
|
||||||
* @param err An error code if there has been an error receiving
|
|
||||||
* Only return ERR_ABRT if you have called tcp_abort from within the
|
|
||||||
* callback function!
|
|
||||||
*/
|
|
||||||
typedef err_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb,
|
|
||||||
struct pbuf *p, err_t err);
|
|
||||||
|
|
||||||
/** Function prototype for tcp sent callback functions. Called when sent data has
|
|
||||||
* been acknowledged by the remote side. Use it to free corresponding resources.
|
|
||||||
* This also means that the pcb has now space available to send new data.
|
|
||||||
*
|
|
||||||
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
|
||||||
* @param tpcb The connection pcb for which data has been acknowledged
|
|
||||||
* @param len The amount of bytes acknowledged
|
|
||||||
* @return ERR_OK: try to send some data by calling tcp_output
|
|
||||||
* Only return ERR_ABRT if you have called tcp_abort from within the
|
|
||||||
* callback function!
|
|
||||||
*/
|
|
||||||
typedef err_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb,
|
|
||||||
u16_t len);
|
|
||||||
|
|
||||||
/** Function prototype for tcp poll callback functions. Called periodically as
|
|
||||||
* specified by @see tcp_poll.
|
|
||||||
*
|
|
||||||
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
|
||||||
* @param tpcb tcp pcb
|
|
||||||
* @return ERR_OK: try to send some data by calling tcp_output
|
|
||||||
* Only return ERR_ABRT if you have called tcp_abort from within the
|
|
||||||
* callback function!
|
|
||||||
*/
|
|
||||||
typedef err_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb);
|
|
||||||
|
|
||||||
/** Function prototype for tcp error callback functions. Called when the pcb
|
|
||||||
* receives a RST or is unexpectedly closed for any other reason.
|
|
||||||
*
|
|
||||||
* @note The corresponding pcb is already freed when this callback is called!
|
|
||||||
*
|
|
||||||
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
|
||||||
* @param err Error code to indicate why the pcb has been closed
|
|
||||||
* ERR_ABRT: aborted through tcp_abort or by a TCP timer
|
|
||||||
* ERR_RST: the connection was reset by the remote host
|
|
||||||
*/
|
|
||||||
typedef void (*tcp_err_fn)(void *arg, err_t err);
|
|
||||||
|
|
||||||
/** Function prototype for tcp connected callback functions. Called when a pcb
|
|
||||||
* is connected to the remote side after initiating a connection attempt by
|
|
||||||
* calling tcp_connect().
|
|
||||||
*
|
|
||||||
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
|
||||||
* @param tpcb The connection pcb which is connected
|
|
||||||
* @param err An unused error code, always ERR_OK currently ;-) TODO!
|
|
||||||
* Only return ERR_ABRT if you have called tcp_abort from within the
|
|
||||||
* callback function!
|
|
||||||
*
|
|
||||||
* @note When a connection attempt fails, the error callback is currently called!
|
|
||||||
*/
|
|
||||||
typedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err);
|
|
||||||
|
|
||||||
enum tcp_state {
|
|
||||||
CLOSED = 0,
|
|
||||||
LISTEN = 1,
|
|
||||||
SYN_SENT = 2,
|
|
||||||
SYN_RCVD = 3,
|
|
||||||
ESTABLISHED = 4,
|
|
||||||
FIN_WAIT_1 = 5,
|
|
||||||
FIN_WAIT_2 = 6,
|
|
||||||
CLOSE_WAIT = 7,
|
|
||||||
CLOSING = 8,
|
|
||||||
LAST_ACK = 9,
|
|
||||||
TIME_WAIT = 10
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_CALLBACK_API
|
|
||||||
/* Function to call when a listener has been connected.
|
|
||||||
* @param arg user-supplied argument (tcp_pcb.callback_arg)
|
|
||||||
* @param pcb a new tcp_pcb that now is connected
|
|
||||||
* @param err an error argument (TODO: that is current always ERR_OK?)
|
|
||||||
* @return ERR_OK: accept the new connection,
|
|
||||||
* any other err_t abortsthe new connection
|
|
||||||
*/
|
|
||||||
#define DEF_ACCEPT_CALLBACK tcp_accept_fn accept;
|
|
||||||
#else /* LWIP_CALLBACK_API */
|
|
||||||
#define DEF_ACCEPT_CALLBACK
|
|
||||||
#endif /* LWIP_CALLBACK_API */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* members common to struct tcp_pcb and struct tcp_listen_pcb
|
|
||||||
*/
|
|
||||||
#define TCP_PCB_COMMON(type) \
|
|
||||||
type *next; /* for the linked list */ \
|
|
||||||
void *callback_arg; \
|
|
||||||
/* the accept callback for listen- and normal pcbs, if LWIP_CALLBACK_API */ \
|
|
||||||
DEF_ACCEPT_CALLBACK \
|
|
||||||
enum tcp_state state; /* TCP state */ \
|
|
||||||
u8_t prio; \
|
|
||||||
/* ports are in host byte order */ \
|
|
||||||
u16_t local_port
|
|
||||||
|
|
||||||
|
|
||||||
/* the TCP protocol control block */
|
|
||||||
struct tcp_pcb {
|
|
||||||
/** common PCB members */
|
|
||||||
IP_PCB;
|
|
||||||
/** protocol specific PCB members */
|
|
||||||
TCP_PCB_COMMON(struct tcp_pcb);
|
|
||||||
|
|
||||||
/* ports are in host byte order */
|
|
||||||
u16_t remote_port;
|
|
||||||
|
|
||||||
u8_t flags;
|
|
||||||
#define TF_ACK_DELAY ((u8_t)0x01U) /* Delayed ACK. */
|
|
||||||
#define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */
|
|
||||||
#define TF_INFR ((u8_t)0x04U) /* In fast recovery. */
|
|
||||||
#define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */
|
|
||||||
#define TF_RXCLOSED ((u8_t)0x10U) /* rx closed by tcp_shutdown */
|
|
||||||
#define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */
|
|
||||||
#define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */
|
|
||||||
#define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */
|
|
||||||
|
|
||||||
/* the rest of the fields are in host byte order
|
|
||||||
as we have to do some math with them */
|
|
||||||
|
|
||||||
/* Timers */
|
|
||||||
u8_t polltmr, pollinterval;
|
|
||||||
u8_t last_timer;
|
|
||||||
u32_t tmr;
|
|
||||||
|
|
||||||
/* receiver variables */
|
|
||||||
u32_t rcv_nxt; /* next seqno expected */
|
|
||||||
u16_t rcv_wnd; /* receiver window available */
|
|
||||||
u16_t rcv_ann_wnd; /* receiver window to announce */
|
|
||||||
u32_t rcv_ann_right_edge; /* announced right edge of window */
|
|
||||||
|
|
||||||
/* Retransmission timer. */
|
|
||||||
s16_t rtime;
|
|
||||||
|
|
||||||
u16_t mss; /* maximum segment size */
|
|
||||||
|
|
||||||
/* RTT (round trip time) estimation variables */
|
|
||||||
u32_t rttest; /* RTT estimate in 500ms ticks */
|
|
||||||
u32_t rtseq; /* sequence number being timed */
|
|
||||||
s16_t sa, sv; /* @todo document this */
|
|
||||||
|
|
||||||
s16_t rto; /* retransmission time-out */
|
|
||||||
u8_t nrtx; /* number of retransmissions */
|
|
||||||
|
|
||||||
/* fast retransmit/recovery */
|
|
||||||
u8_t dupacks;
|
|
||||||
u32_t lastack; /* Highest acknowledged seqno. */
|
|
||||||
|
|
||||||
/* congestion avoidance/control variables */
|
|
||||||
u16_t cwnd;
|
|
||||||
u16_t ssthresh;
|
|
||||||
|
|
||||||
/* sender variables */
|
|
||||||
u32_t snd_nxt; /* next new seqno to be sent */
|
|
||||||
u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last
|
|
||||||
window update. */
|
|
||||||
u32_t snd_lbb; /* Sequence number of next byte to be buffered. */
|
|
||||||
u16_t snd_wnd; /* sender window */
|
|
||||||
u16_t snd_wnd_max; /* the maximum sender window announced by the remote host */
|
|
||||||
|
|
||||||
u16_t acked;
|
|
||||||
|
|
||||||
u16_t snd_buf; /* Available buffer space for sending (in bytes). */
|
|
||||||
#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3)
|
|
||||||
u16_t snd_queuelen; /* Available buffer space for sending (in pbufs). */
|
|
||||||
|
|
||||||
#if TCP_OVERSIZE
|
|
||||||
/* Extra bytes available at the end of the last pbuf in unsent. */
|
|
||||||
u16_t unsent_oversize;
|
|
||||||
#endif /* TCP_OVERSIZE */
|
|
||||||
|
|
||||||
/* These are ordered by sequence number: */
|
|
||||||
struct tcp_seg *unsent; /* Unsent (queued) segments. */
|
|
||||||
struct tcp_seg *unacked; /* Sent but unacknowledged segments. */
|
|
||||||
#if TCP_QUEUE_OOSEQ
|
|
||||||
struct tcp_seg *ooseq; /* Received out of sequence segments. */
|
|
||||||
#endif /* TCP_QUEUE_OOSEQ */
|
|
||||||
|
|
||||||
struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */
|
|
||||||
|
|
||||||
#if LWIP_CALLBACK_API
|
|
||||||
/* Function to be called when more send buffer space is available. */
|
|
||||||
tcp_sent_fn sent;
|
|
||||||
/* Function to be called when (in-sequence) data has arrived. */
|
|
||||||
tcp_recv_fn recv;
|
|
||||||
/* Function to be called when a connection has been set up. */
|
|
||||||
tcp_connected_fn connected;
|
|
||||||
/* Function which is called periodically. */
|
|
||||||
tcp_poll_fn poll;
|
|
||||||
/* Function to be called whenever a fatal error occurs. */
|
|
||||||
tcp_err_fn errf;
|
|
||||||
#endif /* LWIP_CALLBACK_API */
|
|
||||||
|
|
||||||
#if LWIP_TCP_TIMESTAMPS
|
|
||||||
u32_t ts_lastacksent;
|
|
||||||
u32_t ts_recent;
|
|
||||||
#endif /* LWIP_TCP_TIMESTAMPS */
|
|
||||||
|
|
||||||
/* idle time before KEEPALIVE is sent */
|
|
||||||
u32_t keep_idle;
|
|
||||||
#if LWIP_TCP_KEEPALIVE
|
|
||||||
u32_t keep_intvl;
|
|
||||||
u32_t keep_cnt;
|
|
||||||
#endif /* LWIP_TCP_KEEPALIVE */
|
|
||||||
|
|
||||||
/* Persist timer counter */
|
|
||||||
u8_t persist_cnt;
|
|
||||||
/* Persist timer back-off */
|
|
||||||
u8_t persist_backoff;
|
|
||||||
|
|
||||||
/* KEEPALIVE counter */
|
|
||||||
u8_t keep_cnt_sent;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct tcp_pcb_listen {
|
|
||||||
/* Common members of all PCB types */
|
|
||||||
IP_PCB;
|
|
||||||
/* Protocol specific PCB members */
|
|
||||||
TCP_PCB_COMMON(struct tcp_pcb_listen);
|
|
||||||
|
|
||||||
#if TCP_LISTEN_BACKLOG
|
|
||||||
u8_t backlog;
|
|
||||||
u8_t accepts_pending;
|
|
||||||
#endif /* TCP_LISTEN_BACKLOG */
|
|
||||||
#if LWIP_IPV6
|
|
||||||
u8_t accept_any_ip_version;
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
};
|
|
||||||
|
|
||||||
#if LWIP_EVENT_API
|
|
||||||
|
|
||||||
enum lwip_event {
|
|
||||||
LWIP_EVENT_ACCEPT,
|
|
||||||
LWIP_EVENT_SENT,
|
|
||||||
LWIP_EVENT_RECV,
|
|
||||||
LWIP_EVENT_CONNECTED,
|
|
||||||
LWIP_EVENT_POLL,
|
|
||||||
LWIP_EVENT_ERR
|
|
||||||
};
|
|
||||||
|
|
||||||
err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
|
|
||||||
enum lwip_event,
|
|
||||||
struct pbuf *p,
|
|
||||||
u16_t size,
|
|
||||||
err_t err);
|
|
||||||
|
|
||||||
#endif /* LWIP_EVENT_API */
|
|
||||||
|
|
||||||
/* Application program's interface: */
|
|
||||||
struct tcp_pcb * tcp_new (void);
|
|
||||||
|
|
||||||
void tcp_arg (struct tcp_pcb *pcb, void *arg);
|
|
||||||
void tcp_accept (struct tcp_pcb *pcb, tcp_accept_fn accept);
|
|
||||||
void tcp_recv (struct tcp_pcb *pcb, tcp_recv_fn recv);
|
|
||||||
void tcp_sent (struct tcp_pcb *pcb, tcp_sent_fn sent);
|
|
||||||
void tcp_poll (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval);
|
|
||||||
void tcp_err (struct tcp_pcb *pcb, tcp_err_fn err);
|
|
||||||
|
|
||||||
#define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss)
|
|
||||||
#define tcp_sndbuf(pcb) ((pcb)->snd_buf)
|
|
||||||
#define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen)
|
|
||||||
#define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY)
|
|
||||||
#define tcp_nagle_enable(pcb) ((pcb)->flags &= ~TF_NODELAY)
|
|
||||||
#define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0)
|
|
||||||
|
|
||||||
#if TCP_LISTEN_BACKLOG
|
|
||||||
#define tcp_accepted(pcb) do { \
|
|
||||||
LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \
|
|
||||||
(((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0)
|
|
||||||
#else /* TCP_LISTEN_BACKLOG */
|
|
||||||
#define tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \
|
|
||||||
(pcb)->state == LISTEN)
|
|
||||||
#endif /* TCP_LISTEN_BACKLOG */
|
|
||||||
|
|
||||||
void tcp_recved (struct tcp_pcb *pcb, u16_t len);
|
|
||||||
err_t tcp_bind (struct tcp_pcb *pcb, ip_addr_t *ipaddr,
|
|
||||||
u16_t port);
|
|
||||||
err_t tcp_connect (struct tcp_pcb *pcb, ip_addr_t *ipaddr,
|
|
||||||
u16_t port, tcp_connected_fn connected);
|
|
||||||
|
|
||||||
struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog);
|
|
||||||
#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)
|
|
||||||
|
|
||||||
void tcp_abort (struct tcp_pcb *pcb);
|
|
||||||
err_t tcp_close (struct tcp_pcb *pcb);
|
|
||||||
err_t tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx);
|
|
||||||
|
|
||||||
/* Flags for "apiflags" parameter in tcp_write */
|
|
||||||
#define TCP_WRITE_FLAG_COPY 0x01
|
|
||||||
#define TCP_WRITE_FLAG_MORE 0x02
|
|
||||||
|
|
||||||
err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len,
|
|
||||||
u8_t apiflags);
|
|
||||||
|
|
||||||
void tcp_setprio (struct tcp_pcb *pcb, u8_t prio);
|
|
||||||
|
|
||||||
#define TCP_PRIO_MIN 1
|
|
||||||
#define TCP_PRIO_NORMAL 64
|
|
||||||
#define TCP_PRIO_MAX 127
|
|
||||||
|
|
||||||
err_t tcp_output (struct tcp_pcb *pcb);
|
|
||||||
|
|
||||||
|
|
||||||
const char* tcp_debug_state_str(enum tcp_state s);
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
struct tcp_pcb * tcp_new_ip6 (void);
|
|
||||||
#define tcp_bind_ip6(pcb, ip6addr, port) \
|
|
||||||
tcp_bind(pcb, ip6_2_ip(ip6addr), port)
|
|
||||||
#define tcp_connect_ip6(pcb, ip6addr, port, connected) \
|
|
||||||
tcp_connect(pcb, ip6_2_ip(ip6addr), port, connected)
|
|
||||||
struct tcp_pcb * tcp_listen_dual_with_backlog(struct tcp_pcb *pcb, u8_t backlog);
|
|
||||||
#define tcp_listen_dual(pcb) tcp_listen_dual_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
#define tcp_listen_dual_with_backlog(pcb, backlog) tcp_listen_with_backlog(pcb, backlog)
|
|
||||||
#define tcp_listen_dual(pcb) tcp_listen(pcb)
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_TCP_H__ */
|
|
|
@ -1,508 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_TCP_IMPL_H__
|
|
||||||
#define __LWIP_TCP_IMPL_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/icmp.h"
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/ip6.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Functions for interfacing with TCP: */
|
|
||||||
|
|
||||||
/* Lower layer interface to TCP: */
|
|
||||||
void tcp_init (void); /* Initialize this module. */
|
|
||||||
void tcp_tmr (void); /* Must be called every
|
|
||||||
TCP_TMR_INTERVAL
|
|
||||||
ms. (Typically 250 ms). */
|
|
||||||
/* It is also possible to call these two functions at the right
|
|
||||||
intervals (instead of calling tcp_tmr()). */
|
|
||||||
void tcp_slowtmr (void);
|
|
||||||
void tcp_fasttmr (void);
|
|
||||||
|
|
||||||
|
|
||||||
/* Only used by IP to pass a TCP segment to TCP: */
|
|
||||||
void tcp_input (struct pbuf *p, struct netif *inp);
|
|
||||||
/* Used within the TCP code only: */
|
|
||||||
struct tcp_pcb * tcp_alloc (u8_t prio);
|
|
||||||
void tcp_abandon (struct tcp_pcb *pcb, int reset);
|
|
||||||
err_t tcp_send_empty_ack(struct tcp_pcb *pcb);
|
|
||||||
void tcp_rexmit (struct tcp_pcb *pcb);
|
|
||||||
void tcp_rexmit_rto (struct tcp_pcb *pcb);
|
|
||||||
void tcp_rexmit_fast (struct tcp_pcb *pcb);
|
|
||||||
u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb);
|
|
||||||
err_t tcp_process_refused_data(struct tcp_pcb *pcb);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the Nagle algorithm: try to combine user data to send as few TCP
|
|
||||||
* segments as possible. Only send if
|
|
||||||
* - no previously transmitted data on the connection remains unacknowledged or
|
|
||||||
* - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or
|
|
||||||
* - the only unsent segment is at least pcb->mss bytes long (or there is more
|
|
||||||
* than one unsent segment - with lwIP, this can happen although unsent->len < mss)
|
|
||||||
* - or if we are in fast-retransmit (TF_INFR)
|
|
||||||
*/
|
|
||||||
#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \
|
|
||||||
((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \
|
|
||||||
(((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \
|
|
||||||
((tpcb)->unsent->len >= (tpcb)->mss))) || \
|
|
||||||
((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) \
|
|
||||||
) ? 1 : 0)
|
|
||||||
#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK)
|
|
||||||
|
|
||||||
|
|
||||||
#define TCP_SEQ_LT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0)
|
|
||||||
#define TCP_SEQ_LEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0)
|
|
||||||
#define TCP_SEQ_GT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0)
|
|
||||||
#define TCP_SEQ_GEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0)
|
|
||||||
/* is b<=a<=c? */
|
|
||||||
#if 0 /* see bug #10548 */
|
|
||||||
#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b))
|
|
||||||
#endif
|
|
||||||
#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c))
|
|
||||||
#define TCP_FIN 0x01U
|
|
||||||
#define TCP_SYN 0x02U
|
|
||||||
#define TCP_RST 0x04U
|
|
||||||
#define TCP_PSH 0x08U
|
|
||||||
#define TCP_ACK 0x10U
|
|
||||||
#define TCP_URG 0x20U
|
|
||||||
#define TCP_ECE 0x40U
|
|
||||||
#define TCP_CWR 0x80U
|
|
||||||
|
|
||||||
#define TCP_FLAGS 0x3fU
|
|
||||||
|
|
||||||
/* Length of the TCP header, excluding options. */
|
|
||||||
#define TCP_HLEN 20
|
|
||||||
|
|
||||||
#ifndef TCP_TMR_INTERVAL
|
|
||||||
#define TCP_TMR_INTERVAL 250 /* The TCP timer interval in milliseconds. */
|
|
||||||
#endif /* TCP_TMR_INTERVAL */
|
|
||||||
|
|
||||||
#ifndef TCP_FAST_INTERVAL
|
|
||||||
#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */
|
|
||||||
#endif /* TCP_FAST_INTERVAL */
|
|
||||||
|
|
||||||
#ifndef TCP_SLOW_INTERVAL
|
|
||||||
#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */
|
|
||||||
#endif /* TCP_SLOW_INTERVAL */
|
|
||||||
|
|
||||||
#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */
|
|
||||||
#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */
|
|
||||||
|
|
||||||
#define TCP_OOSEQ_TIMEOUT 6U /* x RTO */
|
|
||||||
|
|
||||||
#ifndef TCP_MSL
|
|
||||||
#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */
|
|
||||||
#ifndef TCP_KEEPIDLE_DEFAULT
|
|
||||||
#define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TCP_KEEPINTVL_DEFAULT
|
|
||||||
#define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TCP_KEEPCNT_DEFAULT
|
|
||||||
#define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */
|
|
||||||
|
|
||||||
/* Fields are (of course) in network byte order.
|
|
||||||
* Some fields are converted to host byte order in tcp_input().
|
|
||||||
*/
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct tcp_hdr {
|
|
||||||
PACK_STRUCT_FIELD(u16_t src);
|
|
||||||
PACK_STRUCT_FIELD(u16_t dest);
|
|
||||||
PACK_STRUCT_FIELD(u32_t seqno);
|
|
||||||
PACK_STRUCT_FIELD(u32_t ackno);
|
|
||||||
PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);
|
|
||||||
PACK_STRUCT_FIELD(u16_t wnd);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
PACK_STRUCT_FIELD(u16_t urgp);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)
|
|
||||||
#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS)
|
|
||||||
|
|
||||||
#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr))
|
|
||||||
#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS((u16_t)(~(u16_t)(TCP_FLAGS)))) | htons(flags))
|
|
||||||
#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | (flags))
|
|
||||||
|
|
||||||
#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags))
|
|
||||||
#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) )
|
|
||||||
|
|
||||||
#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0))
|
|
||||||
|
|
||||||
/** Flags used on input processing, not on pcb->flags
|
|
||||||
*/
|
|
||||||
#define TF_RESET (u8_t)0x08U /* Connection was reset. */
|
|
||||||
#define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */
|
|
||||||
#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */
|
|
||||||
|
|
||||||
|
|
||||||
#if LWIP_EVENT_API
|
|
||||||
|
|
||||||
#define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
|
||||||
LWIP_EVENT_ACCEPT, NULL, 0, err)
|
|
||||||
#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
|
||||||
LWIP_EVENT_SENT, NULL, space, ERR_OK)
|
|
||||||
#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
|
||||||
LWIP_EVENT_RECV, (p), 0, (err))
|
|
||||||
#define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
|
||||||
LWIP_EVENT_RECV, NULL, 0, ERR_OK)
|
|
||||||
#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
|
||||||
LWIP_EVENT_CONNECTED, NULL, 0, (err))
|
|
||||||
#define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
|
||||||
LWIP_EVENT_POLL, NULL, 0, ERR_OK)
|
|
||||||
#define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, \
|
|
||||||
LWIP_EVENT_ERR, NULL, 0, (err))
|
|
||||||
|
|
||||||
#else /* LWIP_EVENT_API */
|
|
||||||
|
|
||||||
#define TCP_EVENT_ACCEPT(pcb,err,ret) \
|
|
||||||
do { \
|
|
||||||
if((pcb)->accept != NULL) \
|
|
||||||
(ret) = (pcb)->accept((pcb)->callback_arg,(pcb),(err)); \
|
|
||||||
else (ret) = ERR_ARG; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_EVENT_SENT(pcb,space,ret) \
|
|
||||||
do { \
|
|
||||||
if((pcb)->sent != NULL) \
|
|
||||||
(ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \
|
|
||||||
else (ret) = ERR_OK; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_EVENT_RECV(pcb,p,err,ret) \
|
|
||||||
do { \
|
|
||||||
if((pcb)->recv != NULL) { \
|
|
||||||
(ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\
|
|
||||||
} else { \
|
|
||||||
(ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_EVENT_CLOSED(pcb,ret) \
|
|
||||||
do { \
|
|
||||||
if(((pcb)->recv != NULL)) { \
|
|
||||||
(ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\
|
|
||||||
} else { \
|
|
||||||
(ret) = ERR_OK; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_EVENT_CONNECTED(pcb,err,ret) \
|
|
||||||
do { \
|
|
||||||
if((pcb)->connected != NULL) \
|
|
||||||
(ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \
|
|
||||||
else (ret) = ERR_OK; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_EVENT_POLL(pcb,ret) \
|
|
||||||
do { \
|
|
||||||
if((pcb)->poll != NULL) \
|
|
||||||
(ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \
|
|
||||||
else (ret) = ERR_OK; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_EVENT_ERR(errf,arg,err) \
|
|
||||||
do { \
|
|
||||||
if((errf) != NULL) \
|
|
||||||
(errf)((arg),(err)); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#endif /* LWIP_EVENT_API */
|
|
||||||
|
|
||||||
/** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */
|
|
||||||
#if TCP_OVERSIZE && defined(LWIP_DEBUG)
|
|
||||||
#define TCP_OVERSIZE_DBGCHECK 1
|
|
||||||
#else
|
|
||||||
#define TCP_OVERSIZE_DBGCHECK 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */
|
|
||||||
#define TCP_CHECKSUM_ON_COPY (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP)
|
|
||||||
|
|
||||||
/* This structure represents a TCP segment on the unsent, unacked and ooseq queues */
|
|
||||||
struct tcp_seg {
|
|
||||||
struct tcp_seg *next; /* used when putting segements on a queue */
|
|
||||||
struct pbuf *p; /* buffer containing data + TCP header */
|
|
||||||
u16_t len; /* the TCP length of this segment */
|
|
||||||
#if TCP_OVERSIZE_DBGCHECK
|
|
||||||
u16_t oversize_left; /* Extra bytes available at the end of the last
|
|
||||||
pbuf in unsent (used for asserting vs.
|
|
||||||
tcp_pcb.unsent_oversized only) */
|
|
||||||
#endif /* TCP_OVERSIZE_DBGCHECK */
|
|
||||||
#if TCP_CHECKSUM_ON_COPY
|
|
||||||
u16_t chksum;
|
|
||||||
u8_t chksum_swapped;
|
|
||||||
#endif /* TCP_CHECKSUM_ON_COPY */
|
|
||||||
u8_t flags;
|
|
||||||
#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */
|
|
||||||
#define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */
|
|
||||||
#define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is
|
|
||||||
checksummed into 'chksum' */
|
|
||||||
struct tcp_hdr *tcphdr; /* the TCP header */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define LWIP_TCP_OPT_LENGTH(flags) \
|
|
||||||
(flags & TF_SEG_OPTS_MSS ? 4 : 0) + \
|
|
||||||
(flags & TF_SEG_OPTS_TS ? 12 : 0)
|
|
||||||
|
|
||||||
/** This returns a TCP header option for MSS in an u32_t */
|
|
||||||
#define TCP_BUILD_MSS_OPTION(mss) htonl(0x02040000 | ((mss) & 0xFFFF))
|
|
||||||
|
|
||||||
/* Global variables: */
|
|
||||||
extern struct tcp_pcb *tcp_input_pcb;
|
|
||||||
extern u32_t tcp_ticks;
|
|
||||||
extern u8_t tcp_active_pcbs_changed;
|
|
||||||
|
|
||||||
/* The TCP PCB lists. */
|
|
||||||
union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */
|
|
||||||
struct tcp_pcb_listen *listen_pcbs;
|
|
||||||
struct tcp_pcb *pcbs;
|
|
||||||
};
|
|
||||||
extern struct tcp_pcb *tcp_bound_pcbs;
|
|
||||||
extern union tcp_listen_pcbs_t tcp_listen_pcbs;
|
|
||||||
extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a
|
|
||||||
state in which they accept or send
|
|
||||||
data. */
|
|
||||||
extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */
|
|
||||||
|
|
||||||
extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */
|
|
||||||
|
|
||||||
/* Axioms about the above lists:
|
|
||||||
1) Every TCP PCB that is not CLOSED is in one of the lists.
|
|
||||||
2) A PCB is only in one of the lists.
|
|
||||||
3) All PCBs in the tcp_listen_pcbs list is in LISTEN state.
|
|
||||||
4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state.
|
|
||||||
*/
|
|
||||||
/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB
|
|
||||||
with a PCB list or removes a PCB from a list, respectively. */
|
|
||||||
#ifndef TCP_DEBUG_PCB_LISTS
|
|
||||||
#define TCP_DEBUG_PCB_LISTS 0
|
|
||||||
#endif
|
|
||||||
#if TCP_DEBUG_PCB_LISTS
|
|
||||||
#define TCP_REG(pcbs, npcb) do {\
|
|
||||||
LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", (npcb), (npcb)->local_port)); \
|
|
||||||
for(tcp_tmp_pcb = *(pcbs); \
|
|
||||||
tcp_tmp_pcb != NULL; \
|
|
||||||
tcp_tmp_pcb = tcp_tmp_pcb->next) { \
|
|
||||||
LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \
|
|
||||||
} \
|
|
||||||
LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \
|
|
||||||
(npcb)->next = *(pcbs); \
|
|
||||||
LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \
|
|
||||||
*(pcbs) = (npcb); \
|
|
||||||
LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
|
|
||||||
tcp_timer_needed(); \
|
|
||||||
} while(0)
|
|
||||||
#define TCP_RMV(pcbs, npcb) do { \
|
|
||||||
LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \
|
|
||||||
LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (npcb), *(pcbs))); \
|
|
||||||
if(*(pcbs) == (npcb)) { \
|
|
||||||
*(pcbs) = (*pcbs)->next; \
|
|
||||||
} else for(tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \
|
|
||||||
if(tcp_tmp_pcb->next == (npcb)) { \
|
|
||||||
tcp_tmp_pcb->next = (npcb)->next; \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
(npcb)->next = NULL; \
|
|
||||||
LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
|
|
||||||
LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (npcb), *(pcbs))); \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#else /* LWIP_DEBUG */
|
|
||||||
|
|
||||||
#define TCP_REG(pcbs, npcb) \
|
|
||||||
do { \
|
|
||||||
(npcb)->next = *pcbs; \
|
|
||||||
*(pcbs) = (npcb); \
|
|
||||||
tcp_timer_needed(); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_RMV(pcbs, npcb) \
|
|
||||||
do { \
|
|
||||||
if(*(pcbs) == (npcb)) { \
|
|
||||||
(*(pcbs)) = (*pcbs)->next; \
|
|
||||||
} \
|
|
||||||
else { \
|
|
||||||
for(tcp_tmp_pcb = *pcbs; \
|
|
||||||
tcp_tmp_pcb != NULL; \
|
|
||||||
tcp_tmp_pcb = tcp_tmp_pcb->next) { \
|
|
||||||
if(tcp_tmp_pcb->next == (npcb)) { \
|
|
||||||
tcp_tmp_pcb->next = (npcb)->next; \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
(npcb)->next = NULL; \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#endif /* LWIP_DEBUG */
|
|
||||||
|
|
||||||
#define TCP_REG_ACTIVE(npcb) \
|
|
||||||
do { \
|
|
||||||
TCP_REG(&tcp_active_pcbs, npcb); \
|
|
||||||
tcp_active_pcbs_changed = 1; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_RMV_ACTIVE(npcb) \
|
|
||||||
do { \
|
|
||||||
TCP_RMV(&tcp_active_pcbs, npcb); \
|
|
||||||
tcp_active_pcbs_changed = 1; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define TCP_PCB_REMOVE_ACTIVE(pcb) \
|
|
||||||
do { \
|
|
||||||
tcp_pcb_remove(&tcp_active_pcbs, pcb); \
|
|
||||||
tcp_active_pcbs_changed = 1; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
/* Internal functions: */
|
|
||||||
struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb);
|
|
||||||
void tcp_pcb_purge(struct tcp_pcb *pcb);
|
|
||||||
void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb);
|
|
||||||
|
|
||||||
void tcp_segs_free(struct tcp_seg *seg);
|
|
||||||
void tcp_seg_free(struct tcp_seg *seg);
|
|
||||||
struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg);
|
|
||||||
|
|
||||||
#define tcp_ack(pcb) \
|
|
||||||
do { \
|
|
||||||
if((pcb)->flags & TF_ACK_DELAY) { \
|
|
||||||
(pcb)->flags &= ~TF_ACK_DELAY; \
|
|
||||||
(pcb)->flags |= TF_ACK_NOW; \
|
|
||||||
} \
|
|
||||||
else { \
|
|
||||||
(pcb)->flags |= TF_ACK_DELAY; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define tcp_ack_now(pcb) \
|
|
||||||
do { \
|
|
||||||
(pcb)->flags |= TF_ACK_NOW; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
err_t tcp_send_fin(struct tcp_pcb *pcb);
|
|
||||||
err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags);
|
|
||||||
|
|
||||||
void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg);
|
|
||||||
|
|
||||||
void tcp_rst_impl(u32_t seqno, u32_t ackno,
|
|
||||||
ipX_addr_t *local_ip, ipX_addr_t *remote_ip,
|
|
||||||
u16_t local_port, u16_t remote_port
|
|
||||||
#if LWIP_IPV6
|
|
||||||
, u8_t isipv6
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
);
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define tcp_rst(seqno, ackno, local_ip, remote_ip, local_port, remote_port, isipv6) \
|
|
||||||
tcp_rst_impl(seqno, ackno, local_ip, remote_ip, local_port, remote_port, isipv6)
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
#define tcp_rst(seqno, ackno, local_ip, remote_ip, local_port, remote_port, isipv6) \
|
|
||||||
tcp_rst_impl(seqno, ackno, local_ip, remote_ip, local_port, remote_port)
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
u32_t tcp_next_iss(void);
|
|
||||||
|
|
||||||
void tcp_keepalive(struct tcp_pcb *pcb);
|
|
||||||
void tcp_zero_window_probe(struct tcp_pcb *pcb);
|
|
||||||
|
|
||||||
#if TCP_CALCULATE_EFF_SEND_MSS
|
|
||||||
u16_t tcp_eff_send_mss_impl(u16_t sendmss, ipX_addr_t *dest
|
|
||||||
#if LWIP_IPV6
|
|
||||||
, ipX_addr_t *src, u8_t isipv6
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
);
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define tcp_eff_send_mss(sendmss, src, dest, isipv6) tcp_eff_send_mss_impl(sendmss, dest, src, isipv6)
|
|
||||||
#else /* LWIP_IPV6 */
|
|
||||||
#define tcp_eff_send_mss(sendmss, src, dest, isipv6) tcp_eff_send_mss_impl(sendmss, dest)
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
|
|
||||||
|
|
||||||
#if LWIP_CALLBACK_API
|
|
||||||
err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);
|
|
||||||
#endif /* LWIP_CALLBACK_API */
|
|
||||||
|
|
||||||
#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
|
|
||||||
void tcp_debug_print(struct tcp_hdr *tcphdr);
|
|
||||||
void tcp_debug_print_flags(u8_t flags);
|
|
||||||
void tcp_debug_print_state(enum tcp_state s);
|
|
||||||
void tcp_debug_print_pcbs(void);
|
|
||||||
s16_t tcp_pcbs_sane(void);
|
|
||||||
#else
|
|
||||||
# define tcp_debug_print(tcphdr)
|
|
||||||
# define tcp_debug_print_flags(flags)
|
|
||||||
# define tcp_debug_print_state(s)
|
|
||||||
# define tcp_debug_print_pcbs()
|
|
||||||
# define tcp_pcbs_sane() 1
|
|
||||||
#endif /* TCP_DEBUG */
|
|
||||||
|
|
||||||
/** External function (implemented in timers.c), called when TCP detects
|
|
||||||
* that a timer is needed (i.e. active- or time-wait-pcb found). */
|
|
||||||
void tcp_timer_needed(void);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_TCP_H__ */
|
|
|
@ -1,179 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_TCPIP_H__
|
|
||||||
#define __LWIP_TCPIP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if !NO_SYS /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/api_msg.h"
|
|
||||||
#include "lwip/netifapi.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/api.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/timers.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Define this to something that triggers a watchdog. This is called from
|
|
||||||
* tcpip_thread after processing a message. */
|
|
||||||
#ifndef LWIP_TCPIP_THREAD_ALIVE
|
|
||||||
#define LWIP_TCPIP_THREAD_ALIVE()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_TCPIP_CORE_LOCKING
|
|
||||||
/** The global semaphore to lock the stack. */
|
|
||||||
extern sys_mutex_t lock_tcpip_core;
|
|
||||||
#define LOCK_TCPIP_CORE() sys_mutex_lock(&lock_tcpip_core)
|
|
||||||
#define UNLOCK_TCPIP_CORE() sys_mutex_unlock(&lock_tcpip_core)
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
#define TCIP_APIMSG_SET_ERR(m, e) (m)->msg.err = e /* catch functions that don't set err */
|
|
||||||
#else
|
|
||||||
#define TCIP_APIMSG_SET_ERR(m, e)
|
|
||||||
#endif
|
|
||||||
#define TCPIP_APIMSG_NOERR(m,f) do { \
|
|
||||||
TCIP_APIMSG_SET_ERR(m, ERR_VAL); \
|
|
||||||
LOCK_TCPIP_CORE(); \
|
|
||||||
f(&((m)->msg)); \
|
|
||||||
UNLOCK_TCPIP_CORE(); \
|
|
||||||
} while(0)
|
|
||||||
#define TCPIP_APIMSG(m,f,e) do { \
|
|
||||||
TCPIP_APIMSG_NOERR(m,f); \
|
|
||||||
(e) = (m)->msg.err; \
|
|
||||||
} while(0)
|
|
||||||
#define TCPIP_APIMSG_ACK(m)
|
|
||||||
#define TCPIP_NETIFAPI(m) tcpip_netifapi_lock(m)
|
|
||||||
#define TCPIP_NETIFAPI_ACK(m)
|
|
||||||
#else /* LWIP_TCPIP_CORE_LOCKING */
|
|
||||||
#define LOCK_TCPIP_CORE()
|
|
||||||
#define UNLOCK_TCPIP_CORE()
|
|
||||||
#define TCPIP_APIMSG_NOERR(m,f) do { (m)->function = f; tcpip_apimsg(m); } while(0)
|
|
||||||
#define TCPIP_APIMSG(m,f,e) do { (m)->function = f; (e) = tcpip_apimsg(m); } while(0)
|
|
||||||
#define TCPIP_APIMSG_ACK(m) sys_sem_signal(&m->conn->op_completed)
|
|
||||||
#define TCPIP_NETIFAPI(m) tcpip_netifapi(m)
|
|
||||||
#define TCPIP_NETIFAPI_ACK(m) sys_sem_signal(&m->sem)
|
|
||||||
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
|
||||||
|
|
||||||
/** Function prototype for the init_done function passed to tcpip_init */
|
|
||||||
typedef void (*tcpip_init_done_fn)(void *arg);
|
|
||||||
/** Function prototype for functions passed to tcpip_callback() */
|
|
||||||
typedef void (*tcpip_callback_fn)(void *ctx);
|
|
||||||
|
|
||||||
/* Forward declarations */
|
|
||||||
struct tcpip_callback_msg;
|
|
||||||
|
|
||||||
void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg);
|
|
||||||
|
|
||||||
#if LWIP_NETCONN
|
|
||||||
err_t tcpip_apimsg(struct api_msg *apimsg);
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
|
|
||||||
err_t tcpip_input(struct pbuf *p, struct netif *inp);
|
|
||||||
|
|
||||||
#if LWIP_NETIF_API
|
|
||||||
err_t tcpip_netifapi(struct netifapi_msg *netifapimsg);
|
|
||||||
#if LWIP_TCPIP_CORE_LOCKING
|
|
||||||
err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg);
|
|
||||||
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
|
||||||
#endif /* LWIP_NETIF_API */
|
|
||||||
|
|
||||||
err_t tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block);
|
|
||||||
#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1)
|
|
||||||
|
|
||||||
struct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx);
|
|
||||||
void tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg);
|
|
||||||
err_t tcpip_trycallback(struct tcpip_callback_msg* msg);
|
|
||||||
|
|
||||||
/* free pbufs or heap memory from another context without blocking */
|
|
||||||
err_t pbuf_free_callback(struct pbuf *p);
|
|
||||||
err_t mem_free_callback(void *m);
|
|
||||||
|
|
||||||
#if LWIP_TCPIP_TIMEOUT
|
|
||||||
err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg);
|
|
||||||
err_t tcpip_untimeout(sys_timeout_handler h, void *arg);
|
|
||||||
#endif /* LWIP_TCPIP_TIMEOUT */
|
|
||||||
|
|
||||||
enum tcpip_msg_type {
|
|
||||||
#if LWIP_NETCONN
|
|
||||||
TCPIP_MSG_API,
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
TCPIP_MSG_INPKT,
|
|
||||||
#if LWIP_NETIF_API
|
|
||||||
TCPIP_MSG_NETIFAPI,
|
|
||||||
#endif /* LWIP_NETIF_API */
|
|
||||||
#if LWIP_TCPIP_TIMEOUT
|
|
||||||
TCPIP_MSG_TIMEOUT,
|
|
||||||
TCPIP_MSG_UNTIMEOUT,
|
|
||||||
#endif /* LWIP_TCPIP_TIMEOUT */
|
|
||||||
TCPIP_MSG_CALLBACK,
|
|
||||||
TCPIP_MSG_CALLBACK_STATIC
|
|
||||||
};
|
|
||||||
|
|
||||||
struct tcpip_msg {
|
|
||||||
enum tcpip_msg_type type;
|
|
||||||
sys_sem_t *sem;
|
|
||||||
union {
|
|
||||||
#if LWIP_NETCONN
|
|
||||||
struct api_msg *apimsg;
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
#if LWIP_NETIF_API
|
|
||||||
struct netifapi_msg *netifapimsg;
|
|
||||||
#endif /* LWIP_NETIF_API */
|
|
||||||
struct {
|
|
||||||
struct pbuf *p;
|
|
||||||
struct netif *netif;
|
|
||||||
} inp;
|
|
||||||
struct {
|
|
||||||
tcpip_callback_fn function;
|
|
||||||
void *ctx;
|
|
||||||
} cb;
|
|
||||||
#if LWIP_TCPIP_TIMEOUT
|
|
||||||
struct {
|
|
||||||
u32_t msecs;
|
|
||||||
sys_timeout_handler h;
|
|
||||||
void *arg;
|
|
||||||
} tmo;
|
|
||||||
#endif /* LWIP_TCPIP_TIMEOUT */
|
|
||||||
} msg;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !NO_SYS */
|
|
||||||
|
|
||||||
#endif /* __LWIP_TCPIP_H__ */
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
* Simon Goldschmidt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_TIMERS_H__
|
|
||||||
#define __LWIP_TIMERS_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
/* Timers are not supported when NO_SYS==1 and NO_SYS_NO_TIMERS==1 */
|
|
||||||
#define LWIP_TIMERS (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS))
|
|
||||||
|
|
||||||
#if LWIP_TIMERS
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#if !NO_SYS
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LWIP_DEBUG_TIMERNAMES
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG
|
|
||||||
#else /* LWIP_DEBUG */
|
|
||||||
#define LWIP_DEBUG_TIMERNAMES 0
|
|
||||||
#endif /* LWIP_DEBUG*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Function prototype for a timeout callback function. Register such a function
|
|
||||||
* using sys_timeout().
|
|
||||||
*
|
|
||||||
* @param arg Additional argument to pass to the function - set up by sys_timeout()
|
|
||||||
*/
|
|
||||||
typedef void (* sys_timeout_handler)(void *arg);
|
|
||||||
|
|
||||||
struct sys_timeo {
|
|
||||||
struct sys_timeo *next;
|
|
||||||
u32_t time;
|
|
||||||
sys_timeout_handler h;
|
|
||||||
void *arg;
|
|
||||||
#if LWIP_DEBUG_TIMERNAMES
|
|
||||||
const char* handler_name;
|
|
||||||
#endif /* LWIP_DEBUG_TIMERNAMES */
|
|
||||||
};
|
|
||||||
|
|
||||||
void sys_timeouts_init(void);
|
|
||||||
|
|
||||||
#if LWIP_DEBUG_TIMERNAMES
|
|
||||||
void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name);
|
|
||||||
#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler)
|
|
||||||
#else /* LWIP_DEBUG_TIMERNAMES */
|
|
||||||
void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg);
|
|
||||||
#endif /* LWIP_DEBUG_TIMERNAMES */
|
|
||||||
|
|
||||||
void sys_untimeout(sys_timeout_handler handler, void *arg);
|
|
||||||
#if NO_SYS
|
|
||||||
void sys_check_timeouts(void);
|
|
||||||
void sys_restart_timeouts(void);
|
|
||||||
#else /* NO_SYS */
|
|
||||||
void sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg);
|
|
||||||
#endif /* NO_SYS */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_TIMERS */
|
|
||||||
#endif /* __LWIP_TIMERS_H__ */
|
|
|
@ -1,215 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIP_UDP_H__
|
|
||||||
#define __LWIP_UDP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/ip6_addr.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UDP_HLEN 8
|
|
||||||
|
|
||||||
/* Fields are (of course) in network byte order. */
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct udp_hdr {
|
|
||||||
PACK_STRUCT_FIELD(u16_t src);
|
|
||||||
PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */
|
|
||||||
PACK_STRUCT_FIELD(u16_t len);
|
|
||||||
PACK_STRUCT_FIELD(u16_t chksum);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UDP_FLAGS_NOCHKSUM 0x01U
|
|
||||||
#define UDP_FLAGS_UDPLITE 0x02U
|
|
||||||
#define UDP_FLAGS_CONNECTED 0x04U
|
|
||||||
#define UDP_FLAGS_MULTICAST_LOOP 0x08U
|
|
||||||
|
|
||||||
struct udp_pcb;
|
|
||||||
|
|
||||||
/** Function prototype for udp pcb receive callback functions
|
|
||||||
* addr and port are in same byte order as in the pcb
|
|
||||||
* The callback is responsible for freeing the pbuf
|
|
||||||
* if it's not used any more.
|
|
||||||
*
|
|
||||||
* ATTENTION: Be aware that 'addr' points into the pbuf 'p' so freeing this pbuf
|
|
||||||
* makes 'addr' invalid, too.
|
|
||||||
*
|
|
||||||
* @param arg user supplied argument (udp_pcb.recv_arg)
|
|
||||||
* @param pcb the udp_pcb which received data
|
|
||||||
* @param p the packet buffer that was received
|
|
||||||
* @param addr the remote IP address from which the packet was received
|
|
||||||
* @param port the remote port from which the packet was received
|
|
||||||
*/
|
|
||||||
typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
|
|
||||||
ip_addr_t *addr, u16_t port);
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
/** Function prototype for udp pcb IPv6 receive callback functions
|
|
||||||
* The callback is responsible for freeing the pbuf
|
|
||||||
* if it's not used any more.
|
|
||||||
*
|
|
||||||
* @param arg user supplied argument (udp_pcb.recv_arg)
|
|
||||||
* @param pcb the udp_pcb which received data
|
|
||||||
* @param p the packet buffer that was received
|
|
||||||
* @param addr the remote IPv6 address from which the packet was received
|
|
||||||
* @param port the remote port from which the packet was received
|
|
||||||
*/
|
|
||||||
typedef void (*udp_recv_ip6_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
|
|
||||||
ip6_addr_t *addr, u16_t port);
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
#define UDP_PCB_RECV_IP6 udp_recv_ip6_fn ip6;
|
|
||||||
#else
|
|
||||||
#define UDP_PCB_RECV_IP6
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
struct udp_pcb {
|
|
||||||
/* Common members of all PCB types */
|
|
||||||
IP_PCB;
|
|
||||||
|
|
||||||
/* Protocol specific PCB members */
|
|
||||||
|
|
||||||
struct udp_pcb *next;
|
|
||||||
|
|
||||||
u8_t flags;
|
|
||||||
/** ports are in host byte order */
|
|
||||||
u16_t local_port, remote_port;
|
|
||||||
|
|
||||||
#if LWIP_IGMP
|
|
||||||
/** outgoing network interface for multicast packets */
|
|
||||||
ip_addr_t multicast_ip;
|
|
||||||
#endif /* LWIP_IGMP */
|
|
||||||
|
|
||||||
#if LWIP_UDPLITE
|
|
||||||
/** used for UDP_LITE only */
|
|
||||||
u16_t chksum_len_rx, chksum_len_tx;
|
|
||||||
#endif /* LWIP_UDPLITE */
|
|
||||||
|
|
||||||
/** receive callback function */
|
|
||||||
union {
|
|
||||||
udp_recv_fn ip4;
|
|
||||||
UDP_PCB_RECV_IP6
|
|
||||||
}recv;
|
|
||||||
/** user-supplied argument for the recv callback */
|
|
||||||
void *recv_arg;
|
|
||||||
};
|
|
||||||
/* udp_pcbs export for exernal reference (e.g. SNMP agent) */
|
|
||||||
extern struct udp_pcb *udp_pcbs;
|
|
||||||
|
|
||||||
/* The following functions is the application layer interface to the
|
|
||||||
UDP code. */
|
|
||||||
struct udp_pcb * udp_new (void);
|
|
||||||
void udp_remove (struct udp_pcb *pcb);
|
|
||||||
err_t udp_bind (struct udp_pcb *pcb, ip_addr_t *ipaddr,
|
|
||||||
u16_t port);
|
|
||||||
err_t udp_connect (struct udp_pcb *pcb, ip_addr_t *ipaddr,
|
|
||||||
u16_t port);
|
|
||||||
void udp_disconnect (struct udp_pcb *pcb);
|
|
||||||
void udp_recv (struct udp_pcb *pcb, udp_recv_fn recv,
|
|
||||||
void *recv_arg);
|
|
||||||
err_t udp_sendto_if (struct udp_pcb *pcb, struct pbuf *p,
|
|
||||||
ip_addr_t *dst_ip, u16_t dst_port,
|
|
||||||
struct netif *netif);
|
|
||||||
err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p,
|
|
||||||
ip_addr_t *dst_ip, u16_t dst_port);
|
|
||||||
err_t udp_send (struct udp_pcb *pcb, struct pbuf *p);
|
|
||||||
|
|
||||||
#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
|
|
||||||
err_t udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p,
|
|
||||||
ip_addr_t *dst_ip, u16_t dst_port,
|
|
||||||
struct netif *netif, u8_t have_chksum,
|
|
||||||
u16_t chksum);
|
|
||||||
err_t udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p,
|
|
||||||
ip_addr_t *dst_ip, u16_t dst_port,
|
|
||||||
u8_t have_chksum, u16_t chksum);
|
|
||||||
err_t udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,
|
|
||||||
u8_t have_chksum, u16_t chksum);
|
|
||||||
#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
|
|
||||||
|
|
||||||
#define udp_flags(pcb) ((pcb)->flags)
|
|
||||||
#define udp_setflags(pcb, f) ((pcb)->flags = (f))
|
|
||||||
|
|
||||||
/* The following functions are the lower layer interface to UDP. */
|
|
||||||
void udp_input (struct pbuf *p, struct netif *inp);
|
|
||||||
|
|
||||||
void udp_init (void);
|
|
||||||
|
|
||||||
#if LWIP_IPV6
|
|
||||||
struct udp_pcb * udp_new_ip6(void);
|
|
||||||
#define udp_bind_ip6(pcb, ip6addr, port) \
|
|
||||||
udp_bind(pcb, ip6_2_ip(ip6addr), port)
|
|
||||||
#define udp_connect_ip6(pcb, ip6addr, port) \
|
|
||||||
udp_connect(pcb, ip6_2_ip(ip6addr), port)
|
|
||||||
#define udp_recv_ip6(pcb, recv_ip6_fn, recv_arg) \
|
|
||||||
udp_recv(pcb, (udp_recv_fn)recv_ip6_fn, recv_arg)
|
|
||||||
#define udp_sendto_ip6(pcb, pbuf, ip6addr, port) \
|
|
||||||
udp_sendto(pcb, pbuf, ip6_2_ip(ip6addr), port)
|
|
||||||
#define udp_sendto_if_ip6(pcb, pbuf, ip6addr, port, netif) \
|
|
||||||
udp_sendto_if(pcb, pbuf, ip6_2_ip(ip6addr), port, netif)
|
|
||||||
#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
|
|
||||||
#define udp_sendto_chksum_ip6(pcb, pbuf, ip6addr, port, have_chk, chksum) \
|
|
||||||
udp_sendto_chksum(pcb, pbuf, ip6_2_ip(ip6addr), port, have_chk, chksum)
|
|
||||||
#define udp_sendto_if_chksum_ip6(pcb, pbuf, ip6addr, port, netif, have_chk, chksum) \
|
|
||||||
udp_sendto_if_chksum(pcb, pbuf, ip6_2_ip(ip6addr), port, netif, have_chk, chksum)
|
|
||||||
#endif /*LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
|
|
||||||
#endif /* LWIP_IPV6 */
|
|
||||||
|
|
||||||
#if UDP_DEBUG
|
|
||||||
void udp_debug_print(struct udp_hdr *udphdr);
|
|
||||||
#else
|
|
||||||
#define udp_debug_print(udphdr)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LWIP_UDP */
|
|
||||||
|
|
||||||
#endif /* __LWIP_UDP_H__ */
|
|
|
@ -1,224 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
* Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __NETIF_ETHARP_H__
|
|
||||||
#define __NETIF_ETHARP_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ETHARP_HWADDR_LEN
|
|
||||||
#define ETHARP_HWADDR_LEN 6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct eth_addr {
|
|
||||||
PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
/** Ethernet header */
|
|
||||||
struct eth_hdr {
|
|
||||||
#if ETH_PAD_SIZE
|
|
||||||
PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_FIELD(struct eth_addr dest);
|
|
||||||
PACK_STRUCT_FIELD(struct eth_addr src);
|
|
||||||
PACK_STRUCT_FIELD(u16_t type);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
|
|
||||||
|
|
||||||
#if ETHARP_SUPPORT_VLAN
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
/** VLAN header inserted between ethernet header and payload
|
|
||||||
* if 'type' in ethernet header is ETHTYPE_VLAN.
|
|
||||||
* See IEEE802.Q */
|
|
||||||
struct eth_vlan_hdr {
|
|
||||||
PACK_STRUCT_FIELD(u16_t prio_vid);
|
|
||||||
PACK_STRUCT_FIELD(u16_t tpid);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SIZEOF_VLAN_HDR 4
|
|
||||||
#define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF)
|
|
||||||
|
|
||||||
#endif /* ETHARP_SUPPORT_VLAN */
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
/** the ARP message, see RFC 826 ("Packet format") */
|
|
||||||
struct etharp_hdr {
|
|
||||||
PACK_STRUCT_FIELD(u16_t hwtype);
|
|
||||||
PACK_STRUCT_FIELD(u16_t proto);
|
|
||||||
PACK_STRUCT_FIELD(u8_t hwlen);
|
|
||||||
PACK_STRUCT_FIELD(u8_t protolen);
|
|
||||||
PACK_STRUCT_FIELD(u16_t opcode);
|
|
||||||
PACK_STRUCT_FIELD(struct eth_addr shwaddr);
|
|
||||||
PACK_STRUCT_FIELD(struct ip_addr2 sipaddr);
|
|
||||||
PACK_STRUCT_FIELD(struct eth_addr dhwaddr);
|
|
||||||
PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SIZEOF_ETHARP_HDR 28
|
|
||||||
#define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)
|
|
||||||
|
|
||||||
/** 5 seconds period */
|
|
||||||
#define ARP_TMR_INTERVAL 5000
|
|
||||||
|
|
||||||
#define ETHTYPE_ARP 0x0806U
|
|
||||||
#define ETHTYPE_IP 0x0800U
|
|
||||||
#define ETHTYPE_VLAN 0x8100U
|
|
||||||
#define ETHTYPE_IPV6 0x86DDU
|
|
||||||
#define ETHTYPE_PPPOEDISC 0x8863U /* PPP Over Ethernet Discovery Stage */
|
|
||||||
#define ETHTYPE_PPPOE 0x8864U /* PPP Over Ethernet Session Stage */
|
|
||||||
#define ETHTYPE_PAE 0x888e
|
|
||||||
|
|
||||||
/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables
|
|
||||||
* or known to be 32-bit aligned within the protocol header. */
|
|
||||||
#ifndef ETHADDR32_COPY
|
|
||||||
#define ETHADDR32_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local
|
|
||||||
* variables and known to be 16-bit aligned within the protocol header. */
|
|
||||||
#ifndef ETHADDR16_COPY
|
|
||||||
#define ETHADDR16_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
/** ARP message types (opcodes) */
|
|
||||||
#define ARP_REQUEST 1
|
|
||||||
#define ARP_REPLY 2
|
|
||||||
|
|
||||||
/** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type)
|
|
||||||
* to a filter function that returns the correct netif when using multiple
|
|
||||||
* netifs on one hardware interface where the netif's low-level receive
|
|
||||||
* routine cannot decide for the correct netif (e.g. when mapping multiple
|
|
||||||
* IP addresses to one hardware interface).
|
|
||||||
*/
|
|
||||||
#ifndef LWIP_ARP_FILTER_NETIF
|
|
||||||
#define LWIP_ARP_FILTER_NETIF 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARP_QUEUEING
|
|
||||||
/** struct for queueing outgoing packets for unknown address
|
|
||||||
* defined here to be accessed by memp.h
|
|
||||||
*/
|
|
||||||
struct etharp_q_entry {
|
|
||||||
struct etharp_q_entry *next;
|
|
||||||
struct pbuf *p;
|
|
||||||
};
|
|
||||||
#endif /* ARP_QUEUEING */
|
|
||||||
|
|
||||||
#define etharp_init() /* Compatibility define, not init needed. */
|
|
||||||
void etharp_tmr(void);
|
|
||||||
s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
|
|
||||||
struct eth_addr **eth_ret, ip_addr_t **ip_ret);
|
|
||||||
err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr);
|
|
||||||
err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q);
|
|
||||||
err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr);
|
|
||||||
/** For Ethernet network interfaces, we might want to send "gratuitous ARP";
|
|
||||||
* this is an ARP packet sent by a node in order to spontaneously cause other
|
|
||||||
* nodes to update an entry in their ARP cache.
|
|
||||||
* From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */
|
|
||||||
#define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr)
|
|
||||||
void etharp_cleanup_netif(struct netif *netif);
|
|
||||||
|
|
||||||
#if ETHARP_SUPPORT_STATIC_ENTRIES
|
|
||||||
err_t etharp_add_static_entry(ip_addr_t *ipaddr, struct eth_addr *ethaddr);
|
|
||||||
err_t etharp_remove_static_entry(ip_addr_t *ipaddr);
|
|
||||||
#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
|
|
||||||
|
|
||||||
#if LWIP_AUTOIP
|
|
||||||
err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,
|
|
||||||
const struct eth_addr *ethdst_addr,
|
|
||||||
const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr,
|
|
||||||
const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr,
|
|
||||||
const u16_t opcode);
|
|
||||||
#endif /* LWIP_AUTOIP */
|
|
||||||
|
|
||||||
#endif /* LWIP_ARP */
|
|
||||||
|
|
||||||
err_t ethernet_input(struct pbuf *p, struct netif *netif);
|
|
||||||
|
|
||||||
#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0)
|
|
||||||
|
|
||||||
extern const struct eth_addr ethbroadcast, ethzero;
|
|
||||||
|
|
||||||
#endif /* LWIP_ARP || LWIP_ETHERNET */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __NETIF_ARP_H__ */
|
|
|
@ -1,173 +0,0 @@
|
||||||
/* $NetBSD: if_llc.h,v 1.12 1999/11/19 20:41:19 thorpej Exp $ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 1988, 1993
|
|
||||||
* The Regents of the University of California. 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.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
|
|
||||||
*
|
|
||||||
* @(#)if_llc.h 8.1 (Berkeley) 6/10/93
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _NET_IF_LLC_H_
|
|
||||||
#define _NET_IF_LLC_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IEEE 802.2 Link Level Control headers, for use in conjunction with
|
|
||||||
* 802.{3,4,5} media access control methods.
|
|
||||||
*
|
|
||||||
* Headers here do not use bit fields due to shortcommings in many
|
|
||||||
* compilers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct llc {
|
|
||||||
uint8_t llc_dsap;
|
|
||||||
uint8_t llc_ssap;
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
uint8_t control;
|
|
||||||
uint8_t format_id;
|
|
||||||
uint8_t class;
|
|
||||||
uint8_t window_x2;
|
|
||||||
} __packed type_u;
|
|
||||||
struct {
|
|
||||||
uint8_t num_snd_x2;
|
|
||||||
uint8_t num_rcv_x2;
|
|
||||||
} __packed type_i;
|
|
||||||
struct {
|
|
||||||
uint8_t control;
|
|
||||||
uint8_t num_rcv_x2;
|
|
||||||
} __packed type_s;
|
|
||||||
struct {
|
|
||||||
uint8_t control;
|
|
||||||
/*
|
|
||||||
* We cannot put the following fields in a structure because
|
|
||||||
* the structure rounding might cause padding.
|
|
||||||
*/
|
|
||||||
uint8_t frmr_rej_pdu0;
|
|
||||||
uint8_t frmr_rej_pdu1;
|
|
||||||
uint8_t frmr_control;
|
|
||||||
uint8_t frmr_control_ext;
|
|
||||||
uint8_t frmr_cause;
|
|
||||||
} __packed type_frmr;
|
|
||||||
struct {
|
|
||||||
uint8_t control;
|
|
||||||
uint8_t org_code[3];
|
|
||||||
uint16_t ether_type;
|
|
||||||
} __packed type_snap;
|
|
||||||
struct {
|
|
||||||
uint8_t control;
|
|
||||||
uint8_t control_ext;
|
|
||||||
} __packed type_raw;
|
|
||||||
} __packed llc_un;
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
struct frmrinfo {
|
|
||||||
uint8_t frmr_rej_pdu0;
|
|
||||||
uint8_t frmr_rej_pdu1;
|
|
||||||
uint8_t frmr_control;
|
|
||||||
uint8_t frmr_control_ext;
|
|
||||||
uint8_t frmr_cause;
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
#define llc_control llc_un.type_u.control
|
|
||||||
#define llc_control_ext llc_un.type_raw.control_ext
|
|
||||||
#define llc_fid llc_un.type_u.format_id
|
|
||||||
#define llc_class llc_un.type_u.class
|
|
||||||
#define llc_window llc_un.type_u.window_x2
|
|
||||||
#define llc_frmrinfo llc_un.type_frmr.frmr_rej_pdu0
|
|
||||||
#define llc_frmr_pdu0 llc_un.type_frmr.frmr_rej_pdu0
|
|
||||||
#define llc_frmr_pdu1 llc_un.type_frmr.frmr_rej_pdu1
|
|
||||||
#define llc_frmr_control llc_un.type_frmr.frmr_control
|
|
||||||
#define llc_frmr_control_ext llc_un.type_frmr.frmr_control_ext
|
|
||||||
#define llc_frmr_cause llc_un.type_frmr.frmr_cause
|
|
||||||
#define llc_snap llc_un.type_snap
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't use sizeof(struct llc_un) for LLC header sizes
|
|
||||||
*/
|
|
||||||
#define LLC_ISFRAMELEN 4
|
|
||||||
#define LLC_UFRAMELEN 3
|
|
||||||
#define LLC_FRMRLEN 7
|
|
||||||
#define LLC_SNAPFRAMELEN 8
|
|
||||||
|
|
||||||
#ifdef CTASSERT
|
|
||||||
CTASSERT(sizeof (struct llc) == LLC_SNAPFRAMELEN);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unnumbered LLC format commands
|
|
||||||
*/
|
|
||||||
#define LLC_UI 0x3
|
|
||||||
#define LLC_UI_P 0x13
|
|
||||||
#define LLC_DISC 0x43
|
|
||||||
#define LLC_DISC_P 0x53
|
|
||||||
#define LLC_UA 0x63
|
|
||||||
#define LLC_UA_P 0x73
|
|
||||||
#define LLC_TEST 0xe3
|
|
||||||
#define LLC_TEST_P 0xf3
|
|
||||||
#define LLC_FRMR 0x87
|
|
||||||
#define LLC_FRMR_P 0x97
|
|
||||||
#define LLC_DM 0x0f
|
|
||||||
#define LLC_DM_P 0x1f
|
|
||||||
#define LLC_XID 0xaf
|
|
||||||
#define LLC_XID_P 0xbf
|
|
||||||
#define LLC_SABME 0x6f
|
|
||||||
#define LLC_SABME_P 0x7f
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Supervisory LLC commands
|
|
||||||
*/
|
|
||||||
#define LLC_RR 0x01
|
|
||||||
#define LLC_RNR 0x05
|
|
||||||
#define LLC_REJ 0x09
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Info format - dummy only
|
|
||||||
*/
|
|
||||||
#define LLC_INFO 0x00
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ISO PDTR 10178 contains among others
|
|
||||||
*/
|
|
||||||
#define LLC_8021D_LSAP 0x42
|
|
||||||
#define LLC_X25_LSAP 0x7e
|
|
||||||
#define LLC_SNAP_LSAP 0xaa
|
|
||||||
#define LLC_ISO_LSAP 0xfe
|
|
||||||
|
|
||||||
#define RFC1042_LEN 6
|
|
||||||
#define RFC1042 {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00}
|
|
||||||
#define ETHERNET_TUNNEL {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* copied from sys/net/ethernet.h
|
|
||||||
*/
|
|
||||||
#define ETHERTYPE_AARP 0x80F3 /* AppleTalk AARP */
|
|
||||||
#define ETHERTYPE_IPX 0x8137 /* Novell (old) NetWare IPX (ECONFIG E option) */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NET_IF_LLC_H_ */
|
|
|
@ -1,190 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
* ppp_oe.h - PPP Over Ethernet implementation for lwIP.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc.
|
|
||||||
*
|
|
||||||
* The authors hereby grant permission to use, copy, modify, distribute,
|
|
||||||
* and license this software and its documentation for any purpose, provided
|
|
||||||
* that existing copyright notices are retained in all copies and that this
|
|
||||||
* notice and the following disclaimer are included verbatim in any
|
|
||||||
* distributions. No written agreement, license, or royalty fee is required
|
|
||||||
* for any of the authorized uses.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *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 CONTRIBUTORS 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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* REVISION HISTORY
|
|
||||||
*
|
|
||||||
* 06-01-01 Marc Boucher <marc@mbsi.ca>
|
|
||||||
* Ported to lwIP.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2002 The NetBSD Foundation, Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This code is derived from software contributed to The NetBSD Foundation
|
|
||||||
* by Martin Husemann <martin@NetBSD.org>.
|
|
||||||
*
|
|
||||||
* 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. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by the NetBSD
|
|
||||||
* Foundation, Inc. and its contributors.
|
|
||||||
* 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived
|
|
||||||
* from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
||||||
* ``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 FOUNDATION OR CONTRIBUTORS
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
#ifndef PPP_OE_H
|
|
||||||
#define PPP_OE_H
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if PPPOE_SUPPORT > 0
|
|
||||||
|
|
||||||
#include "netif/etharp.h"
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct pppoehdr {
|
|
||||||
PACK_STRUCT_FIELD(u8_t vertype);
|
|
||||||
PACK_STRUCT_FIELD(u8_t code);
|
|
||||||
PACK_STRUCT_FIELD(u16_t session);
|
|
||||||
PACK_STRUCT_FIELD(u16_t plen);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct pppoetag {
|
|
||||||
PACK_STRUCT_FIELD(u16_t tag);
|
|
||||||
PACK_STRUCT_FIELD(u16_t len);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define PPPOE_STATE_INITIAL 0
|
|
||||||
#define PPPOE_STATE_PADI_SENT 1
|
|
||||||
#define PPPOE_STATE_PADR_SENT 2
|
|
||||||
#define PPPOE_STATE_SESSION 3
|
|
||||||
#define PPPOE_STATE_CLOSING 4
|
|
||||||
/* passive */
|
|
||||||
#define PPPOE_STATE_PADO_SENT 1
|
|
||||||
|
|
||||||
#define PPPOE_HEADERLEN sizeof(struct pppoehdr)
|
|
||||||
#define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */
|
|
||||||
|
|
||||||
#define PPPOE_TAG_EOL 0x0000 /* end of list */
|
|
||||||
#define PPPOE_TAG_SNAME 0x0101 /* service name */
|
|
||||||
#define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */
|
|
||||||
#define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */
|
|
||||||
#define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */
|
|
||||||
#define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */
|
|
||||||
#define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */
|
|
||||||
#define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */
|
|
||||||
#define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */
|
|
||||||
#define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */
|
|
||||||
|
|
||||||
#define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */
|
|
||||||
#define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */
|
|
||||||
#define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */
|
|
||||||
#define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */
|
|
||||||
#define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */
|
|
||||||
|
|
||||||
#ifndef ETHERMTU
|
|
||||||
#define ETHERMTU 1500
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* two byte PPP protocol discriminator, then IP data */
|
|
||||||
#define PPPOE_MAXMTU (ETHERMTU-PPPOE_HEADERLEN-2)
|
|
||||||
|
|
||||||
#ifndef PPPOE_MAX_AC_COOKIE_LEN
|
|
||||||
#define PPPOE_MAX_AC_COOKIE_LEN 64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct pppoe_softc {
|
|
||||||
struct pppoe_softc *next;
|
|
||||||
struct netif *sc_ethif; /* ethernet interface we are using */
|
|
||||||
int sc_pd; /* ppp unit number */
|
|
||||||
void (*sc_linkStatusCB)(int pd, int up);
|
|
||||||
|
|
||||||
int sc_state; /* discovery phase or session connected */
|
|
||||||
struct eth_addr sc_dest; /* hardware address of concentrator */
|
|
||||||
u16_t sc_session; /* PPPoE session id */
|
|
||||||
|
|
||||||
#ifdef PPPOE_TODO
|
|
||||||
char *sc_service_name; /* if != NULL: requested name of service */
|
|
||||||
char *sc_concentrator_name; /* if != NULL: requested concentrator id */
|
|
||||||
#endif /* PPPOE_TODO */
|
|
||||||
u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */
|
|
||||||
size_t sc_ac_cookie_len; /* length of cookie data */
|
|
||||||
#ifdef PPPOE_SERVER
|
|
||||||
u8_t *sc_hunique; /* content of host unique we must echo back */
|
|
||||||
size_t sc_hunique_len; /* length of host unique */
|
|
||||||
#endif
|
|
||||||
int sc_padi_retried; /* number of PADI retries already done */
|
|
||||||
int sc_padr_retried; /* number of PADR retries already done */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define pppoe_init() /* compatibility define, no initialization needed */
|
|
||||||
|
|
||||||
err_t pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr);
|
|
||||||
err_t pppoe_destroy(struct netif *ifp);
|
|
||||||
|
|
||||||
int pppoe_connect(struct pppoe_softc *sc);
|
|
||||||
void pppoe_disconnect(struct pppoe_softc *sc);
|
|
||||||
|
|
||||||
void pppoe_disc_input(struct netif *netif, struct pbuf *p);
|
|
||||||
void pppoe_data_input(struct netif *netif, struct pbuf *p);
|
|
||||||
|
|
||||||
err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb);
|
|
||||||
|
|
||||||
/** used in ppp.c */
|
|
||||||
#define PPPOE_HDRLEN (sizeof(struct eth_hdr) + PPPOE_HEADERLEN)
|
|
||||||
|
|
||||||
#endif /* PPPOE_SUPPORT */
|
|
||||||
|
|
||||||
#endif /* PPP_OE_H */
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001, 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. Neither the name of the Institute nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE OR CONTRIBUTORS 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __NETIF_SLIPIF_H__
|
|
||||||
#define __NETIF_SLIPIF_H__
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
/** Set this to 1 to start a thread that blocks reading on the serial line
|
|
||||||
* (using sio_read()).
|
|
||||||
*/
|
|
||||||
#ifndef SLIP_USE_RX_THREAD
|
|
||||||
#define SLIP_USE_RX_THREAD !NO_SYS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Set this to 1 to enable functions to pass in RX bytes from ISR context.
|
|
||||||
* If enabled, slipif_received_byte[s]() process incoming bytes and put assembled
|
|
||||||
* packets on a queue, which is fed into lwIP from slipif_poll().
|
|
||||||
* If disabled, slipif_poll() polls the serila line (using sio_tryread()).
|
|
||||||
*/
|
|
||||||
#ifndef SLIP_RX_FROM_ISR
|
|
||||||
#define SLIP_RX_FROM_ISR 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Set this to 1 (default for SLIP_RX_FROM_ISR) to queue incoming packets
|
|
||||||
* received by slipif_received_byte[s]() as long as PBUF_POOL pbufs are available.
|
|
||||||
* If disabled, packets will be dropped if more than one packet is received.
|
|
||||||
*/
|
|
||||||
#ifndef SLIP_RX_QUEUE
|
|
||||||
#define SLIP_RX_QUEUE SLIP_RX_FROM_ISR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
err_t slipif_init(struct netif * netif);
|
|
||||||
void slipif_poll(struct netif *netif);
|
|
||||||
#if SLIP_RX_FROM_ISR
|
|
||||||
void slipif_process_rxqueue(struct netif *netif);
|
|
||||||
void slipif_received_byte(struct netif *netif, u8_t data);
|
|
||||||
void slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len);
|
|
||||||
#endif /* SLIP_RX_FROM_ISR */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010-2011 Espressif System
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WLAN_LWIP_IF_H_
|
|
||||||
#define _WLAN_LWIP_IF_H_
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
err_t ethernetif_init(struct netif *netif);
|
|
||||||
void ethernetif_input(struct netif *netif, struct pbuf *p);
|
|
||||||
|
|
||||||
#ifndef IOT_SIP_MODE
|
|
||||||
sint8 ieee80211_output_pbuf(struct netif *ifp, struct pbuf* pb);
|
|
||||||
#else
|
|
||||||
sint8 ieee80211_output_pbuf(struct ieee80211_conn *conn, esf_buf *eb);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _WLAN_LWIP_IF_H_ */
|
|
|
@ -1,33 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* This file is a posix wrapper for lwip/netdb.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/netdb.h"
|
|
|
@ -1,33 +0,0 @@
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* This file is a posix wrapper for lwip/sockets.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/sockets.h"
|
|
|
@ -73,7 +73,7 @@ struct server_config_t {
|
||||||
|
|
||||||
|
|
||||||
typedef uint32_t leasetime_t;
|
typedef uint32_t leasetime_t;
|
||||||
typedef sint32_t signed_leasetime_t;
|
typedef int32_t signed_leasetime_t;
|
||||||
|
|
||||||
struct dyn_lease {
|
struct dyn_lease {
|
||||||
/* Unix time when lease expires. Kept in memory in host order.
|
/* Unix time when lease expires. Kept in memory in host order.
|
||||||
|
|
BIN
lib/liblwip.a
BIN
lib/liblwip.a
Binary file not shown.
15
lwip/component.mk
Normal file
15
lwip/component.mk
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Component makefile for LWIP
|
||||||
|
|
||||||
|
LWIP_DIR = $(ROOT)lwip/lwip/src/
|
||||||
|
INC_DIRS += $(LWIP_DIR)/include $(ROOT)/lwip/include $(ROOT)lwip/include $(LWIP_DIR)include/ipv4 $(LWIP_DIR)include/ipv4/lwip
|
||||||
|
|
||||||
|
# args for passing into compile rule generation
|
||||||
|
lwip_ROOT = $(ROOT)/lwip
|
||||||
|
lwip_INC_DIR = # all in INC_DIRS, needed for normal operation
|
||||||
|
lwip_SRC_DIR = $(ROOT)/lwip $(LWIP_DIR)api $(LWIP_DIR)core $(LWIP_DIR)core/ipv4 $(LWIP_DIR)netif
|
||||||
|
|
||||||
|
# LWIP 1.4.1 generates a single warning so we need to disable -Werror when building it
|
||||||
|
lwip_CFLAGS = $(subst -Werror,,$(CFLAGS))
|
||||||
|
|
||||||
|
$(eval $(call component_compile_rules,lwip))
|
||||||
|
|
16
lwip/esp_interface.c
Normal file
16
lwip/esp_interface.c
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/* LWIP interface to the ESP SDK MAC layer
|
||||||
|
|
||||||
|
These two symbols are called from libnet80211.a
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* called from hostap_input... less clear what this is for! */
|
||||||
|
void ethernetif_init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called from ieee80211_deliver_data with new IP frames */
|
||||||
|
void ethernetif_input(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
1
lwip/include/arch/bpstruct.h
Normal file
1
lwip/include/arch/bpstruct.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#pragma pack(push,1)
|
87
lwip/include/arch/cc.h
Normal file
87
lwip/include/arch/cc.h
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2003 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __ARCH_CC_H__
|
||||||
|
#define __ARCH_CC_H__
|
||||||
|
|
||||||
|
/* Include some files for defining library routines */
|
||||||
|
#include <stdio.h> /* printf, fflush, FILE */
|
||||||
|
#include <stdlib.h> /* abort */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
|
||||||
|
/** @todo fix some warnings: don't use #pragma if compiling with cygwin gcc */
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#include <limits.h>
|
||||||
|
#pragma warning (disable: 4244) /* disable conversion warning (implicit integer promotion!) */
|
||||||
|
#pragma warning (disable: 4127) /* conditional expression is constant */
|
||||||
|
#pragma warning (disable: 4996) /* 'strncpy' was declared deprecated */
|
||||||
|
#pragma warning (disable: 4103) /* structure packing changed by including file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LWIP_PROVIDE_ERRNO
|
||||||
|
|
||||||
|
/* Define generic types used in lwIP */
|
||||||
|
typedef uint8_t u8_t;
|
||||||
|
typedef int8_t s8_t;
|
||||||
|
typedef uint16_t u16_t;
|
||||||
|
typedef int16_t s16_t;
|
||||||
|
typedef uint32_t u32_t;
|
||||||
|
typedef int32_t s32_t;
|
||||||
|
|
||||||
|
typedef size_t mem_ptr_t;
|
||||||
|
typedef u32_t sys_prot_t;
|
||||||
|
|
||||||
|
/* Define (sn)printf formatters for these lwIP types */
|
||||||
|
#define X8_F "02x"
|
||||||
|
#define U16_F "hu"
|
||||||
|
#define S16_F "hd"
|
||||||
|
#define X16_F "hx"
|
||||||
|
#define U32_F "lu"
|
||||||
|
#define S32_F "ld"
|
||||||
|
#define X32_F "lx"
|
||||||
|
#define SZT_F U32_F
|
||||||
|
|
||||||
|
/* Compiler hints for packing structures */
|
||||||
|
#define PACK_STRUCT_STRUCT __attribute__( (packed) )
|
||||||
|
|
||||||
|
/* Plaform specific diagnostic output */
|
||||||
|
#define LWIP_PLATFORM_DIAG(x) do { printf x; } while(0)
|
||||||
|
|
||||||
|
#define LWIP_PLATFORM_ASSERT(x) do { printf("Assertion \"%s\" failed at line %d in %s\n", \
|
||||||
|
x, __LINE__, __FILE__); while(1) {} } while(0)
|
||||||
|
|
||||||
|
#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
|
||||||
|
printf("Assertion \"%s\" failed at line %d in %s\n", message, __LINE__, __FILE__); \
|
||||||
|
handler;} } while(0)
|
||||||
|
|
||||||
|
#endif /* __ARCH_CC_H__ */
|
|
@ -29,14 +29,17 @@
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#ifndef __ARCH_SYS_ARCH_H__
|
||||||
|
#define __ARCH_SYS_ARCH_H__
|
||||||
|
|
||||||
#ifndef __SYS_ARCH_H__
|
#include "FreeRTOS.h"
|
||||||
#define __SYS_ARCH_H__
|
#include "task.h"
|
||||||
|
#include "queue.h"
|
||||||
|
#include "semphr.h"
|
||||||
|
|
||||||
#include "freertos/FreeRTOS.h"
|
#define SYS_MBOX_NULL ( ( xQueueHandle ) NULL )
|
||||||
#include "freertos/task.h"
|
#define SYS_SEM_NULL ( ( xSemaphoreHandle ) NULL )
|
||||||
#include "freertos/queue.h"
|
#define SYS_DEFAULT_THREAD_STACK_DEPTH configMINIMAL_STACK_SIZE
|
||||||
#include "freertos/semphr.h"
|
|
||||||
|
|
||||||
typedef xSemaphoreHandle sys_sem_t;
|
typedef xSemaphoreHandle sys_sem_t;
|
||||||
typedef xSemaphoreHandle sys_mutex_t;
|
typedef xSemaphoreHandle sys_mutex_t;
|
||||||
|
@ -48,7 +51,6 @@ typedef xTaskHandle sys_thread_t;
|
||||||
#define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
|
#define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
|
||||||
#define sys_sem_set_invalid( x ) ( ( *x ) = NULL )
|
#define sys_sem_set_invalid( x ) ( ( *x ) = NULL )
|
||||||
|
|
||||||
#define LWIP_COMPAT_MUTEX 0
|
|
||||||
|
|
||||||
#endif /* __SYS_ARCH_H__ */
|
#endif /* __ARCH_SYS_ARCH_H__ */
|
||||||
|
|
|
@ -184,9 +184,7 @@
|
||||||
* LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS
|
* LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS
|
||||||
* transport.
|
* transport.
|
||||||
*/
|
*/
|
||||||
#ifndef LWIP_DNS
|
|
||||||
#define LWIP_DNS 1
|
#define LWIP_DNS 1
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
---------------------------------
|
---------------------------------
|
1
lwip/lwip
Submodule
1
lwip/lwip
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 5b8b5d459e7dd890724515bbfad86c705234f9ec
|
585
lwip/sys_arch.c
Normal file
585
lwip/sys_arch.c
Normal file
|
@ -0,0 +1,585 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2003 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
// Include OS functionality.
|
||||||
|
//
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
/* ------------------------ System architecture includes ----------------------------- */
|
||||||
|
#include "arch/sys_arch.h"
|
||||||
|
|
||||||
|
/* ------------------------ lwIP includes --------------------------------- */
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/debug.h"
|
||||||
|
#include "lwip/def.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/mem.h"
|
||||||
|
#include "lwip/stats.h"
|
||||||
|
|
||||||
|
/* Very crude mechanism used to determine if the critical section handling
|
||||||
|
functions are being called from an interrupt context or not. This relies on
|
||||||
|
the interrupt handler setting this variable manually. */
|
||||||
|
portBASE_TYPE xInsideISR = pdFALSE;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_mbox_new
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Creates a new mailbox
|
||||||
|
* Inputs:
|
||||||
|
* int size -- Size of elements in the mailbox
|
||||||
|
* Outputs:
|
||||||
|
* sys_mbox_t -- Handle to new mailbox
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
|
||||||
|
{
|
||||||
|
err_t xReturn = ERR_MEM;
|
||||||
|
|
||||||
|
*pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
|
||||||
|
|
||||||
|
if( *pxMailBox != NULL )
|
||||||
|
{
|
||||||
|
xReturn = ERR_OK;
|
||||||
|
SYS_STATS_INC_USED( mbox );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_mbox_free
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Deallocates a mailbox. If there are messages still present in the
|
||||||
|
* mailbox when the mailbox is deallocated, it is an indication of a
|
||||||
|
* programming error in lwIP and the developer should be notified.
|
||||||
|
* Inputs:
|
||||||
|
* sys_mbox_t mbox -- Handle of mailbox
|
||||||
|
* Outputs:
|
||||||
|
* sys_mbox_t -- Handle to new mailbox
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void sys_mbox_free( sys_mbox_t *pxMailBox )
|
||||||
|
{
|
||||||
|
unsigned long ulMessagesWaiting;
|
||||||
|
|
||||||
|
ulMessagesWaiting = uxQueueMessagesWaiting( *pxMailBox );
|
||||||
|
configASSERT( ( ulMessagesWaiting == 0 ) );
|
||||||
|
|
||||||
|
#if SYS_STATS
|
||||||
|
{
|
||||||
|
if( ulMessagesWaiting != 0UL )
|
||||||
|
{
|
||||||
|
SYS_STATS_INC( mbox.err );
|
||||||
|
}
|
||||||
|
|
||||||
|
SYS_STATS_DEC( mbox.used );
|
||||||
|
}
|
||||||
|
#endif /* SYS_STATS */
|
||||||
|
|
||||||
|
vQueueDelete( *pxMailBox );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_mbox_post
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Post the "msg" to the mailbox.
|
||||||
|
* Inputs:
|
||||||
|
* sys_mbox_t mbox -- Handle of mailbox
|
||||||
|
* void *data -- Pointer to data to post
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void sys_mbox_post( sys_mbox_t *pxMailBox, void *pxMessageToPost )
|
||||||
|
{
|
||||||
|
while( xQueueSendToBack( *pxMailBox, &pxMessageToPost, portMAX_DELAY ) != pdTRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_mbox_trypost
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Try to post the "msg" to the mailbox. Returns immediately with
|
||||||
|
* error if cannot.
|
||||||
|
* Inputs:
|
||||||
|
* sys_mbox_t mbox -- Handle of mailbox
|
||||||
|
* void *msg -- Pointer to data to post
|
||||||
|
* Outputs:
|
||||||
|
* err_t -- ERR_OK if message posted, else ERR_MEM
|
||||||
|
* if not.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
|
||||||
|
{
|
||||||
|
err_t xReturn;
|
||||||
|
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
|
||||||
|
if( xInsideISR != pdFALSE )
|
||||||
|
{
|
||||||
|
xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xReturn = xQueueSend( *pxMailBox, &pxMessageToPost, ( portTickType ) 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( xReturn == pdPASS )
|
||||||
|
{
|
||||||
|
xReturn = ERR_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The queue was already full. */
|
||||||
|
xReturn = ERR_MEM;
|
||||||
|
SYS_STATS_INC( mbox.err );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_arch_mbox_fetch
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Blocks the thread until a message arrives in the mailbox, but does
|
||||||
|
* not block the thread longer than "timeout" milliseconds (similar to
|
||||||
|
* the sys_arch_sem_wait() function). The "msg" argument is a result
|
||||||
|
* parameter that is set by the function (i.e., by doing "*msg =
|
||||||
|
* ptr"). The "msg" parameter maybe NULL to indicate that the message
|
||||||
|
* should be dropped.
|
||||||
|
*
|
||||||
|
* The return values are the same as for the sys_arch_sem_wait() function:
|
||||||
|
* Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a
|
||||||
|
* timeout.
|
||||||
|
*
|
||||||
|
* Note that a function with a similar name, sys_mbox_fetch(), is
|
||||||
|
* implemented by lwIP.
|
||||||
|
* Inputs:
|
||||||
|
* sys_mbox_t mbox -- Handle of mailbox
|
||||||
|
* void **msg -- Pointer to pointer to msg received
|
||||||
|
* u32_t timeout -- Number of milliseconds until timeout
|
||||||
|
* Outputs:
|
||||||
|
* u32_t -- SYS_ARCH_TIMEOUT if timeout, else number
|
||||||
|
* of milliseconds until received.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u32_t sys_arch_mbox_fetch( sys_mbox_t *pxMailBox, void **ppvBuffer, u32_t ulTimeOut )
|
||||||
|
{
|
||||||
|
void *pvDummy;
|
||||||
|
portTickType xStartTime, xEndTime, xElapsed;
|
||||||
|
unsigned long ulReturn;
|
||||||
|
|
||||||
|
xStartTime = xTaskGetTickCount();
|
||||||
|
|
||||||
|
if( NULL == ppvBuffer )
|
||||||
|
{
|
||||||
|
ppvBuffer = &pvDummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ulTimeOut != 0UL )
|
||||||
|
{
|
||||||
|
configASSERT( xInsideISR == ( portBASE_TYPE ) 0 );
|
||||||
|
|
||||||
|
if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), ulTimeOut/ portTICK_RATE_MS ) )
|
||||||
|
{
|
||||||
|
xEndTime = xTaskGetTickCount();
|
||||||
|
xElapsed = ( xEndTime - xStartTime ) * portTICK_RATE_MS;
|
||||||
|
|
||||||
|
ulReturn = xElapsed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Timed out. */
|
||||||
|
*ppvBuffer = NULL;
|
||||||
|
ulReturn = SYS_ARCH_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while( pdTRUE != xQueueReceive( *pxMailBox, &( *ppvBuffer ), portMAX_DELAY ) );
|
||||||
|
xEndTime = xTaskGetTickCount();
|
||||||
|
xElapsed = ( xEndTime - xStartTime ) * portTICK_RATE_MS;
|
||||||
|
|
||||||
|
if( xElapsed == 0UL )
|
||||||
|
{
|
||||||
|
xElapsed = 1UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ulReturn = xElapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ulReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_arch_mbox_tryfetch
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Similar to sys_arch_mbox_fetch, but if message is not ready
|
||||||
|
* immediately, we'll return with SYS_MBOX_EMPTY. On success, 0 is
|
||||||
|
* returned.
|
||||||
|
* Inputs:
|
||||||
|
* sys_mbox_t mbox -- Handle of mailbox
|
||||||
|
* void **msg -- Pointer to pointer to msg received
|
||||||
|
* Outputs:
|
||||||
|
* u32_t -- SYS_MBOX_EMPTY if no messages. Otherwise,
|
||||||
|
* return ERR_OK.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u32_t sys_arch_mbox_tryfetch( sys_mbox_t *pxMailBox, void **ppvBuffer )
|
||||||
|
{
|
||||||
|
void *pvDummy;
|
||||||
|
unsigned long ulReturn;
|
||||||
|
long lResult;
|
||||||
|
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
|
||||||
|
if( ppvBuffer== NULL )
|
||||||
|
{
|
||||||
|
ppvBuffer = &pvDummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( xInsideISR != pdFALSE )
|
||||||
|
{
|
||||||
|
lResult = xQueueReceiveFromISR( *pxMailBox, &( *ppvBuffer ), &xHigherPriorityTaskWoken );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lResult = xQueueReceive( *pxMailBox, &( *ppvBuffer ), 0UL );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( lResult == pdPASS )
|
||||||
|
{
|
||||||
|
ulReturn = ERR_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ulReturn = SYS_MBOX_EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ulReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_sem_new
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Creates and returns a new semaphore. The "ucCount" argument specifies
|
||||||
|
* the initial state of the semaphore.
|
||||||
|
* NOTE: Currently this routine only creates counts of 1 or 0
|
||||||
|
* Inputs:
|
||||||
|
* sys_mbox_t mbox -- Handle of mailbox
|
||||||
|
* u8_t ucCount -- Initial ucCount of semaphore (1 or 0)
|
||||||
|
* Outputs:
|
||||||
|
* sys_sem_t -- Created semaphore or 0 if could not create.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
err_t sys_sem_new( sys_sem_t *pxSemaphore, u8_t ucCount )
|
||||||
|
{
|
||||||
|
err_t xReturn = ERR_MEM;
|
||||||
|
|
||||||
|
vSemaphoreCreateBinary( ( *pxSemaphore ) );
|
||||||
|
|
||||||
|
if( *pxSemaphore != NULL )
|
||||||
|
{
|
||||||
|
if( ucCount == 0U )
|
||||||
|
{
|
||||||
|
xSemaphoreTake( *pxSemaphore, 1UL );
|
||||||
|
}
|
||||||
|
|
||||||
|
xReturn = ERR_OK;
|
||||||
|
SYS_STATS_INC_USED( sem );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SYS_STATS_INC( sem.err );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_arch_sem_wait
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Blocks the thread while waiting for the semaphore to be
|
||||||
|
* signaled. If the "timeout" argument is non-zero, the thread should
|
||||||
|
* only be blocked for the specified time (measured in
|
||||||
|
* milliseconds).
|
||||||
|
*
|
||||||
|
* If the timeout argument is non-zero, the return value is the number of
|
||||||
|
* milliseconds spent waiting for the semaphore to be signaled. If the
|
||||||
|
* semaphore wasn't signaled within the specified time, the return value is
|
||||||
|
* SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore
|
||||||
|
* (i.e., it was already signaled), the function may return zero.
|
||||||
|
*
|
||||||
|
* Notice that lwIP implements a function with a similar name,
|
||||||
|
* sys_sem_wait(), that uses the sys_arch_sem_wait() function.
|
||||||
|
* Inputs:
|
||||||
|
* sys_sem_t sem -- Semaphore to wait on
|
||||||
|
* u32_t timeout -- Number of milliseconds until timeout
|
||||||
|
* Outputs:
|
||||||
|
* u32_t -- Time elapsed or SYS_ARCH_TIMEOUT.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u32_t sys_arch_sem_wait( sys_sem_t *pxSemaphore, u32_t ulTimeout )
|
||||||
|
{
|
||||||
|
portTickType xStartTime, xEndTime, xElapsed;
|
||||||
|
unsigned long ulReturn;
|
||||||
|
|
||||||
|
xStartTime = xTaskGetTickCount();
|
||||||
|
|
||||||
|
if( ulTimeout != 0UL )
|
||||||
|
{
|
||||||
|
if( xSemaphoreTake( *pxSemaphore, ulTimeout / portTICK_RATE_MS ) == pdTRUE )
|
||||||
|
{
|
||||||
|
xEndTime = xTaskGetTickCount();
|
||||||
|
xElapsed = (xEndTime - xStartTime) * portTICK_RATE_MS;
|
||||||
|
ulReturn = xElapsed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ulReturn = SYS_ARCH_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while( xSemaphoreTake( *pxSemaphore, portMAX_DELAY ) != pdTRUE );
|
||||||
|
xEndTime = xTaskGetTickCount();
|
||||||
|
xElapsed = ( xEndTime - xStartTime ) * portTICK_RATE_MS;
|
||||||
|
|
||||||
|
if( xElapsed == 0UL )
|
||||||
|
{
|
||||||
|
xElapsed = 1UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ulReturn = xElapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ulReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create a new mutex
|
||||||
|
* @param mutex pointer to the mutex to create
|
||||||
|
* @return a new mutex */
|
||||||
|
err_t sys_mutex_new( sys_mutex_t *pxMutex )
|
||||||
|
{
|
||||||
|
err_t xReturn = ERR_MEM;
|
||||||
|
|
||||||
|
*pxMutex = xSemaphoreCreateMutex();
|
||||||
|
|
||||||
|
if( *pxMutex != NULL )
|
||||||
|
{
|
||||||
|
xReturn = ERR_OK;
|
||||||
|
SYS_STATS_INC_USED( mutex );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SYS_STATS_INC( mutex.err );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Lock a mutex
|
||||||
|
* @param mutex the mutex to lock */
|
||||||
|
void sys_mutex_lock( sys_mutex_t *pxMutex )
|
||||||
|
{
|
||||||
|
while( xSemaphoreTake( *pxMutex, portMAX_DELAY ) != pdPASS );
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Unlock a mutex
|
||||||
|
* @param mutex the mutex to unlock */
|
||||||
|
void sys_mutex_unlock(sys_mutex_t *pxMutex )
|
||||||
|
{
|
||||||
|
xSemaphoreGive( *pxMutex );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Delete a semaphore
|
||||||
|
* @param mutex the mutex to delete */
|
||||||
|
void sys_mutex_free( sys_mutex_t *pxMutex )
|
||||||
|
{
|
||||||
|
SYS_STATS_DEC( mutex.used );
|
||||||
|
vQueueDelete( *pxMutex );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_sem_signal
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Signals (releases) a semaphore
|
||||||
|
* Inputs:
|
||||||
|
* sys_sem_t sem -- Semaphore to signal
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void sys_sem_signal( sys_sem_t *pxSemaphore )
|
||||||
|
{
|
||||||
|
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
|
||||||
|
if( xInsideISR != pdFALSE )
|
||||||
|
{
|
||||||
|
xSemaphoreGiveFromISR( *pxSemaphore, &xHigherPriorityTaskWoken );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xSemaphoreGive( *pxSemaphore );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_sem_free
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Deallocates a semaphore
|
||||||
|
* Inputs:
|
||||||
|
* sys_sem_t sem -- Semaphore to free
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void sys_sem_free( sys_sem_t *pxSemaphore )
|
||||||
|
{
|
||||||
|
SYS_STATS_DEC(sem.used);
|
||||||
|
vQueueDelete( *pxSemaphore );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_init
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Initialize sys arch
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void sys_init(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
u32_t sys_now(void)
|
||||||
|
{
|
||||||
|
return xTaskGetTickCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_thread_new
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* Starts a new thread with priority "prio" that will begin its
|
||||||
|
* execution in the function "thread()". The "arg" argument will be
|
||||||
|
* passed as an argument to the thread() function. The id of the new
|
||||||
|
* thread is returned. Both the id and the priority are system
|
||||||
|
* dependent.
|
||||||
|
* Inputs:
|
||||||
|
* char *name -- Name of thread
|
||||||
|
* void (* thread)(void *arg) -- Pointer to function to run.
|
||||||
|
* void *arg -- Argument passed into function
|
||||||
|
* int stacksize -- Required stack amount in bytes
|
||||||
|
* int prio -- Thread priority
|
||||||
|
* Outputs:
|
||||||
|
* sys_thread_t -- Pointer to per-thread timeouts.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
|
||||||
|
{
|
||||||
|
xTaskHandle xCreatedTask;
|
||||||
|
portBASE_TYPE xResult;
|
||||||
|
sys_thread_t xReturn;
|
||||||
|
|
||||||
|
xResult = xTaskCreate( pxThread, ( signed char * ) pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
|
||||||
|
|
||||||
|
if( xResult == pdPASS )
|
||||||
|
{
|
||||||
|
xReturn = xCreatedTask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xReturn = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_arch_protect
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* This optional function does a "fast" critical region protection and
|
||||||
|
* returns the previous protection level. This function is only called
|
||||||
|
* during very short critical regions. An embedded system which supports
|
||||||
|
* ISR-based drivers might want to implement this function by disabling
|
||||||
|
* interrupts. Task-based systems might want to implement this by using
|
||||||
|
* a mutex or disabling tasking. This function should support recursive
|
||||||
|
* calls from the same task or interrupt. In other words,
|
||||||
|
* sys_arch_protect() could be called while already protected. In
|
||||||
|
* that case the return value indicates that it is already protected.
|
||||||
|
*
|
||||||
|
* sys_arch_protect() is only required if your port is supporting an
|
||||||
|
* operating system.
|
||||||
|
* Outputs:
|
||||||
|
* sys_prot_t -- Previous protection level (not used here)
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
sys_prot_t sys_arch_protect( void )
|
||||||
|
{
|
||||||
|
if( xInsideISR == pdFALSE )
|
||||||
|
{
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
}
|
||||||
|
return ( sys_prot_t ) 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Routine: sys_arch_unprotect
|
||||||
|
*---------------------------------------------------------------------------*
|
||||||
|
* Description:
|
||||||
|
* This optional function does a "fast" set of critical region
|
||||||
|
* protection to the value specified by pval. See the documentation for
|
||||||
|
* sys_arch_protect() for more information. This function is only
|
||||||
|
* required if your port is supporting an operating system.
|
||||||
|
* Inputs:
|
||||||
|
* sys_prot_t -- Previous protection level (not used here)
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void sys_arch_unprotect( sys_prot_t xValue )
|
||||||
|
{
|
||||||
|
(void) xValue;
|
||||||
|
if( xInsideISR == pdFALSE )
|
||||||
|
{
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prints an assertion messages and aborts execution.
|
||||||
|
*/
|
||||||
|
void sys_assert( const char *pcMessage )
|
||||||
|
{
|
||||||
|
(void) pcMessage;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-------------------------------------------------------------------------*
|
||||||
|
* End of File: sys_arch.c
|
||||||
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
Loading…
Reference in a new issue