Skip to content

Commit

Permalink
Merge branch 'gnrc_ndp2/api/initial' (RIOT-OS#7064) into RIOT-OS#7014
Browse files Browse the repository at this point in the history
  • Loading branch information
miri64 committed Aug 1, 2017
2 parents 75439d4 + 0828789 commit 8b4a6ee
Show file tree
Hide file tree
Showing 9 changed files with 2,012 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Makefile.dep
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,10 @@ ifneq (,$(filter gnrc_ndp,$(USEMODULE)))
USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_ndp2,$(USEMODULE)))
USEMODULE += gnrc_icmpv6
endif

ifneq (,$(filter gnrc_icmpv6_echo,$(USEMODULE)))
USEMODULE += gnrc_icmpv6
endif
Expand Down
355 changes: 355 additions & 0 deletions sys/include/net/gnrc/ndp2.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,355 @@
/*
* Copyright (C) 2017 Freie Universität Berlin
*
* 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_ndp2 IPv6 Neighbor discovery (v2)
* @ingroup net_gnrc_ipv6
* @brief Provides build and send functions for neighbor discovery packets
* @{
*
* @file
* @brief GNRC-specific neighbor discovery definitions
*
* @author Martine Lenders <[email protected]>
*/
#ifndef GNRC_NDP2_H
#define GNRC_NDP2_H

#include <stdint.h>

#include "kernel_types.h"
#include "net/gnrc/pkt.h"
#include "net/gnrc/ipv6/netif.h"
#include "net/ipv6/addr.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
* @brief @ref net_gnrc_nettype to send NDP packets to
*/
#ifndef GNRC_NETTYPE_NDP2
# if defined(MODULE_GNRC_IPV6) || DOXYGEN
# define GNRC_NETTYPE_NDP2 (GNRC_NETTYPE_IPV6)
# else
# define GNRC_NETTYPE_NDP2 (GNRC_NETTYPE_UNDEF)
# endif
#endif /* GNRC_NETTYPE_NDP2 */

/**
* @brief Builds a neighbor solicitation message for sending.
*
* @pre `(tgt != NULL) && !ipv6_addr_is_multicast(tgt)`
*
* @see [RFC 4861, section 4.3](https://tools.ietf.org/html/rfc4861#section-4.3")
*
* @param[in] tgt The target address of the neighbor solicitation.
* May not be NULL and **MUST NOT** be multicast.
* @param[in] options Options to append to the neighbor solicitation.
* May be NULL for none.
*
* @return The resulting ICMPv6 packet on success.
* @return NULL, if packet buffer is full.
*/
gnrc_pktsnip_t *gnrc_ndp2_nbr_sol_build(const ipv6_addr_t *tgt,
gnrc_pktsnip_t *options);

/**
* @brief Builds a neighbor advertisement message for sending.
*
* @pre `(tgt != NULL) && !ipv6_addr_is_multicast(tgt)`
*
* @see [RFC 4861, section 4.4](https://tools.ietf.org/html/rfc4861#section-4.4")
*
* @param[in] tgt For solicited advertisements, the Target Address field
* in the neighbor solicitaton.
* For and unsolicited advertisement, the address whose
* link-layer address has changed.
* May not be NULL and **MUST NOT** be multicast.
* @param[in] flags Neighbor advertisement flags:
* @ref NDP_NBR_ADV_FLAGS_R == 1 indicates, that the
* sender is a router,
* @ref NDP_NBR_ADV_FLAGS_S == 1 indicates that the
* advertisement was sent in response to a neighbor
* solicitation,
* @ref NDP_NBR_ADV_FLAGS_O == 1 indicates that the
* advertisement should override an existing cache entry
* and update the cached link-layer address.
* @param[in] options Options to append to the neighbor advertisement.
* May be NULL for none.
*
* @return The resulting ICMPv6 packet on success.
* @return NULL, if packet buffer is full.
*/
gnrc_pktsnip_t *gnrc_ndp2_nbr_adv_build(const ipv6_addr_t *tgt, uint8_t flags,
gnrc_pktsnip_t *options);

