You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

286 lines
10 KiB

/*
* Copyright (C) 2015 Martine Lenders <mlenders@inf.fu-berlin.de>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @defgroup net_gnrc_sixlowpan_nd 6LoWPAN neighbor discovery
* @ingroup net_gnrc_sixlowpan
* @brief Neighbor Discovery Optimization for 6LoWPAN
* @see <a href="https://tools.ietf.org/html/rfc6775">
* RFC 6775
* </a>
* @{
*
* @file
* @brief General 6LoWPAN ND definitions
*
* @author Martine Lenders <mlenders@inf.fu-berlin.de>
*/
#ifndef GNRC_SIXLOWPAN_ND_H_
#define GNRC_SIXLOWPAN_ND_H_
#include <stdint.h>
#include "kernel_types.h"
#include "net/gnrc/ipv6/nc.h"
#include "net/gnrc/ipv6/netif.h"
#include "net/ipv6/addr.h"
#include "net/ndp.h"
#include "net/sixlowpan/nd.h"
#include "timex.h"
#include "net/gnrc/sixlowpan/nd/border_router.h"
#include "net/gnrc/sixlowpan/nd/router.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Message type for next multicast router solicitation.
*/
#define GNRC_SIXLOWPAN_ND_MSG_MC_RTR_SOL (0x0220)
/**
* @brief Message type for next unicast router solicitation.
*/
#define GNRC_SIXLOWPAN_ND_MSG_UC_RTR_SOL (0x0221)
/**
* @brief Message type for removing 6LoWPAN contexts.
*/
#define GNRC_SIXLOWPAN_ND_MSG_DELETE_CTX (0x0222)
/**
* @brief Message type for authoritative border router timeout
*/
#define GNRC_SIXLOWPAN_ND_MSG_ABR_TIMEOUT (0x0223)
/**
* @brief Message type for address registration timeout
*/
#define GNRC_SIXLOWPAN_ND_MSG_AR_TIMEOUT (0x0224)
#ifndef GNRC_SIXLOWPAN_ND_AR_LTIME
/**
* @brief Registration lifetime in minutes for the address registration option
*
* This value should be adapted to the devices power-lifecycle so that it is greater than the
* time the device spends sleeping.
*
* @see <a href="https://tools.ietf.org/html/rfc6775#section-5.8.1">
* RFC 6775, section 5.8.1
* </a>
*/
#define GNRC_SIXLOWPAN_ND_AR_LTIME (15U)
#endif
/**
* @name Border router constants
* @{
* @see <a href="https://tools.ietf.org/html/rfc6775#section-9">
* RFC 6775, section 9
* </a>
*/
#define GNRC_SIXLOWPAN_ND_RTR_MIN_CTX_DELAY (300U) /**< minimum delay between context change and
* stop of C=0 dissimination in seconds */
/** @} */
/**
* @name Host constants
* @{
* @see <a href="https://tools.ietf.org/html/rfc6775#section-9">
* RFC 6775, section 9
* </a>
*/
#define GNRC_SIXLOWPAN_ND_RTR_SOL_INT (10U) /**< replacement value (in seconds) for
* @ref GNRC_NDP_MAX_RTR_SOL_INT */
#define GNRC_SIXLOWPAN_ND_MAX_RTR_SOL_INT (60U) /**< retransmission increment for exponential
* backoff of subsequent RS */
/** @} */
/**
* @name Router constants
* @{
* @see <a href="https://tools.ietf.org/html/rfc6775#section-9">
* RFC 6775, section 9
* </a>
*/
#define GNRC_SIXLOWPAN_ND_MIN_RTR_ADV_DELAY (10U) /**< replacement value (in seconds) for
* @ref GNRC_NDP_MIN_RTR_ADV_DELAY */
/**
* @brief replacement value (in microseconds) for @ref GNRC_NDP_MAX_RTR_ADV_DELAY
*/
#define GNRC_SIXLOWPAN_ND_MAX_RTR_ADV_DELAY (2U * US_PER_SEC)
/**
* @brief Lifetime of a tentative address entry in seconds
*/
#define GNRC_SIXLOWPAN_ND_TENTATIVE_NCE_LIFETIME (20U)
/**
* @brief 6LoWPAN Multihop Hoplimit
*/
#define GNRC_SIXLOWPAN_ND_MULTIHOP_HOPLIMIT (64U)
/** @} */
/**
* @brief Initializes 6LoWPAN neighbor discovery for the interface.
* @pre @p iface->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN
* @param[in] iface An IPv6 interface.
*/
void gnrc_sixlowpan_nd_init(gnrc_ipv6_netif_t *iface);
/**
* @brief Multicasts a router solicitation over @p iface
* @pre @p iface->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN
* @param[in] iface An IPv6 interface.
*/
void gnrc_sixlowpan_nd_mc_rtr_sol(gnrc_ipv6_netif_t *iface);
/**
* @brief Unicasts a router solicitation to the neighbor represented by @p nce
* @pre @p nce->iface is an IPv6 interface and @ref GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN is set
* in its flags.
* @param[in] nce The neighbor to send the router solicitation to.
*/
void gnrc_sixlowpan_nd_uc_rtr_sol(gnrc_ipv6_nc_t *nce);
/**
* @brief Get link-layer address and interface for next hop to destination
* IPv6 address.
*
* @param[out] l2addr The link-layer for the next hop to @p dst.
* @param[out] l2addr_len Length of @p l2addr.
* @param[in] iface The interface to search the next hop on.
* May be @ref KERNEL_PID_UNDEF if not specified.
* @param[in] dst An IPv6 address to search the next hop for.
*
* @return The PID of the interface, on success.
* @return -EHOSTUNREACH, if @p dst is not reachable.
* @return -ENOBUFS, if @p l2addr_len was smaller than the resulting @p l2addr
* would be long.
*/
kernel_pid_t gnrc_sixlowpan_nd_next_hop_l2addr(uint8_t *l2addr, uint8_t *l2addr_len,
kernel_pid_t iface, ipv6_addr_t *dst);
/**
* @brief Reschedules the next router advertisement for a neighboring router.
*
* @pre nce != NULL && sec_delay != 0U
*
* @param[in] nce Neighbor cache entry representing the neighboring router.
* @param[in] sec_delay The delay for the next router solicitation in seconds.
*/
void gnrc_sixlowpan_nd_rtr_sol_reschedule(gnrc_ipv6_nc_t *nce, uint32_t sec_delay);
/**
* @brief Builds the address registration option.
*
* @param[in] status Status for the ARO.
* @param[in] ltime Registration lifetime for the ARO.
* @param[in] eui64 The EUI-64 for the ARO
* @param[in] next More options in the packet. NULL, if there are none.
*
* @return The pkt snip list of options, on success
* @return NULL, if packet buffer is full
*/
gnrc_pktsnip_t *gnrc_sixlowpan_nd_opt_ar_build(uint8_t status, uint16_t ltime, eui64_t *eui64,
gnrc_pktsnip_t *next);
/**
* @brief Handles address registration option.
*
* @param[in] iface The interface the ARO was received on.
* @param[in] ipv6 The IPv6 header the ARO was received in.
* @param[in] icmpv6_type Message type of the ICMPv6 message that contained.
* this message.
* @param[in] addr The IPv6 address to register.
* @param[in] ar_opt The address registration option.
* @param[in] sl2a The link-layer source address contained in SL2A accompanying this
* option. May be NULL for icmpv6_type == ICMPV6_NBR_ADV.
* @param[in] sl2a_len Length of @p sl2a. May be 0 if sl2a == NULL.
*
* @return Status for the ARO in the replying NA (always 0 if icmpv6_type == ICMPV6_NBR_ADV).
*/
uint8_t gnrc_sixlowpan_nd_opt_ar_handle(kernel_pid_t iface, ipv6_hdr_t *ipv6,
uint8_t icmpv6_type, ipv6_addr_t *addr,
sixlowpan_nd_opt_ar_t *ar_opt,
uint8_t *sl2a, size_t sl2a_len);
/**
* @brief Handles 6LoWPAN context option.
*
* @param[in] icmpv6_type Message type of the ICMPv6 message that contained.
* this message.
* @param[in] ctx_opt The 6LoWPAN context option.
*
* @return true, when 6LoWPAN context option was correct.
* @return false, when it was incorrect.
*/
bool gnrc_sixlowpan_nd_opt_6ctx_handle(uint8_t icmpv6_type, sixlowpan_nd_opt_6ctx_t *ctx_opt);
/**
* @brief Handles registration calls after node-wakeup.
*
* @see <a href="https://tools.ietf.org/html/rfc6775#section-5.8.2">
* RFC 6776, section 5.8.2
* </a>
*/
void gnrc_sixlowpan_nd_wakeup(void);
#ifdef MODULE_GNRC_SIXLOWPAN_ND_ROUTER
/**
* @brief Handles authoritative border router option.
*
* @param[in] iface Interface the source link-layer option was received
* on.
* @param[in] rtr_adv The router advertisement containing the ABRO.
* @param[in] icmpv6_size The size of the @p rtr_adv.
* @param[in] abr_opt The ABRO.
*
* @note Erroneous ABROs are always ignored silently.
*/
void gnrc_sixlowpan_nd_opt_abr_handle(kernel_pid_t iface, ndp_rtr_adv_t *rtr_adv, int icmpv6_size,
sixlowpan_nd_opt_abr_t *abr_opt);
/**
* @brief Builds the 6LoWPAN context option.
*
* @param[in] prefix_len The length of the context's prefix.
* @param[in] flags Flags + CID for the context.
* @param[in] ltime Lifetime of the context.
* @param[in] prefix The context's prefix
* @param[in] next More options in the packet. NULL, if there are none.
*
* @return The pkt snip list of options, on success
* @return NULL, if packet buffer is full or on error
*/
gnrc_pktsnip_t *gnrc_sixlowpan_nd_opt_6ctx_build(uint8_t prefix_len, uint8_t flags, uint16_t ltime,
ipv6_addr_t *prefix, gnrc_pktsnip_t *next);
/**
* @brief Builds the authoritative border router option.
*
* @param[in] version Version of the border router information.
* @param[in] ltime Registration lifetime for the border router.
* @param[in] braddr The IPv6 address of the border router.
* @param[in] next More options in the packet. NULL, if there are none.
*
* @return The pkt snip list of options, on success
* @return NULL, if packet buffer is full or on error
*/
gnrc_pktsnip_t *gnrc_sixlowpan_nd_opt_abr_build(uint32_t version, uint16_t ltime,
ipv6_addr_t *braddr, gnrc_pktsnip_t *next);
#else
#define gnrc_sixlowpan_nd_opt_abr_handle(iface, rtr_adv, icmpv6_size, abr_opt)
#define gnrc_sixlowpan_nd_opt_6ctx_build(prefix_len, flags, ltime, prefix, next) (NULL)
#define gnrc_sixlowpan_nd_opt_abr_build(version, ltime, braddr, next) (NULL)
#endif
#ifdef __cplusplus
}
#endif
#endif /* GNRC_SIXLOWPAN_ND_H_ */
/** @} */