Skip to content

Commit

Permalink
ng_ipv6_nc: Initial import
Browse files Browse the repository at this point in the history
  • Loading branch information
miri64 committed Mar 13, 2015
1 parent 67abf81 commit 9081461
Show file tree
Hide file tree
Showing 5 changed files with 415 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Makefile.dep
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ ifneq (,$(filter sixlowpan,$(USEMODULE)))
USEMODULE += vtimer
endif

ifneq (,$(filter ng_ipv6_nc,$(USEMODULE)))
USEMODULE += ng_ipv6_addr
endif

ifneq (,$(filter aodvv2,$(USEMODULE)))
USEMODULE += vtimer
USEMODULE += sixlowpan
Expand Down
3 changes: 3 additions & 0 deletions sys/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ endif
ifneq (,$(filter ng_ipv6_addr,$(USEMODULE)))
DIRS += net/network_layer/ng_ipv6/addr
endif
ifneq (,$(filter ng_ipv6_nc,$(USEMODULE)))
DIRS += net/network_layer/ng_ipv6/nc
endif
ifneq (,$(filter ng_netapi,$(USEMODULE)))
DIRS += net/crosslayer/ng_netapi
endif
Expand Down
220 changes: 220 additions & 0 deletions sys/include/net/ng_ipv6/nc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
/*
* Copyright (C) 2015 Martine Lenders <[email protected]>
*
* 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_ng_ipv6_nc IPv6 neighbor cache
* @ingroup net_ng_ipv6
* @brief Translates IPv6 addresses to link layer addresses.
* @{
*
* @file
* @brief Neighbor cache definitions.
*
* @author Martine Lenders <[email protected]>
*/

#ifndef NG_IPV6_NC_H_
#define NG_IPV6_NC_H_

#include <stdint.h>

#include "kernel_types.h"
#include "net/ng_ipv6/addr.h"
#include "net/ng_netif.h"
#include "net/ng_pktqueue.h"
#include "timex.h"