/**
* @brief Builds a router solicitation message for sending.
*
* @see `[RFC 4861, section 4.1](https://tools.ietf.org/html/rfc4861#section-4.1")
*
* @param[in] options Options to append to the router solicitation.
* May be NULL for none.
*
* @return The resulting ICMPv6 packet on success.
* @return NULL, if packet buffer is full.
*/
gnrc_pktsnip_t *gnrc_ndp2_rtr_sol_build(gnrc_pktsnip_t *options);

/**
* @brief Builds a router advertisement message for sending.
*
* @see `[RFC 4861, section 4.2](https://tools.ietf.org/html/rfc4861#section-4.2")
*
* @note The source address for the packet MUST be the link-local address
* of the interface.
*
* @param[in] cur_hl Default hop limit for outgoing IP packets, 0 if
* unspecified by this router.
* @param[in] flags Flags as defined above.
* @ref NDP_RTR_ADV_FLAGS_M == 1 indicates, that the
* addresses are managed by DHCPv6,
* @ref NDP_RTR_ADV_FLAGS_O == 1 indicates that other
* configuration information is available via DHCPv6.
* @param[in] ltime Lifetime of the default router in seconds.
* @param[in] reach_time Time in milliseconds a node should assume a neighbor
* reachable. 0 means unspecified by the router.
* @param[in] retrans_timer Time in milliseconds between retransmitted
* neighbor solicitations. 0 means unspecified by
* the router.
* @param[in] options Options to append to the router advertisement.
* May be NULL for none.
*
* @return The resulting ICMPv6 packet on success.
* @return NULL, if packet buffer is full.
*/
gnrc_pktsnip_t *gnrc_ndp2_rtr_adv_build(uint8_t cur_hl, uint8_t flags,
uint16_t ltime, uint32_t reach_time,
uint32_t retrans_timer,
gnrc_pktsnip_t *options);

/**
* @brief Builds a generic NDP option.
*
* @param[in] type Type of the option.
* @param[in] size Size in byte of the option (will be rounded up to the next
* multiple of 8).
* @param[in] next More options in the packet. NULL, if there are none.
*
* @return The packet snip list of options, on success
* @return NULL, if packet buffer is full
*/
gnrc_pktsnip_t *gnrc_ndp2_opt_build(uint8_t type, size_t size,
gnrc_pktsnip_t *next);

/**
* @brief Builds the source link-layer address option.
*
* @pre `(l2addr != NULL) && (l2addr_len != 0)`
*
* @see [RFC 4861, section 4.6.1](https://tools.ietf.org/html/rfc4861#section-4.6.1)
*
* @note Should only be used with neighbor solicitations, router solicitations,
* and router advertisements. This is not checked however, since
* hosts should silently ignore it in other NDP messages.
*
* @param[in] l2addr A link-layer address of variable length.
* May not be NULL.
* @param[in] l2addr_len Length of @p l2addr. May not be 0.
* @param[in] next More options in the packet. NULL, if there are none.
*
* @return The packet snip list of options, on success
* @return NULL, if packet buffer is full
*/
gnrc_pktsnip_t *gnrc_ndp2_opt_sl2a_build(const uint8_t *l2addr,
uint8_t l2addr_len,
gnrc_pktsnip_t *next);

