
					 /**
 * \addtogroup uip
 * @{
 */

/**
 * \file
 * Header file for the uIP TCP/IP stack.
 * \author  Adam Dunkels <adam@dunkels.com>
 * \author  Julien Abeille <jabeille@cisco.com> (IPv6 related code)
 * \author  Mathilde Durvy <mdurvy@cisco.com> (IPv6 related code)
 *
 * The uIP TCP/IP stack header file contains definitions for a number
 * of C macros that are used by uIP programs as well as internal uIP
 * structures, TCP/IP header structures and function declarations.
 *
 */

/*
 * Copyright (c) 2001-2003, Adam Dunkels.
 * 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 uIP TCP/IP stack.
 *
 * $Id: uip.h,v 1.24 2009/04/06 13:18:50 nvt-se Exp $
 *
 */
#ifndef __UIP_H__
#define __UIP_H__

#include "net/uipopt.h"
#include "uip-conf.h"

/**
 * Representation of an IP address.
 *
 */
#if UIP_CONF_IPV6 != 0
	typedef union uip_ip6addr_t
	{
		u8_t	u8[16]; /* Initializer, must come first!!! */
		u16_t	u16[8];
	} uip_ip6addr_t;

	typedef uip_ip6addr_t	uip_ipaddr_t;
#else /* UIP_CONF_IPV6 */
	#ifdef __CC_ARM
		__packed /* The ARM compiler insists on this being packed, but with other compilers packing it generates a warning as it will be packed anyway. */
	#endif

	typedef union			uip_ip4addr_t
	{
		u8_t	u8[4];	/* Initializer, must come first!!! */
		u16_t	u16[2];
	} uip_ip4addr_t;
	typedef uip_ip4addr_t	uip_ipaddr_t;
#endif /* UIP_CONF_IPV6 */

/*---------------------------------------------------------------------------*/

/** \brief 16 bit 802.15.4 address */
struct uip_802154_shortaddr
{
	u8_t	addr[2];
};

/** \brief 64 bit 802.15.4 address */
struct uip_802154_longaddr
{
	u8_t	addr[8];
};

/** \brief 802.11 address */
struct uip_80211_addr
{
	u8_t	addr[6];
};

/** \brief 802.3 address */
#include "net/pack_struct_start.h"
struct uip_eth_addr
{
	u8_t	addr[6];
}
#include "net/pack_struct_end.h"

#ifdef UIP_CONF_LL_802154

	/** \brief 802.15.4 address */
	typedef struct uip_802154_longaddr	uip_lladdr_t;
	#define UIP_802154_SHORTADDR_LEN	2
	#define UIP_802154_LONGADDR_LEN		8
	#define UIP_LLADDR_LEN				UIP_802154_LONGADDR_LEN
#else /*UIP_CONF_LL_802154*/
	#ifdef UIP_CONF_LL_80211
		/** \brief 802.11 address */
		typedef struct uip_80211_addr	uip_lladdr_t;
		#define UIP_LLADDR_LEN	6
	#else /*UIP_CONF_LL_80211*/

		/** \brief Ethernet address */
		typedef struct uip_eth_addr uip_lladdr_t;

		#define UIP_LLADDR_LEN	6
	#endif /*UIP_CONF_LL_80211*/
#endif /*UIP_CONF_LL_802154*/

//_RB_#include "net/tcpip.h"

/*---------------------------------------------------------------------------*/

/* First, the functions that should be called from the
 * system. Initialization, the periodic timer, and incoming packets are
 * handled by the following three functions.
 */

/**
 * \defgroup uipconffunc uIP configuration functions
 * @{
 *
 * The uIP configuration functions are used for setting run-time
 * parameters in uIP such as IP addresses.
 */

/**
 * Set the IP address of this host.
 *
 * The IP address is represented as a 4-byte array where the first
 * octet of the IP address is put in the first member of the 4-byte
 * array.
 *
 * Example:
 \code

 uip_ipaddr_t addr;

 uip_ipaddr(&addr, 192,168,1,2);
 uip_sethostaddr(&addr);

 \endcode
 * \param addr A pointer to an IP address of type uip_ipaddr_t;
 *
 * \sa uip_ipaddr()
 *
 * \hideinitializer
 */
#define uip_sethostaddr( addr ) uip_ipaddr_copy( &uip_hostaddr, (addr) )

/**
 * Get the IP address of this host.
 *
 * The IP address is represented as a 4-byte array where the first
 * octet of the IP address is put in the first member of the 4-byte
 * array.
 *
 * Example:
 \code
 uip_ipaddr_t hostaddr;

 uip_gethostaddr(&hostaddr);
 \endcode
 * \param addr A pointer to a uip_ipaddr_t variable that will be
 * filled in with the currently configured IP address.
 *
 * \hideinitializer
 */
#define uip_gethostaddr( addr ) uip_ipaddr_copy( (addr), &uip_hostaddr )

/**
 * Set the default router's IP address.
 *
 * \param addr A pointer to a uip_ipaddr_t variable containing the IP
 * address of the default router.
 *
 * \sa uip_ipaddr()
 *
 * \hideinitializer
 */
#define uip_setdraddr( addr )	uip_ipaddr_copy( &uip_draddr, (addr) )

/**
 * Set the netmask.
 *
 * \param addr A pointer to a uip_ipaddr_t variable containing the IP
 * address of the netmask.
 *
 * \sa uip_ipaddr()
 *
 * \hideinitializer
 */
#define uip_setnetmask( addr )	uip_ipaddr_copy( &uip_netmask, (addr) )

/**
 * Get the default router's IP address.
 *
 * \param addr A pointer to a uip_ipaddr_t variable that will be
 * filled in with the IP address of the default router.
 *
 * \hideinitializer
 */
#define uip_getdraddr( addr )	uip_ipaddr_copy( (addr), &uip_draddr )

/**
 * Get the netmask.
 *
 * \param addr A pointer to a uip_ipaddr_t variable that will be
 * filled in with the value of the netmask.
 *
 * \hideinitializer
 */
#define uip_getnetmask( addr )	uip_ipaddr_copy( (addr), &uip_netmask )

/** @} */

/**
 * \defgroup uipinit uIP initialization functions
 * @{
 *
 * The uIP initialization functions are used for booting uIP.
 */

/**
 * uIP initialization function.
 *
 * This function should be called at boot up to initilize the uIP
 * TCP/IP stack.
 */
void	uip_init( void );

/**
 * uIP initialization function.
 *
 * This function may be used at boot time to set the initial ip_id.
 */
void	uip_setipid( u16_t id );

/** @} */

/**
 * \defgroup uipdevfunc uIP device driver functions
 * @{
 *
 * These functions are used by a network device driver for interacting
 * with uIP.
 */

/**
 * Process an incoming packet.
 *
 * This function should be called when the device driver has received
 * a packet from the network. The packet from the device driver must
 * be present in the uip_buf buffer, and the length of the packet
 * should be placed in the uip_len variable.
 *
 * When the function returns, there may be an outbound packet placed
 * in the uip_buf packet buffer. If so, the uip_len variable is set to
 * the length of the packet. If no packet is to be sent out, the
 * uip_len variable is set to 0.
 *
 * The usual way of calling the function is presented by the source
 * code below.
 \code
 uip_len = devicedriver_poll();
 if(uip_len > 0) {
 uip_input();
 if(uip_len > 0) {
 devicedriver_send();
 }
 }
 \endcode
 *
 * \note If you are writing a uIP device driver that needs ARP
 * (Address Resolution Protocol), e.g., when running uIP over
 * Ethernet, you will need to call the uIP ARP code before calling
 * this function:
 \code
 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
 uip_len = ethernet_devicedrver_poll();
 if(uip_len > 0) {
 if(BUF->type == HTONS(UIP_ETHTYPE_IP)) {
 uip_arp_ipin();
 uip_input();
 if(uip_len > 0) {
 uip_arp_out();
 ethernet_devicedriver_send();
 }
 } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) {
 uip_arp_arpin();
 if(uip_len > 0) {
 ethernet_devicedriver_send();
 }
 }
 \endcode
 *
 * \hideinitializer
 */
#define uip_input() uip_process( UIP_DATA )

