Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

net: initial import of an IPv6 neighbor cache #2461

Merged
merged 2 commits into from
Mar 14, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is 8 big enough? I would definitely put an #ifndef... around this, so that the application designer - who might know more about expected node degree - can overwrite this.

#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) /**< Mask for neighbor cache state */
#define NG_IPV6_NC_STATE_POS (0) /**< Shift of neighbor cache state */

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

/**
* @brief The entry is unreachable
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't this line belongs a couple of lines below?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no, it documents the NG_IPV6_NC_STATE_UNREACHABLE macro, which is exactly below this comment block.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Never mind! Will open my eyes next time.

*
* @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) /**< Mask for neighbor cache state */
#define NG_IPV6_NC_TYPE_POS (4) /**< Shift of neighbor cache state */

/**
* @{
* @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