nes-proj/core/net/uip-netif.h

208 lines
6.4 KiB
C

/**
* \addtogroup uip6
* @{
*/
/**
* \file
* Network interface and stateless autoconfiguration (RFC 4862)
* \author Mathilde Durvy <mdurvy@cisco.com>
* \author Julien Abeille <jabeille@cisco.com>
*
*/
/*
*
* 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.
*
*
*/
#ifndef __UIP_NETIF_H__
#define __UIP_NETIF_H__
#include "net/uip-nd6.h"
#ifndef UIP_CONF_NETIF_MAX_ADDRESSES
#define UIP_CONF_NETIF_MAX_ADDRESSES 2
#endif /*UIP_CONF_NETIF_MAX_ADDRESSES*/
/**
* \brief Possible states for the address of an interface (RFC 4862 autoconf +
* NOT_USED + INFINITE)
*/
typedef enum {
NOT_USED = -1,
TENTATIVE = 0,
PREFERRED = 1,
DEPRECATED = 2, /* not needed if we don't use pliffetime in prefix struct */
} uip_netif_state;
/**
* \brief How the address was acquired: Autoconf, DHCP or manually
*
*/
typedef enum {
AUTOCONF = 1,
DHCP = 2,
MANUAL = 3
} uip_netif_type;
/**
* \brief An address structure for an interface
*
* Contains an ip address assigned to the interface, and its state.
*/
struct uip_netif_addr {
uip_ipaddr_t ipaddr;
uip_netif_state state;
struct stimer vlifetime;
u8_t is_infinite;
uip_netif_type type;
};
/** \brief Interface structure (contains all the interface variables) */
struct uip_netif {
u32_t link_mtu;
u8_t cur_hop_limit;
u32_t base_reachable_time; /* in msec */
u32_t reachable_time; /* in msec */
u32_t retrans_timer; /* in msec */
u8_t dup_addr_detect_transmit;
/** Note: the link-local address is at position 0 */
struct uip_netif_addr addresses[UIP_CONF_NETIF_MAX_ADDRESSES];
uip_ipaddr_t solicited_node_mcastaddr;
};
/*---------------------------------------------------------------------------*/
extern struct uip_netif uip_netif_physical_if;
extern struct etimer uip_netif_timer_dad;
extern struct etimer uip_netif_timer_rs;
extern struct etimer uip_netif_timer_periodic;
/*---------------------------------------------------------------------------*/
/** \brief Initialize the network interfac and run stateless autoconf */
void uip_netif_init(void);
/**
* \brief periodically check the state of the addresses.
*/
void uip_netif_periodic(void);
/**
* \brief recompute random reachable timer
* \return the new value for timer
*/
u32_t uip_netif_compute_reachable_time(void);
/**
* \brief Check if an unicast address is attached to my interface
* \param ipaddr an IP address to be checked
* \return 1 if address is attached to my interface (otherwise false)
*/
#define uip_netif_is_addr_my_unicast(a) (uip_netif_addr_lookup(a, 128, 0) != NULL)
/**
* \brief Check if this is my solicited-node multicast address
* \param ipaddr an IP address to be checked
* \return 1 if the address is my solicited-node (otherwise false)
*/
u8_t uip_netif_is_addr_my_solicited(uip_ipaddr_t *ipaddr);
/**
* \brief Autoconfigure and add an address corresponding to a specific prefix
* \param ipaddr the prefix if we are doing autoconf, the address for DHCP and manual
* \param length the prefix length if autoconf, 0 for DHCP and manual
* \param vlifetime valid lifetime of the address, 0 if the address has INFINITE lifetime,
* non 0 otherwise
* \param type AUTOCONF or MANUAL or DHCP
*/
void uip_netif_addr_add(uip_ipaddr_t *ipaddr, u8_t length, unsigned long vlifetime, uip_netif_type type);
/**
* \brief Set the 8 last bytes of the IP address
* based on the L2 identifier using autoconf
* \param *ipaddr the IP address to be completed with layer 2 info
* \param *lladdr the L2 address
*/
void uip_netif_addr_autoconf_set(uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr);
/**
* \brief Lookup an address
* \param ipaddr the prefix if we are looking for an autoconf address, the address otherwise
* \param length the prefix length if we are looking for autoconf address, 128 otherwise
* \param type AUTOCONF or MANUAL or DHCP or 0
*
*
* If we are looking for an AUTOCONFIGURED address, ipaddr is a prefix
* length is its length, type is AUTOCONF.
* Otherwise ipaddr is a full address, length must be 128, type is MANUAL
* or DHCP.
* Note: if we do not care about the type, type MUST be 0
*/
struct uip_netif_addr *
uip_netif_addr_lookup(uip_ipaddr_t *ipaddr, u8_t length, uip_netif_type type);
/**
* \brief Select the appropriate source address for a packet
* \param ipaddr the selected address (returned value)
* \param ipaddr the destination of the packet
*/
void uip_netif_select_src(uip_ipaddr_t *src, uip_ipaddr_t *dst);
/**
* \brief Schedule DAD for a given address
* \param ifaddr the address for which schedule DAD
*/
void uip_netif_sched_dad(struct uip_netif_addr *ifaddr);
/**
* \brief Perform DAD (i.e. Duplicate Address Detection)
*/
void uip_netif_dad(void);
/**
* \brief DAD failed, should never happen!
* \param ipaddr the address for which DAD failed
*/
void uip_netif_dad_failed(uip_ipaddr_t *ipaddr);
/**
* \brief Schedule the sending of RS
*/
void uip_netif_sched_send_rs(void);
/**
* \brief Send up to MAX_RTR_SOLICITATION_DELAY RS separated by a delay of
* RTR_SOLICITATION_INTERVAL
*/
void uip_netif_send_rs(void);
#endif
/** @} */