/**
 * Periodic processing for a connection identified by its number.
 *
 * This function does the necessary periodic processing (timers,
 * polling) for a uIP TCP conneciton, and should be called when the
 * periodic uIP timer goes off. It should be called for every
 * connection, regardless of whether they are open of closed.
 *
 * When the function returns, it may have an outbound packet waiting
 * for service in the uIP packet buffer, and if so the uip_len
 * variable is set to a value larger than zero. The device driver
 * should be called to send out the packet.
 *
 * The usual way of calling the function is through a for() loop like
 * this:
 \code
 for(i = 0; i < UIP_CONNS; ++i) {
 uip_periodic(i);
 if(uip_len > 0) {
 devicedriver_send();
 }
 }
 \endcode
 *
 * \note If you are writing a uIP device driver that needs ARP
 * (Address Resolution Protocol), e.g., when running uIP over
 * Ethernet, you will need to call the uip_arp_out() function before
 * calling the device driver:
 \code
 for(i = 0; i < UIP_CONNS; ++i) {
 uip_periodic(i);
 if(uip_len > 0) {
 uip_arp_out();
 ethernet_devicedriver_send();
 }
 }
 \endcode
 *
 * \param conn The number of the connection which is to be periodically polled.
 *
 * \hideinitializer
 */
#ifdef UIP_TCP
#define uip_periodic( conn )		 \
	do								 \
	{								 \
		uip_conn = &uip_conns[conn]; \
		uip_process( UIP_TIMER );	 \
	} while( 0 )

/**
 *
 *
 */
#define uip_conn_active( conn ) ( uip_conns[conn].tcpstateflags != UIP_CLOSED )

/**
 * Perform periodic processing for a connection identified by a pointer
 * to its structure.
 *
 * Same as uip_periodic() but takes a pointer to the actual uip_conn
 * struct instead of an integer as its argument. This function can be
 * used to force periodic processing of a specific connection.
 *
 * \param conn A pointer to the uip_conn struct for the connection to
 * be processed.
 *
 * \hideinitializer
 */
#define uip_periodic_conn( conn ) \
	do							  \
	{							  \
		uip_conn = conn;		  \
		uip_process( UIP_TIMER ); \
	} while( 0 )

/**
 * Request that a particular connection should be polled.
 *
 * Similar to uip_periodic_conn() but does not perform any timer
 * processing. The application is polled for new data.
 *
 * \param conn A pointer to the uip_conn struct for the connection to
 * be processed.
 *
 * \hideinitializer
 */
#define uip_poll_conn( conn )			 \
	do									 \
	{									 \
		uip_conn = conn;				 \
		uip_process( UIP_POLL_REQUEST ); \
	} while( 0 )
#endif /* UIP_TCP */

#ifdef UIP_UDP

/**
 * Periodic processing for a UDP connection identified by its number.
 *
 * This function is essentially the same as uip_periodic(), but for
 * UDP connections. It is called in a similar fashion as the
 * uip_periodic() function:
 \code
 for(i = 0; i < UIP_UDP_CONNS; i++) {
 uip_udp_periodic(i);
 if(uip_len > 0) {
 devicedriver_send();
 }
 }
 \endcode
 *
 * \note As for the uip_periodic() function, special care has to be
 * taken when using uIP together with ARP and Ethernet:
 \code
 for(i = 0; i < UIP_UDP_CONNS; i++) {
 uip_udp_periodic(i);
 if(uip_len > 0) {
 uip_arp_out();
 ethernet_devicedriver_send();
 }
 }
 \endcode
 *
 * \param conn The number of the UDP connection to be processed.
 *
 * \hideinitializer
 */
#define uip_udp_periodic( conn )			 \
	do										 \
	{										 \
		uip_udp_conn = &uip_udp_conns[conn]; \
		uip_process( UIP_UDP_TIMER );		 \
	} while( 0 )

/**
 * Periodic processing for a UDP connection identified by a pointer to
 * its structure.
 *
 * Same as uip_udp_periodic() but takes a pointer to the actual
 * uip_conn struct instead of an integer as its argument. This
 * function can be used to force periodic processing of a specific
 * connection.
 *
 * \param conn A pointer to the uip_udp_conn struct for the connection
 * to be processed.
 *
 * \hideinitializer
 */
#define uip_udp_periodic_conn( conn ) \
	do								  \
	{								  \
		uip_udp_conn = conn;		  \
		uip_process( UIP_UDP_TIMER ); \
	} while( 0 )
#endif /* UIP_UDP */

					/** \brief Abandon the reassembly of the current packet */
					void	uip_reass_over( void );

/**
 * The uIP packet buffer.
 *
 * The uip_buf array is used to hold incoming and outgoing
 * packets. The device driver should place incoming data into this
 * buffer. When sending data, the device driver should read the link
 * level headers and the TCP/IP headers from this buffer. The size of
 * the link level headers is configured by the UIP_LLH_LEN define.
 *
 * \note The application data need not be placed in this buffer, so
 * the device driver must read it from the place pointed to by the
 * uip_appdata pointer as illustrated by the following example:
 \code
 void
 devicedriver_send(void)
 {
 hwsend(&uip_buf[0], UIP_LLH_LEN);
 if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) {
 hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
 } else {
 hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
 hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
 }
 }
 \endcode
*/
#ifndef UIP_CONF_EXTERNAL_BUFFER
CCIF extern u8_t			uip_buf[UIP_BUFSIZE + 2];
#else
CCIF extern unsigned char *uip_buf;
#endif

/** @} */

/*---------------------------------------------------------------------------*/

/* Functions that are used by the uIP application program. Opening and
 * closing connections, sending and receiving data, etc. is all
 * handled by the functions below.
 */

/**
 * \defgroup uipappfunc uIP application functions
 * @{
 *
 * Functions used by an application running of top of uIP.
 */

/**
 * Start listening to the specified port.
 *
 * \note Since this function expects the port number in network byte
 * order, a conversion using HTONS() or htons() is necessary.
 *
 \code
 uip_listen(HTONS(80));
 \endcode
 *
 * \param port A 16-bit port number in network byte order.
 */
void						uip_listen( u16_t port );

/**
 * Stop listening to the specified port.
 *
 * \note Since this function expects the port number in network byte
 * order, a conversion using HTONS() or htons() is necessary.
 *
 \code
 uip_unlisten(HTONS(80));
 \endcode
 *
 * \param port A 16-bit port number in network byte order.
 */
void						uip_unlisten( u16_t port );

/**
 * Connect to a remote host using TCP.
 *
 * This function is used to start a new connection to the specified
 * port on the specified host. It allocates a new connection identifier,
 * sets the connection to the SYN_SENT state and sets the
 * retransmission timer to 0. This will cause a TCP SYN segment to be
 * sent out the next time this connection is periodically processed,
 * which usually is done within 0.5 seconds after the call to
 * uip_connect().
 *
 * \note This function is available only if support for active open
 * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h.
 *
 * \note Since this function requires the port number to be in network
 * byte order, a conversion using HTONS() or htons() is necessary.
 *
 \code
 uip_ipaddr_t ipaddr;

 uip_ipaddr(&ipaddr, 192,168,1,2);
 uip_connect(&ipaddr, HTONS(80));
 \endcode
 *
 * \param ripaddr The IP address of the remote host.
 *
 * \param port A 16-bit port number in network byte order.
 *
 * \return A pointer to the uIP connection identifier for the new connection,
 * or NULL if no connection could be allocated.
 *
 */
struct uip_conn				*uip_connect( uip_ipaddr_t *ripaddr, u16_t port );

/**
 * \internal
 *
 * Check if a connection has outstanding (i.e., unacknowledged) data.
 *
 * \param conn A pointer to the uip_conn structure for the connection.
 *
 * \hideinitializer
 */
#define uip_outstanding( conn ) ( (conn)->len )

/**
 * Send data on the current connection.
 *
 * This function is used to send out a single segment of TCP
 * data. Only applications that have been invoked by uIP for event
 * processing can send data.
 *
 * The amount of data that actually is sent out after a call to this
 * function is determined by the maximum amount of data TCP allows. uIP
 * will automatically crop the data so that only the appropriate
 * amount of data is sent. The function uip_mss() can be used to query
 * uIP for the amount of data that actually will be sent.
 *
 * \note This function does not guarantee that the sent data will
 * arrive at the destination. If the data is lost in the network, the
 * application will be invoked with the uip_rexmit() event being
 * set. The application will then have to resend the data using this
 * function.
 *
 * \param data A pointer to the data which is to be sent.
 *
 * \param len The maximum amount of data bytes to be sent.
 *
 * \hideinitializer
 */