/**
* @brief Builds the target link-layer address option.
*
* @pre `(l2addr != NULL) && (l2addr_len != 0)`
*
* @see [RFC 4861, section 4.6.1](https://tools.ietf.org/html/rfc4861#section-4.6.1)
*
* @note Should only be used with neighbor advertisemnents and redirect packets.
* This is not checked however, since hosts should silently ignore it
* in other NDP messages.
*
* @param[in] l2addr A link-layer address of variable length.
* May not be NULL.
* @param[in] l2addr_len Length of @p l2addr. May not be 0.
* @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_ndp2_opt_tl2a_build(const uint8_t *l2addr,
uint8_t l2addr_len,
gnrc_pktsnip_t *next);

/**
* @brief Builds the prefix information option.
*
* @pre `prefix != NULL`
* @pre `!ipv6_addr_is_link_local(prefix) && !ipv6_addr_is_multicast(prefix)`
* @pre `prefix_len <= 128`
*
* @see [RFC 4861, section 4.6.2](https://tools.ietf.org/html/rfc4861#section-4.6.2)
*
* @note Should only be used with router advertisemnents. This is not checked
* however, since nodes should silently ignore it in other NDP messages.
*
* @param[in] prefix An IPv6 address or a prefix of an IPv6 address.
* May not be NULL and must not be link-local or
* multicast.
* @param[in] prefix_len The length of @p prefix in bits. Must be between
* 0 and 128.
* @param[in] valid_ltime Length of time in seconds that @p prefix is valid.
* UINT32_MAX represents infinity.
* @param[in] pref_ltime Length of time in seconds that addresses using
* @p prefix remain prefered. UINT32_MAX represents
* infinity.
* @param[in] flags Flags as defined above.
* @ref NDP_OPT_PI_FLAGS_L == 1 indicates, that
* @p prefix can be used for on-link determination,
* @ref NDP_OPT_PI_FLAGS_A == 1 indicates, that
* @p prefix can be used for stateless address
* configuration.
* @param[in] next More options in the packet. NULL, if there are none.
*
* @return The packet snip list of options, on success
* @return NULL, if packet buffer is full
*/
gnrc_pktsnip_t *gnrc_ndp2_opt_pi_build(const ipv6_addr_t *prefix,
uint8_t prefix_len,
uint32_t valid_ltime, uint32_t pref_ltime,
uint8_t flags, gnrc_pktsnip_t *next);

/**
* @brief Builds the MTU option.
*
* @see [RFC 4861, section 4.6.4](https://tools.ietf.org/html/rfc4861#section-4.6.4)
*
* @note Should only be used with router advertisemnents. This is not checked
* however, since nodes should silently ignore it in other NDP messages.
*
* @param[in] mtu The recommended MTU for the link.
* @param[in] next More options in the packet. NULL, if there are none.
*
* @return The packet snip list of options, on success
* @return NULL, if packet buffer is full
*/
gnrc_pktsnip_t *gnrc_ndp2_opt_mtu_build(uint32_t mtu, gnrc_pktsnip_t *next);

/**
* @brief Send pre-compiled neighbor solicitation depending on a given network
* interface.
*
* @pre `(tgt != NULL) && !ipv6_addr_is_multicast(tgt)`
* @pre `(netif != NULL) && (dst != NULL)`
*
* @param[in] tgt The target address of the neighbor solicitation.
* May not be NULL and **MUST NOT** be multicast.
* @param[in] netif Interface to send over. May not be NULL.
* @param[in] src Source address for the neighbor solicitation. Will be chosen
* from the interface according to @p dst, if NULL.
* @param[in] dst Destination address for neighbor solicitation. May not be
* NULL.
*/
void gnrc_ndp2_nbr_sol_send(const ipv6_addr_t *tgt, gnrc_ipv6_netif_t *netif,
const ipv6_addr_t *src, const ipv6_addr_t *dst);