#ifdef __cplusplus
extern "C" {
#endif

#ifndef NG_IPV6_NC_SIZE
/**
* @brief The size of the neighbor cache
*/
#define NG_IPV6_NC_SIZE (NG_NETIF_NUMOF * 8)
#endif

#ifndef NG_IPV6_NC_L2_ADDR_MAX
/**
* @brief The maximum size of a link layer address
*/
#define NG_IPV6_NC_L2_ADDR_MAX (8)
#endif

/**
* @{
* @name Flag definitions for ng_ipv6_nc_t
*/
/**
* @{
* @brief States of a neighbor cache entry.
*
* @see <a href="http://tools.ietf.org/html/rfc4861#section-7.3.2">
* RFC 4861, section 7.3.2
* </a>
*/
#define NG_IPV6_NC_STATE_MASK (0x07)
#define NG_IPV6_NC_STATE_POS (0)

#define NG_IPV6_NC_STATE_UNMANAGED (0x00) /**< The entry is not manage by NDP */

/**
* @brief The entry is unreachable
*
* @see <a href="http://tools.ietf.org/html/rfc7048#section-3">
* RFC 7048, section 3
* </a>
*/
#define NG_IPV6_NC_STATE_UNREACHABLE (0x01)
#define NG_IPV6_NC_STATE_INCOMPLETE (0x02) /**< Address resolution is performed */
#define NG_IPV6_NC_STATE_STALE (0x03) /**< The entry is stale */
#define NG_IPV6_NC_STATE_DELAY (0x04) /**< The entry was stale but packet was sent out */
#define NG_IPV6_NC_STATE_PROBE (0x05) /**< Periodic reachabality confirmation */
#define NG_IPV6_NC_STATE_REACHABLE (0x07) /**< The entry is reachable */
/**
* @}
*/

#define NG_IPV6_NC_IS_ROUTER (0x08) /**< The neighbor is a router */

#define NG_IPV6_NC_TYPE_MASK (0x30)
#define NG_IPV6_NC_TYPE_POS (4)

/**
* @{
* @brief States of a neighbor cache entry.
*
* @see <a href="http://tools.ietf.org/html/rfc6775#section-3.5">
* RFC 6775, section 3.5
* </a>
*/
/**
* @brief The entry has no type
*
* @details The node sents multicast Neighbor Solicitations for hosts.
*/
#define NG_IPV6_NC_TYPE_NONE (0x00)
#define NG_IPV6_NC_TYPE_GC (0x10) /**< The entry is marked for removal */
#define NG_IPV6_NC_TYPE_TENTATIVE (0x20) /**< The entry is temporary */
#define NG_IPV6_NC_TYPE_REGISTERED (0x30) /**< The entry is registered */
/**
* @}
*/
/**
* @}
*/

/**
* @brief Neighbor cache entry as defined in
* <a href="http://tools.ietf.org/html/rfc4861#section-5.1">
* RFC 4861, section 5.1
* </a>.
*/
typedef struct {
ng_pktqueue_t pkts; /**< Packets waiting for address resolution */
ng_ipv6_addr_t ipv6_addr; /**< IPv6 address of the neighbor */
uint8_t l2_addr[NG_IPV6_NC_L2_ADDR_MAX];/**< Link layer address of the neighbor */
uint8_t l2_addr_len; /**< Length of ng_ipv6_nc_t::l2_addr */
uint8_t flags; /**< Flags as defined above */
kernel_pid_t iface; /**< PID to the interface where the neighbor is */
} ng_ipv6_nc_t;

/**
* @brief Initializes neighbor cache
*/
void ng_ipv6_nc_init(void);

/**
* @brief Adds a neighbor to the neighbor cache
*
* @param[in] iface PID to the interface where the neighbor is.
* Must not be KERNEL_PID_UNDEF.
* @param[in] ipv6_addr IPv6 address of the neighbor. Must not be NULL.
* @param[in] l2_addr Link layer address of the neighbor. NULL if unknown.
* @param[in] l2_addr_len Length of @p l2_addr, must be lesser than or equal
* to NG_IPV6_L2_ADDR_MAX. 0 if unknown.
* @param[in] flags Flags for the entry
*
* @return 0 on success
* @return -EADDRINUSE, if @p ipv6_addr is already registered to the neighbor
* cache.
* @return -EFAULT, if @p ipv6_addr was NULL.
* @return -EINVAL, if @p l2_addr_len is greater then @ref NG_IPV6_NC_L2_ADDR_MAX,
* @p ipv6_addr is unspecified or @p iface is KERNEL_PID_UNDEF.
* @return -ENOMEM, if no space is left to store entry.
*/
int ng_ipv6_nc_add(kernel_pid_t iface, const ng_ipv6_addr_t *ipv6_addr,
const void *l2_addr, size_t l2_addr_len, uint8_t flags);

/**
* @brief Removes a neighbor from the neighbor cache
*
* @param[in] iface PID to the interface where the neighbor is. If it
* is KERNEL_PID_UNDEF it will be removed for all
* interfaces.
* @param[in] ipv6_addr IPv6 address of the neighbor
*/
void ng_ipv6_nc_remove(kernel_pid_t iface, const ng_ipv6_addr_t *ipv6_addr);

/**
* @brief Searches for any neighbor cache entry fitting the @p ipv6_addr.
*
* @param[in] iface PID to the interface where the neighbor is. If it
* is KERNEL_PID_UNDEF it will be searched on all
* interfaces.
* @param[in] ipv6_addr An IPv6 address
*
* @return The neighbor cache entry, if one is found.
* @return NULL, if none is found.
*/
ng_ipv6_nc_t *ng_ipv6_nc_get(kernel_pid_t iface, const ng_ipv6_addr_t *ipv6_addr);

/**
* @brief Searches for any neighbor cache entry fitting the @p ipv6_addr,
* where you currently can send a packet to (do not confuse with
* NG_IPV6_NC_STATE_REACHABLE).
*
* @param[in] iface PID to the interface where the neighbor is. If it
* is KERNEL_PID_UNDEF it will be searched on all
* interfaces.
* @param[in] ipv6_addr An IPv6 address
*
* @return The neighbor cache entry, if one is found.
* @return NULL, if none is found.
*/
ng_ipv6_nc_t *ng_ipv6_nc_get_reachable(kernel_pid_t iface,
const ng_ipv6_addr_t *ipv6_addr);

/**
* @brief Marks an entry as still reachable, if one with a fitting @p ipv6_addr
* can be found.
*
* @details This function can be used by upper layer protocols for neighbor
* discovery optimization to confirm that there was a reachability
* confirmation (e. g. an ACK in TCP) from the neighbor.
*
* @see <a href="http://tools.ietf.org/html/rfc4861#section-7.3.1">
* RFC 4861, section 7.3.1
* </a>
*
* @param[in] ipv6_addr An IPv6 address
*
* @return The neighbor cache entry, if one is found.
* @return NULL, if none is found.
*/
ng_ipv6_nc_t *ng_ipv6_nc_still_reachable(const ng_ipv6_addr_t *ipv6_addr);

#ifdef __cplusplus
}
#endif

#endif /* NG_IPV6_NC_H_ */
/**
* @}
*/
3 changes: 3 additions & 0 deletions sys/net/network_layer/ng_ipv6/nc/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
MODULE = ng_ipv6_nc

include $(RIOTBASE)/Makefile.base
Loading

0 comments on commit 9081461

Please sign in to comment.