CCIF void	uip_send( const void *data, int len );

/**
 * The length of any incoming data that is currently available (if available)
 * in the uip_appdata buffer.
 *
 * The test function uip_data() must first be used to check if there
 * is any data available at all.
 *
 * \hideinitializer
 */

/*void uip_datalen(void);*/
#define uip_datalen()	uip_len

/**
 * The length of any out-of-band data (urgent data) that has arrived
 * on the connection.
 *
 * \note The configuration parameter UIP_URGDATA must be set for this
 * function to be enabled.
 *
 * \hideinitializer
 */
#define uip_urgdatalen()	uip_urglen

/**
 * Close the current connection.
 *
 * This function will close the current connection in a nice way.
 *
 * \hideinitializer
 */
#define uip_close() ( uip_flags = UIP_CLOSE )

/**
 * Abort the current connection.
 *
 * This function will abort (reset) the current connection, and is
 * usually used when an error has occurred that prevents using the
 * uip_close() function.
 *
 * \hideinitializer
 */
#define uip_abort() ( uip_flags = UIP_ABORT )

/**
 * Tell the sending host to stop sending data.
 *
 * This function will close our receiver's window so that we stop
 * receiving data for the current connection.
 *
 * \hideinitializer
 */
#define uip_stop()	( uip_conn->tcpstateflags |= UIP_STOPPED )

/**
 * Find out if the current connection has been previously stopped with
 * uip_stop().
 *
 * \hideinitializer
 */
#define uip_stopped( conn ) ( (conn)->tcpstateflags & UIP_STOPPED )

/**
 * Restart the current connection, if is has previously been stopped
 * with uip_stop().
 *
 * This function will open the receiver's window again so that we
 * start receiving data for the current connection.
 *
 * \hideinitializer
 */
#define uip_restart()							 \
	do											 \
	{											 \
		uip_flags |= UIP_NEWDATA;				 \
		uip_conn->tcpstateflags &= ~UIP_STOPPED; \
	} while( 0 )

	/* uIP tests that can be made to determine in what state the current
   connection is, and what the application function should do. */

/**
 * Is the current connection a UDP connection?
 *
 * This function checks whether the current connection is a UDP connection.
 *
 * \hideinitializer
 *
 */
#define uip_udpconnection() ( uip_conn == NULL )

/**
 * Is new incoming data available?
 *
 * Will reduce to non-zero if there is new data for the application
 * present at the uip_appdata pointer. The size of the data is
 * available through the uip_len variable.
 *
 * \hideinitializer
 */
#define uip_newdata()	( uip_flags & UIP_NEWDATA )

/**
 * Has previously sent data been acknowledged?
 *
 * Will reduce to non-zero if the previously sent data has been
 * acknowledged by the remote host. This means that the application
 * can send new data.
 *
 * \hideinitializer
 */
#define uip_acked() ( uip_flags & UIP_ACKDATA )

/**
 * Has the connection just been connected?
 *
 * Reduces to non-zero if the current connection has been connected to
 * a remote host. This will happen both if the connection has been
 * actively opened (with uip_connect()) or passively opened (with
 * uip_listen()).
 *
 * \hideinitializer
 */
#define uip_connected() ( uip_flags & UIP_CONNECTED )

/**
 * Has the connection been closed by the other end?
 *
 * Is non-zero if the connection has been closed by the remote
 * host. The application may then do the necessary clean-ups.
 *
 * \hideinitializer
 */
#define uip_closed()	( uip_flags & UIP_CLOSE )

/**
 * Has the connection been aborted by the other end?
 *
 * Non-zero if the current connection has been aborted (reset) by the
 * remote host.
 *
 * \hideinitializer
 */
#define uip_aborted()	( uip_flags & UIP_ABORT )

/**
 * Has the connection timed out?
 *
 * Non-zero if the current connection has been aborted due to too many
 * retransmissions.
 *
 * \hideinitializer
 */
#define uip_timedout()	( uip_flags & UIP_TIMEDOUT )

/**
 * Do we need to retransmit previously data?
 *
 * Reduces to non-zero if the previously sent data has been lost in
 * the network, and the application should retransmit it. The
 * application should send the exact same data as it did the last
 * time, using the uip_send() function.
 *
 * \hideinitializer
 */
#define uip_rexmit()	( uip_flags & UIP_REXMIT )

/**
 * Is the connection being polled by uIP?
 *
 * Is non-zero if the reason the application is invoked is that the
 * current connection has been idle for a while and should be
 * polled.
 *
 * The polling event can be used for sending data without having to
 * wait for the remote host to send data.
 *
 * \hideinitializer
 */
#define uip_poll()	( uip_flags & UIP_POLL )

/**
 * Get the initial maximum segment size (MSS) of the current
 * connection.
 *
 * \hideinitializer
 */
#define uip_initialmss()	( uip_conn->initialmss )

/**
 * Get the current maximum segment size that can be sent on the current
 * connection.
 *
 * The current maximum segment size that can be sent on the
 * connection is computed from the receiver's window and the MSS of
 * the connection (which also is available by calling
 * uip_initialmss()).
 *
 * \hideinitializer
 */
#define uip_mss()	( uip_conn->mss )
	/**
 * Set up a new UDP connection.
 *
 * This function sets up a new UDP connection. The function will
 * automatically allocate an unused local port for the new
 * connection. However, another port can be chosen by using the
 * uip_udp_bind() call, after the uip_udp_new() function has been
 * called.
 *
 * Example:
 \code
 uip_ipaddr_t addr;
 struct uip_udp_conn *c;

 uip_ipaddr(&addr, 192,168,2,1);
 c = uip_udp_new(&addr, HTONS(12345));
 if(c != NULL) {
 uip_udp_bind(c, HTONS(12344));
 }
 \endcode
 * \param ripaddr The IP address of the remote host.
 *
 * \param rport The remote port number in network byte order.
 *
 * \return The uip_udp_conn structure for the new connection or NULL
 * if no connection could be allocated.
 */
	struct uip_udp_conn *uip_udp_new( const uip_ipaddr_t *ripaddr, u16_t rport );

/**
 * Removed a UDP connection.
 *
 * \param conn A pointer to the uip_udp_conn structure for the connection.
 *
 * \hideinitializer
 */
#define uip_udp_remove( conn )	( conn )->lport = 0

/**
 * Bind a UDP connection to a local port.
 *
 * \param conn A pointer to the uip_udp_conn structure for the
 * connection.
 *
 * \param port The local port number, in network byte order.
 *
 * \hideinitializer
 */
#define uip_udp_bind( conn, port )	( conn )->lport = port

/**
 * Send a UDP datagram of length len on the current connection.
 *
 * This function can only be called in response to a UDP event (poll
 * or newdata). The data must be present in the uip_buf buffer, at the
 * place pointed to by the uip_appdata pointer.
 *
 * \param len The length of the data in the uip_buf buffer.
 *
 * \hideinitializer
 */
#define uip_udp_send( len ) uip_send( ( char * ) uip_appdata, len )

/** @} */

/* uIP convenience and converting functions. */

/**
 * \defgroup uipconvfunc uIP conversion functions
 * @{
 *
 * These functions can be used for converting between different data
 * formats used by uIP.
 */

/**
 * Convert an IP address to four bytes separated by commas.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr;
 printf("ipaddr=%d.%d.%d.%d\n", uip_ipaddr_to_quad(&ipaddr));
 \endcode
 *
 * \param a A pointer to a uip_ipaddr_t.
 * \hideinitializer
 */
#define uip_ipaddr_to_quad( a ) ( a )->u8[0], ( a )->u8[1], ( a )->u8[2], ( a )->u8[3]

/**
 * Construct an IP address from four bytes.
 *
 * This function constructs an IP address of the type that uIP handles
 * internally from four bytes. The function is handy for specifying IP
 * addresses to use with e.g. the uip_connect() function.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr;
 struct uip_conn *c;

 uip_ipaddr(&ipaddr, 192,168,1,2);
 c = uip_connect(&ipaddr, HTONS(80));
 \endcode
 *
 * \param addr A pointer to a uip_ipaddr_t variable that will be
 * filled in with the IP address.
 *
 * \param addr0 The first octet of the IP address.
 * \param addr1 The second octet of the IP address.
 * \param addr2 The third octet of the IP address.
 * \param addr3 The forth octet of the IP address.
 *
 * \hideinitializer
 */