/**
* @brief Send pre-compiled neighbor advertisement depending on a given
* network interface.
*
* @pre `(tgt != NULL) && !ipv6_addr_is_multicast(tgt)`
* @pre `(netif != NULL) && (dst != NULL)`
*
* If @p netif is a forwarding interface and router advertisements are
* activated the @ref NDP_NBR_ADV_FLAGS_R is set in the neighbor advertisement.
* If @p dst is the unspecified address it will be replaced with ff02::1 and
* @p supply_tl2a is set to true implicitly. Otherwise, the
* @ref NDP_NBR_ADV_FLAGS_S will be set. If @p tgt is an anycast address
* on @p netif the @ref NDP_NBR_ADV_FLAGS_O flag will be set.
*
* The source address of the IPv6 packet will be left unspecified, so the
* @ref net_gnrc_ipv6 "IPv6 module" selects a fitting IPv6 address.
*
* @param[in] tgt Target address for the neighbor advertisement. May
* not be NULL and **MUST NOT** be multicast.
* @param[in] netif Interface to send over. May not be NULL.
* @param[in] dst Destination address for neighbor advertisement. May
* not be NULL. Is set to ff02::1 when equal to ::
* (to allow for simple reply mechanisms to neighbor
* solicitations). This also implies that
* @p supply_tl2a **must** be true and the parameter
* will be reset accordingly. If @p dst is not ::, the
* @ref NDP_NBR_ADV_FLAGS_S flag will be set.
* @param[in] supply_tl2a Add target link-layer address option to neighbor
* advertisement if link-layer has addresses.
* @param[in] ext_opts External options for the neighbor advertisement.
* Leave NULL for none.
* **Warning:** these are not tested if they are
* suitable for a neighbor advertisement so be sure to
* check that.
* **Will be released** in an error case.
*/
void gnrc_ndp2_nbr_adv_send(const ipv6_addr_t *tgt, gnrc_ipv6_netif_t *netif,
const ipv6_addr_t *dst, bool supply_tl2a,
gnrc_pktsnip_t *ext_opts);

/**
* @brief Send pre-compiled router solicitation depending on a given
* network interface.
*
* @pre `(netif != NULL)`
*
* @param[in] netif Interface to send over. May not be NULL.
* @param[in] dst Destination for the router solicitation. ff02::2 if NULL.
*/
void gnrc_ndp2_rtr_sol_send(gnrc_ipv6_netif_t *netif, const ipv6_addr_t *dst);

/**
* @brief Send pre-compiled router advertisement depending on a given network
* interface.
*
* @pre `(netif != NULL)`
*
* This function does not add the PIOs to the router, since they are highly
* dependent on external set-ups (e.g. if multihop prefix distribution is used).
* Provide them via @p ext_opts
*
* @param[in] netif Interface to send over. May not be NULL.
* @param[in] src Source address for the router advertisement. May be
* NULL to be determined by source address selection
* (:: if @p netif has no address).
* @param[in] dst Destination address for router advertisement.
* ff02::1 if NULL.
* @param[in] fin This is part of the router's final batch of router
* advertisements before ceising to be a router (set's
* router lifetime field to 0).
* @param[in] ext_opts External options for the neighbor advertisement.
* Leave NULL for none.
* **Warning:** these are not tested if they are suitable
* for a neighbor advertisement so be sure to check that.
* **Will be released** in an error case.
*/
void gnrc_ndp2_rtr_adv_send(gnrc_ipv6_netif_t *netif, const ipv6_addr_t *src,
const ipv6_addr_t *dst, bool fin,
gnrc_pktsnip_t *ext_opts);

#ifdef __cplusplus
}
#endif

#endif /* GNRC_NDP2_H */
/** @} */
3 changes: 3 additions & 0 deletions sys/net/gnrc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ endif
ifneq (,$(filter gnrc_ndp_router,$(USEMODULE)))
DIRS += network_layer/ndp/router
endif
ifneq (,$(filter gnrc_ndp2,$(USEMODULE)))
DIRS += network_layer/ndp2
endif
ifneq (,$(filter gnrc_netapi,$(USEMODULE)))
DIRS += netapi
endif
Expand Down
1 change: 1 addition & 0 deletions sys/net/gnrc/network_layer/icmpv6/gnrc_icmpv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ void gnrc_icmpv6_demux(kernel_pid_t iface, gnrc_pktsnip_t *pkt)

default:
DEBUG("icmpv6: unknown type field %u\n", hdr->type);
(void)iface;
break;
}

Expand Down
3 changes: 3 additions & 0 deletions sys/net/gnrc/network_layer/ndp2/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
MODULE = gnrc_ndp2

include $(RIOTBASE)/Makefile.base
Loading

0 comments on commit 8b4a6ee

Please sign in to comment.