diff --git a/arch/platform/native/platform.c b/arch/platform/native/platform.c
index d00efaac1..b2c25e223 100644
--- a/arch/platform/native/platform.c
+++ b/arch/platform/native/platform.c
@@ -196,16 +196,13 @@ set_lladdr(void)
static void
set_global_address(void)
{
- static uip_ipaddr_t ipaddr;
- static uip_ipaddr_t *prefix = NULL;
+ uip_ipaddr_t ipaddr;
+ const uip_ipaddr_t *default_prefix = uip_ds6_default_prefix();
/* Assign a unique local address (RFC4193,
http://tools.ietf.org/html/rfc4193). */
- if(prefix == NULL) {
- uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
- } else {
- memcpy(&ipaddr, prefix, 8);
- }
+ uip_ip6addr_copy(&ipaddr, default_prefix);
+
/* Assumes that the uip_lladdr is set */
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
@@ -215,7 +212,8 @@ set_global_address(void)
LOG_INFO_("\n");
/* set the PREFIX::1 address to the IF */
- uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 1);
+ uip_ip6addr_copy(&ipaddr, default_prefix);
+ ipaddr.u8[15] = 1;
uip_ds6_defrt_add(&ipaddr, 0);
}
#endif
diff --git a/examples/multicast/sink.c b/examples/multicast/sink.c
index 49180b69a..2b6f48846 100644
--- a/examples/multicast/sink.c
+++ b/examples/multicast/sink.c
@@ -80,9 +80,10 @@ join_mcast_group(void)
{
uip_ipaddr_t addr;
uip_ds6_maddr_t *rv;
+ const uip_ipaddr_t *default_prefix = uip_ds6_default_prefix();
/* First, set our v6 global */
- uip_ip6addr(&addr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&addr, default_prefix);
uip_ds6_set_addr_iid(&addr, &uip_lladdr);
uip_ds6_addr_add(&addr, 0, ADDR_AUTOCONF);
diff --git a/os/net/ipv6/uip-ds6.c b/os/net/ipv6/uip-ds6.c
index 4e82b3745..bcfb9b0c8 100644
--- a/os/net/ipv6/uip-ds6.c
+++ b/os/net/ipv6/uip-ds6.c
@@ -95,10 +95,29 @@ static uip_ds6_prefix_t *locprefix;
static const uint8_t iid_prefix[] = { 0x00, 0x00 , 0x00 , 0xff , 0xfe , 0x00 };
#endif /* (UIP_LLADDR_LEN == 2) */
+/* The default prefix */
+static uip_ip6addr_t default_prefix = {
+ .u16 = { 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+/*---------------------------------------------------------------------------*/
+const uip_ip6addr_t *
+uip_ds6_default_prefix()
+{
+ return &default_prefix;
+}
+/*---------------------------------------------------------------------------*/
+void
+uip_ds6_set_default_prefix(const uip_ip6addr_t *prefix)
+{
+ uip_ip6addr_copy(&default_prefix, prefix);
+}
/*---------------------------------------------------------------------------*/
void
uip_ds6_init(void)
{
+ if(uip_is_addr_unspecified(&default_prefix)) {
+ uip_ip6addr(&default_prefix, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ }
uip_ds6_neighbors_init();
uip_ds6_route_init();
diff --git a/os/net/ipv6/uip-ds6.h b/os/net/ipv6/uip-ds6.h
index 45394fec3..0edc1fd6d 100644
--- a/os/net/ipv6/uip-ds6.h
+++ b/os/net/ipv6/uip-ds6.h
@@ -296,6 +296,22 @@ uip_ds6_prefix_t *uip_ds6_prefix_lookup(uip_ipaddr_t *ipaddr,
uint8_t ipaddrlen);
uint8_t uip_ds6_is_addr_onlink(uip_ipaddr_t *ipaddr);
+/**
+ * \brief Retrieve the Default IPv6 prefix
+ * \retval A pointer to the default prefix
+ */
+const uip_ip6addr_t *uip_ds6_default_prefix(void);
+
+/**
+ * \brief Set the Default IPv6 prefix
+ * \param prefix A pointer to the new default prefix
+ *
+ * uip_ds6_init() will set the default prefix to UIP_DS6_DEFAULT_PREFIX
+ * unless this function here has been called beforehand to set a new default
+ * prefix.
+ */
+void uip_ds6_set_default_prefix(const uip_ip6addr_t *prefix);
+
/** @} */
/** \name Unicast address list basic routines */
diff --git a/os/net/mac/tsch/tsch-rpl.c b/os/net/mac/tsch/tsch-rpl.c
index 951648d91..e8db94b57 100644
--- a/os/net/mac/tsch/tsch-rpl.c
+++ b/os/net/mac/tsch/tsch-rpl.c
@@ -136,5 +136,13 @@ tsch_rpl_callback_parent_switch(rpl_parent_t *old, rpl_parent_t *new)
rpl_parent_get_ipaddr(new)));
}
}
+/*---------------------------------------------------------------------------*/
+/* Check RPL has joined DODAG.
+ * To use, set #define TSCH_RPL_CHECK_DODAG_JOINED tsch_rpl_check_dodag_joined */
+int
+tsch_rpl_check_dodag_joined(void)
+{
+ return NETSTACK_ROUTING.node_has_joined();
+}
#endif /* UIP_CONF_IPV6_RPL */
/** @} */
diff --git a/os/net/mac/tsch/tsch-rpl.h b/os/net/mac/tsch/tsch-rpl.h
index 23a148db8..95412e3d2 100644
--- a/os/net/mac/tsch/tsch-rpl.h
+++ b/os/net/mac/tsch/tsch-rpl.h
@@ -79,6 +79,12 @@ void tsch_rpl_callback_new_dio_interval(clock_time_t dio_interval);
* \param new The new RPL parent
*/
void tsch_rpl_callback_parent_switch(rpl_parent_t *old, rpl_parent_t *new);
+/**
+ * \brief Check RPL has joined DODAG.
+ * To use, set TSCH_RPL_CHECK_DODAG_JOINED tsch_rpl_check_dodag_joined
+ * \return 1 if joined, 0 otherwise
+ */
+int tsch_rpl_check_dodag_joined(void);
#endif /* __TSCH_RPL_H__ */
/** @} */
diff --git a/os/net/mac/tsch/tsch.c b/os/net/mac/tsch/tsch.c
index a33feeef1..6278ce0dc 100644
--- a/os/net/mac/tsch/tsch.c
+++ b/os/net/mac/tsch/tsch.c
@@ -861,7 +861,12 @@ PROCESS_THREAD(tsch_send_eb_process, ev, data)
while(1) {
unsigned long delay;
- if(tsch_is_associated && tsch_current_eb_period > 0) {
+ if(tsch_is_associated && tsch_current_eb_period > 0
+#ifdef TSCH_RPL_CHECK_DODAG_JOINED
+ /* Implementation section 6.3 of RFC 8180 */
+ && TSCH_RPL_CHECK_DODAG_JOINED()
+#endif /* TSCH_RPL_CHECK_DODAG_JOINED */
+ ) {
/* Enqueue EB only if there isn't already one in queue */
if(tsch_queue_packet_count(&tsch_eb_address) == 0) {
uint8_t hdr_len = 0;
diff --git a/os/net/mac/tsch/tsch.h b/os/net/mac/tsch/tsch.h
index 8674ee31a..ba2926341 100644
--- a/os/net/mac/tsch/tsch.h
+++ b/os/net/mac/tsch/tsch.h
@@ -88,6 +88,10 @@ frequency hopping for enhanced reliability.
#define TSCH_CALLBACK_KA_SENT tsch_rpl_callback_ka_sent
#endif /* TSCH_CALLBACK_KA_SENT */
+#ifndef TSCH_RPL_CHECK_DODAG_JOINED
+#define TSCH_RPL_CHECK_DODAG_JOINED tsch_rpl_check_dodag_joined
+#endif /* TSCH_RPL_CHECK_DODAG_JOINED */
+
#endif /* UIP_CONF_IPV6_RPL */
#if BUILD_WITH_ORCHESTRA
@@ -117,6 +121,11 @@ void TSCH_CALLBACK_LEAVING_NETWORK();
void TSCH_CALLBACK_KA_SENT();
#endif
+/* Called by TSCH before sending a EB */
+#ifdef TSCH_RPL_CHECK_DODAG_JOINED
+int TSCH_RPL_CHECK_DODAG_JOINED();
+#endif
+
/* Called by TSCH form interrupt after receiving a frame, enabled upper-layer to decide
* whether to ACK or NACK */
#ifdef TSCH_CALLBACK_DO_NACK
diff --git a/os/net/nbr-table.c b/os/net/nbr-table.c
index 8a8eaeb78..588315e58 100644
--- a/os/net/nbr-table.c
+++ b/os/net/nbr-table.c
@@ -354,6 +354,10 @@ nbr_table_add_lladdr(nbr_table_t *table, const linkaddr_t *lladdr, nbr_table_rea
nbr_table_item_t *item;
nbr_table_key_t *key;
+ if(table == NULL) {
+ return NULL;
+ }
+
/* Allow lladdr-free insertion, useful e.g. for IPv6 ND.
* Only one such entry is possible at a time, indexed by linkaddr_null. */
if(lladdr == NULL) {
diff --git a/os/net/routing/routing.h b/os/net/routing/routing.h
index 4508f0c4e..3cee3d9b2 100644
--- a/os/net/routing/routing.h
+++ b/os/net/routing/routing.h
@@ -57,7 +57,7 @@ struct routing_driver {
/**
* Set the prefix, for nodes that will operate as root
*
- * \param prefix The prefix. If NULL, UIP_DS6_DEFAULT_PREFIX is used instead
+ * \param prefix The prefix. If NULL, uip_ds6_default_prefix() is used instead
* \param iid The IID. If NULL, it will be built from uip_ds6_set_addr_iid.
*/
void (* root_set_prefix)(uip_ipaddr_t *prefix, uip_ipaddr_t *iid);
diff --git a/os/net/routing/rpl-classic/rpl-dag-root.c b/os/net/routing/rpl-classic/rpl-dag-root.c
index 3a0162627..f45c2d317 100644
--- a/os/net/routing/rpl-classic/rpl-dag-root.c
+++ b/os/net/routing/rpl-classic/rpl-dag-root.c
@@ -48,12 +48,15 @@ static void
set_global_address(uip_ipaddr_t *prefix, uip_ipaddr_t *iid)
{
static uip_ipaddr_t root_ipaddr;
+ const uip_ipaddr_t *default_prefix;
int i;
+ default_prefix = uip_ds6_default_prefix();
+
/* Assign a unique local address (RFC4193,
http://tools.ietf.org/html/rfc4193). */
if(prefix == NULL) {
- uip_ip6addr(&root_ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&root_ipaddr, default_prefix);
} else {
memcpy(&root_ipaddr, prefix, 8);
}
@@ -115,9 +118,11 @@ rpl_dag_root_start(void)
if(root_if != NULL) {
rpl_dag_t *dag;
uip_ipaddr_t prefix;
+ const uip_ipaddr_t *default_prefix;
rpl_set_root(RPL_DEFAULT_INSTANCE, ipaddr);
dag = rpl_get_any_dag();
+ default_prefix = uip_ds6_default_prefix();
/* If there are routes in this dag, we remove them all as we are
from now on the new dag root and the old routes are wrong */
@@ -129,7 +134,7 @@ rpl_dag_root_start(void)
dag->instance->def_route = NULL;
}
- uip_ip6addr(&prefix, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&prefix, default_prefix);
rpl_set_prefix(dag, &prefix, 64);
LOG_INFO("root_set_prefix: created a new RPL dag\n");
return 0;
diff --git a/os/net/routing/rpl-lite/rpl-dag-root.c b/os/net/routing/rpl-lite/rpl-dag-root.c
index c3e356828..38f5697e7 100644
--- a/os/net/routing/rpl-lite/rpl-dag-root.c
+++ b/os/net/routing/rpl-lite/rpl-dag-root.c
@@ -76,13 +76,16 @@ static void
set_global_address(uip_ipaddr_t *prefix, uip_ipaddr_t *iid)
{
static uip_ipaddr_t root_ipaddr;
+ const uip_ipaddr_t *default_prefix;
int i;
uint8_t state;
+ default_prefix = uip_ds6_default_prefix();
+
/* Assign a unique local address (RFC4193,
http://tools.ietf.org/html/rfc4193). */
if(prefix == NULL) {
- uip_ip6addr(&root_ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&root_ipaddr, default_prefix);
} else {
memcpy(&root_ipaddr, prefix, 8);
}
diff --git a/os/net/routing/rpl-lite/rpl-dag-root.h b/os/net/routing/rpl-lite/rpl-dag-root.h
index 71b999765..f035e8595 100644
--- a/os/net/routing/rpl-lite/rpl-dag-root.h
+++ b/os/net/routing/rpl-lite/rpl-dag-root.h
@@ -45,7 +45,7 @@
/**
* Set a prefix in case the node is later set as dag root.
*
- * \param prefix The prefix. If NULL, UIP_DS6_DEFAULT_PREFIX is used instead
+ * \param prefix The prefix. If NULL, uip_ds6_default_prefix() is used instead
* \param iid The IID. If NULL, it will be built from uip_ds6_set_addr_iid.
*/
void rpl_dag_root_set_prefix(uip_ipaddr_t *prefix, uip_ipaddr_t *iid);
diff --git a/os/net/routing/rpl-lite/rpl-dag.c b/os/net/routing/rpl-lite/rpl-dag.c
index 09caa9625..5ec080c15 100644
--- a/os/net/routing/rpl-lite/rpl-dag.c
+++ b/os/net/routing/rpl-lite/rpl-dag.c
@@ -104,7 +104,7 @@ rpl_dag_leave(void)
/* Issue a no-path DAO */
if(!rpl_dag_root_is_root()) {
- RPL_LOLLIPOP_INCREMENT(curr_instance.dag.dao_curr_seqno);
+ RPL_LOLLIPOP_INCREMENT(curr_instance.dag.dao_last_seqno);
rpl_icmp6_dao_output(0);
}
@@ -507,7 +507,7 @@ init_dag(uint8_t instance_id, uip_ipaddr_t *dag_id, rpl_ocp_t ocp,
curr_instance.dag.lowest_rank = RPL_INFINITE_RANK;
curr_instance.dag.dao_last_seqno = RPL_LOLLIPOP_INIT;
curr_instance.dag.dao_last_acked_seqno = RPL_LOLLIPOP_INIT;
- curr_instance.dag.dao_curr_seqno = RPL_LOLLIPOP_INIT;
+ curr_instance.dag.dao_last_seqno = RPL_LOLLIPOP_INIT;
memcpy(&curr_instance.dag.dag_id, dag_id, sizeof(curr_instance.dag.dag_id));
return 1;
@@ -657,6 +657,8 @@ rpl_process_dao_ack(uint8_t sequence, uint8_t status)
curr_instance.dag.state = DAG_REACHABLE;
rpl_timers_dio_reset("Reachable");
}
+ /* Let the rpl-timers module know that we got an ACK for the last DAO */
+ rpl_timers_notify_dao_ack();
if(!status_ok) {
/* We got a NACK, start poisoning and leave */
diff --git a/os/net/routing/rpl-lite/rpl-icmp6.c b/os/net/routing/rpl-lite/rpl-icmp6.c
index d376ff5e8..335c640d9 100644
--- a/os/net/routing/rpl-lite/rpl-icmp6.c
+++ b/os/net/routing/rpl-lite/rpl-icmp6.c
@@ -579,7 +579,7 @@ rpl_icmp6_dao_output(uint8_t lifetime)
#endif /* RPL_WITH_DAO_ACK */
++pos;
buffer[pos++] = 0; /* reserved */
- buffer[pos++] = curr_instance.dag.dao_curr_seqno;
+ buffer[pos++] = curr_instance.dag.dao_last_seqno;
/* create target subopt */
prefixlen = sizeof(*prefix) * CHAR_BIT;
@@ -606,7 +606,7 @@ rpl_icmp6_dao_output(uint8_t lifetime)
LOG_INFO("sending a %sDAO seqno %u, tx count %u, lifetime %u, prefix ",
lifetime == 0 ? "No-path " : "",
- curr_instance.dag.dao_curr_seqno, curr_instance.dag.dao_transmissions, lifetime);
+ curr_instance.dag.dao_last_seqno, curr_instance.dag.dao_transmissions, lifetime);
LOG_INFO_6ADDR(prefix);
LOG_INFO_(" to ");
LOG_INFO_6ADDR(&curr_instance.dag.dag_id);
@@ -640,7 +640,7 @@ dao_ack_input(void)
LOG_INFO("received a DAO-%s with seqno %d (%d %d) and status %d from ",
status < RPL_DAO_ACK_UNABLE_TO_ACCEPT ? "ACK" : "NACK", sequence,
- curr_instance.dag.dao_curr_seqno, curr_instance.dag.dao_curr_seqno, status);
+ curr_instance.dag.dao_last_seqno, curr_instance.dag.dao_last_seqno, status);
LOG_INFO_6ADDR(&UIP_IP_BUF->srcipaddr);
LOG_INFO_("\n");
diff --git a/os/net/routing/rpl-lite/rpl-timers.c b/os/net/routing/rpl-lite/rpl-timers.c
index c41b92948..169226fd5 100644
--- a/os/net/routing/rpl-lite/rpl-timers.c
+++ b/os/net/routing/rpl-lite/rpl-timers.c
@@ -71,8 +71,9 @@ clock_time_t RPL_PROBING_DELAY_FUNC(void);
static void handle_dis_timer(void *ptr);
static void handle_dio_timer(void *ptr);
static void handle_unicast_dio_timer(void *ptr);
-static void handle_dao_timer(void *ptr);
+static void send_new_dao(void *ptr);
#if RPL_WITH_DAO_ACK
+static void resend_dao(void *ptr);
static void handle_dao_ack_timer(void *ptr);
#endif /* RPL_WITH_DAO_ACK */
#if RPL_WITH_PROBING
@@ -224,7 +225,7 @@ static void
schedule_dao_retransmission(void)
{
clock_time_t expiration_time = RPL_DAO_RETRANSMISSION_TIMEOUT / 2 + (random_rand() % (RPL_DAO_RETRANSMISSION_TIMEOUT));
- ctimer_set(&curr_instance.dag.dao_timer, expiration_time, handle_dao_timer, NULL);
+ ctimer_set(&curr_instance.dag.dao_timer, expiration_time, resend_dao, NULL);
}
#endif /* RPL_WITH_DAO_ACK */
/*---------------------------------------------------------------------------*/
@@ -247,9 +248,8 @@ schedule_dao_refresh(void)
target_refresh -= safety_margin;
}
- /* Increment next sequno */
- RPL_LOLLIPOP_INCREMENT(curr_instance.dag.dao_curr_seqno);
- ctimer_set(&curr_instance.dag.dao_timer, target_refresh, handle_dao_timer, NULL);
+ /* Schedule transmission */
+ ctimer_set(&curr_instance.dag.dao_timer, target_refresh, send_new_dao, NULL);
}
}
/*---------------------------------------------------------------------------*/
@@ -261,36 +261,16 @@ rpl_timers_schedule_dao(void)
* only serves storing mode. Use simple delay instead, with the only purpose
* to reduce congestion. */
clock_time_t expiration_time = RPL_DAO_DELAY / 2 + (random_rand() % (RPL_DAO_DELAY));
- /* Increment next seqno */
- RPL_LOLLIPOP_INCREMENT(curr_instance.dag.dao_curr_seqno);
- ctimer_set(&curr_instance.dag.dao_timer, expiration_time, handle_dao_timer, NULL);
+ ctimer_set(&curr_instance.dag.dao_timer, expiration_time, send_new_dao, NULL);
}
}
/*---------------------------------------------------------------------------*/
static void
-handle_dao_timer(void *ptr)
+send_new_dao(void *ptr)
{
#if RPL_WITH_DAO_ACK
- if(rpl_lollipop_greater_than(curr_instance.dag.dao_curr_seqno,
- curr_instance.dag.dao_last_seqno)) {
- /* We are sending a new DAO here. Prepare retransmissions */
- curr_instance.dag.dao_transmissions = 0;
- } else {
- /* We are called for the same DAO again */
- if(curr_instance.dag.dao_last_acked_seqno == curr_instance.dag.dao_last_seqno) {
- /* The last seqno sent is ACKed! Schedule refresh to avoid route expiration */
- schedule_dao_refresh();
- return;
- }
- /* We need to re-send the last DAO */
- if(curr_instance.dag.dao_transmissions >= RPL_DAO_MAX_RETRANSMISSIONS) {
- /* No more retransmissions. Perform local repair and hope to find another . */
- rpl_local_repair("DAO max rtx");
- return;
- }
- }
- /* Increment transmission counter before sending */
- curr_instance.dag.dao_transmissions++;
+ /* We are sending a new DAO here. Prepare retransmissions */
+ curr_instance.dag.dao_transmissions = 1;
/* Schedule next retransmission */
schedule_dao_retransmission();
#else /* RPL_WITH_DAO_ACK */
@@ -299,19 +279,14 @@ handle_dao_timer(void *ptr)
curr_instance.dag.state = DAG_REACHABLE;
}
rpl_timers_dio_reset("Reachable");
-#endif /* !RPL_WITH_DAO_ACK */
-
- curr_instance.dag.dao_last_seqno = curr_instance.dag.dao_curr_seqno;
- /* Send a DAO with own prefix as target and default lifetime */
- rpl_icmp6_dao_output(curr_instance.default_lifetime);
-
-#if !RPL_WITH_DAO_ACK
- /* There is no DAO-ACK, schedule a refresh. Must be done after rpl_icmp6_dao_output,
- because we increment curr_instance.dag.dao_curr_seqno for the next DAO (refresh).
- Where there is DAO-ACK, the refresh is scheduled after reception of the ACK.
- Happens when handle_dao_timer is called again next. */
+ /* There is no DAO-ACK, schedule a refresh. */
schedule_dao_refresh();
#endif /* !RPL_WITH_DAO_ACK */
+
+ /* Increment seqno */
+ RPL_LOLLIPOP_INCREMENT(curr_instance.dag.dao_last_seqno);
+ /* Send a DAO with own prefix as target and default lifetime */
+ rpl_icmp6_dao_output(curr_instance.default_lifetime);
}
#if RPL_WITH_DAO_ACK
/*---------------------------------------------------------------------------*/
@@ -334,6 +309,32 @@ handle_dao_ack_timer(void *ptr)
rpl_icmp6_dao_ack_output(&curr_instance.dag.dao_ack_target,
curr_instance.dag.dao_ack_sequence, RPL_DAO_ACK_UNCONDITIONAL_ACCEPT);
}
+/*---------------------------------------------------------------------------*/
+void
+rpl_timers_notify_dao_ack(void)
+{
+ /* The last DAO was ACKed. Schedule refresh to avoid route expiration. This
+ implicitly de-schedules resend_dao, as both share curr_instance.dag.dao_timer */
+ schedule_dao_refresh();
+}
+/*---------------------------------------------------------------------------*/
+static void
+resend_dao(void *ptr)
+{
+ /* Increment transmission counter before sending */
+ curr_instance.dag.dao_transmissions++;
+ /* Send a DAO with own prefix as target and default lifetime */
+ rpl_icmp6_dao_output(curr_instance.default_lifetime);
+
+ /* Schedule next retransmission, or abort */
+ if(curr_instance.dag.dao_transmissions < RPL_DAO_MAX_RETRANSMISSIONS) {
+ schedule_dao_retransmission();
+ } else {
+ /* No more retransmissions. Perform local repair. */
+ rpl_local_repair("DAO max rtx");
+ return;
+ }
+}
#endif /* RPL_WITH_DAO_ACK */
/*---------------------------------------------------------------------------*/
/*------------------------------- Probing----------------------------------- */
diff --git a/os/net/routing/rpl-lite/rpl-timers.h b/os/net/routing/rpl-lite/rpl-timers.h
index e153858fc..5d9498b97 100644
--- a/os/net/routing/rpl-lite/rpl-timers.h
+++ b/os/net/routing/rpl-lite/rpl-timers.h
@@ -99,6 +99,11 @@ void rpl_timers_schedule_dao(void);
*/
void rpl_timers_schedule_dao_ack(uip_ipaddr_t *target, uint16_t sequence);
+/**
+ * Let the rpl-timers module know that the last DAO was ACKed
+*/
+void rpl_timers_notify_dao_ack(void);
+
/**
* Schedule probing with delay RPL_PROBING_DELAY_FUNC()
*/
diff --git a/os/net/routing/rpl-lite/rpl-types.h b/os/net/routing/rpl-lite/rpl-types.h
index 16dfa057e..2c57bf664 100644
--- a/os/net/routing/rpl-lite/rpl-types.h
+++ b/os/net/routing/rpl-lite/rpl-types.h
@@ -198,7 +198,6 @@ struct rpl_dag {
uint8_t dio_counter; /* internal trickle timer state: redundancy counter */
uint8_t dao_last_seqno; /* the node's last sent DAO seqno */
uint8_t dao_last_acked_seqno; /* the last seqno we got an ACK for */
- uint8_t dao_curr_seqno; /* the node's current DAO seqno (sent or to be sent) */
uint8_t dao_transmissions; /* the number of transmissions for the current DAO */
enum rpl_dag_state state;
diff --git a/os/services/shell/shell-commands.c b/os/services/shell/shell-commands.c
index 32827e4b3..0a48f7ce9 100644
--- a/os/services/shell/shell-commands.c
+++ b/os/services/shell/shell-commands.c
@@ -413,7 +413,8 @@ PT_THREAD(cmd_rpl_set_root(struct pt *pt, shell_output_func output, char *args))
PT_EXIT(pt);
}
} else {
- uip_ip6addr(&prefix, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ const uip_ipaddr_t *default_prefix = uip_ds6_default_prefix();
+ uip_ip6addr_copy(&prefix, default_prefix);
}
if(is_on) {
diff --git a/tests/07-simulation-base/23-rpl-tsch-z1.csc b/tests/07-simulation-base/23-rpl-tsch-z1.csc
index f5a182ecd..170300f55 100644
--- a/tests/07-simulation-base/23-rpl-tsch-z1.csc
+++ b/tests/07-simulation-base/23-rpl-tsch-z1.csc
@@ -7,7 +7,7 @@
[APPS_DIR]/powertracker
RPL+TSCH (Z1)
- 123456
+ 1
1000000
org.contikios.cooja.radiomediums.UDGM
@@ -108,20 +108,6 @@
z11
-
-
-
- org.contikios.cooja.interfaces.Position
- 10.622284947035123
- 109.81862399725188
- 0.0
-
-
- org.contikios.cooja.mspmote.interfaces.MspMoteID
- 6
-
- z11
-
org.contikios.cooja.plugins.SimControl
@@ -168,7 +154,6 @@
2
3
4
- 5
diff --git a/tests/07-simulation-base/code-ipv6/receiver/udp-receiver.c b/tests/07-simulation-base/code-ipv6/receiver/udp-receiver.c
index e84c57637..0a3b16b15 100644
--- a/tests/07-simulation-base/code-ipv6/receiver/udp-receiver.c
+++ b/tests/07-simulation-base/code-ipv6/receiver/udp-receiver.c
@@ -36,10 +36,13 @@ PROCESS_THREAD(udp_process, ev, data)
static struct etimer send_timer;
uip_ipaddr_t addr;
static int alive;
+ const uip_ipaddr_t *default_prefix;
PROCESS_BEGIN();
- uip_ip6addr(&addr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 2);
+ default_prefix = uip_ds6_default_prefix();
+ uip_ip6addr_copy(&addr, default_prefix);
+ addr.u16[7] = UIP_HTONS(2);
uip_ds6_addr_add(&addr, 0, ADDR_AUTOCONF);
simple_udp_register(&broadcast_connection, UDP_PORT,
diff --git a/tests/07-simulation-base/code-ipv6/sender/unicast-sender.c b/tests/07-simulation-base/code-ipv6/sender/unicast-sender.c
index 4e2e664b3..e56daa342 100644
--- a/tests/07-simulation-base/code-ipv6/sender/unicast-sender.c
+++ b/tests/07-simulation-base/code-ipv6/sender/unicast-sender.c
@@ -51,12 +51,15 @@ PROCESS_THREAD(udp_process, ev, data)
etimer_set(&periodic_timer, SEND_INTERVAL);
while(1) {
+ const uip_ipaddr_t *default_prefix;
uint8_t buf[SIZE];
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&periodic_timer));
etimer_reset(&periodic_timer);
printf("Sending unicast\n");
- uip_ip6addr(&addr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 2);
+ default_prefix = uip_ds6_default_prefix();
+ uip_ip6addr_copy(&addr, default_prefix);
+ addr.u16[7] = UIP_HTONS(2);
simple_udp_sendto(&broadcast_connection, buf, sizeof(buf), &addr);
}
diff --git a/tests/09-ipv6/code/node.c b/tests/09-ipv6/code/node.c
index f465e2642..a99261865 100644
--- a/tests/09-ipv6/code/node.c
+++ b/tests/09-ipv6/code/node.c
@@ -44,6 +44,7 @@ PROCESS_THREAD(node_process, ev, data)
static struct etimer et;
#if WITH_ULA
static uip_ipaddr_t ipaddr;
+ const uip_ipaddr_t *default_prefix;
#endif /* WITH_ULA */
#if WITH_TSCH
@@ -60,7 +61,8 @@ PROCESS_THREAD(node_process, ev, data)
#endif /* WITH_TSCH */
#if WITH_ULA
- uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ default_prefix = uip_ds6_default_prefix();
+ uip_ip6addr_copy(&ipaddr, default_prefix);
uip_ds6_prefix_add(&ipaddr, UIP_DEFAULT_PREFIX_LEN, 0, 0, 0, 0);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
diff --git a/tests/14-rpl-lite/code/receiver-node.c b/tests/14-rpl-lite/code/receiver-node.c
index b5265d3f7..b5cd26a15 100644
--- a/tests/14-rpl-lite/code/receiver-node.c
+++ b/tests/14-rpl-lite/code/receiver-node.c
@@ -73,8 +73,9 @@ set_global_address(void)
static uip_ipaddr_t ipaddr;
int i;
uint8_t state;
+ const uip_ipaddr_t *default_prefix = uip_ds6_default_prefix();
- uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&ipaddr, default_prefix);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
diff --git a/tests/14-rpl-lite/code/sender-node.c b/tests/14-rpl-lite/code/sender-node.c
index 350758110..00bd6d5c5 100644
--- a/tests/14-rpl-lite/code/sender-node.c
+++ b/tests/14-rpl-lite/code/sender-node.c
@@ -71,8 +71,9 @@ set_global_address(void)
uip_ipaddr_t ipaddr;
int i;
uint8_t state;
+ const uip_ipaddr_t *default_prefix = uip_ds6_default_prefix();
- uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&ipaddr, default_prefix);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
@@ -92,6 +93,7 @@ PROCESS_THREAD(sender_node_process, ev, data)
static struct etimer periodic_timer;
static struct etimer send_timer;
uip_ipaddr_t addr;
+ const uip_ipaddr_t *default_prefix;
PROCESS_BEGIN();
@@ -109,7 +111,13 @@ PROCESS_THREAD(sender_node_process, ev, data)
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&send_timer));
- uip_ip6addr(&addr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0x0201, 0x001, 0x001, 0x001);
+ default_prefix = uip_ds6_default_prefix();
+ uip_ip6addr_copy(&addr, default_prefix);
+
+ addr.u16[4] = UIP_HTONS(0x0201);
+ addr.u16[5] = UIP_HTONS(0x0001);
+ addr.u16[6] = UIP_HTONS(0x0001);
+ addr.u16[7] = UIP_HTONS(0x0001);
{
static unsigned int message_number;
diff --git a/tests/15-rpl-classic/code/receiver-node.c b/tests/15-rpl-classic/code/receiver-node.c
index 798aea84d..3854784d0 100644
--- a/tests/15-rpl-classic/code/receiver-node.c
+++ b/tests/15-rpl-classic/code/receiver-node.c
@@ -73,8 +73,9 @@ set_global_address(void)
static uip_ipaddr_t ipaddr;
int i;
uint8_t state;
+ const uip_ipaddr_t *default_prefix = uip_ds6_default_prefix();
- uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&ipaddr, default_prefix);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
diff --git a/tests/15-rpl-classic/code/sender-node.c b/tests/15-rpl-classic/code/sender-node.c
index 350758110..00bd6d5c5 100644
--- a/tests/15-rpl-classic/code/sender-node.c
+++ b/tests/15-rpl-classic/code/sender-node.c
@@ -71,8 +71,9 @@ set_global_address(void)
uip_ipaddr_t ipaddr;
int i;
uint8_t state;
+ const uip_ipaddr_t *default_prefix = uip_ds6_default_prefix();
- uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
+ uip_ip6addr_copy(&ipaddr, default_prefix);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
@@ -92,6 +93,7 @@ PROCESS_THREAD(sender_node_process, ev, data)
static struct etimer periodic_timer;
static struct etimer send_timer;
uip_ipaddr_t addr;
+ const uip_ipaddr_t *default_prefix;
PROCESS_BEGIN();
@@ -109,7 +111,13 @@ PROCESS_THREAD(sender_node_process, ev, data)
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&send_timer));
- uip_ip6addr(&addr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0x0201, 0x001, 0x001, 0x001);
+ default_prefix = uip_ds6_default_prefix();
+ uip_ip6addr_copy(&addr, default_prefix);
+
+ addr.u16[4] = UIP_HTONS(0x0201);
+ addr.u16[5] = UIP_HTONS(0x0001);
+ addr.u16[6] = UIP_HTONS(0x0001);
+ addr.u16[7] = UIP_HTONS(0x0001);
{
static unsigned int message_number;