#define uip_ipaddr( addr, addr0, addr1, addr2, addr3 ) \
	do												   \
	{												   \
		( addr )->u8[0] = addr0;					   \
		( addr )->u8[1] = addr1;					   \
		( addr )->u8[2] = addr2;					   \
		( addr )->u8[3] = addr3;					   \
	} while( 0 )

/**
 * Construct an IPv6 address from eight 16-bit words.
 *
 * This function constructs an IPv6 address.
 *
 * \hideinitializer
 */
#define uip_ip6addr( addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, addr7 ) \
	do																				\
	{																				\
		( addr )->u16[0] = HTONS( addr0 );											\
		( addr )->u16[1] = HTONS( addr1 );											\
		( addr )->u16[2] = HTONS( addr2 );											\
		( addr )->u16[3] = HTONS( addr3 );											\
		( addr )->u16[4] = HTONS( addr4 );											\
		( addr )->u16[5] = HTONS( addr5 );											\
		( addr )->u16[6] = HTONS( addr6 );											\
		( addr )->u16[7] = HTONS( addr7 );											\
	} while( 0 )	/**
 * Construct an IPv6 address from eight 8-bit words.
 *
 * This function constructs an IPv6 address.
 *
 * \hideinitializer
 */
#define uip_ip6addr_u8	( addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, addr7, addr8, addr9, addr10, addr11, addr12, addr13, addr14, \
						 addr15 ) do																										  \
	{\
		( addr )->u8[0] = addr0;																											  \
		( addr )->u8[1] = addr1;																											  \
		( addr )->u8[2] = addr2;																											  \
		( addr )->u8[3] = addr3;																											  \
		( addr )->u8[4] = addr4;																											  \
		( addr )->u8[5] = addr5;																											  \
		( addr )->u8[6] = addr6;																											  \
		( addr )->u8[7] = addr7;																											  \
		( addr )->u8[8] = addr8;																											  \
		( addr )->u8[9] = addr9;																											  \
		( addr )->u8[10] = addr10;																											  \
		( addr )->u8[11] = addr11;																											  \
		( addr )->u8[12] = addr12;																											  \
		( addr )->u8[13] = addr13;																											  \
		( addr )->u8[14] = addr14;																											  \
		( addr )->u8[15] = addr15;																											  \
	} while( 0 )
			/**
 * Copy an IP address to another IP address.
 *
 * Copies an IP address from one place to another.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr1, ipaddr2;

 uip_ipaddr(&ipaddr1, 192,16,1,2);
 uip_ipaddr_copy(&ipaddr2, &ipaddr1);
 \endcode
 *
 * \param dest The destination for the copy.
 * \param src The source from where to copy.
 *
 * \hideinitializer
 */
#ifndef uip_ipaddr_copy
	#define uip_ipaddr_copy( dest, src ) 	\
	do										\
	{										\
		(dest)->u8[0] = (src)->u8[0];		\
		(dest)->u8[1] = (src)->u8[1];		\
		(dest)->u8[2] = (src)->u8[2];		\
		(dest)->u8[3] = (src)->u8[3];		\
	} while( 0 )	
#endif

			/**
 * Compare two IP addresses
 *
 * Compares two IP addresses.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr1, ipaddr2;

 uip_ipaddr(&ipaddr1, 192,16,1,2);
 if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) {
 printf("They are the same");
 }
 \endcode
 *
 * \param addr1 The first IP address.
 * \param addr2 The second IP address.
 *
 * \hideinitializer
 */
#if !UIP_CONF_IPV6
#define uip_ipaddr_cmp( addr1, addr2 )	( (addr1)->u16[0] == (addr2)->u16[0] && (addr1)->u16[1] == (addr2)->u16[1] )
#else /* !UIP_CONF_IPV6 */
#define uip_ipaddr_cmp( addr1, addr2 )	( memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0 )
#endif /* !UIP_CONF_IPV6 */

			/**
 * Compare two IP addresses with netmasks
 *
 * Compares two IP addresses with netmasks. The masks are used to mask
 * out the bits that are to be compared.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr1, ipaddr2, mask;

 uip_ipaddr(&mask, 255,255,255,0);
 uip_ipaddr(&ipaddr1, 192,16,1,2);
 uip_ipaddr(&ipaddr2, 192,16,1,3);
 if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) {
 printf("They are the same");
 }
 \endcode
 *
 * \param addr1 The first IP address.
 * \param addr2 The second IP address.
 * \param mask The netmask.
 *
 * \hideinitializer
 */
#if !UIP_CONF_IPV6
#define uip_ipaddr_maskcmp( addr1, addr2, mask )																	  \
		(																											  \
			(((( u16_t * ) addr1)[0] & (( u16_t * ) mask)[0]) == ((( u16_t * ) addr2)[0] & (( u16_t * ) mask)[0])) && \
			(((( u16_t * ) addr1)[1] & (( u16_t * ) mask)[1]) == ((( u16_t * ) addr2)[1] & (( u16_t * ) mask)[1]))	  \
		)
#else
#define uip_ipaddr_prefixcmp( addr1, addr2, length )	( memcmp(addr1, addr2, length >> 3) == 0 )
#endif

			/**
 * Check if an address is a broadcast address for a network.
 *
 * Checks if an address is the broadcast address for a network. The
 * network is defined by an IP address that is on the network and the
 * network's netmask.
 *
 * \param addr The IP address.
 * \param netaddr The network's IP address.
 * \param netmask The network's netmask.
 *
 * \hideinitializer
 */

			/*#define uip_ipaddr_isbroadcast(addr, netaddr, netmask)
  ((uip_ipaddr_t *)(addr)).u16 & ((uip_ipaddr_t *)(addr)).u16*/

/**
 * Mask out the network part of an IP address.
 *
 * Masks out the network part of an IP address, given the address and
 * the netmask.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr1, ipaddr2, netmask;

 uip_ipaddr(&ipaddr1, 192,16,1,2);
 uip_ipaddr(&netmask, 255,255,255,0);
 uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask);
 \endcode
 *
 * In the example above, the variable "ipaddr2" will contain the IP
 * address 192.168.1.0.
 *
 * \param dest Where the result is to be placed.
 * \param src The IP address.
 * \param mask The netmask.
 *
 * \hideinitializer
 */
#define uip_ipaddr_mask( dest, src, mask )											\
	do																				\
	{																				\
		( ( u16_t * ) dest )[0] = ( ( u16_t * ) src )[0] & ( ( u16_t * ) mask )[0]; \
		( ( u16_t * ) dest )[1] = ( ( u16_t * ) src )[1] & ( ( u16_t * ) mask )[1]; \
	} while( 0 )

/**
 * Pick the first octet of an IP address.
 *
 * Picks out the first octet of an IP address.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr;
 u8_t octet;

 uip_ipaddr(&ipaddr, 1,2,3,4);
 octet = uip_ipaddr1(&ipaddr);
 \endcode
 *
 * In the example above, the variable "octet" will contain the value 1.
 *
 * \hideinitializer
 */
#define uip_ipaddr1( addr ) ( (addr)->u8[0] )

/**
 * Pick the second octet of an IP address.
 *
 * Picks out the second octet of an IP address.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr;
 u8_t octet;

 uip_ipaddr(&ipaddr, 1,2,3,4);
 octet = uip_ipaddr2(&ipaddr);
 \endcode
 *
 * In the example above, the variable "octet" will contain the value 2.
 *
 * \hideinitializer
 */
#define uip_ipaddr2( addr ) ( (addr)->u8[1] )

/**
 * Pick the third octet of an IP address.
 *
 * Picks out the third octet of an IP address.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr;
 u8_t octet;

 uip_ipaddr(&ipaddr, 1,2,3,4);
 octet = uip_ipaddr3(&ipaddr);
 \endcode
 *
 * In the example above, the variable "octet" will contain the value 3.
 *
 * \hideinitializer
 */
#define uip_ipaddr3( addr ) ( (addr)->u8[2] )

/**
 * Pick the fourth octet of an IP address.
 *
 * Picks out the fourth octet of an IP address.
 *
 * Example:
 \code
 uip_ipaddr_t ipaddr;
 u8_t octet;

 uip_ipaddr(&ipaddr, 1,2,3,4);
 octet = uip_ipaddr4(&ipaddr);
 \endcode
 *
 * In the example above, the variable "octet" will contain the value 4.
 *
 * \hideinitializer
 */
