81#define LOG_MODULE "IPv6 NDP"
82#define LOG_LEVEL LOG_LEVEL_IPV6
90#define UIP_ND6_RS_BUF ((uip_nd6_rs *)UIP_ICMP_PAYLOAD)
91#define UIP_ND6_RA_BUF ((uip_nd6_ra *)UIP_ICMP_PAYLOAD)
92#define UIP_ND6_NS_BUF ((uip_nd6_ns *)UIP_ICMP_PAYLOAD)
93#define UIP_ND6_NA_BUF ((uip_nd6_na *)UIP_ICMP_PAYLOAD)
96#define ND6_OPT(opt) ((unsigned char *)(UIP_ICMP_PAYLOAD + (opt)))
97#define ND6_OPT_HDR_BUF(opt) ((uip_nd6_opt_hdr *)ND6_OPT(opt))
98#define ND6_OPT_PREFIX_BUF(opt) ((uip_nd6_opt_prefix_info *)ND6_OPT(opt))
99#define ND6_OPT_MTU_BUF(opt) ((uip_nd6_opt_mtu *)ND6_OPT(opt))
100#define ND6_OPT_RDNSS_BUF(opt) ((uip_nd6_opt_dns *)ND6_OPT(opt))
103#if UIP_ND6_SEND_NS || UIP_ND6_SEND_NA || UIP_ND6_SEND_RA || !UIP_CONF_ROUTER
104static uint16_t nd6_opt_offset;
110#if UIP_ND6_SEND_NS || UIP_ND6_SEND_RA || !UIP_CONF_ROUTER
118#if (!UIP_CONF_ROUTER || UIP_ND6_SEND_RA)
122#if UIP_ND6_SEND_NA || UIP_ND6_SEND_RA || !UIP_CONF_ROUTER
139create_llao(uint8_t *llao, uint8_t type)
141 llao[UIP_ND6_OPT_TYPE_OFFSET] = type;
176 LOG_ERR(
"Insufficient data for reading ND6 NS header fields");
182 LOG_INFO(
"Received NS from ");
186 LOG_INFO_(
" with target address ");
187 LOG_INFO_6ADDR((uip_ipaddr_t *)(&UIP_ND6_NS_BUF->tgtipaddr));
194 LOG_ERR(
"Discarding invalid NS\n");
200 nd6_opt_offset = UIP_ND6_NS_LEN;
201 while(uip_l3_icmp_hdr_len + nd6_opt_offset + UIP_ND6_OPT_HDR_LEN <
uip_len) {
202 if(ND6_OPT_HDR_BUF(nd6_opt_offset)->len == 0) {
203 LOG_ERR(
"Discarding invalid NS\n");
207 switch(ND6_OPT_HDR_BUF(nd6_opt_offset)->type) {
208 case UIP_ND6_OPT_SLLAO:
209 if(uip_l3_icmp_hdr_len + nd6_opt_offset +
211 LOG_ERR(
"Insufficient data for NS SLLAO option\n");
218 LOG_ERR(
"Discarding invalid NS\n");
221 uip_lladdr_t lladdr_aligned;
226 0, NBR_STALE, NBR_TABLE_REASON_IPV6_ND, NULL);
235 (
const uip_lladdr_t *)&lladdr_aligned)
240 nbr->state = NBR_STALE;
243 nbr->state = NBR_STALE;
250 LOG_WARN(
"ND option not supported in NS");
253 nd6_opt_offset += (ND6_OPT_HDR_BUF(nd6_opt_offset)->len << 3);
256 addr = uip_ds6_addr_lookup(&UIP_ND6_NS_BUF->tgtipaddr);
260#if UIP_ND6_DEF_MAXDADNS > 0
262 LOG_ERR(
"Discarding invalid NS\n");
269 flags = UIP_ND6_NA_FLAG_OVERRIDE;
281 if(uip_ds6_is_my_addr(&
UIP_IP_BUF->srcipaddr)) {
288 LOG_ERR(
"Discarding invalid NS\n");
296 flags = UIP_ND6_NA_FLAG_SOLICITED | UIP_ND6_NA_FLAG_OVERRIDE;
304 flags = UIP_ND6_NA_FLAG_SOLICITED | UIP_ND6_NA_FLAG_OVERRIDE;
307 LOG_ERR(
"Discarding invalid NS\n");
330 UIP_ND6_NA_BUF->flagsreserved =
flags;
331 memcpy(&UIP_ND6_NA_BUF->tgtipaddr, &
addr->ipaddr,
sizeof(uip_ipaddr_t));
333 create_llao(&
uip_buf[uip_l3_icmp_hdr_len + UIP_ND6_NA_LEN],
342 LOG_INFO(
"Sending NA to ");
346 LOG_INFO_(
" with target address ");
347 LOG_INFO_6ADDR(&UIP_ND6_NA_BUF->tgtipaddr);
377 UIP_ND6_NS_BUF->reserved = 0;
383 if(!(uip_ds6_is_my_addr(tgt))) {
390 LOG_ERR(
"Dropping NS due to no suitable source address\n");
396 create_llao(&
uip_buf[uip_l3_icmp_hdr_len + UIP_ND6_NS_LEN],
403 UIP_IP_BUF->len[1] = UIP_ICMPH_LEN + UIP_ND6_NS_LEN;
404 uip_len = UIP_IPH_LEN + UIP_ICMPH_LEN + UIP_ND6_NS_LEN;
411 LOG_INFO(
"Sending NS to ");
415 LOG_INFO_(
" with target address ");
446 uint8_t is_solicited;
448 uip_lladdr_t lladdr_aligned;
450 LOG_INFO(
"Received NA from ");
454 LOG_INFO_(
" with target address ");
455 LOG_INFO_6ADDR((uip_ipaddr_t *)(&UIP_ND6_NA_BUF->tgtipaddr));
464 is_router = ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_ROUTER));
466 ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_SOLICITED));
468 ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_OVERRIDE));
474 LOG_ERR(
"Discarding invalid NA\n");
479 nd6_opt_offset = UIP_ND6_NA_LEN;
481 while(uip_l3_icmp_hdr_len + nd6_opt_offset + UIP_ND6_OPT_HDR_LEN <
uip_len) {
482 if(ND6_OPT_HDR_BUF(nd6_opt_offset)->len == 0) {
483 LOG_ERR(
"Discarding invalid NA\n");
487 switch(ND6_OPT_HDR_BUF(nd6_opt_offset)->type) {
488 case UIP_ND6_OPT_TLLAO:
491 LOG_ERR(
"TLLAO option extends beyond packet boundary\n");
494 nd6_opt_llao = (uint8_t *)ND6_OPT_HDR_BUF(nd6_opt_offset);
497 LOG_WARN(
"ND option not supported in NA\n");
500 nd6_opt_offset += (ND6_OPT_HDR_BUF(nd6_opt_offset)->len << 3);
502 addr = uip_ds6_addr_lookup(&UIP_ND6_NA_BUF->tgtipaddr);
505#if UIP_ND6_DEF_MAXDADNS > 0
510 LOG_ERR(
"Discarding invalid NA\n");
513 const uip_lladdr_t *lladdr;
532 (
const uip_lladdr_t *)&lladdr_aligned) < 0) {
542 nbr->state = NBR_STALE;
544 nbr->isrouter = is_router;
546 if(!is_override && is_llchange) {
547 if(
nbr->state == NBR_REACHABLE) {
548 nbr->state = NBR_STALE;
556 if(is_override || !is_llchange ||
nd6_opt_llao == NULL) {
560 (
const uip_lladdr_t *)&lladdr_aligned)
572 if(
nbr->isrouter && !is_router) {
575 uip_ds6_defrt_rm(
defrt);
578 nbr->isrouter = is_router;
581#if UIP_CONF_IPV6_QUEUE_PKT
583 if(uip_packetqueue_buflen(&
nbr->packethandle) != 0) {
584 uip_len = uip_packetqueue_buflen(&
nbr->packethandle);
586 uip_packetqueue_free(&
nbr->packethandle);
605 LOG_INFO(
"Received RS from ");
618 LOG_ERR(
"Discarding invalid RS\n");
624 nd6_opt_offset = UIP_ND6_RS_LEN;
627 while(uip_l3_icmp_hdr_len + nd6_opt_offset + UIP_ND6_OPT_HDR_LEN <
uip_len) {
628 if(ND6_OPT_HDR_BUF(nd6_opt_offset)->len == 0) {
629 LOG_ERR(
"Discarding invalid RS\n");
633 switch(ND6_OPT_HDR_BUF(nd6_opt_offset)->type) {
634 case UIP_ND6_OPT_SLLAO:
637 LOG_ERR(
"SLLAO option extends beyond packet boundary\n");
640 nd6_opt_llao = (uint8_t *)ND6_OPT_HDR_BUF(nd6_opt_offset);
643 LOG_WARN(
"ND option not supported in RS\n");
646 nd6_opt_offset += (ND6_OPT_HDR_BUF(nd6_opt_offset)->len << 3);
651 LOG_ERR(
"Discarding invalid RS\n");
654 uip_lladdr_t lladdr_aligned;
659 0, NBR_STALE, NBR_TABLE_REASON_IPV6_ND, NULL);
672 0, NBR_STALE, NBR_TABLE_REASON_IPV6_ND, NULL);
676 nbr->reachable = nbr_data.reachable;
677 nbr->sendns = nbr_data.sendns;
678 nbr->nscount = nbr_data.nscount;
686 uip_ds6_send_ra_sollicited();
694uip_nd6_ra_output(
const uip_ipaddr_t *dest)
714 UIP_ND6_RA_BUF->cur_ttl =
uip_ds6_if.cur_hop_limit;
716 UIP_ND6_RA_BUF->flags_reserved =
717 (UIP_ND6_M_FLAG << 7) | (UIP_ND6_O_FLAG << 6);
719 UIP_ND6_RA_BUF->router_lifetime =
uip_htons(UIP_ND6_ROUTER_LIFETIME);
720 UIP_ND6_RA_BUF->reachable_time = 0;
721 UIP_ND6_RA_BUF->retrans_timer = 0;
723 uip_len = UIP_IPH_LEN + UIP_ICMPH_LEN + UIP_ND6_RA_LEN;
724 nd6_opt_offset = UIP_ND6_RA_LEN;
729 if((prefix->isused) && (prefix->advertise)) {
730 ND6_OPT_PREFIX_BUF(nd6_opt_offset)->type = UIP_ND6_OPT_PREFIX_INFO;
731 ND6_OPT_PREFIX_BUF(nd6_opt_offset)->len = UIP_ND6_OPT_PREFIX_INFO_LEN / 8;
732 ND6_OPT_PREFIX_BUF(nd6_opt_offset)->preflen = prefix->length;
733 ND6_OPT_PREFIX_BUF(nd6_opt_offset)->flagsreserved1 = prefix->l_a_reserved;
734 ND6_OPT_PREFIX_BUF(nd6_opt_offset)->validlt = uip_htonl(prefix->vlifetime);
735 ND6_OPT_PREFIX_BUF(nd6_opt_offset)->preferredlt = uip_htonl(prefix->plifetime);
736 ND6_OPT_PREFIX_BUF(nd6_opt_offset)->reserved2 = 0;
737 uip_ipaddr_copy(&(ND6_OPT_PREFIX_BUF(nd6_opt_offset)->prefix), &(prefix->ipaddr));
738 nd6_opt_offset += UIP_ND6_OPT_PREFIX_INFO_LEN;
739 uip_len += UIP_ND6_OPT_PREFIX_INFO_LEN;
744 create_llao((uint8_t *)ND6_OPT_HDR_BUF(nd6_opt_offset), UIP_ND6_OPT_SLLAO);
750 ND6_OPT_MTU_BUF(nd6_opt_offset)->type = UIP_ND6_OPT_MTU;
751 ND6_OPT_MTU_BUF(nd6_opt_offset)->len = UIP_ND6_OPT_MTU_LEN >> 3;
752 ND6_OPT_MTU_BUF(nd6_opt_offset)->reserved = 0;
753 ND6_OPT_MTU_BUF(nd6_opt_offset)->mtu = uip_htonl(1500);
755 uip_len += UIP_ND6_OPT_MTU_LEN;
756 nd6_opt_offset += UIP_ND6_OPT_MTU_LEN;
761 uip_ipaddr_t *ip = &ND6_OPT_RDNSS_BUF(nd6_opt_offset)->ip;
762 uip_ipaddr_t *dns = NULL;
763 ND6_OPT_RDNSS_BUF(nd6_opt_offset)->type = UIP_ND6_OPT_RDNSS;
764 ND6_OPT_RDNSS_BUF(nd6_opt_offset)->reserved = 0;
767 ND6_OPT_RDNSS_BUF(nd6_opt_offset)->lifetime -=
clock_seconds();
773 ND6_OPT_RDNSS_BUF(nd6_opt_offset)->len = UIP_ND6_OPT_RDNSS_LEN + (i << 1);
774 LOG_INFO(
"%d nameservers reported\n", i);
775 uip_len += ND6_OPT_RDNSS_BUF(nd6_opt_offset)->len << 3;
776 nd6_opt_offset += ND6_OPT_RDNSS_BUF(nd6_opt_offset)->len << 3;
787 LOG_INFO(
"Sending RA to ");
813 UIP_IP_BUF->len[1] = UIP_ICMPH_LEN + UIP_ND6_RS_LEN;
814 uip_len = uip_l3_icmp_hdr_len + UIP_ND6_RS_LEN;
819 create_llao(&
uip_buf[uip_l3_icmp_hdr_len + UIP_ND6_RS_LEN],
827 LOG_INFO(
"Sending RS to ");
847 uip_lladdr_t lladdr_aligned;
849 LOG_INFO(
"Received RA from ");
859 LOG_ERR(
"Discarding invalid RA");
863 if(UIP_ND6_RA_BUF->cur_ttl != 0) {
864 uip_ds6_if.cur_hop_limit = UIP_ND6_RA_BUF->cur_ttl;
865 LOG_INFO(
"uip_ds6_if.cur_hop_limit %u\n",
uip_ds6_if.cur_hop_limit);
868 if(UIP_ND6_RA_BUF->reachable_time != 0) {
870 uip_ntohl(UIP_ND6_RA_BUF->reachable_time)) {
871 uip_ds6_if.base_reachable_time = uip_ntohl(UIP_ND6_RA_BUF->reachable_time);
875 if(UIP_ND6_RA_BUF->retrans_timer != 0) {
876 uip_ds6_if.retrans_timer = uip_ntohl(UIP_ND6_RA_BUF->retrans_timer);
880 nd6_opt_offset = UIP_ND6_RA_LEN;
881 while(uip_l3_icmp_hdr_len + nd6_opt_offset + UIP_ND6_OPT_HDR_LEN <
uip_len) {
882 if(ND6_OPT_HDR_BUF(nd6_opt_offset)->len == 0) {
883 LOG_ERR(
"Discarding invalid RA");
886 switch(ND6_OPT_HDR_BUF(nd6_opt_offset)->type) {
887 case UIP_ND6_OPT_SLLAO:
888 LOG_DBG(
"Processing SLLAO option in RA\n");
892 LOG_ERR(
"SLLAO option extends beyond packet boundary\n");
896 nd6_opt_llao = (uint8_t *)ND6_OPT_HDR_BUF(nd6_opt_offset);
904 1, NBR_STALE, NBR_TABLE_REASON_IPV6_ND, NULL);
911 nbr->state = NBR_STALE;
917 (
const uip_lladdr_t *)&lladdr_aligned) < 0) {
921 nbr->state = NBR_STALE;
926 case UIP_ND6_OPT_MTU:
927 LOG_DBG(
"Processing MTU option in RA\n");
930 if(uip_l3_icmp_hdr_len + nd6_opt_offset + UIP_ND6_OPT_MTU_LEN >
uip_len) {
931 LOG_ERR(
"MTU option extends beyond packet boundary\n");
938 case UIP_ND6_OPT_PREFIX_INFO:
939 LOG_DBG(
"Processing PREFIX option in RA\n");
942 if(uip_l3_icmp_hdr_len + nd6_opt_offset + UIP_ND6_OPT_PREFIX_INFO_LEN >
uip_len) {
943 LOG_ERR(
"PREFIX_INFO option extends beyond packet boundary\n");
948 if(ND6_OPT_HDR_BUF(nd6_opt_offset)->len != UIP_ND6_OPT_PREFIX_INFO_LEN / 8) {
949 LOG_ERR(
"PREFIX_INFO option has invalid length field (len=%u, expected=%u)\n",
950 ND6_OPT_HDR_BUF(nd6_opt_offset)->len, UIP_ND6_OPT_PREFIX_INFO_LEN / 8);
978 uip_ds6_prefix_rm(prefix);
981 prefix->isinfinite = 1;
984 LOG_DBG(
"Updating timer of prefix ");
985 LOG_DBG_6ADDR(&prefix->ipaddr);
989 prefix->isinfinite = 0;
1003 if((
addr != NULL) && (
addr->type == ADDR_AUTOCONF)) {
1009 LOG_DBG(
"Updating timer of address ");
1010 LOG_DBG_6ADDR(&
addr->ipaddr);
1011 LOG_DBG_(
" new value %lu\n",
1017 LOG_DBG(
"Updating timer of address ");
1018 LOG_DBG_6ADDR(&
addr->ipaddr);
1019 LOG_DBG_(
" new value %lu\n", (
unsigned long)(2 * 60 * 60));
1021 addr->isinfinite = 0;
1023 addr->isinfinite = 1;
1039 case UIP_ND6_OPT_RDNSS:
1040 LOG_DBG(
"Processing RDNSS option\n");
1049 if(ND6_OPT_RDNSS_BUF(nd6_opt_offset)->len < 3) {
1050 LOG_ERR(
"RDNSS option too short (len=%u)\n",
1051 ND6_OPT_RDNSS_BUF(nd6_opt_offset)->len);
1056 uint16_t opt_full_len = ND6_OPT_RDNSS_BUF(nd6_opt_offset)->len << 3;
1057 if(uip_l3_icmp_hdr_len + nd6_opt_offset + opt_full_len >
uip_len) {
1058 LOG_ERR(
"RDNSS option extends beyond packet boundary\n");
1063 uint8_t naddr = (ND6_OPT_RDNSS_BUF(nd6_opt_offset)->len - 1) / 2;
1064 uip_ipaddr_t *ip = (uip_ipaddr_t *)(&ND6_OPT_RDNSS_BUF(nd6_opt_offset)->ip);
1065 LOG_DBG(
"got %d nameservers\n", naddr);
1066 while(naddr-- > 0) {
1067 LOG_DBG(
"nameserver: ");
1069 LOG_DBG_(
" lifetime: %" PRIx32
"\n", uip_ntohl(ND6_OPT_RDNSS_BUF(nd6_opt_offset)->lifetime));
1076 LOG_ERR(
"ND option not supported in RA\n");
1079 nd6_opt_offset += (ND6_OPT_HDR_BUF(nd6_opt_offset)->len << 3);
1083 if(UIP_ND6_RA_BUF->router_lifetime != 0) {
1090 long)(uip_ntohs(UIP_ND6_RA_BUF->router_lifetime)));
1093 (
unsigned long)(uip_ntohs(UIP_ND6_RA_BUF->router_lifetime)));
1097 uip_ds6_defrt_rm(
defrt);
1101#if UIP_CONF_IPV6_QUEUE_PKT
1110 if(
nbr != NULL && uip_packetqueue_buflen(&
nbr->packethandle) != 0) {
1111 uip_len = uip_packetqueue_buflen(&
nbr->packethandle);
1113 uip_packetqueue_free(&
nbr->packethandle);
1127UIP_ICMP6_HANDLER(ns_input_handler,
ICMP6_NS, UIP_ICMP6_HANDLER_CODE_ANY,
1131UIP_ICMP6_HANDLER(na_input_handler,
ICMP6_NA, UIP_ICMP6_HANDLER_CODE_ANY,
1135#if UIP_CONF_ROUTER && UIP_ND6_SEND_RA
1136UIP_ICMP6_HANDLER(rs_input_handler,
ICMP6_RS, UIP_ICMP6_HANDLER_CODE_ANY,
1141UIP_ICMP6_HANDLER(ra_input_handler,
ICMP6_RA, UIP_ICMP6_HANDLER_CODE_ANY,
1159#if UIP_CONF_ROUTER && UIP_ND6_SEND_RA
static volatile at86rf215_flags_t flags
The radio driver uses the following flags to keep track of the current state of the radio and IRQ eve...
unsigned long clock_seconds(void)
Get the current value of the platform seconds.
static void stimer_set(struct stimer *t, unsigned long interval)
Set a timer.
static unsigned long stimer_remaining(struct stimer *t)
The time until the timer expires.
void uip_nd6_ns_output(const uip_ipaddr_t *src, const uip_ipaddr_t *dest, uip_ipaddr_t *tgt)
Send a neighbor solicitation, send a Neighbor Advertisement.
#define uip_create_linklocal_allrouters_mcast(a)
set IP address a to the link local all-routers multicast address
uint32_t uip_nameserver_next_expiration(void)
Get next expiration time.
const uip_lladdr_t * uip_ds6_nbr_get_ll(const uip_ds6_nbr_t *nbr)
Get the link-layer address associated with a specified nbr cache.
#define uip_create_unspecified(a)
set IP address a to unspecified
uip_ds6_nbr_t * uip_ds6_nbr_add(const uip_ipaddr_t *ipaddr, const uip_lladdr_t *lladdr, uint8_t isrouter, uint8_t state, nbr_table_reason_t reason, void *data)
Add a neighbor cache for a specified IPv6 address, which is associated with a specified link-layer ad...
uip_lladdr_t uip_lladdr
Host L2 address.
int uip_ds6_nbr_update_ll(uip_ds6_nbr_t **nbr_pp, const uip_lladdr_t *new_ll_addr)
Update the link-layer address associated with an IPv6 address.
#define uip_is_addr_unspecified(a)
Is IPv6 address a the unspecified address a is of type uip_ipaddr_t.
void uip_nameserver_update(const uip_ipaddr_t *nameserver, uint32_t lifetime)
Initialize the module variables.
#define UIP_ICMP_BUF
Direct access to ICMP, UDP, and TCP headers and payload, with implicit ext header offset (global uip_...
#define ICMP6_NS
Neighbor Solicitation.
#define UIP_LLADDR_LEN
802.15.4 address
#define NBR_INCOMPLETE
Possible states for the nbr cache entries.
int uip_ds6_nbr_rm(uip_ds6_nbr_t *nbr)
Remove a neighbor cache.
uip_ds6_nbr_t * uip_ds6_nbr_lookup(const uip_ipaddr_t *ipaddr)
Get the neighbor cache associated with a specified IPv6 address.
void uip_nd6_rs_output(void)
Neighbor Solicitation Processing.
#define uip_is_addr_mcast(a)
is address a multicast address, see RFC 4291 a is of type uip_ipaddr_t*
uip_ds6_addr_t * uip_ds6_addr_add(uip_ipaddr_t *ipaddr, unsigned long vlifetime, uint8_t type)
Add a unicast address to the interface.
#define ICMP6_NA
Neighbor advertisement.
#define UIP_ND6_INFINITE_LIFETIME
INFINITE lifetime.
void uip_nd6_init()
Initialise the uIP ND core.
#define UIP_STAT(s)
The uIP TCP/IP statistics.
int uip_ds6_dad_failed(uip_ds6_addr_t *addr)
Callback when DAD failed.
#define uip_create_solicited_node(a, b)
put in b the solicited node address corresponding to address a both a and b are of type uip_ipaddr_t*
#define ICMP6_RS
Router Solicitation.
#define UIP_ND6_OPT_LLAO_LEN
length of a ND6 LLAO option for default L2 type (e.g.
#define uip_is_addr_linklocal(a)
is addr (a) a link local unicast address, see RFC 4291 i.e.
#define uip_is_addr_solicited_node(a)
is addr (a) a solicited node multicast address, see RFC 4291 a is of type uip_ipaddr_t*
void uip_ds6_select_src(uip_ipaddr_t *src, uip_ipaddr_t *dst)
Source address selection, see RFC 3484.
#define UIP_NAMESERVER_INFINITE_LIFETIME
Infinite Lifetime indicator.
void uip_ds6_set_addr_iid(uip_ipaddr_t *ipaddr, const uip_lladdr_t *lladdr)
set the last 64 bits of an IP address based on the MAC address
uip_ds6_prefix_t uip_ds6_prefix_list[UIP_DS6_PREFIX_NB]
Prefix list.
void uip_icmp6_register_input_handler(uip_icmp6_input_handler_t *handler)
Register a handler which can handle a specific ICMPv6 message type.
uip_ipaddr_t * uip_nameserver_get(uint8_t num)
Get a Nameserver ip address given in RA.
#define UIP_ND6_HOP_LIMIT
HOP LIMIT to be used when sending ND messages (255)
#define ADDR_TENTATIVE
Possible states for the an address (RFC 4862)
#define ICMP6_RA
Router Advertisement.
uint16_t uip_nameserver_count(void)
Get the number of recorded name servers.
uip_ds6_netif_t uip_ds6_if
The single interface.
#define uip_create_linklocal_allnodes_mcast(a)
set IP address a to the link local all-nodes multicast address
uint32_t uip_ds6_compute_reachable_time(void)
Compute the reachable time based on base reachable time, see RFC 4861.
#define UIP_IP_BUF
Direct access to IPv6 header.
#define uip_ipaddr_copy(dest, src)
Copy an IP address from one place to another.
uint16_t uip_htons(uint16_t val)
Convert a 16-bit quantity from host byte order to network byte order.
#define uip_buf
Macro to access uip_aligned_buf as an array of bytes.
uint16_t uip_len
The length of the packet in the uip_buf buffer.
Header file for the logging system.
Header file for generating non-cryptographic random numbers.
Unicast address structure.
An entry in the default router list.
The default nbr_table entry (when UIP_DS6_NBR_MULTI_IPV6_ADDRS is disabled), that implements nbr cach...
A neighbor solicitation constant part.
ND option prefix information.
Header file for IPv6-related data structures.
Header file for ICMPv6 message and error handing (RFC 4443)
uIP Name Server interface
static uip_ds6_nbr_t * nbr
Pointer to llao option in uip_buf.
void ra_input(void)
Process a Router Advertisement.
static uip_ipaddr_t ipaddr
Pointer to prefix information option in uip_buf.
static uip_ds6_defrt_t * defrt
Pointer to an interface address.
static uip_nd6_opt_prefix_info * nd6_opt_prefix_info
Pointer to a router list entry.
static int extract_lladdr_from_llao_aligned(uip_lladdr_t *dest)
Pointer to a prefix list entry.
static uint8_t * nd6_opt_llao
Offset from the end of the icmpv6 header to the option in uip_buf.
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
Header file for IPv6 Neighbor discovery (RFC 4861)