nd6_input(): allow using NA without lladdr_opt for DAD
diff --git a/src/core/ipv6/nd6.c b/src/core/ipv6/nd6.c
index e555321..72a2523 100644
--- a/src/core/ipv6/nd6.c
+++ b/src/core/ipv6/nd6.c
@@ -155,25 +155,6 @@
* link-layer changed?
* part of DAD mechanism? */
- /* Check that link-layer address option also fits in packet. */
- if (p->len < (sizeof(struct na_header) + 2)) {
- /* @todo debug message */
- pbuf_free(p);
- ND6_STATS_INC(nd6.lenerr);
- ND6_STATS_INC(nd6.drop);
- return;
- }
-
- lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));
-
- if (p->len < (sizeof(struct na_header) + (lladdr_opt->length << 3))) {
- /* @todo debug message */
- pbuf_free(p);
- ND6_STATS_INC(nd6.lenerr);
- ND6_STATS_INC(nd6.drop);
- return;
- }
-
/* Create an aligned copy. */
ip6_addr_set(&target_address, &(na_hdr->target_address));
@@ -209,6 +190,25 @@
}
#endif /* LWIP_IPV6_DUP_DETECT_ATTEMPTS */
+ /* Check that link-layer address option also fits in packet. */
+ if (p->len < (sizeof(struct na_header) + 2)) {
+ /* @todo debug message */
+ pbuf_free(p);
+ ND6_STATS_INC(nd6.lenerr);
+ ND6_STATS_INC(nd6.drop);
+ return;
+ }
+
+ lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));
+
+ if (p->len < (sizeof(struct na_header) + (lladdr_opt->length << 3))) {
+ /* @todo debug message */
+ pbuf_free(p);
+ ND6_STATS_INC(nd6.lenerr);
+ ND6_STATS_INC(nd6.drop);
+ return;
+ }
+
/* This is an unsolicited NA, most likely there was a LLADDR change. */
i = nd6_find_neighbor_cache_entry(&target_address);
if (i >= 0) {