#define uip_ipaddr4( addr ) ( (addr)->u8[3] )
				/**
 * Convert 16-bit quantity from host byte order to network byte order.
 *
 * This macro is primarily used for converting constants from host
 * byte order to network byte order. For converting variables to
 * network byte order, use the htons() function instead.
 *
 * \hideinitializer
 */
#ifndef HTONS
#if UIP_BYTE_ORDER == UIP_BIG_ENDIAN
#define HTONS( n )	( n )
#define HTONL( n )	( n )
#else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
#define HTONS( n )	( u16_t ) ( (((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8) )
#define HTONL( n )	( ((u32_t) HTONS(n) << 16) | HTONS((u32_t) (n) >> 16) )
#endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
#else
#error "HTONS already defined!"
#endif /* HTONS */

				/**
 * Convert 16-bit quantity from host byte order to network byte order.
 *
 * This function is primarily used for converting variables from host
 * byte order to network byte order. For converting constants to
 * network byte order, use the HTONS() macro instead.
 */
#ifndef htons
	CCIF u16_t	htons( u16_t val );
#endif /* htons */

#ifndef ntohs
	#define ntohs	htons
#endif

#ifndef htonl
	CCIF u32_t	htonl( u32_t val );
#endif /* htonl */

#ifndef ntohl
	#define ntohl	htonl
#endif

/** @} */

/**
 * Pointer to the application data in the packet buffer.
 *
 * This pointer points to the application data when the application is
 * called. If the application wishes to send data, the application may
 * use this space to write the data into before calling uip_send().
 */
CCIF extern void	*uip_appdata;

#if UIP_URGDATA > 0

/* u8_t *uip_urgdata:
 *
 * This pointer points to any urgent data that has been received. Only
 * present if compiled with support for urgent data (UIP_URGDATA).
 */
extern void			*uip_urgdata;
#endif /* UIP_URGDATA > 0 */

/**
 * \defgroup uipdrivervars Variables used in uIP device drivers
 * @{
 *
 * uIP has a few global variables that are used in device drivers for
 * uIP.
 */

/**
 * The length of the packet in the uip_buf buffer.
 *
 * The global variable uip_len holds the length of the packet in the
 * uip_buf buffer.
 *
 * When the network device driver calls the uIP input function,
 * uip_len should be set to the length of the packet in the uip_buf
 * buffer.
 *
 * When sending packets, the device driver should use the contents of
 * the uip_len variable to determine the length of the outgoing
 * packet.
 *
 */
CCIF extern u16_t	uip_len;

/**
 * The length of the extension headers
 */
extern u8_t			uip_ext_len;

/** @} */
#if UIP_URGDATA > 0
extern u16_t		uip_urglen, uip_surglen;
#endif /* UIP_URGDATA > 0 */

/**
 * Representation of a uIP TCP connection.
 *
 * The uip_conn structure is used for identifying a connection. All
 * but one field in the structure are to be considered read-only by an
 * application. The only exception is the appstate field whose purpose
 * is to let the application store application-specific state (e.g.,
 * file pointers) for the connection. The type of this field is
 * configured in the "uipopt.h" header file.
 */
struct uip_conn
{
	uip_ipaddr_t		ripaddr;		/**< The IP address of the remote host. */

	u16_t				lport;			/**< The local TCP port, in network byte order. */
	u16_t				rport;			/**< The local remote TCP port, in network byte
			 order. */

	u8_t				rcv_nxt[4];		/**< The sequence number that we expect to
			 receive next. */
	u8_t				snd_nxt[4];		/**< The sequence number that was last sent by
                         us. */
	u16_t				len;			/**< Length of the data that was previously sent. */
	u16_t				mss;			/**< Current maximum segment size for the
			 connection. */
	u16_t				initialmss;		/**< Initial maximum segment size for the
			 connection. */
	u8_t				sa;				/**< Retransmission time-out calculation state
			 variable. */
	u8_t				sv;				/**< Retransmission time-out calculation state
			 variable. */
	u8_t				rto;			/**< Retransmission time-out. */
	u8_t				tcpstateflags;	/**< TCP state and flags. */
	u8_t				timer;			/**< The retransmission timer. */
	u8_t				nrtx;			/**< The number of retransmissions for the last
			 segment sent. */

	/** The application state. */
	uip_tcp_appstate_t	appstate;
};

/**
 * Pointer to the current TCP connection.
 *
 * The uip_conn pointer can be used to access the current TCP
 * connection.
 */
CCIF extern struct uip_conn *uip_conn;
#ifdef UIP_TCP

/* The array containing all uIP connections. */
CCIF extern struct uip_conn uip_conns[UIP_CONNS];
#endif

/**
 * \addtogroup uiparch
 * @{
 */

/**
 * 4-byte array used for the 32-bit sequence number calculations.
 */
extern u8_t					uip_acc32[4];

/** @} */
#if UIP_UDP == 1
/**
 * Representation of a uIP UDP connection.
 */
struct uip_udp_conn
{
	uip_ipaddr_t		ripaddr;	/**< The IP address of the remote peer. */
	u16_t				lport;		/**< The local port number in network byte order. */
	u16_t				rport;		/**< The remote port number in network byte order. */
	u8_t				ttl;		/**< Default time-to-live. */

	/** The application state. */
	uip_udp_appstate_t	appstate;
};

/**
 * The current UDP connection.
 */
extern struct uip_udp_conn	*uip_udp_conn;
extern struct uip_udp_conn	uip_udp_conns[UIP_UDP_CONNS];
#endif /* UIP_UDP */

struct uip_router
{
	int ( *activate ) ( void );
	int ( *deactivate ) ( void );
	uip_ipaddr_t * ( *lookup ) ( uip_ipaddr_t *destipaddr, uip_ipaddr_t *nexthop );
};

#ifdef UIP_CONF_ROUTER
extern const struct uip_router	*uip_router;

/**
 * uIP routing driver registration function.
 */
void							uip_router_register( const struct uip_router *router );
#endif /*UIP_CONF_ROUTER*/

#ifdef UIP_CONF_ICMP6
struct uip_icmp6_conn
{
	uip_icmp6_appstate_t	appstate;
};
extern struct uip_icmp6_conn	uip_icmp6_conns;
#endif /*UIP_CONF_ICMP6*/

/**
 * The uIP TCP/IP statistics.
 *
 * This is the variable in which the uIP TCP/IP statistics are gathered.
 */
#if UIP_STATISTICS == 1
extern struct uip_stats			uip_stat;
#define UIP_STAT( s )	s
#else
#define UIP_STAT( s )
#endif /* UIP_STATISTICS == 1 */

/**
 * The structure holding the TCP/IP statistics that are gathered if
 * UIP_STATISTICS is set to 1.
 *
 */
struct uip_stats
{
	struct
	{
		uip_stats_t recv;		/**< Number of received packets at the IP
			     layer. */
		uip_stats_t sent;		/**< Number of sent packets at the IP
			     layer. */
		uip_stats_t forwarded;	/**< Number of forwarded packets at the IP
			     layer. */
		uip_stats_t drop;		/**< Number of dropped packets at the IP
			     layer. */
		uip_stats_t vhlerr;		/**< Number of packets dropped due to wrong
			     IP version or header length. */
		uip_stats_t hblenerr;	/**< Number of packets dropped due to wrong
			     IP length, high byte. */
		uip_stats_t lblenerr;	/**< Number of packets dropped due to wrong
			     IP length, low byte. */
		uip_stats_t fragerr;	/**< Number of packets dropped since they
			     were IP fragments. */
		uip_stats_t chkerr;		/**< Number of packets dropped due to IP
			     checksum errors. */
		uip_stats_t protoerr;	/**< Number of packets dropped since they
			     were neither ICMP, UDP nor TCP. */
	} ip;						/**< IP statistics. */
	struct
	{
		uip_stats_t recv;		/**< Number of received ICMP packets. */
		uip_stats_t sent;		/**< Number of sent ICMP packets. */
		uip_stats_t drop;		/**< Number of dropped ICMP packets. */
		uip_stats_t typeerr;	/**< Number of ICMP packets with a wrong
			     type. */
		uip_stats_t chkerr;		/**< Number of ICMP packets with a bad
			     checksum. */
	} icmp;						/**< ICMP statistics. */
#ifdef UIP_TCP
	struct
	{
		uip_stats_t recv;		/**< Number of recived TCP segments. */
		uip_stats_t sent;		/**< Number of sent TCP segments. */
		uip_stats_t drop;		/**< Number of dropped TCP segments. */
		uip_stats_t chkerr;		/**< Number of TCP segments with a bad
			     checksum. */
		uip_stats_t ackerr;		/**< Number of TCP segments with a bad ACK
			     number. */
		uip_stats_t rst;		/**< Number of recevied TCP RST (reset) segments. */
		uip_stats_t rexmit;		/**< Number of retransmitted TCP segments. */
		uip_stats_t syndrop;	/**< Number of dropped SYNs due to too few
			     connections was avaliable. */
		uip_stats_t synrst;		/**< Number of SYNs for closed ports,
			     triggering a RST. */
	} tcp;						/**< TCP statistics. */
#endif
#ifdef UIP_UDP
	struct
	{
		uip_stats_t drop;		/**< Number of dropped UDP segments. */
		uip_stats_t recv;		/**< Number of recived UDP segments. */
		uip_stats_t sent;		/**< Number of sent UDP segments. */
		uip_stats_t chkerr;		/**< Number of UDP segments with a bad
			     checksum. */
	} udp;						/**< UDP statistics. */
#endif /* UIP_UDP */
#if UIP_CONF_IPV6 != 0
	struct
	{
		uip_stats_t drop;		/**< Number of dropped ND6 packets. */
		uip_stats_t recv;		/**< Number of recived ND6 packets */
		uip_stats_t sent;		/**< Number of sent ND6 packets */
	} nd6;
#endif /*UIP_CONF_IPV6*/
};

