Loading...
Searching...
No Matches
_nib-arsm.h
1/*
2 * SPDX-FileCopyrightText: 2017 Freie Universität Berlin
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
20
21#include <kernel_defines.h>
22#include <stdint.h>
23
25#include "net/gnrc/netif.h"
26#include "net/ndp.h"
27#include "net/icmpv6.h"
28#include "net/ipv6/hdr.h"
29
30#include "_nib-internal.h"
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
50void _snd_ns(const ipv6_addr_t *tgt, gnrc_netif_t *netif,
51 const ipv6_addr_t *src, const ipv6_addr_t *dst);
52
65void _snd_uc_ns(_nib_onl_entry_t *nbr, bool reset);
66
80void _handle_sl2ao(gnrc_netif_t *netif, const ipv6_hdr_t *ipv6,
81 const icmpv6_hdr_t *icmpv6, const ndp_opt_t *sl2ao);
82
102static inline uint32_t _exp_backoff_retrans_timer_factor(uint8_t ns_sent,
103 uint32_t retrans_timer,
104 uint32_t factor)
105{
106 assert(NDP_MIN_RANDOM_FACTOR <= factor);
108 assert(ns_sent <= NDP_MAX_NS_NUMOF);
109 /* backoff according to https://tools.ietf.org/html/rfc7048 with
110 * BACKOFF_MULTIPLE == 2 */
111 uint32_t res = (uint32_t)(((uint64_t)(((uint32_t) 1) << ns_sent) *
112 retrans_timer * factor) / US_PER_MS);
113 /* random factors were statically multiplied with 1000 */
114 if (res > NDP_MAX_RETRANS_TIMER_MS) {
116 }
117 return res;
118}
119
120#if IS_ACTIVE(CONFIG_GNRC_IPV6_NIB_ARSM) || defined(DOXYGEN)
127void _handle_snd_ns(_nib_onl_entry_t *nbr);
128
135void _handle_state_timeout(_nib_onl_entry_t *nbr);
136
143void _probe_nbr(_nib_onl_entry_t *nbr, bool reset);
144
160void _handle_adv_l2(gnrc_netif_t *netif, _nib_onl_entry_t *nce,
161 const icmpv6_hdr_t *icmpv6, const ndp_opt_t *tl2ao);
162
171void _recalc_reach_time(gnrc_netif_ipv6_t *netif);
172
180void _set_reachable(gnrc_netif_t *netif, _nib_onl_entry_t *nce);
181
188void _set_unreachable(gnrc_netif_t *netif, _nib_onl_entry_t *nce);
189
195static inline void _init_iface_arsm(gnrc_netif_t *netif)
196{
198 _recalc_reach_time(&netif->ipv6);
199}
200
206static inline void _deinit_iface_arsm(gnrc_netif_t *netif)
207{
208 _evtimer_del(&netif->ipv6.recalc_reach_time);
209}
210
218static inline uint16_t _get_nud_state(_nib_onl_entry_t *nbr)
219{
221}
222
231void _set_nud_state(gnrc_netif_t *netif, _nib_onl_entry_t *nbr,
232 uint16_t state);
233
244bool _is_reachable(_nib_onl_entry_t *entry);
245#else /* CONFIG_GNRC_IPV6_NIB_ARSM || defined(DOXYGEN) */
246#define _handle_snd_ns(ctx) (void)ctx
247#define _handle_state_timeout(ctx) (void)ctx
248#define _probe_nbr(nbr, reset) (void)nbr; (void)reset
249#define _init_iface_arsm(netif) (void)netif
250#define _deinit_iface_arsm(netif) (void)netif
251#define _handle_adv_l2(netif, nce, icmpv6, tl2ao) (void)netif; (void)nce; \
252 (void)icmpv6; (void)tl2ao
253#define _recalc_reach_time(netif) (void)netif
254#define _set_reachable(netif, nce) (void)netif; (void)nce
255
256#define _get_nud_state(nbr) (GNRC_IPV6_NIB_NC_INFO_NUD_STATE_UNMANAGED)
257#define _set_nud_state(netif, nce, state) (void)netif; (void)nce; (void)state
258#define _is_reachable(entry) (true)
259#endif /* CONFIG_GNRC_IPV6_NIB_ARSM || defined(DOXYGEN) */
260
261#ifdef __cplusplus
262}
263#endif
264
#define assert(cond)
abort the program if assertion is false
Definition assert.h:143
Definition for GNRC's network interfaces.
#define GNRC_IPV6_NIB_NC_INFO_NUD_STATE_MASK
Mask for neighbor unreachability detection (NUD) states.
Definition nc.h:45
void _snd_ns(const ipv6_addr_t *tgt, gnrc_netif_t *netif, const ipv6_addr_t *src, const ipv6_addr_t *dst)
Sends neighbor solicitation (including ARO if required)
#define NDP_MAX_RETRANS_TIMER_MS
MAX_RETRANS_TIMER (in ms)
Definition ndp.h:190
#define NDP_REACH_MS
REACHABLE_TIME (in ms)
Definition ndp.h:183
#define NDP_MAX_NS_NUMOF
Maximum retransmission of neighbor solicitations when UNREACHABLE.
Definition ndp.h:199
#define NDP_MAX_RANDOM_FACTOR
MAX_RANDOM_FACTOR (x 1000)
Definition ndp.h:202
#define NDP_MIN_RANDOM_FACTOR
MIN_RANDOM_FACTOR (x 1000)
Definition ndp.h:201
#define US_PER_MS
The number of microseconds per millisecond.
Definition time_units.h:86
ICMPv6 type and function definitions.
Configuration macro definitions for neighbor information base.
Common macros and compiler attributes/pragmas configuration.
IPv6 neighbor discovery message type definitions.
IPv6 header type and helper function definitions.
uint16_t info
Information flags.
IPv6 component for gnrc_netif_t.
Definition ipv6.h:75
evtimer_msg_event_t recalc_reach_time
Event for GNRC_IPV6_NIB_RECALC_REACH_TIME.
Definition ipv6.h:142
uint32_t reach_time_base
Base for random reachable time calculation and advertised reachable time in ms (if GNRC_NETIF_FLAGS_I...
Definition ipv6.h:186
Representation of a network interface.
Definition netif.h:137
gnrc_netif_ipv6_t ipv6
IPv6 component.
Definition netif.h:149
General ICMPv6 message format.
Definition icmpv6.h:135
Data type to represent an IPv6 packet header.
Definition hdr.h:63
General NDP option format.
Definition ndp.h:295
Data type to represent an IPv6 address.
Definition addr.h:64