/*---------------------------------------------------------------------------*/

/* All the stuff below this point is internal to uIP and should not be
 * used directly by an application or by a device driver.
 */

/*---------------------------------------------------------------------------*/

/* u8_t uip_flags:
 *
 * When the application is called, uip_flags will contain the flags
 * that are defined in this file. Please read below for more
 * information.
 */
CCIF extern u8_t	uip_flags;

/* The following flags may be set in the global variable uip_flags
   before calling the application callback. The UIP_ACKDATA,
   UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time,
   whereas the others are mutually exclusive. Note that these flags
   should *NOT* be accessed directly, but only through the uIP
   functions/macros. */
#define UIP_ACKDATA		1		/* Signifies that the outstanding data was
			       acked and the application should send
			       out new data instead of retransmitting
			       the last data. */
#define UIP_NEWDATA		2		/* Flags the fact that the peer has sent
			       us new data. */
#define UIP_REXMIT		4		/* Tells the application to retransmit the
			       data that was last sent. */
#define UIP_POLL		8		/* Used for polling the application, to
			       check if the application has data that
			       it wants to send. */
#define UIP_CLOSE		16		/* The remote host has closed the
			       connection, thus the connection has
			       gone away. Or the application signals
			       that it wants to close the
			       connection. */
#define UIP_ABORT		32		/* The remote host has aborted the
			       connection, thus the connection has
			       gone away. Or the application signals
			       that it wants to abort the
			       connection. */
#define UIP_CONNECTED	64		/* We have got a connection from a remote
                               host and have set up a new connection
                               for it, or an active connection has
                               been successfully established. */

#define UIP_TIMEDOUT	128		/* The connection has been aborted due to
			       too many retransmissions. */

/**
 * \brief process the options within a hop by hop or destination option header
 * \retval 0: nothing to send,
 * \retval 1: drop pkt
 * \retval 2: ICMP error message to send
*/

/*static u8_t
uip_ext_hdr_options_process(); */

/* uip_process(flag):
 *
 * The actual uIP function which does all the work.
 */
void	uip_process( u8_t flag );

/* The following flags are passed as an argument to the uip_process()
   function. They are used to distinguish between the two cases where
   uip_process() is called. It can be called either because we have
   incoming data that should be processed, or because the periodic
   timer has fired. These values are never used directly, but only in
   the macros defined in this file. */
#define UIP_DATA			1	/* Tells uIP that there is incoming
				   data in the uip_buf buffer. The
				   length of the data is stored in the
				   global variable uip_len. */
#define UIP_TIMER			2	/* Tells uIP that the periodic timer
				   has fired. */
#define UIP_POLL_REQUEST	3	/* Tells uIP that a connection should
				   be polled. */
#define UIP_UDP_SEND_CONN	4	/* Tells uIP that a UDP datagram
				   should be constructed in the
				   uip_buf buffer. */
#ifdef UIP_UDP
#define UIP_UDP_TIMER	5
#endif /* UIP_UDP */

/* The TCP states used in the uip_conn->tcpstateflags. */
#define UIP_CLOSED		0
#define UIP_SYN_RCVD	1
#define UIP_SYN_SENT	2
#define UIP_ESTABLISHED 3
#define UIP_FIN_WAIT_1	4
#define UIP_FIN_WAIT_2	5
#define UIP_CLOSING		6
#define UIP_TIME_WAIT	7
#define UIP_LAST_ACK	8
#define UIP_TS_MASK		15

#define UIP_STOPPED		16

/* The TCP and IP headers. */
#include "net/pack_struct_start.h"
struct uip_tcpip_hdr
{
#if UIP_CONF_IPV6 != 0
	/* IPv6 header. */
	u8_t			vtc, tcflow;
	u16_t			flow;
	u8_t			len[2];
	u8_t			proto, ttl;
	uip_ip6addr_t	srcipaddr, destipaddr;
#else /* UIP_CONF_IPV6 */
	/* IPv4 header. */
	u8_t			vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto;
	u16_t			ipchksum;
	uip_ipaddr_t	srcipaddr, destipaddr;
#endif /* UIP_CONF_IPV6 */

	/* TCP header. */
	u16_t			srcport, destport;
	u8_t			seqno[4], ackno[4], tcpoffset, flags, wnd[2];
	u16_t			tcpchksum;
	u8_t			urgp[2];
	u8_t			optdata[4];
}
#include "net/pack_struct_end.h"

/* The ICMP and IP headers. */
#include "net/pack_struct_start.h"
struct uip_icmpip_hdr
{
#if UIP_CONF_IPV6 != 0
	/* IPv6 header. */
	u8_t			vtc, tcf;
	u16_t			flow;
	u8_t			len[2];
	u8_t			proto, ttl;
	uip_ip6addr_t	srcipaddr, destipaddr;
#else /* UIP_CONF_IPV6 */
	/* IPv4 header. */
	u8_t			vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto;
	u16_t			ipchksum;
	uip_ipaddr_t	srcipaddr, destipaddr;
#endif /* UIP_CONF_IPV6 */

	/* ICMP header. */
	u8_t			type, icode;
	u16_t			icmpchksum;
#if !UIP_CONF_IPV6
	u16_t			id, seqno;
	u8_t			payload[1];
#endif /* !UIP_CONF_IPV6 */
}

#include "net/pack_struct_end.h"

/* The UDP and IP headers. */
#include "net/pack_struct_start.h"
struct uip_udpip_hdr
{
#if UIP_CONF_IPV6 != 0
	/* IPv6 header. */
	u8_t			vtc, tcf;
	u16_t			flow;
	u8_t			len[2];
	u8_t			proto, ttl;
	uip_ip6addr_t	srcipaddr, destipaddr;
#else /* UIP_CONF_IPV6 */
	/* IP header. */
	u8_t			vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto;
	u16_t			ipchksum;
	uip_ipaddr_t	srcipaddr, destipaddr;
#endif /* UIP_CONF_IPV6 */

	/* UDP header. */
	u16_t			srcport, destport;
	u16_t			udplen;
	u16_t			udpchksum;
}

#include "net/pack_struct_end.h"

/*
 * In IPv6 the length of the L3 headers before the transport header is
 * not fixed, due to the possibility to include extension option headers
 * after the IP header. hence we split here L3 and L4 headers
 */

/* The IP header */
struct uip_ip_hdr
{
#if UIP_CONF_IPV6 != 0
	/* IPV6 header */
	u8_t			vtc;
	u8_t			tcflow;
	u16_t			flow;
	u8_t			len[2];
	u8_t			proto, ttl;
	uip_ip6addr_t	srcipaddr, destipaddr;
#else /* UIP_CONF_IPV6 */
	/* IPV4 header */
	u8_t			vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto;
	u16_t			ipchksum;
	uip_ipaddr_t	srcipaddr, destipaddr;
#endif /* UIP_CONF_IPV6 */
};

/*
 * IPv6 extension option headers: we are able to process
 * the 4 extension headers defined in RFC2460 (IPv6):
 * - Hop by hop option header, destination option header:
 *   These two are not used by any core IPv6 protocol, hence
 *   we just read them and go to the next. They convey options,
 *   the options defined in RFC2460 are Pad1 and PadN, which do
 *   some padding, and that we do not need to read (the length
 *   field in the header is enough)
 * - Routing header: this one is most notably used by MIPv6,
 *   which we do not implement, hence we just read it and go
 *   to the next
 * - Fragmentation header: we read this header and are able to
 *   reassemble packets
 *
 * We do not offer any means to send packets with extension headers
 *
 * We do not implement Authentication and ESP headers, which are
 * used in IPSec and defined in RFC4302,4303,4305,4385
 */

/* common header part */
struct uip_ext_hdr
{
	u8_t	next;
	u8_t	len;
};

/* Hop by Hop option header */
struct uip_hbho_hdr
{
	u8_t	next;
	u8_t	len;
};

/* destination option header */
struct uip_desto_hdr
{
	u8_t	next;
	u8_t	len;
};

/* We do not define structures for PAD1 and PADN options */

/*
 * routing header
 * the routing header as 4 common bytes, then routing header type
 * specific data there are several types of routing header. Type 0 was
 * deprecated as per RFC5095 most notable other type is 2, used in
 * RFC3775 (MIPv6) here we do not implement MIPv6, so we just need to
 * parse the 4 first bytes
 */
struct uip_routing_hdr
{
	u8_t	next;
	u8_t	len;
	u8_t	routing_type;
	u8_t	seg_left;
};

/* fragmentation header */
struct uip_frag_hdr
{
	u8_t	next;
	u8_t	res;
	u16_t	offsetresmore;
	u32_t	id;
};

/*
 * an option within the destination or hop by hop option headers
 * it contains type an length, which is true for all options but PAD1
 */
struct uip_ext_hdr_opt
{
	u8_t	type;
	u8_t	len;
};

/* PADN option */
struct uip_ext_hdr_opt_padn
{
	u8_t	opt_type;
	u8_t	opt_len;
};

/* TCP header */
struct uip_tcp_hdr
{
	u16_t	srcport;
	u16_t	destport;
	u8_t	seqno[4];
	u8_t	ackno[4];
	u8_t	tcpoffset;
	u8_t	flags;
	u8_t	wnd[2];
	u16_t	tcpchksum;
	u8_t	urgp[2];
	u8_t	optdata[4];
};

/* The ICMP headers. */
struct uip_icmp_hdr
{
	u8_t	type, icode;
	u16_t	icmpchksum;
#if !UIP_CONF_IPV6
	u16_t	id, seqno;
#endif /* !UIP_CONF_IPV6 */
};

/* The UDP headers. */
struct uip_udp_hdr
{
	u16_t	srcport;
	u16_t	destport;
	u16_t	udplen;
	u16_t	udpchksum;
};

/**
 * The buffer size available for user data in the \ref uip_buf buffer.
 *
 * This macro holds the available size for user data in the \ref
 * uip_buf buffer. The macro is intended to be used for checking
 * bounds of available user data.
 *
 * Example:
 \code
 snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i);
 \endcode
 *
 * \hideinitializer
 */
#define UIP_APPDATA_SIZE	( UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN )
#define UIP_APPDATA_PTR		( void * ) &uip_buf[UIP_LLH_LEN + UIP_TCPIP_HLEN]

#define UIP_PROTO_ICMP		1
#define UIP_PROTO_TCP		6
#define UIP_PROTO_UDP		17
#define UIP_PROTO_ICMP6		58

#if UIP_CONF_IPV6 != 0

/** @{ */

/** \brief  extension headers types */
#define UIP_PROTO_HBHO		0
#define UIP_PROTO_DESTO		60
#define UIP_PROTO_ROUTING	43
#define UIP_PROTO_FRAG		44
#define UIP_PROTO_NONE		59

/** @} */

/** @{ */

/** \brief  Destination and Hop By Hop extension headers option types */
#define UIP_EXT_HDR_OPT_PAD1	0
#define UIP_EXT_HDR_OPT_PADN	1

/** @} */

/** @{ */

/**
 * \brief Bitmaps for extension header processing
 *
 * When processing extension headers, we should record somehow which one we
 * see, because you cannot have twice the same header, except for destination
 * We store all this in one u8_t bitmap one bit for each header expected. The
 * order in the bitmap is the order recommended in RFC2460
 */
#define UIP_EXT_HDR_BITMAP_HBHO		0x01
#define UIP_EXT_HDR_BITMAP_DESTO1	0x02
#define UIP_EXT_HDR_BITMAP_ROUTING	0x04
#define UIP_EXT_HDR_BITMAP_FRAG		0x08
#define UIP_EXT_HDR_BITMAP_AH		0x10
#define UIP_EXT_HDR_BITMAP_ESP		0x20
#define UIP_EXT_HDR_BITMAP_DESTO2	0x40

/** @} */
#endif /* UIP_CONF_IPV6 */

/* Header sizes. */
#if UIP_CONF_IPV6 != 0
#define UIP_IPH_LEN		40
#define UIP_FRAGH_LEN	8
#else /* UIP_CONF_IPV6 */
#define UIP_IPH_LEN 20		/* Size of IP header */
#endif /* UIP_CONF_IPV6 */

#define UIP_UDPH_LEN	8	/* Size of UDP header */
#define UIP_TCPH_LEN	20	/* Size of TCP header */
#ifdef UIP_IPH_LEN
#define UIP_ICMPH_LEN	4	/* Size of ICMP header */
#endif
#define UIP_IPUDPH_LEN	( UIP_UDPH_LEN + UIP_IPH_LEN )	/* Size of IP +
                        * UDP
							   * header */
#define UIP_IPTCPH_LEN	( UIP_TCPH_LEN + UIP_IPH_LEN )	/* Size of IP +
							   * TCP
							   * header */
#define UIP_TCPIP_HLEN	UIP_IPTCPH_LEN
#define UIP_IPICMPH_LEN ( UIP_IPH_LEN + UIP_ICMPH_LEN ) /* size of ICMP
                                                         + IP header */
#define UIP_LLIPH_LEN	( UIP_LLH_LEN + UIP_IPH_LEN )	/* size of L2
                                                        + IP header */
#if UIP_CONF_IPV6 != 0

/**
 * The sums below are quite used in ND. When used for uip_buf, we
 * include link layer length when used for uip_len, we do not, hence
 * we need values with and without LLH_LEN we do not use capital
 * letters as these values are variable
 */
#define uip_l2_l3_hdr_len		( UIP_LLH_LEN + UIP_IPH_LEN + uip_ext_len )
#define uip_l2_l3_icmp_hdr_len	( UIP_LLH_LEN + UIP_IPH_LEN + uip_ext_len + UIP_ICMPH_LEN )
#define uip_l3_hdr_len			( UIP_IPH_LEN + uip_ext_len )
#define uip_l3_icmp_hdr_len		( UIP_IPH_LEN + uip_ext_len + UIP_ICMPH_LEN )
#endif /*UIP_CONF_IPV6*/

#ifdef UIP_FIXEDADDR
CCIF extern const uip_ipaddr_t	uip_hostaddr, uip_netmask, uip_draddr;
#else /* UIP_FIXEDADDR */
CCIF extern uip_ipaddr_t		uip_hostaddr, uip_netmask, uip_draddr;
#endif /* UIP_FIXEDADDR */
CCIF extern const uip_ipaddr_t	uip_broadcast_addr;
CCIF extern const uip_ipaddr_t	uip_all_zeroes_addr;

#ifdef UIP_FIXEDETHADDR
CCIF extern const uip_lladdr_t	uip_lladdr;
#else
CCIF extern uip_lladdr_t		uip_lladdr;
#endif
#if UIP_CONF_IPV6 != 0

/**
 * \brief Is IPv6 address a the unspecified address
 * a is of type uip_ipaddr_t
 */
#define uip_is_addr_unspecified( a ) \
		(							 \
			(((a)->u16[0]) == 0) &&	 \
			(((a)->u16[1]) == 0) &&	 \
			(((a)->u16[2]) == 0) &&	 \
			(((a)->u16[3]) == 0) &&	 \
			(((a)->u16[4]) == 0) &&	 \
			(((a)->u16[5]) == 0) &&	 \
			(((a)->u16[6]) == 0) &&	 \
			(((a)->u16[7]) == 0)	 \
		)

/** \brief Is IPv6 address a the link local all-nodes multicast address */
#define uip_is_addr_linklocal_allnodes_mcast( a ) \
		(										  \
			(((a)->u8[0]) == 0xff) &&			  \
			(((a)->u8[1]) == 0x02) &&			  \
			(((a)->u16[1]) == 0) &&				  \
			(((a)->u16[2]) == 0) &&				  \
			(((a)->u16[3]) == 0) &&				  \
			(((a)->u16[4]) == 0) &&				  \
			(((a)->u16[5]) == 0) &&				  \
			(((a)->u16[6]) == 0) &&				  \
			(((a)->u8[14]) == 0) &&				  \
			(((a)->u8[15]) == 0x01)				  \
		)

/** \brief set IP address a to unspecified */
#define uip_create_unspecified( a ) uip_ip6addr( a, 0, 0, 0, 0, 0, 0, 0, 0 )

/** \brief set IP address a to the link local all-nodes multicast address */
#define uip_create_linklocal_allnodes_mcast( a )	uip_ip6addr( a, 0xff02, 0, 0, 0, 0, 0, 0, 0x0001 )

/** \brief set IP address a to the link local all-routers multicast address */
#define uip_create_linklocal_allrouters_mcast( a )	uip_ip6addr( a, 0xff02, 0, 0, 0, 0, 0, 0, 0x0002 )

/**
 * \brief  is addr (a) a solicited node multicast address, see RFC3513
 *  a is of type uip_ipaddr_t*
 */
#define uip_is_addr_solicited_node( a ) \
		(								\
			(((a)->u8[0]) == 0xFF) &&	\
			(((a)->u8[1]) == 0x02) &&	\
			(((a)->u16[1]) == 0) &&		\
			(((a)->u16[2]) == 0) &&		\
			(((a)->u16[3]) == 0) &&		\
			(((a)->u16[4]) == 0) &&		\
			(((a)->u16[5]) == 1) &&		\
			(((a)->u8[12]) == 0xFF)		\
		)

/**
 * \briefput in b the solicited node address corresponding to address a
 * both a and b are of type uip_ipaddr_t*
 * */
#define uip_create_solicited_node( a, b ) \
	( ((b)->u8[0]) = 0xFF );			  \
	( ((b)->u8[1]) = 0x02 );			  \
	( ((b)->u16[1]) = 0 );				  \
	( ((b)->u16[2]) = 0 );				  \
	( ((b)->u16[3]) = 0 );				  \
	( ((b)->u16[4]) = 0 );				  \
	( ((b)->u8[10]) = 0 );				  \
	( ((b)->u8[11]) = 0x01 );			  \
	( ((b)->u8[12]) = 0xFF );			  \
	( ((b)->u8[13]) = ((a)->u8[13]) );	  \
	( ((b)->u16[7]) = ((a)->u16[7]) )

/**
 * \brief is addr (a) a link local unicast address, see RFC3513
 *  i.e. is (a) on prefix FE80::/10
 *  a is of type uip_ipaddr_t*
 */
#define uip_is_addr_link_local( a ) ( (((a)->u8[0]) == 0xFE) && (((a)->u8[1]) == 0x80) )

/**
 * \brief was addr (a) forged based on the mac address m
 * a type is uip_ipaddr_t
 * m type is uiplladdr_t
 */
#ifdef UIP_CONF_LL_802154
#define uip_is_addr_mac_addr_based( a, m )				 \
		(												 \
			(((a)->u8[8]) == (((m)->addr[0]) ^ 0x02)) && \
			(((a)->u8[9]) == (m)->addr[1]) &&			 \
			(((a)->u8[10]) == (m)->addr[2]) &&			 \
			(((a)->u8[11]) == (m)->addr[3]) &&			 \
			(((a)->u8[12]) == (m)->addr[4]) &&			 \
			(((a)->u8[13]) == (m)->addr[5]) &&			 \
			(((a)->u8[14]) == (m)->addr[6]) &&			 \
			(((a)->u8[15]) == (m)->addr[7])				 \
		)
#else
#define uip_is_addr_mac_addr_based( a, m )				 \
		(												 \
			(((a)->u8[8]) == (((m)->addr[0]) | 0x02)) && \
			(((a)->u8[9]) == (m)->addr[1]) &&			 \
			(((a)->u8[10]) == (m)->addr[2]) &&			 \
			(((a)->u8[11]) == 0xff) &&					 \
			(((a)->u8[12]) == 0xfe) &&					 \
			(((a)->u8[13]) == (m)->addr[3]) &&			 \
			(((a)->u8[14]) == (m)->addr[4]) &&			 \
			(((a)->u8[15]) == (m)->addr[5])				 \
		)
#endif /*UIP_CONF_LL_802154*/

/**
 * \brief is address a multicast address, see RFC 3513
 * a is of type uip_ipaddr_t*
 * */
#define uip_is_addr_mcast( a )	( ((a)->u8[0]) == 0xFF )

/**
 * \brief is group-id of multicast address a
 * the all nodes group-id
 */
#define uip_is_mcast_group_id_all_nodes( a ) \
		(									 \
			(((a)->u16[1]) == 0) &&			 \
			(((a)->u16[2]) == 0) &&			 \
			(((a)->u16[3]) == 0) &&			 \
			(((a)->u16[4]) == 0) &&			 \
			(((a)->u16[5]) == 0) &&			 \
			(((a)->u16[6]) == 0) &&			 \
			(((a)->u8[14]) == 0) &&			 \
			(((a)->u8[15]) == 1)			 \
		)

/**
 * \brief is group-id of multicast address a
 * the all routers group-id
 */
#define uip_is_mcast_group_id_all_routers( a ) \
		(									   \
			(((a)->u16[1]) == 0) &&			   \
			(((a)->u16[2]) == 0) &&			   \
			(((a)->u16[3]) == 0) &&			   \
			(((a)->u16[4]) == 0) &&			   \
			(((a)->u16[5]) == 0) &&			   \
			(((a)->u16[6]) == 0) &&			   \
			(((a)->u8[14]) == 0) &&			   \
			(((a)->u8[15]) == 2)			   \
		)
#endif /*UIP_CONF_IPV6*/

/**
 * Calculate the Internet checksum over a buffer.
 *
 * The Internet checksum is the one's complement of the one's
 * complement sum of all 16-bit words in the buffer.
 *
 * See RFC1071.
 *
 * \param buf A pointer to the buffer over which the checksum is to be
 * computed.
 *
 * \param len The length of the buffer over which the checksum is to
 * be computed.
 *
 * \return The Internet checksum of the buffer.
 */
u16_t	uip_chksum( u16_t *buf, u16_t len );

/**
 * Calculate the IP header checksum of the packet header in uip_buf.
 *
 * The IP header checksum is the Internet checksum of the 20 bytes of
 * the IP header.
 *
 * \return The IP header checksum of the IP header in the uip_buf
 * buffer.
 */
u16_t	uip_ipchksum( void );

/**
 * Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
 *
 * The TCP checksum is the Internet checksum of data contents of the
 * TCP segment, and a pseudo-header as defined in RFC793.
 *
 * \return The TCP checksum of the TCP segment in uip_buf and pointed
 * to by uip_appdata.
 */
u16_t	uip_tcpchksum( void );

/**
 * Calculate the UDP checksum of the packet in uip_buf and uip_appdata.
 *
 * The UDP checksum is the Internet checksum of data contents of the
 * UDP segment, and a pseudo-header as defined in RFC768.
 *
 * \return The UDP checksum of the UDP segment in uip_buf and pointed
 * to by uip_appdata.
 */
u16_t	uip_udpchksum( void );

/**
 * Calculate the ICMP checksum of the packet in uip_buf.
 *
 * \return The ICMP checksum of the ICMP packet in uip_buf
 */
u16_t	uip_icmp6chksum( void );

/* Events that can get posted to the uIP event queue.  These are events
originating from the Ethernet interface or from a timer. */
#define uipETHERNET_RX_EVENT		0x01UL
#define	uipETHERNET_TX_EVENT		0x02UL
#define uipARP_TIMER_EVENT			0x04UL
#define uipPERIODIC_TIMER_EVENT		0x08UL
#define uipAPPLICATION_SEND_EVENT	0x10UL


#endif /* __UIP_H__ */

/** @} */
