Merge remote-tracking branch 'contiki-os/master'
This commit is contained in:
commit
bd0716b044
|
@ -135,6 +135,7 @@ env:
|
||||||
- BUILD_TYPE='collect'
|
- BUILD_TYPE='collect'
|
||||||
- BUILD_TYPE='collect-lossy'
|
- BUILD_TYPE='collect-lossy'
|
||||||
- BUILD_TYPE='rpl'
|
- BUILD_TYPE='rpl'
|
||||||
|
- BUILD_TYPE='rpl-non-storing'
|
||||||
- BUILD_TYPE='large-rpl'
|
- BUILD_TYPE='large-rpl'
|
||||||
- BUILD_TYPE='rime'
|
- BUILD_TYPE='rime'
|
||||||
- BUILD_TYPE='ipv6'
|
- BUILD_TYPE='ipv6'
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
orchestra_src = orchestra.c orchestra-rule-default-common.c orchestra-rule-eb-per-time-source.c orchestra-rule-unicast-per-neighbor.c
|
orchestra_src = orchestra.c orchestra-rule-default-common.c orchestra-rule-eb-per-time-source.c orchestra-rule-unicast-per-neighbor-rpl-storing.c orchestra-rule-unicast-per-neighbor-rpl-ns.c
|
||||||
|
|
|
@ -46,10 +46,10 @@
|
||||||
* - a sender-based or receiver-based slotframe for unicast to RPL parents and children
|
* - a sender-based or receiver-based slotframe for unicast to RPL parents and children
|
||||||
* - a common shared slotframe for any other traffic (mostly broadcast)
|
* - a common shared slotframe for any other traffic (mostly broadcast)
|
||||||
* */
|
* */
|
||||||
#define ORCHESTRA_RULES { &eb_per_time_source, \
|
#define ORCHESTRA_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_storing, &default_common }
|
||||||
&unicast_per_neighbor, \
|
/* Example configuration for RPL non-storing mode: */
|
||||||
&default_common, \
|
/* #define ORCHESTRA_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_ns, &default_common } */
|
||||||
}
|
|
||||||
#endif /* ORCHESTRA_CONF_RULES */
|
#endif /* ORCHESTRA_CONF_RULES */
|
||||||
|
|
||||||
/* Length of the various slotframes. Tune to balance network capacity,
|
/* Length of the various slotframes. Tune to balance network capacity,
|
||||||
|
|
119
apps/orchestra/orchestra-rule-unicast-per-neighbor-rpl-ns.c
Normal file
119
apps/orchestra/orchestra-rule-unicast-per-neighbor-rpl-ns.c
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Inria.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Orchestra: a slotframe dedicated to unicast data transmission. Designed primarily
|
||||||
|
* for RPL non-storing mode but would work with any mode-of-operation. Does not require
|
||||||
|
* any knowledge of the children. Works only as received-base, and as follows:
|
||||||
|
* Nodes listen at a timeslot defined as hash(MAC) % ORCHESTRA_SB_UNICAST_PERIOD
|
||||||
|
* Nodes transmit at: for any neighbor, hash(nbr.MAC) % ORCHESTRA_SB_UNICAST_PERIOD
|
||||||
|
*
|
||||||
|
* \author Simon Duquennoy <simon.duquennoy@inria.fr>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "orchestra.h"
|
||||||
|
#include "net/ipv6/uip-ds6-route.h"
|
||||||
|
#include "net/packetbuf.h"
|
||||||
|
|
||||||
|
static uint16_t slotframe_handle = 0;
|
||||||
|
static uint16_t channel_offset = 0;
|
||||||
|
static struct tsch_slotframe *sf_unicast;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static uint16_t
|
||||||
|
get_node_timeslot(const linkaddr_t *addr)
|
||||||
|
{
|
||||||
|
if(addr != NULL && ORCHESTRA_UNICAST_PERIOD > 0) {
|
||||||
|
return ORCHESTRA_LINKADDR_HASH(addr) % ORCHESTRA_UNICAST_PERIOD;
|
||||||
|
} else {
|
||||||
|
return 0xffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
child_added(const linkaddr_t *linkaddr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
child_removed(const linkaddr_t *linkaddr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
select_packet(uint16_t *slotframe, uint16_t *timeslot)
|
||||||
|
{
|
||||||
|
/* Select data packets we have a unicast link to */
|
||||||
|
const linkaddr_t *dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
|
||||||
|
if(packetbuf_attr(PACKETBUF_ATTR_FRAME_TYPE) == FRAME802154_DATAFRAME
|
||||||
|
&& !linkaddr_cmp(dest, &linkaddr_null)) {
|
||||||
|
if(slotframe != NULL) {
|
||||||
|
*slotframe = slotframe_handle;
|
||||||
|
}
|
||||||
|
if(timeslot != NULL) {
|
||||||
|
*timeslot = get_node_timeslot(dest);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
new_time_source(const struct tsch_neighbor *old, const struct tsch_neighbor *new)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
init(uint16_t sf_handle)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint16_t rx_timeslot;
|
||||||
|
slotframe_handle = sf_handle;
|
||||||
|
channel_offset = sf_handle;
|
||||||
|
/* Slotframe for unicast transmissions */
|
||||||
|
sf_unicast = tsch_schedule_add_slotframe(slotframe_handle, ORCHESTRA_UNICAST_PERIOD);
|
||||||
|
rx_timeslot = get_node_timeslot(&linkaddr_node_addr);
|
||||||
|
/* Add a Tx link at each available timeslot. Make the link Rx at our own timeslot. */
|
||||||
|
for(i = 0; i < ORCHESTRA_UNICAST_PERIOD; i++) {
|
||||||
|
tsch_schedule_add_link(sf_unicast,
|
||||||
|
LINK_OPTION_SHARED | LINK_OPTION_TX | ( i == rx_timeslot ? LINK_OPTION_RX : 0 ),
|
||||||
|
LINK_TYPE_NORMAL, &tsch_broadcast_address,
|
||||||
|
i, channel_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
struct orchestra_rule unicast_per_neighbor_rpl_ns = {
|
||||||
|
init,
|
||||||
|
new_time_source,
|
||||||
|
select_packet,
|
||||||
|
child_added,
|
||||||
|
child_removed,
|
||||||
|
};
|
|
@ -29,12 +29,13 @@
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* \file
|
* \file
|
||||||
* Orchestra: a slotframe dedicated to unicast data transmission.
|
* Orchestra: a slotframe dedicated to unicast data transmission. Designed for
|
||||||
* If sender-based:
|
* RPL storing mode only, as this is based on the knowledge of the children (and parent).
|
||||||
|
* If receiver-based:
|
||||||
* Nodes listen at a timeslot defined as hash(MAC) % ORCHESTRA_SB_UNICAST_PERIOD
|
* Nodes listen at a timeslot defined as hash(MAC) % ORCHESTRA_SB_UNICAST_PERIOD
|
||||||
* Nodes transmit at: for each nbr in RPL children and RPL preferred parent,
|
* Nodes transmit at: for each nbr in RPL children and RPL preferred parent,
|
||||||
* hash(nbr.MAC) % ORCHESTRA_SB_UNICAST_PERIOD
|
* hash(nbr.MAC) % ORCHESTRA_SB_UNICAST_PERIOD
|
||||||
* If receiver-based: the opposite
|
* If sender-based: the opposite
|
||||||
*
|
*
|
||||||
* \author Simon Duquennoy <simonduq@sics.se>
|
* \author Simon Duquennoy <simonduq@sics.se>
|
||||||
*/
|
*/
|
||||||
|
@ -43,6 +44,7 @@
|
||||||
#include "orchestra.h"
|
#include "orchestra.h"
|
||||||
#include "net/ipv6/uip-ds6-route.h"
|
#include "net/ipv6/uip-ds6-route.h"
|
||||||
#include "net/packetbuf.h"
|
#include "net/packetbuf.h"
|
||||||
|
#include "net/rpl/rpl-conf.h"
|
||||||
|
|
||||||
#if ORCHESTRA_UNICAST_SENDER_BASED && ORCHESTRA_COLLISION_FREE_HASH
|
#if ORCHESTRA_UNICAST_SENDER_BASED && ORCHESTRA_COLLISION_FREE_HASH
|
||||||
#define UNICAST_SLOT_SHARED_FLAG ((ORCHESTRA_UNICAST_PERIOD < (ORCHESTRA_MAX_HASH + 1)) ? LINK_OPTION_SHARED : 0)
|
#define UNICAST_SLOT_SHARED_FLAG ((ORCHESTRA_UNICAST_PERIOD < (ORCHESTRA_MAX_HASH + 1)) ? LINK_OPTION_SHARED : 0)
|
||||||
|
@ -202,7 +204,7 @@ init(uint16_t sf_handle)
|
||||||
timeslot, channel_offset);
|
timeslot, channel_offset);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
struct orchestra_rule unicast_per_neighbor = {
|
struct orchestra_rule unicast_per_neighbor_rpl_storing = {
|
||||||
init,
|
init,
|
||||||
new_time_source,
|
new_time_source,
|
||||||
select_packet,
|
select_packet,
|
|
@ -53,7 +53,8 @@ struct orchestra_rule {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct orchestra_rule eb_per_time_source;
|
struct orchestra_rule eb_per_time_source;
|
||||||
struct orchestra_rule unicast_per_neighbor;
|
struct orchestra_rule unicast_per_neighbor_rpl_storing;
|
||||||
|
struct orchestra_rule unicast_per_neighbor_rpl_ns;
|
||||||
struct orchestra_rule default_common;
|
struct orchestra_rule default_common;
|
||||||
|
|
||||||
extern linkaddr_t orchestra_parent_linkaddr;
|
extern linkaddr_t orchestra_parent_linkaddr;
|
||||||
|
|
|
@ -148,12 +148,25 @@
|
||||||
#endif /* NBR_TABLE_FIND_REMOVABLE */
|
#endif /* NBR_TABLE_FIND_REMOVABLE */
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
|
|
||||||
|
/* RPL_CONF_MOP specifies the RPL mode of operation that will be
|
||||||
|
* advertised by the RPL root. Possible values: RPL_MOP_NO_DOWNWARD_ROUTES,
|
||||||
|
* RPL_MOP_NON_STORING, RPL_MOP_STORING_NO_MULTICAST, RPL_MOP_STORING_MULTICAST */
|
||||||
|
#ifndef RPL_CONF_MOP
|
||||||
|
#define RPL_CONF_MOP RPL_MOP_STORING_NO_MULTICAST
|
||||||
|
#endif /* RPL_CONF_MOP */
|
||||||
|
|
||||||
/* UIP_CONF_MAX_ROUTES specifies the maximum number of routes that each
|
/* UIP_CONF_MAX_ROUTES specifies the maximum number of routes that each
|
||||||
node will be able to handle. */
|
node will be able to handle. */
|
||||||
#ifndef UIP_CONF_MAX_ROUTES
|
#ifndef UIP_CONF_MAX_ROUTES
|
||||||
#define UIP_CONF_MAX_ROUTES 20
|
#define UIP_CONF_MAX_ROUTES 20
|
||||||
#endif /* UIP_CONF_MAX_ROUTES */
|
#endif /* UIP_CONF_MAX_ROUTES */
|
||||||
|
|
||||||
|
/* RPL_NS_CONF_LINK_NUM specifies the maximum number of links a RPL root
|
||||||
|
* will maintain in non-storing mode. */
|
||||||
|
#ifndef RPL_NS_CONF_LINK_NUM
|
||||||
|
#define RPL_NS_CONF_LINK_NUM 20
|
||||||
|
#endif /* RPL_NS_CONF_LINK_NUM */
|
||||||
|
|
||||||
/* UIP_CONF_UDP specifies if UDP support should be included or
|
/* UIP_CONF_UDP specifies if UDP support should be included or
|
||||||
not. Disabling UDP saves memory but breaks a lot of stuff. */
|
not. Disabling UDP saves memory but breaks a lot of stuff. */
|
||||||
#ifndef UIP_CONF_UDP
|
#ifndef UIP_CONF_UDP
|
||||||
|
|
|
@ -47,6 +47,11 @@
|
||||||
#include "net/ipv6/uip-ds6.h"
|
#include "net/ipv6/uip-ds6.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
#include "net/rpl/rpl.h"
|
||||||
|
#include "net/rpl/rpl-private.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define DEBUG DEBUG_NONE
|
#define DEBUG DEBUG_NONE
|
||||||
|
@ -525,7 +530,7 @@ void
|
||||||
tcpip_ipv6_output(void)
|
tcpip_ipv6_output(void)
|
||||||
{
|
{
|
||||||
uip_ds6_nbr_t *nbr = NULL;
|
uip_ds6_nbr_t *nbr = NULL;
|
||||||
uip_ipaddr_t *nexthop;
|
uip_ipaddr_t *nexthop = NULL;
|
||||||
|
|
||||||
if(uip_len == 0) {
|
if(uip_len == 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -545,14 +550,25 @@ tcpip_ipv6_output(void)
|
||||||
|
|
||||||
if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {
|
if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {
|
||||||
/* Next hop determination */
|
/* Next hop determination */
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL && RPL_WITH_NON_STORING
|
||||||
|
uip_ipaddr_t ipaddr;
|
||||||
|
/* Look for a RPL Source Route */
|
||||||
|
if(rpl_srh_get_next_hop(&ipaddr)) {
|
||||||
|
nexthop = &ipaddr;
|
||||||
|
}
|
||||||
|
#endif /* UIP_CONF_IPV6_RPL && RPL_WITH_NON_STORING */
|
||||||
|
|
||||||
nbr = NULL;
|
nbr = NULL;
|
||||||
|
|
||||||
/* We first check if the destination address is on our immediate
|
/* We first check if the destination address is on our immediate
|
||||||
link. If so, we simply use the destination address as our
|
link. If so, we simply use the destination address as our
|
||||||
nexthop address. */
|
nexthop address. */
|
||||||
if(uip_ds6_is_addr_onlink(&UIP_IP_BUF->destipaddr)){
|
if(nexthop == NULL && uip_ds6_is_addr_onlink(&UIP_IP_BUF->destipaddr)){
|
||||||
nexthop = &UIP_IP_BUF->destipaddr;
|
nexthop = &UIP_IP_BUF->destipaddr;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
if(nexthop == NULL) {
|
||||||
uip_ds6_route_t *route;
|
uip_ds6_route_t *route;
|
||||||
/* Check if we have a route to the destination address. */
|
/* Check if we have a route to the destination address. */
|
||||||
route = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);
|
route = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);
|
||||||
|
@ -636,7 +652,7 @@ tcpip_ipv6_output(void)
|
||||||
/* End of next hop determination */
|
/* End of next hop determination */
|
||||||
|
|
||||||
#if UIP_CONF_IPV6_RPL
|
#if UIP_CONF_IPV6_RPL
|
||||||
if(rpl_update_header_final(nexthop)) {
|
if(!rpl_finalize_header(nexthop)) {
|
||||||
uip_clear_buf();
|
uip_clear_buf();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -646,6 +662,7 @@ tcpip_ipv6_output(void)
|
||||||
#if UIP_ND6_SEND_NA
|
#if UIP_ND6_SEND_NA
|
||||||
if((nbr = uip_ds6_nbr_add(nexthop, NULL, 0, NBR_INCOMPLETE, NBR_TABLE_REASON_IPV6_ND, NULL)) == NULL) {
|
if((nbr = uip_ds6_nbr_add(nexthop, NULL, 0, NBR_INCOMPLETE, NBR_TABLE_REASON_IPV6_ND, NULL)) == NULL) {
|
||||||
uip_clear_buf();
|
uip_clear_buf();
|
||||||
|
PRINTF("tcpip_ipv6_output: failed to add neighbor to cache\n");
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
#if UIP_CONF_IPV6_QUEUE_PKT
|
#if UIP_CONF_IPV6_QUEUE_PKT
|
||||||
|
@ -672,6 +689,7 @@ tcpip_ipv6_output(void)
|
||||||
/* Send the first NS try from here (multicast destination IP address). */
|
/* Send the first NS try from here (multicast destination IP address). */
|
||||||
}
|
}
|
||||||
#else /* UIP_ND6_SEND_NA */
|
#else /* UIP_ND6_SEND_NA */
|
||||||
|
PRINTF("tcpip_ipv6_output: neighbor not in cache\n");
|
||||||
uip_len = 0;
|
uip_len = 0;
|
||||||
return;
|
return;
|
||||||
#endif /* UIP_ND6_SEND_NA */
|
#endif /* UIP_ND6_SEND_NA */
|
||||||
|
|
|
@ -1801,6 +1801,13 @@ typedef struct uip_routing_hdr {
|
||||||
uint8_t seg_left;
|
uint8_t seg_left;
|
||||||
} uip_routing_hdr;
|
} uip_routing_hdr;
|
||||||
|
|
||||||
|
/* RPL Source Routing Header */
|
||||||
|
typedef struct uip_rpl_srh_hdr {
|
||||||
|
uint8_t cmpr; /* CmprI and CmprE */
|
||||||
|
uint8_t pad;
|
||||||
|
uint8_t reserved[2];
|
||||||
|
} uip_rpl_srh_hdr;
|
||||||
|
|
||||||
/* fragmentation header */
|
/* fragmentation header */
|
||||||
typedef struct uip_frag_hdr {
|
typedef struct uip_frag_hdr {
|
||||||
uint8_t next;
|
uint8_t next;
|
||||||
|
|
|
@ -57,6 +57,7 @@ void NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK(const linkaddr_t *addr);
|
||||||
void NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK(const linkaddr_t *addr);
|
void NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK(const linkaddr_t *addr);
|
||||||
#endif /* NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK */
|
#endif /* NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK */
|
||||||
|
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
/* The nbr_routes holds a neighbor table to be able to maintain
|
/* The nbr_routes holds a neighbor table to be able to maintain
|
||||||
information about what routes go through what neighbor. This
|
information about what routes go through what neighbor. This
|
||||||
neighbor table is registered with the central nbr-table repository
|
neighbor table is registered with the central nbr-table repository
|
||||||
|
@ -71,6 +72,11 @@ MEMB(neighborroutememb, struct uip_ds6_route_neighbor_route, UIP_DS6_ROUTE_NB);
|
||||||
LIST(routelist);
|
LIST(routelist);
|
||||||
MEMB(routememb, uip_ds6_route_t, UIP_DS6_ROUTE_NB);
|
MEMB(routememb, uip_ds6_route_t, UIP_DS6_ROUTE_NB);
|
||||||
|
|
||||||
|
static int num_routes = 0;
|
||||||
|
static void rm_routelist_callback(nbr_table_item_t *ptr);
|
||||||
|
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
|
||||||
/* Default routes are held on the defaultrouterlist and their
|
/* Default routes are held on the defaultrouterlist and their
|
||||||
structures are allocated from the defaultroutermemb memory block.*/
|
structures are allocated from the defaultroutermemb memory block.*/
|
||||||
LIST(defaultrouterlist);
|
LIST(defaultrouterlist);
|
||||||
|
@ -80,13 +86,10 @@ MEMB(defaultroutermemb, uip_ds6_defrt_t, UIP_DS6_DEFRT_NB);
|
||||||
LIST(notificationlist);
|
LIST(notificationlist);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int num_routes = 0;
|
|
||||||
|
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
#define DEBUG DEBUG_NONE
|
#define DEBUG DEBUG_NONE
|
||||||
#include "net/ip/uip-debug.h"
|
#include "net/ip/uip-debug.h"
|
||||||
|
|
||||||
static void rm_routelist_callback(nbr_table_item_t *ptr);
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#if DEBUG != DEBUG_NONE
|
#if DEBUG != DEBUG_NONE
|
||||||
static void
|
static void
|
||||||
|
@ -156,10 +159,12 @@ uip_ds6_notification_rm(struct uip_ds6_notification *n)
|
||||||
void
|
void
|
||||||
uip_ds6_route_init(void)
|
uip_ds6_route_init(void)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
memb_init(&routememb);
|
memb_init(&routememb);
|
||||||
list_init(routelist);
|
list_init(routelist);
|
||||||
nbr_table_register(nbr_routes,
|
nbr_table_register(nbr_routes,
|
||||||
(nbr_table_callback *)rm_routelist_callback);
|
(nbr_table_callback *)rm_routelist_callback);
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
|
||||||
memb_init(&defaultroutermemb);
|
memb_init(&defaultroutermemb);
|
||||||
list_init(defaultrouterlist);
|
list_init(defaultrouterlist);
|
||||||
|
@ -168,6 +173,7 @@ uip_ds6_route_init(void)
|
||||||
list_init(notificationlist);
|
list_init(notificationlist);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static uip_lladdr_t *
|
static uip_lladdr_t *
|
||||||
uip_ds6_route_nexthop_lladdr(uip_ds6_route_t *route)
|
uip_ds6_route_nexthop_lladdr(uip_ds6_route_t *route)
|
||||||
|
@ -179,36 +185,48 @@ uip_ds6_route_nexthop_lladdr(uip_ds6_route_t *route)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
uip_ipaddr_t *
|
uip_ipaddr_t *
|
||||||
uip_ds6_route_nexthop(uip_ds6_route_t *route)
|
uip_ds6_route_nexthop(uip_ds6_route_t *route)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
if(route != NULL) {
|
if(route != NULL) {
|
||||||
return uip_ds6_nbr_ipaddr_from_lladdr(uip_ds6_route_nexthop_lladdr(route));
|
return uip_ds6_nbr_ipaddr_from_lladdr(uip_ds6_route_nexthop_lladdr(route));
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#else /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
return NULL;
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
uip_ds6_route_t *
|
uip_ds6_route_t *
|
||||||
uip_ds6_route_head(void)
|
uip_ds6_route_head(void)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
return list_head(routelist);
|
return list_head(routelist);
|
||||||
|
#else /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
return NULL;
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
uip_ds6_route_t *
|
uip_ds6_route_t *
|
||||||
uip_ds6_route_next(uip_ds6_route_t *r)
|
uip_ds6_route_next(uip_ds6_route_t *r)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
if(r != NULL) {
|
if(r != NULL) {
|
||||||
uip_ds6_route_t *n = list_item_next(r);
|
uip_ds6_route_t *n = list_item_next(r);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
uip_ds6_route_is_nexthop(const uip_ipaddr_t *ipaddr)
|
uip_ds6_route_is_nexthop(const uip_ipaddr_t *ipaddr)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
const uip_lladdr_t *lladdr;
|
const uip_lladdr_t *lladdr;
|
||||||
lladdr = uip_ds6_nbr_lladdr_from_ipaddr(ipaddr);
|
lladdr = uip_ds6_nbr_lladdr_from_ipaddr(ipaddr);
|
||||||
|
|
||||||
|
@ -217,17 +235,25 @@ uip_ds6_route_is_nexthop(const uip_ipaddr_t *ipaddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nbr_table_get_from_lladdr(nbr_routes, (linkaddr_t *)lladdr) != NULL;
|
return nbr_table_get_from_lladdr(nbr_routes, (linkaddr_t *)lladdr) != NULL;
|
||||||
|
#else /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
return 0;
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
uip_ds6_route_num_routes(void)
|
uip_ds6_route_num_routes(void)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
return num_routes;
|
return num_routes;
|
||||||
|
#else /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
return 0;
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
uip_ds6_route_t *
|
uip_ds6_route_t *
|
||||||
uip_ds6_route_lookup(uip_ipaddr_t *addr)
|
uip_ds6_route_lookup(uip_ipaddr_t *addr)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
uip_ds6_route_t *r;
|
uip_ds6_route_t *r;
|
||||||
uip_ds6_route_t *found_route;
|
uip_ds6_route_t *found_route;
|
||||||
uint8_t longestmatch;
|
uint8_t longestmatch;
|
||||||
|
@ -274,12 +300,16 @@ uip_ds6_route_lookup(uip_ipaddr_t *addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
return found_route;
|
return found_route;
|
||||||
|
#else /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
return NULL;
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
uip_ds6_route_t *
|
uip_ds6_route_t *
|
||||||
uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length,
|
uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length,
|
||||||
uip_ipaddr_t *nexthop)
|
uip_ipaddr_t *nexthop)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
uip_ds6_route_t *r;
|
uip_ds6_route_t *r;
|
||||||
struct uip_ds6_route_neighbor_route *nbrr;
|
struct uip_ds6_route_neighbor_route *nbrr;
|
||||||
|
|
||||||
|
@ -426,12 +456,17 @@ uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length,
|
||||||
assert_nbr_routes_list_sane();
|
assert_nbr_routes_list_sane();
|
||||||
#endif /* DEBUG != DEBUG_NONE */
|
#endif /* DEBUG != DEBUG_NONE */
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
#else /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
|
return NULL;
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
uip_ds6_route_rm(uip_ds6_route_t *route)
|
uip_ds6_route_rm(uip_ds6_route_t *route)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
struct uip_ds6_route_neighbor_route *neighbor_route;
|
struct uip_ds6_route_neighbor_route *neighbor_route;
|
||||||
#if DEBUG != DEBUG_NONE
|
#if DEBUG != DEBUG_NONE
|
||||||
assert_nbr_routes_list_sane();
|
assert_nbr_routes_list_sane();
|
||||||
|
@ -488,8 +523,11 @@ uip_ds6_route_rm(uip_ds6_route_t *route)
|
||||||
#if DEBUG != DEBUG_NONE
|
#if DEBUG != DEBUG_NONE
|
||||||
assert_nbr_routes_list_sane();
|
assert_nbr_routes_list_sane();
|
||||||
#endif /* DEBUG != DEBUG_NONE */
|
#endif /* DEBUG != DEBUG_NONE */
|
||||||
|
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
rm_routelist(struct uip_ds6_route_neighbor_routes *routes)
|
rm_routelist(struct uip_ds6_route_neighbor_routes *routes)
|
||||||
|
@ -517,10 +555,12 @@ rm_routelist_callback(nbr_table_item_t *ptr)
|
||||||
{
|
{
|
||||||
rm_routelist((struct uip_ds6_route_neighbor_routes *)ptr);
|
rm_routelist((struct uip_ds6_route_neighbor_routes *)ptr);
|
||||||
}
|
}
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
uip_ds6_route_rm_by_nexthop(uip_ipaddr_t *nexthop)
|
uip_ds6_route_rm_by_nexthop(uip_ipaddr_t *nexthop)
|
||||||
{
|
{
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
/* Get routing entry list of this neighbor */
|
/* Get routing entry list of this neighbor */
|
||||||
const uip_lladdr_t *nexthop_lladdr;
|
const uip_lladdr_t *nexthop_lladdr;
|
||||||
struct uip_ds6_route_neighbor_routes *routes;
|
struct uip_ds6_route_neighbor_routes *routes;
|
||||||
|
@ -529,6 +569,7 @@ uip_ds6_route_rm_by_nexthop(uip_ipaddr_t *nexthop)
|
||||||
routes = nbr_table_get_from_lladdr(nbr_routes,
|
routes = nbr_table_get_from_lladdr(nbr_routes,
|
||||||
(linkaddr_t *)nexthop_lladdr);
|
(linkaddr_t *)nexthop_lladdr);
|
||||||
rm_routelist(routes);
|
rm_routelist(routes);
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
uip_ds6_defrt_t *
|
uip_ds6_defrt_t *
|
||||||
|
|
|
@ -50,7 +50,7 @@ NBR_TABLE_DECLARE(nbr_routes);
|
||||||
void uip_ds6_route_init(void);
|
void uip_ds6_route_init(void);
|
||||||
|
|
||||||
#ifndef UIP_CONF_UIP_DS6_NOTIFICATIONS
|
#ifndef UIP_CONF_UIP_DS6_NOTIFICATIONS
|
||||||
#define UIP_DS6_NOTIFICATIONS 1
|
#define UIP_DS6_NOTIFICATIONS (UIP_CONF_MAX_ROUTES != 0)
|
||||||
#else
|
#else
|
||||||
#define UIP_DS6_NOTIFICATIONS UIP_CONF_UIP_DS6_NOTIFICATIONS
|
#define UIP_DS6_NOTIFICATIONS UIP_CONF_UIP_DS6_NOTIFICATIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -120,9 +120,6 @@ uip_icmp6_register_input_handler(uip_icmp6_input_handler_t *handler)
|
||||||
static void
|
static void
|
||||||
echo_request_input(void)
|
echo_request_input(void)
|
||||||
{
|
{
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
uint8_t temp_ext_len;
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
/*
|
/*
|
||||||
* we send an echo reply. It is trivial if there was no extension
|
* we send an echo reply. It is trivial if there was no extension
|
||||||
* headers in the request otherwise we need to remove the extension
|
* headers in the request otherwise we need to remove the extension
|
||||||
|
@ -147,27 +144,7 @@ echo_request_input(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(uip_ext_len > 0) {
|
if(uip_ext_len > 0) {
|
||||||
#if UIP_CONF_IPV6_RPL
|
/* Remove extension headers if any */
|
||||||
if((temp_ext_len = rpl_invert_header())) {
|
|
||||||
/* If there were other extension headers*/
|
|
||||||
UIP_FIRST_EXT_BUF->next = UIP_PROTO_ICMP6;
|
|
||||||
if (uip_ext_len != temp_ext_len) {
|
|
||||||
uip_len -= (uip_ext_len - temp_ext_len);
|
|
||||||
UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
|
|
||||||
UIP_IP_BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
|
|
||||||
/* move the echo request payload (starting after the icmp header)
|
|
||||||
* to the new location in the reply.
|
|
||||||
* The shift is equal to the length of the remaining extension headers present
|
|
||||||
* Note: UIP_ICMP_BUF still points to the echo request at this stage
|
|
||||||
*/
|
|
||||||
memmove((uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN - (uip_ext_len - temp_ext_len),
|
|
||||||
(uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,
|
|
||||||
(uip_len - UIP_IPH_LEN - temp_ext_len - UIP_ICMPH_LEN));
|
|
||||||
}
|
|
||||||
uip_ext_len = temp_ext_len;
|
|
||||||
} else {
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
/* If there were extension headers*/
|
|
||||||
UIP_IP_BUF->proto = UIP_PROTO_ICMP6;
|
UIP_IP_BUF->proto = UIP_PROTO_ICMP6;
|
||||||
uip_len -= uip_ext_len;
|
uip_len -= uip_ext_len;
|
||||||
UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
|
UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
|
||||||
|
@ -181,10 +158,13 @@ echo_request_input(void)
|
||||||
(uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,
|
(uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,
|
||||||
(uip_len - UIP_IPH_LEN - UIP_ICMPH_LEN));
|
(uip_len - UIP_IPH_LEN - UIP_ICMPH_LEN));
|
||||||
uip_ext_len = 0;
|
uip_ext_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Insert RPL extension headers */
|
||||||
#if UIP_CONF_IPV6_RPL
|
#if UIP_CONF_IPV6_RPL
|
||||||
}
|
rpl_insert_header();
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
}
|
|
||||||
/* Below is important for the correctness of UIP_ICMP_BUF and the
|
/* Below is important for the correctness of UIP_ICMP_BUF and the
|
||||||
* checksum
|
* checksum
|
||||||
*/
|
*/
|
||||||
|
@ -321,6 +301,9 @@ uip_icmp6_send(const uip_ipaddr_t *dest, int type, int code, int payload_len)
|
||||||
UIP_STAT(++uip_stat.icmp.sent);
|
UIP_STAT(++uip_stat.icmp.sent);
|
||||||
UIP_STAT(++uip_stat.ip.sent);
|
UIP_STAT(++uip_stat.ip.sent);
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
rpl_insert_header();
|
||||||
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
tcpip_ipv6_output();
|
tcpip_ipv6_output();
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -329,37 +312,18 @@ echo_reply_input(void)
|
||||||
{
|
{
|
||||||
int ttl;
|
int ttl;
|
||||||
uip_ipaddr_t sender;
|
uip_ipaddr_t sender;
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
uint8_t temp_ext_len;
|
PRINTF("Received Echo Reply from ");
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
|
||||||
|
PRINTF(" to ");
|
||||||
|
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
|
||||||
|
PRINTF("\n");
|
||||||
|
|
||||||
uip_ipaddr_copy(&sender, &UIP_IP_BUF->srcipaddr);
|
uip_ipaddr_copy(&sender, &UIP_IP_BUF->srcipaddr);
|
||||||
ttl = UIP_IP_BUF->ttl;
|
ttl = UIP_IP_BUF->ttl;
|
||||||
|
|
||||||
if(uip_ext_len > 0) {
|
if(uip_ext_len > 0) {
|
||||||
#if UIP_CONF_IPV6_RPL
|
/* Remove extension headers if any */
|
||||||
if((temp_ext_len = rpl_invert_header())) {
|
|
||||||
/* If there were other extension headers*/
|
|
||||||
UIP_FIRST_EXT_BUF->next = UIP_PROTO_ICMP6;
|
|
||||||
if (uip_ext_len != temp_ext_len) {
|
|
||||||
uip_len -= (uip_ext_len - temp_ext_len);
|
|
||||||
UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
|
|
||||||
UIP_IP_BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
|
|
||||||
/* move the echo reply payload (starting after the icmp
|
|
||||||
* header) to the new location in the reply. The shift is
|
|
||||||
* equal to the length of the remaining extension headers
|
|
||||||
* present Note: UIP_ICMP_BUF still points to the echo reply
|
|
||||||
* at this stage
|
|
||||||
*/
|
|
||||||
memmove((uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN - (uip_ext_len - temp_ext_len),
|
|
||||||
(uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,
|
|
||||||
(uip_len - UIP_IPH_LEN - temp_ext_len - UIP_ICMPH_LEN));
|
|
||||||
}
|
|
||||||
uip_ext_len = temp_ext_len;
|
|
||||||
uip_len -= uip_ext_len;
|
|
||||||
} else {
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
/* If there were extension headers*/
|
|
||||||
UIP_IP_BUF->proto = UIP_PROTO_ICMP6;
|
UIP_IP_BUF->proto = UIP_PROTO_ICMP6;
|
||||||
uip_len -= uip_ext_len;
|
uip_len -= uip_ext_len;
|
||||||
UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
|
UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
|
||||||
|
@ -373,9 +337,6 @@ echo_reply_input(void)
|
||||||
(uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,
|
(uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,
|
||||||
(uip_len - UIP_IPH_LEN - UIP_ICMPH_LEN));
|
(uip_len - UIP_IPH_LEN - UIP_ICMPH_LEN));
|
||||||
uip_ext_len = 0;
|
uip_ext_len = 0;
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
}
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call all registered applications to let them know an echo reply
|
/* Call all registered applications to let them know an echo reply
|
||||||
|
|
|
@ -79,6 +79,11 @@
|
||||||
#include "net/ipv6/uip-ds6.h"
|
#include "net/ipv6/uip-ds6.h"
|
||||||
#include "net/ipv6/multicast/uip-mcast6.h"
|
#include "net/ipv6/multicast/uip-mcast6.h"
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
#include "rpl/rpl.h"
|
||||||
|
#include "rpl/rpl-private.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -88,10 +93,6 @@
|
||||||
#define DEBUG DEBUG_NONE
|
#define DEBUG DEBUG_NONE
|
||||||
#include "net/ip/uip-debug.h"
|
#include "net/ip/uip-debug.h"
|
||||||
|
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
#include "rpl/rpl.h"
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
|
|
||||||
#if UIP_LOGGING == 1
|
#if UIP_LOGGING == 1
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
void uip_log(char *msg);
|
void uip_log(char *msg);
|
||||||
|
@ -889,7 +890,7 @@ ext_hdr_options_process(void)
|
||||||
*/
|
*/
|
||||||
#if UIP_CONF_IPV6_RPL
|
#if UIP_CONF_IPV6_RPL
|
||||||
PRINTF("Processing RPL option\n");
|
PRINTF("Processing RPL option\n");
|
||||||
if(rpl_verify_header(uip_ext_opt_offset)) {
|
if(rpl_verify_hbh_header(uip_ext_opt_offset)) {
|
||||||
PRINTF("RPL Option Error: Dropping Packet\n");
|
PRINTF("RPL Option Error: Dropping Packet\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1228,9 +1229,9 @@ uip_process(uint8_t flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if UIP_CONF_IPV6_RPL
|
#if UIP_CONF_IPV6_RPL
|
||||||
if(rpl_update_header_empty()) {
|
if(!rpl_update_header()) {
|
||||||
/* Packet can not be forwarded */
|
/* Packet can not be forwarded */
|
||||||
PRINTF("RPL Forward Option Error\n");
|
PRINTF("RPL header update error\n");
|
||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
|
@ -1368,6 +1369,11 @@ uip_process(uint8_t flag)
|
||||||
|
|
||||||
PRINTF("Processing Routing header\n");
|
PRINTF("Processing Routing header\n");
|
||||||
if(UIP_ROUTING_BUF->seg_left > 0) {
|
if(UIP_ROUTING_BUF->seg_left > 0) {
|
||||||
|
#if UIP_CONF_IPV6_RPL && RPL_WITH_NON_STORING
|
||||||
|
if(rpl_process_srh_header()) {
|
||||||
|
goto send; /* Proceed to forwarding */
|
||||||
|
}
|
||||||
|
#endif /* UIP_CONF_IPV6_RPL && RPL_WITH_NON_STORING */
|
||||||
uip_icmp6_error_output(ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, UIP_IPH_LEN + uip_ext_len + 2);
|
uip_icmp6_error_output(ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, UIP_IPH_LEN + uip_ext_len + 2);
|
||||||
UIP_STAT(++uip_stat.ip.drop);
|
UIP_STAT(++uip_stat.ip.drop);
|
||||||
UIP_LOG("ip6: unrecognized routing type");
|
UIP_LOG("ip6: unrecognized routing type");
|
||||||
|
|
|
@ -235,18 +235,6 @@
|
||||||
#define RPL_PREFERENCE 0
|
#define RPL_PREFERENCE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Hop-by-hop option
|
|
||||||
* This option control the insertion of the RPL Hop-by-Hop extension header
|
|
||||||
* into packets originating from this node. Incoming Hop-by-hop extension
|
|
||||||
* header are still processed and forwarded.
|
|
||||||
*/
|
|
||||||
#ifdef RPL_CONF_INSERT_HBH_OPTION
|
|
||||||
#define RPL_INSERT_HBH_OPTION RPL_CONF_INSERT_HBH_OPTION
|
|
||||||
#else
|
|
||||||
#define RPL_INSERT_HBH_OPTION 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RPL DAO ACK support. When enabled, DAO ACK will be sent and requested.
|
* RPL DAO ACK support. When enabled, DAO ACK will be sent and requested.
|
||||||
* This will also enable retransmission of DAO when no ack is received.
|
* This will also enable retransmission of DAO when no ack is received.
|
||||||
|
@ -269,15 +257,16 @@
|
||||||
#endif /* RPL_CONF_RPL_REPAIR_ON_DAO_NACK */
|
#endif /* RPL_CONF_RPL_REPAIR_ON_DAO_NACK */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setting the DIO_REFRESH_DAO_ROUTES will make RPL always increase
|
* Setting the DIO_REFRESH_DAO_ROUTES will make the RPL root always
|
||||||
* the DTSN (Destination Advertisement Trigger Sequence Number) when
|
* increase the DTSN (Destination Advertisement Trigger Sequence Number)
|
||||||
* sending broadcast DIO. This is to get all children to re-register
|
* when sending multicast DIO. This is to get all children to re-register
|
||||||
* their DAO route.
|
* their DAO route. This is needed when DAO-ACK is not enabled to add
|
||||||
|
* reliability to route maintenance.
|
||||||
* */
|
* */
|
||||||
#ifdef RPL_CONF_DIO_REFRESH_DAO_ROUTES
|
#ifdef RPL_CONF_DIO_REFRESH_DAO_ROUTES
|
||||||
#define RPL_DIO_REFRESH_DAO_ROUTES RPL_CONF_DIO_REFRESH_DAO_ROUTES
|
#define RPL_DIO_REFRESH_DAO_ROUTES RPL_CONF_DIO_REFRESH_DAO_ROUTES
|
||||||
#else
|
#else
|
||||||
#define RPL_DIO_REFRESH_DAO_ROUTES 0
|
#define RPL_DIO_REFRESH_DAO_ROUTES 1
|
||||||
#endif /* RPL_CONF_DIO_REFRESH_DAO_ROUTES */
|
#endif /* RPL_CONF_DIO_REFRESH_DAO_ROUTES */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -43,7 +43,9 @@
|
||||||
|
|
||||||
#define RPL_DAG_GRACE_PERIOD (CLOCK_SECOND * 20 * 1)
|
#define RPL_DAG_GRACE_PERIOD (CLOCK_SECOND * 20 * 1)
|
||||||
|
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
static struct uip_ds6_notification n;
|
static struct uip_ds6_notification n;
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
static uint8_t to_become_root;
|
static uint8_t to_become_root;
|
||||||
static struct ctimer c;
|
static struct ctimer c;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -121,6 +123,7 @@ create_dag_callback(void *ptr)
|
||||||
ctimer_set(&c, RPL_DAG_GRACE_PERIOD, create_dag_callback, NULL);
|
ctimer_set(&c, RPL_DAG_GRACE_PERIOD, create_dag_callback, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
route_callback(int event, uip_ipaddr_t *route, uip_ipaddr_t *ipaddr,
|
route_callback(int event, uip_ipaddr_t *route, uip_ipaddr_t *ipaddr,
|
||||||
|
@ -136,6 +139,7 @@ route_callback(int event, uip_ipaddr_t *route, uip_ipaddr_t *ipaddr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static uip_ipaddr_t *
|
static uip_ipaddr_t *
|
||||||
set_global_address(void)
|
set_global_address(void)
|
||||||
|
@ -171,7 +175,9 @@ rpl_dag_root_init(void)
|
||||||
if(!initialized) {
|
if(!initialized) {
|
||||||
to_become_root = 0;
|
to_become_root = 0;
|
||||||
set_global_address();
|
set_global_address();
|
||||||
|
#if (UIP_CONF_MAX_ROUTES != 0)
|
||||||
uip_ds6_notification_add(&n, route_callback);
|
uip_ds6_notification_add(&n, route_callback);
|
||||||
|
#endif /* (UIP_CONF_MAX_ROUTES != 0) */
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,7 +212,9 @@ rpl_dag_root_init_dag_immediately(void)
|
||||||
|
|
||||||
/* If there are routes in this dag, we remove them all as we are
|
/* 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 */
|
from now on the new dag root and the old routes are wrong */
|
||||||
|
if(RPL_IS_STORING(dag->instance)) {
|
||||||
rpl_remove_routes(dag);
|
rpl_remove_routes(dag);
|
||||||
|
}
|
||||||
if(dag->instance != NULL &&
|
if(dag->instance != NULL &&
|
||||||
dag->instance->def_route != NULL) {
|
dag->instance->def_route != NULL) {
|
||||||
uip_ds6_defrt_rm(dag->instance->def_route);
|
uip_ds6_defrt_rm(dag->instance->def_route);
|
||||||
|
|
|
@ -98,8 +98,8 @@ rpl_print_neighbor_list(void)
|
||||||
rpl_parent_t *p = nbr_table_head(rpl_parents);
|
rpl_parent_t *p = nbr_table_head(rpl_parents);
|
||||||
clock_time_t clock_now = clock_time();
|
clock_time_t clock_now = clock_time();
|
||||||
|
|
||||||
printf("RPL: OCP %u rank %u dioint %u, nbr count %u\n",
|
printf("RPL: MOP %u OCP %u rank %u dioint %u, nbr count %u\n",
|
||||||
default_instance->of->ocp, curr_rank, curr_dio_interval, uip_ds6_nbr_num());
|
default_instance->mop, default_instance->of->ocp, curr_rank, curr_dio_interval, uip_ds6_nbr_num());
|
||||||
while(p != NULL) {
|
while(p != NULL) {
|
||||||
const struct link_stats *stats = rpl_get_parent_link_stats(p);
|
const struct link_stats *stats = rpl_get_parent_link_stats(p);
|
||||||
printf("RPL: nbr %3u %5u, %5u => %5u -- %2u %c%c (last tx %u min ago)\n",
|
printf("RPL: nbr %3u %5u, %5u => %5u -- %2u %c%c (last tx %u min ago)\n",
|
||||||
|
@ -418,7 +418,9 @@ rpl_set_root(uint8_t instance_id, uip_ipaddr_t *dag_id)
|
||||||
|
|
||||||
if(instance->current_dag != dag && instance->current_dag != NULL) {
|
if(instance->current_dag != dag && instance->current_dag != NULL) {
|
||||||
/* Remove routes installed by DAOs. */
|
/* Remove routes installed by DAOs. */
|
||||||
|
if(RPL_IS_STORING(instance)) {
|
||||||
rpl_remove_routes(instance->current_dag);
|
rpl_remove_routes(instance->current_dag);
|
||||||
|
}
|
||||||
|
|
||||||
instance->current_dag->joined = 0;
|
instance->current_dag->joined = 0;
|
||||||
}
|
}
|
||||||
|
@ -667,7 +669,9 @@ rpl_free_dag(rpl_dag_t *dag)
|
||||||
dag->joined = 0;
|
dag->joined = 0;
|
||||||
|
|
||||||
/* Remove routes installed by DAOs. */
|
/* Remove routes installed by DAOs. */
|
||||||
|
if(RPL_IS_STORING(dag->instance)) {
|
||||||
rpl_remove_routes(dag);
|
rpl_remove_routes(dag);
|
||||||
|
}
|
||||||
|
|
||||||
/* Remove autoconfigured address */
|
/* Remove autoconfigured address */
|
||||||
if((dag->prefix_info.flags & UIP_ND6_RA_FLAG_AUTONOMOUS)) {
|
if((dag->prefix_info.flags & UIP_ND6_RA_FLAG_AUTONOMOUS)) {
|
||||||
|
@ -787,7 +791,9 @@ rpl_select_dag(rpl_instance_t *instance, rpl_parent_t *p)
|
||||||
|
|
||||||
if(instance->current_dag != best_dag) {
|
if(instance->current_dag != best_dag) {
|
||||||
/* Remove routes installed by DAOs. */
|
/* Remove routes installed by DAOs. */
|
||||||
|
if(RPL_IS_STORING(instance)) {
|
||||||
rpl_remove_routes(instance->current_dag);
|
rpl_remove_routes(instance->current_dag);
|
||||||
|
}
|
||||||
|
|
||||||
PRINTF("RPL: New preferred DAG: ");
|
PRINTF("RPL: New preferred DAG: ");
|
||||||
PRINT6ADDR(&best_dag->dag_id);
|
PRINT6ADDR(&best_dag->dag_id);
|
||||||
|
@ -816,7 +822,7 @@ rpl_select_dag(rpl_instance_t *instance, rpl_parent_t *p)
|
||||||
if(!acceptable_rank(best_dag, best_dag->rank)) {
|
if(!acceptable_rank(best_dag, best_dag->rank)) {
|
||||||
PRINTF("RPL: New rank unacceptable!\n");
|
PRINTF("RPL: New rank unacceptable!\n");
|
||||||
rpl_set_preferred_parent(instance->current_dag, NULL);
|
rpl_set_preferred_parent(instance->current_dag, NULL);
|
||||||
if(instance->mop != RPL_MOP_NO_DOWNWARD_ROUTES && last_parent != NULL) {
|
if(RPL_IS_STORING(instance) && last_parent != NULL) {
|
||||||
/* Send a No-Path DAO to the removed preferred parent. */
|
/* Send a No-Path DAO to the removed preferred parent. */
|
||||||
dao_output(last_parent, RPL_ZERO_LIFETIME);
|
dao_output(last_parent, RPL_ZERO_LIFETIME);
|
||||||
}
|
}
|
||||||
|
@ -828,15 +834,13 @@ rpl_select_dag(rpl_instance_t *instance, rpl_parent_t *p)
|
||||||
PRINTF("RPL: Changed preferred parent, rank changed from %u to %u\n",
|
PRINTF("RPL: Changed preferred parent, rank changed from %u to %u\n",
|
||||||
(unsigned)old_rank, best_dag->rank);
|
(unsigned)old_rank, best_dag->rank);
|
||||||
RPL_STAT(rpl_stats.parent_switch++);
|
RPL_STAT(rpl_stats.parent_switch++);
|
||||||
if(instance->mop != RPL_MOP_NO_DOWNWARD_ROUTES) {
|
if(RPL_IS_STORING(instance) && last_parent != NULL) {
|
||||||
if(last_parent != NULL) {
|
|
||||||
/* Send a No-Path DAO to the removed preferred parent. */
|
/* Send a No-Path DAO to the removed preferred parent. */
|
||||||
dao_output(last_parent, RPL_ZERO_LIFETIME);
|
dao_output(last_parent, RPL_ZERO_LIFETIME);
|
||||||
}
|
}
|
||||||
/* The DAO parent set changed - schedule a DAO transmission. */
|
/* The DAO parent set changed - schedule a DAO transmission. */
|
||||||
RPL_LOLLIPOP_INCREMENT(instance->dtsn_out);
|
RPL_LOLLIPOP_INCREMENT(instance->dtsn_out);
|
||||||
rpl_schedule_dao(instance);
|
rpl_schedule_dao(instance);
|
||||||
}
|
|
||||||
rpl_reset_dio_timer(instance);
|
rpl_reset_dio_timer(instance);
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
rpl_print_neighbor_list();
|
rpl_print_neighbor_list();
|
||||||
|
@ -954,9 +958,11 @@ rpl_nullify_parent(rpl_parent_t *parent)
|
||||||
uip_ds6_defrt_rm(dag->instance->def_route);
|
uip_ds6_defrt_rm(dag->instance->def_route);
|
||||||
dag->instance->def_route = NULL;
|
dag->instance->def_route = NULL;
|
||||||
}
|
}
|
||||||
/* Send No-Path DAO only to preferred parent, if any */
|
/* Send No-Path DAO only when nullifying preferred parent */
|
||||||
if(parent == dag->preferred_parent) {
|
if(parent == dag->preferred_parent) {
|
||||||
|
if(RPL_IS_STORING(dag->instance)) {
|
||||||
dao_output(parent, RPL_ZERO_LIFETIME);
|
dao_output(parent, RPL_ZERO_LIFETIME);
|
||||||
|
}
|
||||||
rpl_set_preferred_parent(dag, NULL);
|
rpl_set_preferred_parent(dag, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -982,9 +988,11 @@ rpl_move_parent(rpl_dag_t *dag_src, rpl_dag_t *dag_dst, rpl_parent_t *parent)
|
||||||
dag_src->instance->def_route = NULL;
|
dag_src->instance->def_route = NULL;
|
||||||
}
|
}
|
||||||
} else if(dag_src->joined) {
|
} else if(dag_src->joined) {
|
||||||
|
if(RPL_IS_STORING(dag_src->instance)) {
|
||||||
/* Remove uIPv6 routes that have this parent as the next hop. */
|
/* Remove uIPv6 routes that have this parent as the next hop. */
|
||||||
rpl_remove_routes_by_nexthop(rpl_get_parent_ipaddr(parent), dag_src);
|
rpl_remove_routes_by_nexthop(rpl_get_parent_ipaddr(parent), dag_src);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PRINTF("RPL: Moving parent ");
|
PRINTF("RPL: Moving parent ");
|
||||||
PRINT6ADDR(rpl_get_parent_ipaddr(parent));
|
PRINT6ADDR(rpl_get_parent_ipaddr(parent));
|
||||||
|
@ -1006,6 +1014,25 @@ rpl_has_downward_route(void)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
rpl_dag_t *
|
rpl_dag_t *
|
||||||
|
rpl_get_dag(const uip_ipaddr_t *addr)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for(i = 0; i < RPL_MAX_INSTANCES; ++i) {
|
||||||
|
if(instance_table[i].used) {
|
||||||
|
for(j = 0; j < RPL_MAX_DAG_PER_INSTANCE; ++j) {
|
||||||
|
if(instance_table[i].dag_table[j].joined
|
||||||
|
&& uip_ipaddr_prefixcmp(&instance_table[i].dag_table[j].dag_id, addr,
|
||||||
|
instance_table[i].dag_table[j].prefix_info.length)) {
|
||||||
|
return &instance_table[i].dag_table[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
rpl_dag_t *
|
||||||
rpl_get_any_dag(void)
|
rpl_get_any_dag(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1055,6 +1082,12 @@ rpl_join_instance(uip_ipaddr_t *from, rpl_dio_t *dio)
|
||||||
rpl_parent_t *p;
|
rpl_parent_t *p;
|
||||||
rpl_of_t *of;
|
rpl_of_t *of;
|
||||||
|
|
||||||
|
if((!RPL_WITH_NON_STORING && dio->mop == RPL_MOP_NON_STORING)
|
||||||
|
|| (!RPL_WITH_STORING && (dio->mop == RPL_MOP_STORING_NO_MULTICAST
|
||||||
|
|| dio->mop == RPL_MOP_STORING_MULTICAST))) {
|
||||||
|
PRINTF("RPL: DIO advertising a non-supported MOP %u\n", dio->mop);
|
||||||
|
}
|
||||||
|
|
||||||
/* Determine the objective function by using the
|
/* Determine the objective function by using the
|
||||||
objective code point of the DIO. */
|
objective code point of the DIO. */
|
||||||
of = rpl_find_of(dio->ocp);
|
of = rpl_find_of(dio->ocp);
|
||||||
|
@ -1333,7 +1366,9 @@ rpl_process_parent_event(rpl_instance_t *instance, rpl_parent_t *p)
|
||||||
|
|
||||||
return_value = 1;
|
return_value = 1;
|
||||||
|
|
||||||
if(uip_ds6_route_is_nexthop(rpl_get_parent_ipaddr(p)) && !rpl_parent_is_reachable(p)) {
|
if(RPL_IS_STORING(instance)
|
||||||
|
&& uip_ds6_route_is_nexthop(rpl_get_parent_ipaddr(p))
|
||||||
|
&& !rpl_parent_is_reachable(p) && instance->mop > RPL_MOP_NON_STORING) {
|
||||||
PRINTF("RPL: Unacceptable link %u, removing routes via: ", rpl_get_parent_link_metric(p));
|
PRINTF("RPL: Unacceptable link %u, removing routes via: ", rpl_get_parent_link_metric(p));
|
||||||
PRINT6ADDR(rpl_get_parent_ipaddr(p));
|
PRINT6ADDR(rpl_get_parent_ipaddr(p));
|
||||||
PRINTF("\n");
|
PRINTF("\n");
|
||||||
|
@ -1492,6 +1527,11 @@ rpl_process_dio(uip_ipaddr_t *from, rpl_dio_t *dio)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!add_nbr_from_dio(from, dio)) {
|
||||||
|
PRINTF("RPL: Could not add parent based on DIO\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(dag->rank == ROOT_RANK(instance)) {
|
if(dag->rank == ROOT_RANK(instance)) {
|
||||||
if(dio->rank != INFINITE_RANK) {
|
if(dio->rank != INFINITE_RANK) {
|
||||||
instance->dio_counter++;
|
instance->dio_counter++;
|
||||||
|
@ -1512,11 +1552,6 @@ rpl_process_dio(uip_ipaddr_t *from, rpl_dio_t *dio)
|
||||||
* whether to keep it in the set.
|
* whether to keep it in the set.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(!add_nbr_from_dio(from, dio)) {
|
|
||||||
PRINTF("RPL: Could not add parent based on DIO\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = rpl_find_parent(dag, from);
|
p = rpl_find_parent(dag, from);
|
||||||
if(p == NULL) {
|
if(p == NULL) {
|
||||||
previous_dag = find_parent_dag(instance, from);
|
previous_dag = find_parent_dag(instance, from);
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include "net/ip/tcpip.h"
|
#include "net/ip/tcpip.h"
|
||||||
#include "net/ipv6/uip-ds6.h"
|
#include "net/ipv6/uip-ds6.h"
|
||||||
#include "net/rpl/rpl-private.h"
|
#include "net/rpl/rpl-private.h"
|
||||||
|
#include "net/rpl/rpl-ns.h"
|
||||||
#include "net/packetbuf.h"
|
#include "net/packetbuf.h"
|
||||||
|
|
||||||
#define DEBUG DEBUG_NONE
|
#define DEBUG DEBUG_NONE
|
||||||
|
@ -61,12 +62,14 @@
|
||||||
#define UIP_EXT_BUF ((struct uip_ext_hdr *)&uip_buf[uip_l2_l3_hdr_len])
|
#define UIP_EXT_BUF ((struct uip_ext_hdr *)&uip_buf[uip_l2_l3_hdr_len])
|
||||||
#define UIP_HBHO_BUF ((struct uip_hbho_hdr *)&uip_buf[uip_l2_l3_hdr_len])
|
#define UIP_HBHO_BUF ((struct uip_hbho_hdr *)&uip_buf[uip_l2_l3_hdr_len])
|
||||||
#define UIP_HBHO_NEXT_BUF ((struct uip_ext_hdr *)&uip_buf[uip_l2_l3_hdr_len + RPL_HOP_BY_HOP_LEN])
|
#define UIP_HBHO_NEXT_BUF ((struct uip_ext_hdr *)&uip_buf[uip_l2_l3_hdr_len + RPL_HOP_BY_HOP_LEN])
|
||||||
|
#define UIP_RH_BUF ((struct uip_routing_hdr *)&uip_buf[uip_l2_l3_hdr_len])
|
||||||
|
#define UIP_RPL_SRH_BUF ((struct uip_rpl_srh_hdr *)&uip_buf[uip_l2_l3_hdr_len + RPL_RH_LEN])
|
||||||
#define UIP_EXT_HDR_OPT_BUF ((struct uip_ext_hdr_opt *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
|
#define UIP_EXT_HDR_OPT_BUF ((struct uip_ext_hdr_opt *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
|
||||||
#define UIP_EXT_HDR_OPT_PADN_BUF ((struct uip_ext_hdr_opt_padn *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
|
#define UIP_EXT_HDR_OPT_PADN_BUF ((struct uip_ext_hdr_opt_padn *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
|
||||||
#define UIP_EXT_HDR_OPT_RPL_BUF ((struct uip_ext_hdr_opt_rpl *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
|
#define UIP_EXT_HDR_OPT_RPL_BUF ((struct uip_ext_hdr_opt_rpl *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
rpl_verify_header(int uip_ext_opt_offset)
|
rpl_verify_hbh_header(int uip_ext_opt_offset)
|
||||||
{
|
{
|
||||||
rpl_instance_t *instance;
|
rpl_instance_t *instance;
|
||||||
int down;
|
int down;
|
||||||
|
@ -75,7 +78,7 @@ rpl_verify_header(int uip_ext_opt_offset)
|
||||||
uip_ds6_route_t *route;
|
uip_ds6_route_t *route;
|
||||||
rpl_parent_t *sender = NULL;
|
rpl_parent_t *sender = NULL;
|
||||||
|
|
||||||
if(UIP_HBHO_BUF->len != RPL_HOP_BY_HOP_LEN - 8) {
|
if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8)) {
|
||||||
PRINTF("RPL: Hop-by-hop extension header has wrong size\n");
|
PRINTF("RPL: Hop-by-hop extension header has wrong size\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -103,10 +106,12 @@ rpl_verify_header(int uip_ext_opt_offset)
|
||||||
the packet to be forwareded in the first place. We drop any
|
the packet to be forwareded in the first place. We drop any
|
||||||
routes that go through the neighbor that sent the packet to
|
routes that go through the neighbor that sent the packet to
|
||||||
us. */
|
us. */
|
||||||
|
if(RPL_IS_STORING(instance)) {
|
||||||
route = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);
|
route = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);
|
||||||
if(route != NULL) {
|
if(route != NULL) {
|
||||||
uip_ds6_route_rm(route);
|
uip_ds6_route_rm(route);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
RPL_STAT(rpl_stats.forward_errors++);
|
RPL_STAT(rpl_stats.forward_errors++);
|
||||||
/* Trigger DAO retransmission */
|
/* Trigger DAO retransmission */
|
||||||
rpl_reset_dio_timer(instance);
|
rpl_reset_dio_timer(instance);
|
||||||
|
@ -131,8 +136,13 @@ rpl_verify_header(int uip_ext_opt_offset)
|
||||||
/* A rank error was signalled, attempt to repair it by updating
|
/* A rank error was signalled, attempt to repair it by updating
|
||||||
* the sender's rank from ext header */
|
* the sender's rank from ext header */
|
||||||
sender->rank = sender_rank;
|
sender->rank = sender_rank;
|
||||||
|
if(RPL_IS_NON_STORING(instance)) {
|
||||||
|
/* Select DAG and preferred parent only in non-storing mode. In storing mode,
|
||||||
|
* a parent switch would result in an immediate No-path DAO transmission, dropping
|
||||||
|
* current incoming packet. */
|
||||||
rpl_select_dag(instance, sender);
|
rpl_select_dag(instance, sender);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sender_closer = sender_rank < instance->current_dag->rank;
|
sender_closer = sender_rank < instance->current_dag->rank;
|
||||||
|
|
||||||
|
@ -166,35 +176,308 @@ rpl_verify_header(int uip_ext_opt_offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
PRINTF("RPL: Rank OK\n");
|
PRINTF("RPL: Rank OK\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
#if RPL_WITH_NON_STORING
|
||||||
set_rpl_opt(unsigned uip_ext_opt_offset)
|
int
|
||||||
|
rpl_srh_get_next_hop(uip_ipaddr_t *ipaddr)
|
||||||
{
|
{
|
||||||
uint8_t temp_len;
|
uint8_t *uip_next_hdr;
|
||||||
|
int last_uip_ext_len = uip_ext_len;
|
||||||
|
rpl_dag_t *dag;
|
||||||
|
rpl_ns_node_t *dest_node;
|
||||||
|
rpl_ns_node_t *root_node;
|
||||||
|
|
||||||
memmove(UIP_HBHO_NEXT_BUF, UIP_EXT_BUF, uip_len - UIP_IPH_LEN);
|
uip_ext_len = 0;
|
||||||
memset(UIP_HBHO_BUF, 0, RPL_HOP_BY_HOP_LEN);
|
uip_next_hdr = &UIP_IP_BUF->proto;
|
||||||
UIP_HBHO_BUF->next = UIP_IP_BUF->proto;
|
|
||||||
UIP_IP_BUF->proto = UIP_PROTO_HBHO;
|
/* Look for routing header */
|
||||||
UIP_HBHO_BUF->len = RPL_HOP_BY_HOP_LEN - 8;
|
while(uip_next_hdr != NULL && *uip_next_hdr != UIP_PROTO_ROUTING) {
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->opt_type = UIP_EXT_HDR_OPT_RPL;
|
switch(*uip_next_hdr) {
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->opt_len = RPL_HDR_OPT_LEN;
|
case UIP_PROTO_TCP:
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->flags = 0;
|
case UIP_PROTO_UDP:
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->instance = 0;
|
case UIP_PROTO_ICMP6:
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = 0;
|
case UIP_PROTO_NONE:
|
||||||
uip_len += RPL_HOP_BY_HOP_LEN;
|
uip_next_hdr = NULL;
|
||||||
temp_len = UIP_IP_BUF->len[1];
|
break;
|
||||||
UIP_IP_BUF->len[1] += UIP_HBHO_BUF->len + 8;
|
case UIP_PROTO_HBHO:
|
||||||
if(UIP_IP_BUF->len[1] < temp_len) {
|
case UIP_PROTO_DESTO:
|
||||||
UIP_IP_BUF->len[0]++;
|
case UIP_PROTO_FRAG:
|
||||||
|
/* Move to next header */
|
||||||
|
if(uip_next_hdr != &UIP_IP_BUF->proto) {
|
||||||
|
uip_ext_len += (UIP_EXT_BUF->len << 3) + 8;
|
||||||
}
|
}
|
||||||
|
uip_next_hdr = &UIP_EXT_BUF->next;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dag = rpl_get_dag(&UIP_IP_BUF->destipaddr);
|
||||||
|
root_node = rpl_ns_get_node(dag, &dag->dag_id);
|
||||||
|
dest_node = rpl_ns_get_node(dag, &UIP_IP_BUF->destipaddr);
|
||||||
|
|
||||||
|
if((uip_next_hdr != NULL && *uip_next_hdr == UIP_PROTO_ROUTING
|
||||||
|
&& UIP_RH_BUF->routing_type == RPL_RH_TYPE_SRH) ||
|
||||||
|
(dest_node != NULL && root_node != NULL &&
|
||||||
|
dest_node->parent == root_node)) {
|
||||||
|
/* Routing header found or the packet destined for a direct child of the root.
|
||||||
|
* The next hop should be already copied as the IPv6 destination
|
||||||
|
* address, via rpl_process_srh_header. We turn this address into a link-local to enable
|
||||||
|
* forwarding to next hop */
|
||||||
|
uip_ipaddr_copy(ipaddr, &UIP_IP_BUF->destipaddr);
|
||||||
|
uip_create_linklocal_prefix(ipaddr);
|
||||||
|
uip_ext_len = last_uip_ext_len;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uip_ext_len = last_uip_ext_len;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
rpl_update_header_empty(void)
|
rpl_process_srh_header(void)
|
||||||
|
{
|
||||||
|
uint8_t *uip_next_hdr;
|
||||||
|
int last_uip_ext_len = uip_ext_len;
|
||||||
|
|
||||||
|
uip_ext_len = 0;
|
||||||
|
uip_next_hdr = &UIP_IP_BUF->proto;
|
||||||
|
|
||||||
|
/* Look for routing header */
|
||||||
|
while(uip_next_hdr != NULL && *uip_next_hdr != UIP_PROTO_ROUTING) {
|
||||||
|
switch(*uip_next_hdr) {
|
||||||
|
case UIP_PROTO_TCP:
|
||||||
|
case UIP_PROTO_UDP:
|
||||||
|
case UIP_PROTO_ICMP6:
|
||||||
|
case UIP_PROTO_NONE:
|
||||||
|
uip_next_hdr = NULL;
|
||||||
|
break;
|
||||||
|
case UIP_PROTO_HBHO:
|
||||||
|
case UIP_PROTO_DESTO:
|
||||||
|
case UIP_PROTO_FRAG:
|
||||||
|
/* Move to next header */
|
||||||
|
if(uip_next_hdr != &UIP_IP_BUF->proto) {
|
||||||
|
uip_ext_len += (UIP_EXT_BUF->len << 3) + 8;
|
||||||
|
}
|
||||||
|
uip_next_hdr = &UIP_EXT_BUF->next;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(uip_next_hdr != NULL && *uip_next_hdr == UIP_PROTO_ROUTING
|
||||||
|
&& UIP_RH_BUF->routing_type == RPL_RH_TYPE_SRH) {
|
||||||
|
/* SRH found, now look for next hop */
|
||||||
|
uint8_t cmpri, cmpre;
|
||||||
|
uint8_t ext_len;
|
||||||
|
uint8_t padding;
|
||||||
|
uint8_t path_len;
|
||||||
|
uint8_t segments_left;
|
||||||
|
uip_ipaddr_t current_dest_addr;
|
||||||
|
|
||||||
|
segments_left = UIP_RH_BUF->seg_left;
|
||||||
|
ext_len = (UIP_RH_BUF->len * 8) + 8;
|
||||||
|
cmpri = UIP_RPL_SRH_BUF->cmpr >> 4;
|
||||||
|
cmpre = UIP_RPL_SRH_BUF->cmpr & 0x0f;
|
||||||
|
padding = UIP_RPL_SRH_BUF->pad >> 4;
|
||||||
|
path_len = ((ext_len - padding - RPL_RH_LEN - RPL_SRH_LEN - (16 - cmpre)) / (16 - cmpri)) + 1;
|
||||||
|
(void)path_len;
|
||||||
|
|
||||||
|
PRINTF("RPL: read SRH, path len %u, segments left %u, Cmpri %u, Cmpre %u, ext len %u (padding %u)\n",
|
||||||
|
path_len, segments_left, cmpri, cmpre, ext_len, padding);
|
||||||
|
|
||||||
|
if(segments_left == 0) {
|
||||||
|
/* We are the final destination, do nothing */
|
||||||
|
} else {
|
||||||
|
uint8_t i = path_len - segments_left; /* The index of the next address to be visited */
|
||||||
|
uint8_t *addr_ptr = ((uint8_t *)UIP_RH_BUF) + RPL_RH_LEN + RPL_SRH_LEN + (i * (16 - cmpri));
|
||||||
|
uint8_t cmpr = segments_left == 1 ? cmpre : cmpri;
|
||||||
|
|
||||||
|
/* As per RFC6554: swap the IPv6 destination address and address[i] */
|
||||||
|
|
||||||
|
/* First, copy the current IPv6 destination address */
|
||||||
|
uip_ipaddr_copy(¤t_dest_addr, &UIP_IP_BUF->destipaddr);
|
||||||
|
/* Second, update the IPv6 destination address with addresses[i] */
|
||||||
|
memcpy(((uint8_t *)&UIP_IP_BUF->destipaddr) + cmpr, addr_ptr, 16 - cmpr);
|
||||||
|
/* Third, write current_dest_addr to addresses[i] */
|
||||||
|
memcpy(addr_ptr, ((uint8_t *)¤t_dest_addr) + cmpr, 16 - cmpr);
|
||||||
|
|
||||||
|
/* Update segments left field */
|
||||||
|
UIP_RH_BUF->seg_left--;
|
||||||
|
|
||||||
|
PRINTF("RPL: SRH next hop ");
|
||||||
|
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
|
||||||
|
PRINTF("\n");
|
||||||
|
}
|
||||||
|
uip_ext_len = last_uip_ext_len;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uip_ext_len = last_uip_ext_len;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
count_matching_bytes(const void *p1, const void *p2, size_t n)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for(i = 0; i < n; i++) {
|
||||||
|
if(((uint8_t *)p1)[i] != ((uint8_t *)p2)[i]) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
insert_srh_header(void)
|
||||||
|
{
|
||||||
|
/* Implementation of RFC6554 */
|
||||||
|
uint8_t temp_len;
|
||||||
|
uint8_t path_len;
|
||||||
|
uint8_t ext_len;
|
||||||
|
uint8_t cmpri, cmpre; /* ComprI and ComprE fields of the RPL Source Routing Header */
|
||||||
|
uint8_t *hop_ptr;
|
||||||
|
uint8_t padding;
|
||||||
|
rpl_ns_node_t *dest_node;
|
||||||
|
rpl_ns_node_t *root_node;
|
||||||
|
rpl_ns_node_t *node;
|
||||||
|
rpl_dag_t *dag;
|
||||||
|
uip_ipaddr_t node_addr;
|
||||||
|
|
||||||
|
PRINTF("RPL: SRH creating source routing header with destination ");
|
||||||
|
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
|
||||||
|
PRINTF(" \n");
|
||||||
|
|
||||||
|
/* Construct source route. We do not do this recursively to keep the runtime stack usage constant. */
|
||||||
|
|
||||||
|
/* Get link of the destination and root */
|
||||||
|
dag = rpl_get_dag(&UIP_IP_BUF->destipaddr);
|
||||||
|
|
||||||
|
if(dag == NULL) {
|
||||||
|
PRINTF("RPL: SRH DAG not found\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest_node = rpl_ns_get_node(dag, &UIP_IP_BUF->destipaddr);
|
||||||
|
if(dest_node == NULL) {
|
||||||
|
/* The destination is not found, skip SRH insertion */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
root_node = rpl_ns_get_node(dag, &dag->dag_id);
|
||||||
|
if(root_node == NULL) {
|
||||||
|
PRINTF("RPL: SRH root node not found\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!rpl_ns_is_node_reachable(dag, &UIP_IP_BUF->destipaddr)) {
|
||||||
|
PRINTF("RPL: SRH no path found to destination\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute path length and compression factors (we use cmpri == cmpre) */
|
||||||
|
path_len = 0;
|
||||||
|
node = dest_node->parent;
|
||||||
|
/* For simplicity, we use cmpri = cmpre */
|
||||||
|
cmpri = 15;
|
||||||
|
cmpre = 15;
|
||||||
|
|
||||||
|
if(node == root_node) {
|
||||||
|
PRINTF("RPL: SRH no need to insert SRH\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(node != NULL && node != root_node) {
|
||||||
|
|
||||||
|
rpl_ns_get_node_global_addr(&node_addr, node);
|
||||||
|
|
||||||
|
/* How many bytes in common between all nodes in the path? */
|
||||||
|
cmpri = MIN(cmpri, count_matching_bytes(&node_addr, &UIP_IP_BUF->destipaddr, 16));
|
||||||
|
cmpre = cmpri;
|
||||||
|
|
||||||
|
PRINTF("RPL: SRH Hop ");
|
||||||
|
PRINT6ADDR(&node_addr);
|
||||||
|
PRINTF("\n");
|
||||||
|
node = node->parent;
|
||||||
|
path_len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extension header length: fixed headers + (n-1) * (16-ComprI) + (16-ComprE)*/
|
||||||
|
ext_len = RPL_RH_LEN + RPL_SRH_LEN
|
||||||
|
+ (path_len - 1) * (16 - cmpre)
|
||||||
|
+ (16 - cmpri);
|
||||||
|
|
||||||
|
padding = ext_len % 8 == 0 ? 0 : (8 - (ext_len % 8));
|
||||||
|
ext_len += padding;
|
||||||
|
|
||||||
|
PRINTF("RPL: SRH Path len: %u, ComprI %u, ComprE %u, ext len %u (padding %u)\n",
|
||||||
|
path_len, cmpri, cmpre, ext_len, padding);
|
||||||
|
|
||||||
|
/* Check if there is enough space to store the extension header */
|
||||||
|
if(uip_len + ext_len > UIP_BUFSIZE) {
|
||||||
|
PRINTF("RPL: Packet too long: impossible to add source routing header (%u bytes)\n", ext_len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move existing ext headers and payload uip_ext_len further */
|
||||||
|
memmove(uip_buf + uip_l2_l3_hdr_len + ext_len,
|
||||||
|
uip_buf + uip_l2_l3_hdr_len, uip_len - UIP_IPH_LEN);
|
||||||
|
memset(uip_buf + uip_l2_l3_hdr_len, 0, ext_len);
|
||||||
|
|
||||||
|
/* Insert source routing header */
|
||||||
|
UIP_RH_BUF->next = UIP_IP_BUF->proto;
|
||||||
|
UIP_IP_BUF->proto = UIP_PROTO_ROUTING;
|
||||||
|
|
||||||
|
/* Initialize IPv6 Routing Header */
|
||||||
|
UIP_RH_BUF->len = (ext_len - 8) / 8;
|
||||||
|
UIP_RH_BUF->routing_type = RPL_RH_TYPE_SRH;
|
||||||
|
UIP_RH_BUF->seg_left = path_len;
|
||||||
|
|
||||||
|
/* Initialize RPL Source Routing Header */
|
||||||
|
UIP_RPL_SRH_BUF->cmpr = (cmpri << 4) + cmpre;
|
||||||
|
UIP_RPL_SRH_BUF->pad = padding << 4;
|
||||||
|
|
||||||
|
/* Initialize addresses field (the actual source route).
|
||||||
|
* From last to first. */
|
||||||
|
node = dest_node;
|
||||||
|
hop_ptr = ((uint8_t *)UIP_RH_BUF) + ext_len - padding; /* Pointer where to write the next hop compressed address */
|
||||||
|
|
||||||
|
while(node != NULL && node->parent != root_node) {
|
||||||
|
rpl_ns_get_node_global_addr(&node_addr, node);
|
||||||
|
|
||||||
|
hop_ptr -= (16 - cmpri);
|
||||||
|
memcpy(hop_ptr, ((uint8_t*)&node_addr) + cmpri, 16 - cmpri);
|
||||||
|
|
||||||
|
node = node->parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The next hop (i.e. node whose parent is the root) is placed as the current IPv6 destination */
|
||||||
|
rpl_ns_get_node_global_addr(&node_addr, node);
|
||||||
|
uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &node_addr);
|
||||||
|
|
||||||
|
/* In-place update of IPv6 length field */
|
||||||
|
temp_len = UIP_IP_BUF->len[1];
|
||||||
|
UIP_IP_BUF->len[1] += ext_len;
|
||||||
|
if(UIP_IP_BUF->len[1] < temp_len) {
|
||||||
|
UIP_IP_BUF->len[0]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
uip_ext_len += ext_len;
|
||||||
|
uip_len += ext_len;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#else /* RPL_WITH_NON_STORING */
|
||||||
|
int insert_srh_header(void);
|
||||||
|
#endif /* RPL_WITH_NON_STORING */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
update_hbh_header(void)
|
||||||
{
|
{
|
||||||
rpl_instance_t *instance;
|
rpl_instance_t *instance;
|
||||||
int uip_ext_opt_offset;
|
int uip_ext_opt_offset;
|
||||||
|
@ -209,39 +492,30 @@ rpl_update_header_empty(void)
|
||||||
|
|
||||||
switch(UIP_IP_BUF->proto) {
|
switch(UIP_IP_BUF->proto) {
|
||||||
case UIP_PROTO_HBHO:
|
case UIP_PROTO_HBHO:
|
||||||
if(UIP_HBHO_BUF->len != RPL_HOP_BY_HOP_LEN - 8) {
|
if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8)) {
|
||||||
PRINTF("RPL: Hop-by-hop extension header has wrong size\n");
|
PRINTF("RPL: Hop-by-hop extension header has wrong size\n");
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_type != UIP_EXT_HDR_OPT_RPL) {
|
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_type != UIP_EXT_HDR_OPT_RPL) {
|
||||||
PRINTF("RPL: Non RPL Hop-by-hop option support not implemented\n");
|
PRINTF("RPL: Non RPL Hop-by-hop option support not implemented\n");
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) {
|
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) {
|
||||||
PRINTF("RPL: RPL Hop-by-hop option has wrong length\n");
|
PRINTF("RPL: RPL Hop-by-hop option has wrong length\n");
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
instance = rpl_get_instance(UIP_EXT_HDR_OPT_RPL_BUF->instance);
|
instance = rpl_get_instance(UIP_EXT_HDR_OPT_RPL_BUF->instance);
|
||||||
if(instance == NULL || !instance->used || !instance->current_dag->joined) {
|
if(instance == NULL || !instance->used || !instance->current_dag->joined) {
|
||||||
PRINTF("RPL: Unable to add hop-by-hop extension header: incorrect instance\n");
|
PRINTF("RPL: Unable to add hop-by-hop extension header: incorrect instance\n");
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
#if RPL_INSERT_HBH_OPTION
|
PRINTF("RPL: No hop-by-hop option found\n");
|
||||||
PRINTF("RPL: No hop-by-hop option found, creating it\n");
|
return 1;
|
||||||
if(uip_len + RPL_HOP_BY_HOP_LEN > UIP_BUFSIZE) {
|
|
||||||
PRINTF("RPL: Packet too long: impossible to add hop-by-hop option\n");
|
|
||||||
uip_ext_len = last_uip_ext_len;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
set_rpl_opt(uip_ext_opt_offset);
|
|
||||||
uip_ext_len = last_uip_ext_len + RPL_HOP_BY_HOP_LEN;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(UIP_EXT_HDR_OPT_BUF->type) {
|
switch(UIP_EXT_HDR_OPT_BUF->type) {
|
||||||
|
@ -249,6 +523,7 @@ rpl_update_header_empty(void)
|
||||||
PRINTF("RPL: Updating RPL option\n");
|
PRINTF("RPL: Updating RPL option\n");
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(instance->current_dag->rank);
|
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(instance->current_dag->rank);
|
||||||
|
|
||||||
|
if(RPL_IS_STORING(instance)) { /* In non-storing mode, downwards traffic does not have the HBH option */
|
||||||
/* Check the direction of the down flag, as per Section 11.2.2.3,
|
/* Check the direction of the down flag, as per Section 11.2.2.3,
|
||||||
which states that if a packet is going down it should in
|
which states that if a packet is going down it should in
|
||||||
general not go back up again. If this happens, a
|
general not go back up again. If this happens, a
|
||||||
|
@ -265,7 +540,7 @@ rpl_update_header_empty(void)
|
||||||
dao_output_target(parent, &UIP_IP_BUF->destipaddr, RPL_ZERO_LIFETIME);
|
dao_output_target(parent, &UIP_IP_BUF->destipaddr, RPL_ZERO_LIFETIME);
|
||||||
}
|
}
|
||||||
/* Drop packet */
|
/* Drop packet */
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Set the down extension flag correctly as described in Section
|
/* Set the down extension flag correctly as described in Section
|
||||||
|
@ -282,18 +557,64 @@ rpl_update_header_empty(void)
|
||||||
PRINTF("RPL option going down\n");
|
PRINTF("RPL option going down\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return 0;
|
return 1;
|
||||||
default:
|
default:
|
||||||
PRINTF("RPL: Multi Hop-by-hop options not implemented\n");
|
PRINTF("RPL: Multi Hop-by-hop options not implemented\n");
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
insert_hbh_header(void)
|
||||||
|
{
|
||||||
|
int uip_ext_opt_offset;
|
||||||
|
int last_uip_ext_len;
|
||||||
|
uint8_t temp_len;
|
||||||
|
|
||||||
|
last_uip_ext_len = uip_ext_len;
|
||||||
|
uip_ext_len = 0;
|
||||||
|
uip_ext_opt_offset = 2;
|
||||||
|
|
||||||
|
/* Insert hop-by-hop header */
|
||||||
|
PRINTF("RPL: Creating hop-by-hop option\n");
|
||||||
|
if(uip_len + RPL_HOP_BY_HOP_LEN > UIP_BUFSIZE) {
|
||||||
|
PRINTF("RPL: Packet too long: impossible to add hop-by-hop option\n");
|
||||||
|
uip_ext_len = last_uip_ext_len;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move existing ext headers and payload UIP_EXT_BUF further */
|
||||||
|
memmove(UIP_HBHO_NEXT_BUF, UIP_EXT_BUF, uip_len - UIP_IPH_LEN);
|
||||||
|
memset(UIP_HBHO_BUF, 0, RPL_HOP_BY_HOP_LEN);
|
||||||
|
|
||||||
|
/* Update IP and HBH protocol and fields */
|
||||||
|
UIP_HBHO_BUF->next = UIP_IP_BUF->proto;
|
||||||
|
UIP_IP_BUF->proto = UIP_PROTO_HBHO;
|
||||||
|
|
||||||
|
/* Initialize HBH option */
|
||||||
|
UIP_HBHO_BUF->len = (RPL_HOP_BY_HOP_LEN - 8) / 8;
|
||||||
|
UIP_EXT_HDR_OPT_RPL_BUF->opt_type = UIP_EXT_HDR_OPT_RPL;
|
||||||
|
UIP_EXT_HDR_OPT_RPL_BUF->opt_len = RPL_HDR_OPT_LEN;
|
||||||
|
UIP_EXT_HDR_OPT_RPL_BUF->flags = 0;
|
||||||
|
UIP_EXT_HDR_OPT_RPL_BUF->instance = 0;
|
||||||
|
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = 0;
|
||||||
|
uip_len += RPL_HOP_BY_HOP_LEN;
|
||||||
|
temp_len = UIP_IP_BUF->len[1];
|
||||||
|
UIP_IP_BUF->len[1] += RPL_HOP_BY_HOP_LEN;
|
||||||
|
if(UIP_IP_BUF->len[1] < temp_len) {
|
||||||
|
UIP_IP_BUF->len[0]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
uip_ext_len = last_uip_ext_len + RPL_HOP_BY_HOP_LEN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
rpl_update_header_final(uip_ipaddr_t *addr)
|
rpl_finalize_header(uip_ipaddr_t *addr)
|
||||||
{
|
{
|
||||||
rpl_parent_t *parent;
|
rpl_parent_t *parent;
|
||||||
int uip_ext_opt_offset;
|
int uip_ext_opt_offset;
|
||||||
|
@ -304,10 +625,10 @@ rpl_update_header_final(uip_ipaddr_t *addr)
|
||||||
uip_ext_opt_offset = 2;
|
uip_ext_opt_offset = 2;
|
||||||
|
|
||||||
if(UIP_IP_BUF->proto == UIP_PROTO_HBHO) {
|
if(UIP_IP_BUF->proto == UIP_PROTO_HBHO) {
|
||||||
if(UIP_HBHO_BUF->len != RPL_HOP_BY_HOP_LEN - 8) {
|
if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8)) {
|
||||||
PRINTF("RPL: Non RPL Hop-by-hop options support not implemented\n");
|
PRINTF("RPL: Non RPL Hop-by-hop options support not implemented\n");
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(UIP_EXT_HDR_OPT_BUF->type == UIP_EXT_HDR_OPT_RPL) {
|
if(UIP_EXT_HDR_OPT_BUF->type == UIP_EXT_HDR_OPT_RPL) {
|
||||||
|
@ -315,7 +636,7 @@ rpl_update_header_final(uip_ipaddr_t *addr)
|
||||||
PRINTF("RPL: Updating RPL option\n");
|
PRINTF("RPL: Updating RPL option\n");
|
||||||
if(default_instance == NULL || !default_instance->used || !default_instance->current_dag->joined) {
|
if(default_instance == NULL || !default_instance->used || !default_instance->current_dag->joined) {
|
||||||
PRINTF("RPL: Unable to add hop-by-hop extension header: incorrect default instance\n");
|
PRINTF("RPL: Unable to add hop-by-hop extension header: incorrect default instance\n");
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
parent = rpl_find_parent(default_instance->current_dag, addr);
|
parent = rpl_find_parent(default_instance->current_dag, addr);
|
||||||
if(parent == NULL || parent != parent->dag->preferred_parent) {
|
if(parent == NULL || parent != parent->dag->preferred_parent) {
|
||||||
|
@ -326,78 +647,100 @@ rpl_update_header_final(uip_ipaddr_t *addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
rpl_remove_header(void)
|
rpl_remove_header(void)
|
||||||
{
|
{
|
||||||
uint8_t temp_len;
|
uint8_t temp_len;
|
||||||
|
uint8_t rpl_ext_hdr_len;
|
||||||
|
uint8_t *uip_next_hdr;
|
||||||
|
|
||||||
uip_ext_len = 0;
|
uip_ext_len = 0;
|
||||||
|
uip_next_hdr = &UIP_IP_BUF->proto;
|
||||||
|
|
||||||
PRINTF("RPL: Verifying the presence of the RPL header option\n");
|
PRINTF("RPL: Verifying the presence of RPL extension headers\n");
|
||||||
switch(UIP_IP_BUF->proto){
|
|
||||||
|
/* Look for hop-by-hop and routing headers */
|
||||||
|
while(uip_next_hdr != NULL) {
|
||||||
|
switch(*uip_next_hdr) {
|
||||||
|
case UIP_PROTO_TCP:
|
||||||
|
case UIP_PROTO_UDP:
|
||||||
|
case UIP_PROTO_ICMP6:
|
||||||
|
case UIP_PROTO_NONE:
|
||||||
|
return;
|
||||||
case UIP_PROTO_HBHO:
|
case UIP_PROTO_HBHO:
|
||||||
PRINTF("RPL: Removing the RPL header option\n");
|
case UIP_PROTO_ROUTING:
|
||||||
UIP_IP_BUF->proto = UIP_HBHO_BUF->next;
|
/* Remove hop-by-hop and routing headers */
|
||||||
|
*uip_next_hdr = UIP_EXT_BUF->next;
|
||||||
|
rpl_ext_hdr_len = (UIP_EXT_BUF->len * 8) + 8;
|
||||||
temp_len = UIP_IP_BUF->len[1];
|
temp_len = UIP_IP_BUF->len[1];
|
||||||
uip_len -= UIP_HBHO_BUF->len + 8;
|
uip_len -= rpl_ext_hdr_len;
|
||||||
UIP_IP_BUF->len[1] -= UIP_HBHO_BUF->len + 8;
|
UIP_IP_BUF->len[1] -= rpl_ext_hdr_len;
|
||||||
if(UIP_IP_BUF->len[1] > temp_len) {
|
if(UIP_IP_BUF->len[1] > temp_len) {
|
||||||
UIP_IP_BUF->len[0]--;
|
UIP_IP_BUF->len[0]--;
|
||||||
}
|
}
|
||||||
memmove(UIP_EXT_BUF, UIP_HBHO_NEXT_BUF, uip_len - UIP_IPH_LEN);
|
PRINTF("RPL: Removing RPL extension header (type %u, len %u)\n", *uip_next_hdr, rpl_ext_hdr_len);
|
||||||
|
memmove(UIP_EXT_BUF, ((uint8_t *)UIP_EXT_BUF) + rpl_ext_hdr_len, uip_len - UIP_IPH_LEN);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
PRINTF("RPL: No hop-by-hop Option found\n");
|
/* Move to next header */
|
||||||
|
if(uip_next_hdr != &UIP_IP_BUF->proto) {
|
||||||
|
uip_ext_len += (UIP_EXT_BUF->len << 3) + 8;
|
||||||
}
|
}
|
||||||
}
|
uip_next_hdr = &UIP_EXT_BUF->next;
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
uint8_t
|
|
||||||
rpl_invert_header(void)
|
|
||||||
{
|
|
||||||
uint8_t uip_ext_opt_offset;
|
|
||||||
uint8_t last_uip_ext_len;
|
|
||||||
|
|
||||||
last_uip_ext_len = uip_ext_len;
|
|
||||||
uip_ext_len = 0;
|
|
||||||
uip_ext_opt_offset = 2;
|
|
||||||
|
|
||||||
PRINTF("RPL: Verifying the presence of the RPL header option\n");
|
|
||||||
switch(UIP_IP_BUF->proto) {
|
|
||||||
case UIP_PROTO_HBHO:
|
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
PRINTF("RPL: No hop-by-hop Option found\n");
|
|
||||||
uip_ext_len = last_uip_ext_len;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (UIP_EXT_HDR_OPT_BUF->type) {
|
|
||||||
case UIP_EXT_HDR_OPT_RPL:
|
|
||||||
PRINTF("RPL: Updating RPL option (switching direction)\n");
|
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->flags &= RPL_HDR_OPT_DOWN;
|
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->flags ^= RPL_HDR_OPT_DOWN;
|
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(rpl_get_instance(UIP_EXT_HDR_OPT_RPL_BUF->instance)->current_dag->rank);
|
|
||||||
uip_ext_len = last_uip_ext_len;
|
|
||||||
return RPL_HOP_BY_HOP_LEN;
|
|
||||||
default:
|
|
||||||
PRINTF("RPL: Multi Hop-by-hop options not implemented\n");
|
|
||||||
uip_ext_len = last_uip_ext_len;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
rpl_insert_header(void)
|
rpl_insert_header(void)
|
||||||
{
|
{
|
||||||
#if RPL_INSERT_HBH_OPTION
|
if(default_instance == NULL || default_instance->current_dag == NULL
|
||||||
if(default_instance != NULL && !uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {
|
|| uip_is_addr_linklocal(&UIP_IP_BUF->destipaddr) || uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {
|
||||||
rpl_update_header_empty();
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(RPL_IS_STORING(default_instance)) {
|
||||||
|
insert_hbh_header();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(RPL_IS_NON_STORING(default_instance)) {
|
||||||
|
if(default_instance->current_dag != NULL) {
|
||||||
|
if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) {
|
||||||
|
insert_srh_header();
|
||||||
|
} else {
|
||||||
|
insert_hbh_header();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
rpl_update_header(void)
|
||||||
|
{
|
||||||
|
if(default_instance == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(default_instance->current_dag != NULL) {
|
||||||
|
if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) {
|
||||||
|
/* At the root, remove headers if any, and insert SRH or HBH
|
||||||
|
* (SRH is inserted only if the destination is in the DODAG) */
|
||||||
|
rpl_remove_header();
|
||||||
|
if(RPL_IS_NON_STORING(default_instance)) {
|
||||||
|
return insert_srh_header();
|
||||||
|
} else {
|
||||||
|
return insert_hbh_header();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return update_hbh_header();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include "net/ipv6/uip-nd6.h"
|
#include "net/ipv6/uip-nd6.h"
|
||||||
#include "net/ipv6/uip-icmp6.h"
|
#include "net/ipv6/uip-icmp6.h"
|
||||||
#include "net/rpl/rpl-private.h"
|
#include "net/rpl/rpl-private.h"
|
||||||
|
#include "net/rpl/rpl-ns.h"
|
||||||
#include "net/packetbuf.h"
|
#include "net/packetbuf.h"
|
||||||
#include "net/ipv6/multicast/uip-mcast6.h"
|
#include "net/ipv6/multicast/uip-mcast6.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
|
@ -119,6 +120,7 @@ find_route_entry_by_dao_ack(uint8_t seq)
|
||||||
}
|
}
|
||||||
#endif /* RPL_WITH_DAO_ACK */
|
#endif /* RPL_WITH_DAO_ACK */
|
||||||
|
|
||||||
|
#if RPL_WITH_STORING
|
||||||
/* prepare for forwarding of DAO */
|
/* prepare for forwarding of DAO */
|
||||||
static uint8_t
|
static uint8_t
|
||||||
prepare_for_dao_fwd(uint8_t sequence, uip_ds6_route_t *rep)
|
prepare_for_dao_fwd(uint8_t sequence, uip_ds6_route_t *rep)
|
||||||
|
@ -132,6 +134,7 @@ prepare_for_dao_fwd(uint8_t sequence, uip_ds6_route_t *rep)
|
||||||
RPL_ROUTE_SET_DAO_PENDING(rep);
|
RPL_ROUTE_SET_DAO_PENDING(rep);
|
||||||
return dao_sequence;
|
return dao_sequence;
|
||||||
}
|
}
|
||||||
|
#endif /* RPL_WITH_STORING */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
get_global_addr(uip_ipaddr_t *addr)
|
get_global_addr(uip_ipaddr_t *addr)
|
||||||
|
@ -476,6 +479,7 @@ dio_output(rpl_instance_t *instance, uip_ipaddr_t *uc_addr)
|
||||||
{
|
{
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
int pos;
|
int pos;
|
||||||
|
int is_root;
|
||||||
rpl_dag_t *dag = instance->current_dag;
|
rpl_dag_t *dag = instance->current_dag;
|
||||||
#if !RPL_LEAF_ONLY
|
#if !RPL_LEAF_ONLY
|
||||||
uip_ipaddr_t addr;
|
uip_ipaddr_t addr;
|
||||||
|
@ -496,6 +500,7 @@ dio_output(rpl_instance_t *instance, uip_ipaddr_t *uc_addr)
|
||||||
buffer = UIP_ICMP_PAYLOAD;
|
buffer = UIP_ICMP_PAYLOAD;
|
||||||
buffer[pos++] = instance->instance_id;
|
buffer[pos++] = instance->instance_id;
|
||||||
buffer[pos++] = dag->version;
|
buffer[pos++] = dag->version;
|
||||||
|
is_root = (dag->rank == ROOT_RANK(instance));
|
||||||
|
|
||||||
#if RPL_LEAF_ONLY
|
#if RPL_LEAF_ONLY
|
||||||
PRINTF("RPL: LEAF ONLY DIO rank set to INFINITE_RANK\n");
|
PRINTF("RPL: LEAF ONLY DIO rank set to INFINITE_RANK\n");
|
||||||
|
@ -516,7 +521,7 @@ dio_output(rpl_instance_t *instance, uip_ipaddr_t *uc_addr)
|
||||||
|
|
||||||
buffer[pos++] = instance->dtsn_out;
|
buffer[pos++] = instance->dtsn_out;
|
||||||
|
|
||||||
if(RPL_DIO_REFRESH_DAO_ROUTES && uc_addr == NULL) {
|
if(RPL_DIO_REFRESH_DAO_ROUTES && is_root && uc_addr == NULL) {
|
||||||
/* Request new DAO to refresh route. We do not do this for unicast DIO
|
/* Request new DAO to refresh route. We do not do this for unicast DIO
|
||||||
* in order to avoid DAO messages after a DIS-DIO update,
|
* in order to avoid DAO messages after a DIS-DIO update,
|
||||||
* or upon unicast DIO probing. */
|
* or upon unicast DIO probing. */
|
||||||
|
@ -626,8 +631,9 @@ dio_output(rpl_instance_t *instance, uip_ipaddr_t *uc_addr)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
dao_input(void)
|
dao_input_storing(void)
|
||||||
{
|
{
|
||||||
|
#if RPL_WITH_STORING
|
||||||
uip_ipaddr_t dao_sender_addr;
|
uip_ipaddr_t dao_sender_addr;
|
||||||
rpl_dag_t *dag;
|
rpl_dag_t *dag;
|
||||||
rpl_instance_t *instance;
|
rpl_instance_t *instance;
|
||||||
|
@ -665,11 +671,6 @@ dao_input(void)
|
||||||
instance_id = buffer[pos++];
|
instance_id = buffer[pos++];
|
||||||
|
|
||||||
instance = rpl_get_instance(instance_id);
|
instance = rpl_get_instance(instance_id);
|
||||||
if(instance == NULL) {
|
|
||||||
PRINTF("RPL: Ignoring a DAO for an unknown RPL instance(%u)\n",
|
|
||||||
instance_id);
|
|
||||||
goto discard;
|
|
||||||
}
|
|
||||||
|
|
||||||
lifetime = instance->default_lifetime;
|
lifetime = instance->default_lifetime;
|
||||||
|
|
||||||
|
@ -685,7 +686,7 @@ dao_input(void)
|
||||||
if(flags & RPL_DAO_D_FLAG) {
|
if(flags & RPL_DAO_D_FLAG) {
|
||||||
if(memcmp(&dag->dag_id, &buffer[pos], sizeof(dag->dag_id))) {
|
if(memcmp(&dag->dag_id, &buffer[pos], sizeof(dag->dag_id))) {
|
||||||
PRINTF("RPL: Ignoring a DAO for a DAG different from ours\n");
|
PRINTF("RPL: Ignoring a DAO for a DAG different from ours\n");
|
||||||
goto discard;
|
return;
|
||||||
}
|
}
|
||||||
pos += 16;
|
pos += 16;
|
||||||
}
|
}
|
||||||
|
@ -710,7 +711,7 @@ dao_input(void)
|
||||||
DAG_RANK(parent->rank, instance), DAG_RANK(dag->rank, instance));
|
DAG_RANK(parent->rank, instance), DAG_RANK(dag->rank, instance));
|
||||||
parent->rank = INFINITE_RANK;
|
parent->rank = INFINITE_RANK;
|
||||||
parent->flags |= RPL_PARENT_FLAG_UPDATED;
|
parent->flags |= RPL_PARENT_FLAG_UPDATED;
|
||||||
goto discard;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we get the DAO from our parent, we also have a loop. */
|
/* If we get the DAO from our parent, we also have a loop. */
|
||||||
|
@ -718,7 +719,7 @@ dao_input(void)
|
||||||
PRINTF("RPL: Loop detected when receiving a unicast DAO from our parent\n");
|
PRINTF("RPL: Loop detected when receiving a unicast DAO from our parent\n");
|
||||||
parent->rank = INFINITE_RANK;
|
parent->rank = INFINITE_RANK;
|
||||||
parent->flags |= RPL_PARENT_FLAG_UPDATED;
|
parent->flags |= RPL_PARENT_FLAG_UPDATED;
|
||||||
goto discard;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -802,10 +803,11 @@ dao_input(void)
|
||||||
/* independent if we remove or not - ACK the request */
|
/* independent if we remove or not - ACK the request */
|
||||||
if(flags & RPL_DAO_K_FLAG) {
|
if(flags & RPL_DAO_K_FLAG) {
|
||||||
/* indicate that we accepted the no-path DAO */
|
/* indicate that we accepted the no-path DAO */
|
||||||
|
uip_clear_buf();
|
||||||
dao_ack_output(instance, &dao_sender_addr, sequence,
|
dao_ack_output(instance, &dao_sender_addr, sequence,
|
||||||
RPL_DAO_ACK_UNCONDITIONAL_ACCEPT);
|
RPL_DAO_ACK_UNCONDITIONAL_ACCEPT);
|
||||||
}
|
}
|
||||||
goto discard;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRINTF("RPL: Adding DAO route\n");
|
PRINTF("RPL: Adding DAO route\n");
|
||||||
|
@ -823,7 +825,7 @@ dao_input(void)
|
||||||
is_root ? RPL_DAO_ACK_UNABLE_TO_ADD_ROUTE_AT_ROOT :
|
is_root ? RPL_DAO_ACK_UNABLE_TO_ADD_ROUTE_AT_ROOT :
|
||||||
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
||||||
}
|
}
|
||||||
goto discard;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rep = rpl_add_route(dag, &prefix, prefixlen, &dao_sender_addr);
|
rep = rpl_add_route(dag, &prefix, prefixlen, &dao_sender_addr);
|
||||||
|
@ -836,7 +838,7 @@ dao_input(void)
|
||||||
is_root ? RPL_DAO_ACK_UNABLE_TO_ADD_ROUTE_AT_ROOT :
|
is_root ? RPL_DAO_ACK_UNABLE_TO_ADD_ROUTE_AT_ROOT :
|
||||||
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
||||||
}
|
}
|
||||||
goto discard;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set lifetime and clear NOPATH bit */
|
/* set lifetime and clear NOPATH bit */
|
||||||
|
@ -885,13 +887,144 @@ fwd_dao:
|
||||||
uip_icmp6_send(rpl_get_parent_ipaddr(dag->preferred_parent),
|
uip_icmp6_send(rpl_get_parent_ipaddr(dag->preferred_parent),
|
||||||
ICMP6_RPL, RPL_CODE_DAO, buffer_length);
|
ICMP6_RPL, RPL_CODE_DAO, buffer_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(should_ack) {
|
if(should_ack) {
|
||||||
PRINTF("RPL: Sending DAO ACK\n");
|
PRINTF("RPL: Sending DAO ACK\n");
|
||||||
|
uip_clear_buf();
|
||||||
dao_ack_output(instance, &dao_sender_addr, sequence,
|
dao_ack_output(instance, &dao_sender_addr, sequence,
|
||||||
RPL_DAO_ACK_UNCONDITIONAL_ACCEPT);
|
RPL_DAO_ACK_UNCONDITIONAL_ACCEPT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* RPL_WITH_STORING */
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
dao_input_nonstoring(void)
|
||||||
|
{
|
||||||
|
#if RPL_WITH_NON_STORING
|
||||||
|
uip_ipaddr_t dao_sender_addr;
|
||||||
|
uip_ipaddr_t dao_parent_addr;
|
||||||
|
rpl_dag_t *dag;
|
||||||
|
rpl_instance_t *instance;
|
||||||
|
unsigned char *buffer;
|
||||||
|
uint16_t sequence;
|
||||||
|
uint8_t instance_id;
|
||||||
|
uint8_t lifetime;
|
||||||
|
uint8_t prefixlen;
|
||||||
|
uint8_t flags;
|
||||||
|
uint8_t subopt_type;
|
||||||
|
uip_ipaddr_t prefix;
|
||||||
|
uint8_t buffer_length;
|
||||||
|
int pos;
|
||||||
|
int len;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
prefixlen = 0;
|
||||||
|
|
||||||
|
uip_ipaddr_copy(&dao_sender_addr, &UIP_IP_BUF->srcipaddr);
|
||||||
|
memset(&dao_parent_addr, 0, 16);
|
||||||
|
|
||||||
|
buffer = UIP_ICMP_PAYLOAD;
|
||||||
|
buffer_length = uip_len - uip_l3_icmp_hdr_len;
|
||||||
|
|
||||||
|
pos = 0;
|
||||||
|
instance_id = buffer[pos++];
|
||||||
|
instance = rpl_get_instance(instance_id);
|
||||||
|
lifetime = instance->default_lifetime;
|
||||||
|
|
||||||
|
flags = buffer[pos++];
|
||||||
|
/* reserved */
|
||||||
|
pos++;
|
||||||
|
sequence = buffer[pos++];
|
||||||
|
|
||||||
|
dag = instance->current_dag;
|
||||||
|
/* Is the DAG ID present? */
|
||||||
|
if(flags & RPL_DAO_D_FLAG) {
|
||||||
|
if(memcmp(&dag->dag_id, &buffer[pos], sizeof(dag->dag_id))) {
|
||||||
|
PRINTF("RPL: Ignoring a DAO for a DAG different from ours\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pos += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if there are any RPL options present. */
|
||||||
|
for(i = pos; i < buffer_length; i += len) {
|
||||||
|
subopt_type = buffer[i];
|
||||||
|
if(subopt_type == RPL_OPTION_PAD1) {
|
||||||
|
len = 1;
|
||||||
|
} else {
|
||||||
|
/* The option consists of a two-byte header and a payload. */
|
||||||
|
len = 2 + buffer[i + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(subopt_type) {
|
||||||
|
case RPL_OPTION_TARGET:
|
||||||
|
/* Handle the target option. */
|
||||||
|
prefixlen = buffer[i + 3];
|
||||||
|
memset(&prefix, 0, sizeof(prefix));
|
||||||
|
memcpy(&prefix, buffer + i + 4, (prefixlen + 7) / CHAR_BIT);
|
||||||
|
break;
|
||||||
|
case RPL_OPTION_TRANSIT:
|
||||||
|
/* The path sequence and control are ignored. */
|
||||||
|
/* pathcontrol = buffer[i + 3];
|
||||||
|
pathsequence = buffer[i + 4];*/
|
||||||
|
lifetime = buffer[i + 5];
|
||||||
|
if(len >= 20) {
|
||||||
|
memcpy(&dao_parent_addr, buffer + i + 6, 16);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINTF("RPL: DAO lifetime: %u, prefix length: %u prefix: ",
|
||||||
|
(unsigned)lifetime, (unsigned)prefixlen);
|
||||||
|
PRINT6ADDR(&prefix);
|
||||||
|
PRINTF(", parent: ");
|
||||||
|
PRINT6ADDR(&dao_parent_addr);
|
||||||
|
PRINTF(" \n");
|
||||||
|
|
||||||
|
if(lifetime == RPL_ZERO_LIFETIME) {
|
||||||
|
PRINTF("RPL: No-Path DAO received\n");
|
||||||
|
rpl_ns_expire_parent(dag, &prefix, &dao_parent_addr);
|
||||||
|
} else {
|
||||||
|
if(rpl_ns_update_node(dag, &prefix, &dao_parent_addr, RPL_LIFETIME(instance, lifetime)) == NULL) {
|
||||||
|
PRINTF("RPL: failed to add link\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(flags & RPL_DAO_K_FLAG) {
|
||||||
|
PRINTF("RPL: Sending DAO ACK\n");
|
||||||
|
uip_clear_buf();
|
||||||
|
dao_ack_output(instance, &dao_sender_addr, sequence,
|
||||||
|
RPL_DAO_ACK_UNCONDITIONAL_ACCEPT);
|
||||||
|
}
|
||||||
|
#endif /* RPL_WITH_NON_STORING */
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
dao_input(void)
|
||||||
|
{
|
||||||
|
rpl_instance_t *instance;
|
||||||
|
uint8_t instance_id;
|
||||||
|
|
||||||
|
/* Destination Advertisement Object */
|
||||||
|
PRINTF("RPL: Received a DAO from ");
|
||||||
|
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
|
||||||
|
PRINTF("\n");
|
||||||
|
|
||||||
|
instance_id = UIP_ICMP_PAYLOAD[0];
|
||||||
|
instance = rpl_get_instance(instance_id);
|
||||||
|
if(instance == NULL) {
|
||||||
|
PRINTF("RPL: Ignoring a DAO for an unknown RPL instance(%u)\n",
|
||||||
|
instance_id);
|
||||||
|
goto discard;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(RPL_IS_STORING(instance)) {
|
||||||
|
dao_input_storing();
|
||||||
|
} else if(RPL_IS_NON_STORING(instance)) {
|
||||||
|
dao_input_nonstoring();
|
||||||
|
}
|
||||||
|
|
||||||
discard:
|
discard:
|
||||||
uip_clear_buf();
|
uip_clear_buf();
|
||||||
|
@ -924,7 +1057,7 @@ handle_dao_retransmission(void *ptr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(instance->of->dao_ack_callback) {
|
if(RPL_IS_STORING(instance) && instance->of->dao_ack_callback) {
|
||||||
/* Inform the objective function about the timeout. */
|
/* Inform the objective function about the timeout. */
|
||||||
instance->of->dao_ack_callback(parent, RPL_DAO_ACK_TIMEOUT);
|
instance->of->dao_ack_callback(parent, RPL_DAO_ACK_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
@ -1006,6 +1139,8 @@ dao_output_target_seq(rpl_parent_t *parent, uip_ipaddr_t *prefix,
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
uint8_t prefixlen;
|
uint8_t prefixlen;
|
||||||
int pos;
|
int pos;
|
||||||
|
uip_ipaddr_t *parent_ipaddr = NULL;
|
||||||
|
uip_ipaddr_t *dest_ipaddr = NULL;
|
||||||
|
|
||||||
/* Destination Advertisement Object */
|
/* Destination Advertisement Object */
|
||||||
|
|
||||||
|
@ -1019,6 +1154,12 @@ dao_output_target_seq(rpl_parent_t *parent, uip_ipaddr_t *prefix,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parent_ipaddr = rpl_get_parent_ipaddr(parent);
|
||||||
|
if(parent_ipaddr == NULL) {
|
||||||
|
PRINTF("RPL dao_output_target error parent IP address NULL\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
dag = parent->dag;
|
dag = parent->dag;
|
||||||
if(dag == NULL) {
|
if(dag == NULL) {
|
||||||
PRINTF("RPL dao_output_target error dag NULL\n");
|
PRINTF("RPL dao_output_target error dag NULL\n");
|
||||||
|
@ -1071,21 +1212,37 @@ dao_output_target_seq(rpl_parent_t *parent, uip_ipaddr_t *prefix,
|
||||||
|
|
||||||
/* Create a transit information sub-option. */
|
/* Create a transit information sub-option. */
|
||||||
buffer[pos++] = RPL_OPTION_TRANSIT;
|
buffer[pos++] = RPL_OPTION_TRANSIT;
|
||||||
buffer[pos++] = 4;
|
buffer[pos++] = (instance->mop != RPL_MOP_NON_STORING) ? 4 : 20;
|
||||||
buffer[pos++] = 0; /* flags - ignored */
|
buffer[pos++] = 0; /* flags - ignored */
|
||||||
buffer[pos++] = 0; /* path control - ignored */
|
buffer[pos++] = 0; /* path control - ignored */
|
||||||
buffer[pos++] = 0; /* path seq - ignored */
|
buffer[pos++] = 0; /* path seq - ignored */
|
||||||
buffer[pos++] = lifetime;
|
buffer[pos++] = lifetime;
|
||||||
|
|
||||||
|
if(instance->mop != RPL_MOP_NON_STORING) {
|
||||||
|
/* Send DAO to parent */
|
||||||
|
dest_ipaddr = parent_ipaddr;
|
||||||
|
} else {
|
||||||
|
/* Include parent global IP address */
|
||||||
|
memcpy(buffer + pos, &parent->dag->dag_id, 8); /* Prefix */
|
||||||
|
pos += 8;
|
||||||
|
memcpy(buffer + pos, ((const unsigned char *)parent_ipaddr) + 8, 8); /* Interface identifier */
|
||||||
|
pos += 8;
|
||||||
|
/* Send DAO to root */
|
||||||
|
dest_ipaddr = &parent->dag->dag_id;
|
||||||
|
}
|
||||||
|
|
||||||
PRINTF("RPL: Sending a %sDAO with sequence number %u, lifetime %u, prefix ",
|
PRINTF("RPL: Sending a %sDAO with sequence number %u, lifetime %u, prefix ",
|
||||||
lifetime == RPL_ZERO_LIFETIME ? "No-Path " : "", seq_no, lifetime);
|
lifetime == RPL_ZERO_LIFETIME ? "No-Path " : "", seq_no, lifetime);
|
||||||
|
|
||||||
PRINT6ADDR(prefix);
|
PRINT6ADDR(prefix);
|
||||||
PRINTF(" to ");
|
PRINTF(" to ");
|
||||||
PRINT6ADDR(rpl_get_parent_ipaddr(parent));
|
PRINT6ADDR(dest_ipaddr);
|
||||||
|
PRINTF(" , parent ");
|
||||||
|
PRINT6ADDR(parent_ipaddr);
|
||||||
PRINTF("\n");
|
PRINTF("\n");
|
||||||
|
|
||||||
if(rpl_get_parent_ipaddr(parent) != NULL) {
|
if(dest_ipaddr != NULL) {
|
||||||
uip_icmp6_send(rpl_get_parent_ipaddr(parent), ICMP6_RPL, RPL_CODE_DAO, pos);
|
uip_icmp6_send(dest_ipaddr, ICMP6_RPL, RPL_CODE_DAO, pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -1113,12 +1270,16 @@ dao_ack_input(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(RPL_IS_STORING(instance)) {
|
||||||
parent = rpl_find_parent(instance->current_dag, &UIP_IP_BUF->srcipaddr);
|
parent = rpl_find_parent(instance->current_dag, &UIP_IP_BUF->srcipaddr);
|
||||||
if(parent == NULL) {
|
if(parent == NULL) {
|
||||||
/* not a known instance - drop the packet and ignore */
|
/* not a known instance - drop the packet and ignore */
|
||||||
uip_clear_buf();
|
uip_clear_buf();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
parent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
PRINTF("RPL: Received a DAO %s with sequence number %d (%d) and status %d from ",
|
PRINTF("RPL: Received a DAO %s with sequence number %d (%d) and status %d from ",
|
||||||
status < 128 ? "ACK" : "NACK",
|
status < 128 ? "ACK" : "NACK",
|
||||||
|
@ -1133,7 +1294,7 @@ dao_ack_input(void)
|
||||||
ctimer_stop(&instance->dao_retransmit_timer);
|
ctimer_stop(&instance->dao_retransmit_timer);
|
||||||
|
|
||||||
/* Inform objective function on status of the DAO ACK */
|
/* Inform objective function on status of the DAO ACK */
|
||||||
if(instance->of->dao_ack_callback) {
|
if(RPL_IS_STORING(instance) && instance->of->dao_ack_callback) {
|
||||||
instance->of->dao_ack_callback(parent, status);
|
instance->of->dao_ack_callback(parent, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1147,7 +1308,7 @@ dao_ack_input(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} else {
|
} else if(RPL_IS_STORING(instance)) {
|
||||||
/* this DAO ACK should be forwarded to another recently registered route */
|
/* this DAO ACK should be forwarded to another recently registered route */
|
||||||
uip_ds6_route_t *re;
|
uip_ds6_route_t *re;
|
||||||
uip_ipaddr_t *nexthop;
|
uip_ipaddr_t *nexthop;
|
||||||
|
|
230
core/net/rpl/rpl-ns.c
Normal file
230
core/net/rpl/rpl-ns.c
Normal file
|
@ -0,0 +1,230 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Inria.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* RPL non-storing mode specific functions. Includes support for
|
||||||
|
* source routing.
|
||||||
|
*
|
||||||
|
* \author Simon Duquennoy <simon.duquennoy@inria.fr>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "net/rpl/rpl-conf.h"
|
||||||
|
|
||||||
|
#include "net/ip/uip.h"
|
||||||
|
#include "net/ip/tcpip.h"
|
||||||
|
#include "net/ipv6/uip-ds6.h"
|
||||||
|
#include "net/ipv6/uip-icmp6.h"
|
||||||
|
#include "net/rpl/rpl-private.h"
|
||||||
|
#include "net/rpl/rpl-ns.h"
|
||||||
|
#include "lib/list.h"
|
||||||
|
#include "lib/memb.h"
|
||||||
|
|
||||||
|
#if RPL_WITH_NON_STORING
|
||||||
|
|
||||||
|
#define DEBUG DEBUG_NONE
|
||||||
|
#include "net/ip/uip-debug.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Total number of nodes */
|
||||||
|
static int num_nodes;
|
||||||
|
|
||||||
|
/* Every known node in the network */
|
||||||
|
LIST(nodelist);
|
||||||
|
MEMB(nodememb, rpl_ns_node_t, RPL_NS_LINK_NUM);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
rpl_ns_num_nodes(void)
|
||||||
|
{
|
||||||
|
return num_nodes;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
node_matches_address(const rpl_dag_t *dag, const rpl_ns_node_t *node, const uip_ipaddr_t *addr)
|
||||||
|
{
|
||||||
|
return addr != NULL
|
||||||
|
&& node != NULL
|
||||||
|
&& dag != NULL
|
||||||
|
&& dag == node->dag
|
||||||
|
&& !memcmp(addr, &node->dag->dag_id, 8)
|
||||||
|
&& !memcmp(((const unsigned char *)addr) + 8, node->link_identifier, 8);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
rpl_ns_node_t *
|
||||||
|
rpl_ns_get_node(const rpl_dag_t *dag, const uip_ipaddr_t *addr)
|
||||||
|
{
|
||||||
|
rpl_ns_node_t *l;
|
||||||
|
for(l = list_head(nodelist); l != NULL; l = list_item_next(l)) {
|
||||||
|
/* Compare prefix and node identifier */
|
||||||
|
if(node_matches_address(dag, l, addr)) {
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
rpl_ns_is_node_reachable(const rpl_dag_t *dag, const uip_ipaddr_t *addr)
|
||||||
|
{
|
||||||
|
int max_depth = RPL_NS_LINK_NUM;
|
||||||
|
rpl_ns_node_t *node = rpl_ns_get_node(dag, addr);
|
||||||
|
rpl_ns_node_t *root_node = rpl_ns_get_node(dag, dag != NULL ? &dag->dag_id : NULL);
|
||||||
|
while(node != NULL && node != root_node && max_depth > 0) {
|
||||||
|
node = node->parent;
|
||||||
|
max_depth--;
|
||||||
|
}
|
||||||
|
return node != NULL && node == root_node;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
rpl_ns_expire_parent(rpl_dag_t *dag, const uip_ipaddr_t *child, const uip_ipaddr_t *parent)
|
||||||
|
{
|
||||||
|
rpl_ns_node_t *l = rpl_ns_get_node(dag, child);
|
||||||
|
/* Check if parent matches */
|
||||||
|
if(l != NULL && node_matches_address(dag, l->parent, parent)) {
|
||||||
|
l->lifetime = RPL_NOPATH_REMOVAL_DELAY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
rpl_ns_node_t *
|
||||||
|
rpl_ns_update_node(rpl_dag_t *dag, const uip_ipaddr_t *child, const uip_ipaddr_t *parent, uint32_t lifetime)
|
||||||
|
{
|
||||||
|
rpl_ns_node_t *child_node = rpl_ns_get_node(dag, child);
|
||||||
|
rpl_ns_node_t *parent_node = rpl_ns_get_node(dag, parent);
|
||||||
|
rpl_ns_node_t *old_parent_node;
|
||||||
|
|
||||||
|
if(parent != NULL) {
|
||||||
|
/* No node for the parent, add one with infinite lifetime */
|
||||||
|
if(parent_node == NULL) {
|
||||||
|
parent_node = rpl_ns_update_node(dag, parent, NULL, 0xffffffff);
|
||||||
|
if(parent_node == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No node for this child, add one */
|
||||||
|
if(child_node == NULL) {
|
||||||
|
child_node = memb_alloc(&nodememb);
|
||||||
|
/* No space left, abort */
|
||||||
|
if(child_node == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
child_node->parent = NULL;
|
||||||
|
list_add(nodelist, child_node);
|
||||||
|
num_nodes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize node */
|
||||||
|
child_node->dag = dag;
|
||||||
|
child_node->lifetime = lifetime;
|
||||||
|
memcpy(child_node->link_identifier, ((const unsigned char *)child) + 8, 8);
|
||||||
|
|
||||||
|
/* Is the node reachable before the update? */
|
||||||
|
if(rpl_ns_is_node_reachable(dag, child)) {
|
||||||
|
old_parent_node = child_node->parent;
|
||||||
|
/* Update node */
|
||||||
|
child_node->parent = parent_node;
|
||||||
|
/* Has the node become unreachable? May happen if we create a loop. */
|
||||||
|
if(!rpl_ns_is_node_reachable(dag, child)) {
|
||||||
|
/* The new parent makes the node unreachable, restore old parent.
|
||||||
|
* We will take the update next time, with chances we know more of
|
||||||
|
* the topology and the loop is gone. */
|
||||||
|
child_node->parent = old_parent_node;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
child_node->parent = parent_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
return child_node;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
rpl_ns_init(void)
|
||||||
|
{
|
||||||
|
num_nodes = 0;
|
||||||
|
memb_init(&nodememb);
|
||||||
|
list_init(nodelist);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
rpl_ns_node_t *
|
||||||
|
rpl_ns_node_head(void)
|
||||||
|
{
|
||||||
|
return list_head(nodelist);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
rpl_ns_node_t *
|
||||||
|
rpl_ns_node_next(rpl_ns_node_t *item)
|
||||||
|
{
|
||||||
|
return list_item_next(item);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
rpl_ns_get_node_global_addr(uip_ipaddr_t *addr, rpl_ns_node_t *node)
|
||||||
|
{
|
||||||
|
if(addr != NULL && node != NULL && node->dag != NULL) {
|
||||||
|
memcpy(addr, &node->dag->dag_id, 8);
|
||||||
|
memcpy(((unsigned char *)addr) + 8, &node->link_identifier, 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
rpl_ns_periodic(void)
|
||||||
|
{
|
||||||
|
rpl_ns_node_t *l;
|
||||||
|
/* First pass, decrement lifetime for all nodes with non-infinite lifetime */
|
||||||
|
for(l = list_head(nodelist); l != NULL; l = list_item_next(l)) {
|
||||||
|
/* Don't touch infinite lifetime nodes */
|
||||||
|
if(l->lifetime != 0xffffffff && l->lifetime > 0) {
|
||||||
|
l->lifetime--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Second pass, for all expire nodes, deallocate them iff no child points to them */
|
||||||
|
for(l = list_head(nodelist); l != NULL; l = list_item_next(l)) {
|
||||||
|
if(l->lifetime == 0) {
|
||||||
|
rpl_ns_node_t *l2;
|
||||||
|
for(l2 = list_head(nodelist); l2 != NULL; l2 = list_item_next(l2)) {
|
||||||
|
if(l2->parent == l) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* No child found, deallocate node */
|
||||||
|
list_remove(nodelist, l);
|
||||||
|
memb_free(&nodememb, l);
|
||||||
|
num_nodes--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* RPL_WITH_NON_STORING */
|
72
core/net/rpl/rpl-ns.h
Normal file
72
core/net/rpl/rpl-ns.h
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Inria.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* RPL non-storing mode specific functions. Includes support for
|
||||||
|
* source routing.
|
||||||
|
*
|
||||||
|
* \author Simon Duquennoy <simon.duquennoy@inria.fr>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RPL_NS_H
|
||||||
|
#define RPL_NS_H
|
||||||
|
|
||||||
|
#include "rpl-conf.h"
|
||||||
|
|
||||||
|
#ifdef RPL_NS_CONF_LINK_NUM
|
||||||
|
#define RPL_NS_LINK_NUM RPL_NS_CONF_LINK_NUM
|
||||||
|
#else /* RPL_NS_CONF_LINK_NUM */
|
||||||
|
#define RPL_NS_LINK_NUM 32
|
||||||
|
#endif /* RPL_NS_CONF_LINK_NUM */
|
||||||
|
|
||||||
|
typedef struct rpl_ns_node {
|
||||||
|
struct rpl_ns_node *next;
|
||||||
|
uint32_t lifetime;
|
||||||
|
rpl_dag_t *dag;
|
||||||
|
/* Store only IPv6 link identifiers as all nodes in the DAG share the same prefix */
|
||||||
|
unsigned char link_identifier[8];
|
||||||
|
struct rpl_ns_node *parent;
|
||||||
|
} rpl_ns_node_t;
|
||||||
|
|
||||||
|
int rpl_ns_num_nodes(void);
|
||||||
|
void rpl_ns_expire_parent(rpl_dag_t *dag, const uip_ipaddr_t *child, const uip_ipaddr_t *parent);
|
||||||
|
rpl_ns_node_t *rpl_ns_update_node(rpl_dag_t *dag, const uip_ipaddr_t *child, const uip_ipaddr_t *parent, uint32_t lifetime);
|
||||||
|
void rpl_ns_init(void);
|
||||||
|
rpl_ns_node_t *rpl_ns_node_head(void);
|
||||||
|
rpl_ns_node_t *rpl_ns_node_next(rpl_ns_node_t *item);
|
||||||
|
rpl_ns_node_t *rpl_ns_get_node(const rpl_dag_t *dag, const uip_ipaddr_t *addr);
|
||||||
|
int rpl_ns_is_node_reachable(const rpl_dag_t *dag, const uip_ipaddr_t *addr);
|
||||||
|
void rpl_ns_get_node_global_addr(uip_ipaddr_t *addr, rpl_ns_node_t *node);
|
||||||
|
void rpl_ns_periodic();
|
||||||
|
|
||||||
|
#endif /* RPL_NS_H */
|
|
@ -44,6 +44,8 @@
|
||||||
#include "sys/clock.h"
|
#include "sys/clock.h"
|
||||||
#include "sys/ctimer.h"
|
#include "sys/ctimer.h"
|
||||||
#include "net/ipv6/uip-ds6.h"
|
#include "net/ipv6/uip-ds6.h"
|
||||||
|
#include "net/ipv6/uip-ds6-route.h"
|
||||||
|
#include "net/rpl/rpl-ns.h"
|
||||||
#include "net/ipv6/multicast/uip-mcast6.h"
|
#include "net/ipv6/multicast/uip-mcast6.h"
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -102,6 +104,9 @@
|
||||||
/* RPL IPv6 extension header option. */
|
/* RPL IPv6 extension header option. */
|
||||||
#define RPL_HDR_OPT_LEN 4
|
#define RPL_HDR_OPT_LEN 4
|
||||||
#define RPL_HOP_BY_HOP_LEN (RPL_HDR_OPT_LEN + 2 + 2)
|
#define RPL_HOP_BY_HOP_LEN (RPL_HDR_OPT_LEN + 2 + 2)
|
||||||
|
#define RPL_RH_LEN 4
|
||||||
|
#define RPL_SRH_LEN 4
|
||||||
|
#define RPL_RH_TYPE_SRH 3
|
||||||
#define RPL_HDR_OPT_DOWN 0x80
|
#define RPL_HDR_OPT_DOWN 0x80
|
||||||
#define RPL_HDR_OPT_DOWN_SHIFT 7
|
#define RPL_HDR_OPT_DOWN_SHIFT 7
|
||||||
#define RPL_HDR_OPT_RANK_ERR 0x40
|
#define RPL_HDR_OPT_RANK_ERR 0x40
|
||||||
|
@ -194,6 +199,7 @@
|
||||||
#define RPL_MOP_STORING_NO_MULTICAST 2
|
#define RPL_MOP_STORING_NO_MULTICAST 2
|
||||||
#define RPL_MOP_STORING_MULTICAST 3
|
#define RPL_MOP_STORING_MULTICAST 3
|
||||||
|
|
||||||
|
/* RPL Mode of operation */
|
||||||
#ifdef RPL_CONF_MOP
|
#ifdef RPL_CONF_MOP
|
||||||
#define RPL_MOP_DEFAULT RPL_CONF_MOP
|
#define RPL_MOP_DEFAULT RPL_CONF_MOP
|
||||||
#else /* RPL_CONF_MOP */
|
#else /* RPL_CONF_MOP */
|
||||||
|
@ -204,6 +210,43 @@
|
||||||
#endif /* UIP_IPV6_MULTICAST_RPL */
|
#endif /* UIP_IPV6_MULTICAST_RPL */
|
||||||
#endif /* RPL_CONF_MOP */
|
#endif /* RPL_CONF_MOP */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Embed support for storing mode
|
||||||
|
*/
|
||||||
|
#ifdef RPL_CONF_WITH_STORING
|
||||||
|
#define RPL_WITH_STORING RPL_CONF_WITH_STORING
|
||||||
|
#else /* RPL_CONF_WITH_STORING */
|
||||||
|
/* By default: embed support for non-storing if and only if the configured MOP is not non-storing */
|
||||||
|
#define RPL_WITH_STORING (RPL_MOP_DEFAULT != RPL_MOP_NON_STORING)
|
||||||
|
#endif /* RPL_CONF_WITH_STORING */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Embed support for non-storing mode
|
||||||
|
*/
|
||||||
|
#ifdef RPL_CONF_WITH_NON_STORING
|
||||||
|
#define RPL_WITH_NON_STORING RPL_CONF_WITH_NON_STORING
|
||||||
|
#else /* RPL_CONF_WITH_NON_STORING */
|
||||||
|
/* By default: embed support for non-storing if and only if the configured MOP is non-storing */
|
||||||
|
#define RPL_WITH_NON_STORING (RPL_MOP_DEFAULT == RPL_MOP_NON_STORING)
|
||||||
|
#endif /* RPL_CONF_WITH_NON_STORING */
|
||||||
|
|
||||||
|
#if RPL_WITH_STORING && (UIP_DS6_ROUTE_NB == 0)
|
||||||
|
#error "RPL with storing mode included but #routes == 0. Set UIP_CONF_MAX_ROUTES accordingly."
|
||||||
|
#if !RPL_WITH_NON_STORING && (RPL_NS_LINK_NUM > 0)
|
||||||
|
#error "You might also want to set RPL_NS_CONF_LINK_NUM to 0."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if RPL_WITH_NON_STORING && (RPL_NS_LINK_NUM == 0)
|
||||||
|
#error "RPL with non-storing mode included but #links == 0. Set RPL_NS_CONF_LINK_NUM accordingly."
|
||||||
|
#if !RPL_WITH_STORING && (UIP_DS6_ROUTE_NB > 0)
|
||||||
|
#error "You might also want to set UIP_CONF_MAX_ROUTES to 0."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define RPL_IS_STORING(instance) (RPL_WITH_STORING && ((instance) != NULL) && ((instance)->mop > RPL_MOP_NON_STORING))
|
||||||
|
#define RPL_IS_NON_STORING(instance) (RPL_WITH_NON_STORING && ((instance) != NULL) && ((instance)->mop == RPL_MOP_NON_STORING))
|
||||||
|
|
||||||
/* Emit a pre-processor error if the user configured multicast with bad MOP */
|
/* Emit a pre-processor error if the user configured multicast with bad MOP */
|
||||||
#if RPL_CONF_MULTICAST && (RPL_MOP_DEFAULT != RPL_MOP_STORING_MULTICAST)
|
#if RPL_CONF_MULTICAST && (RPL_MOP_DEFAULT != RPL_MOP_STORING_MULTICAST)
|
||||||
#error "RPL Multicast requires RPL_MOP_DEFAULT==3. Check contiki-conf.h"
|
#error "RPL Multicast requires RPL_MOP_DEFAULT==3. Check contiki-conf.h"
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
|
|
||||||
#include "contiki-conf.h"
|
#include "contiki-conf.h"
|
||||||
#include "net/rpl/rpl-private.h"
|
#include "net/rpl/rpl-private.h"
|
||||||
|
#include "net/rpl/rpl-ns.h"
|
||||||
#include "net/link-stats.h"
|
#include "net/link-stats.h"
|
||||||
#include "net/ipv6/multicast/uip-mcast6.h"
|
#include "net/ipv6/multicast/uip-mcast6.h"
|
||||||
#include "lib/random.h"
|
#include "lib/random.h"
|
||||||
|
@ -80,14 +81,21 @@ static uint8_t dio_send_ok;
|
||||||
static void
|
static void
|
||||||
handle_periodic_timer(void *ptr)
|
handle_periodic_timer(void *ptr)
|
||||||
{
|
{
|
||||||
|
rpl_dag_t *dag = rpl_get_any_dag();
|
||||||
|
|
||||||
rpl_purge_dags();
|
rpl_purge_dags();
|
||||||
|
if(dag != NULL && RPL_IS_STORING(dag->instance)) {
|
||||||
rpl_purge_routes();
|
rpl_purge_routes();
|
||||||
|
}
|
||||||
|
if(dag != NULL && RPL_IS_NON_STORING(dag->instance)) {
|
||||||
|
rpl_ns_periodic();
|
||||||
|
}
|
||||||
rpl_recalculate_ranks();
|
rpl_recalculate_ranks();
|
||||||
|
|
||||||
/* handle DIS */
|
/* handle DIS */
|
||||||
#if RPL_DIS_SEND
|
#if RPL_DIS_SEND
|
||||||
next_dis++;
|
next_dis++;
|
||||||
if(rpl_get_any_dag() == NULL && next_dis >= RPL_DIS_INTERVAL) {
|
if(dag == NULL && next_dis >= RPL_DIS_INTERVAL) {
|
||||||
next_dis = 0;
|
next_dis = 0;
|
||||||
dis_output(NULL);
|
dis_output(NULL);
|
||||||
}
|
}
|
||||||
|
@ -459,7 +467,7 @@ handle_probing_timer(void *ptr)
|
||||||
const struct link_stats *stats = rpl_get_parent_link_stats(probing_target);
|
const struct link_stats *stats = rpl_get_parent_link_stats(probing_target);
|
||||||
(void)stats;
|
(void)stats;
|
||||||
PRINTF("RPL: probing %u %s last tx %u min ago\n",
|
PRINTF("RPL: probing %u %s last tx %u min ago\n",
|
||||||
rpl_get_parent_llpaddr(probing_target)->u8[7],
|
rpl_get_parent_lladdr(probing_target)->u8[7],
|
||||||
instance->urgent_probing_target != NULL ? "(urgent)" : "",
|
instance->urgent_probing_target != NULL ? "(urgent)" : "",
|
||||||
probing_target != NULL ?
|
probing_target != NULL ?
|
||||||
(unsigned)((clock_time() - stats->last_tx_time) / (60 * CLOCK_SECOND)) : 0
|
(unsigned)((clock_time() - stats->last_tx_time) / (60 * CLOCK_SECOND)) : 0
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include "net/ipv6/uip-ds6.h"
|
#include "net/ipv6/uip-ds6.h"
|
||||||
#include "net/ipv6/uip-icmp6.h"
|
#include "net/ipv6/uip-icmp6.h"
|
||||||
#include "net/rpl/rpl-private.h"
|
#include "net/rpl/rpl-private.h"
|
||||||
|
#include "net/rpl/rpl-ns.h"
|
||||||
#include "net/ipv6/multicast/uip-mcast6.h"
|
#include "net/ipv6/multicast/uip-mcast6.h"
|
||||||
|
|
||||||
#define DEBUG DEBUG_NONE
|
#define DEBUG DEBUG_NONE
|
||||||
|
@ -344,6 +345,10 @@ rpl_init(void)
|
||||||
#if RPL_CONF_STATS
|
#if RPL_CONF_STATS
|
||||||
memset(&rpl_stats, 0, sizeof(rpl_stats));
|
memset(&rpl_stats, 0, sizeof(rpl_stats));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if RPL_WITH_NON_STORING
|
||||||
|
rpl_ns_init();
|
||||||
|
#endif /* RPL_WITH_NON_STORING */
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
|
@ -271,14 +271,14 @@ rpl_dag_t *rpl_set_root(uint8_t instance_id, uip_ipaddr_t *dag_id);
|
||||||
int rpl_set_prefix(rpl_dag_t *dag, uip_ipaddr_t *prefix, unsigned len);
|
int rpl_set_prefix(rpl_dag_t *dag, uip_ipaddr_t *prefix, unsigned len);
|
||||||
int rpl_repair_root(uint8_t instance_id);
|
int rpl_repair_root(uint8_t instance_id);
|
||||||
int rpl_set_default_route(rpl_instance_t *instance, uip_ipaddr_t *from);
|
int rpl_set_default_route(rpl_instance_t *instance, uip_ipaddr_t *from);
|
||||||
|
rpl_dag_t *rpl_get_dag(const uip_ipaddr_t *addr);
|
||||||
rpl_dag_t *rpl_get_any_dag(void);
|
rpl_dag_t *rpl_get_any_dag(void);
|
||||||
rpl_instance_t *rpl_get_instance(uint8_t instance_id);
|
rpl_instance_t *rpl_get_instance(uint8_t instance_id);
|
||||||
int rpl_update_header_empty(void);
|
int rpl_update_header(void);
|
||||||
int rpl_update_header_final(uip_ipaddr_t *addr);
|
int rpl_finalize_header(uip_ipaddr_t *addr);
|
||||||
int rpl_verify_header(int);
|
int rpl_verify_hbh_header(int);
|
||||||
void rpl_insert_header(void);
|
void rpl_insert_header(void);
|
||||||
void rpl_remove_header(void);
|
void rpl_remove_header(void);
|
||||||
uint8_t rpl_invert_header(void);
|
|
||||||
const struct link_stats *rpl_get_parent_link_stats(rpl_parent_t *p);
|
const struct link_stats *rpl_get_parent_link_stats(rpl_parent_t *p);
|
||||||
int rpl_parent_is_fresh(rpl_parent_t *p);
|
int rpl_parent_is_fresh(rpl_parent_t *p);
|
||||||
int rpl_parent_is_reachable(rpl_parent_t *p);
|
int rpl_parent_is_reachable(rpl_parent_t *p);
|
||||||
|
@ -291,6 +291,8 @@ rpl_rank_t rpl_get_parent_rank(uip_lladdr_t *addr);
|
||||||
void rpl_dag_init(void);
|
void rpl_dag_init(void);
|
||||||
uip_ds6_nbr_t *rpl_get_nbr(rpl_parent_t *parent);
|
uip_ds6_nbr_t *rpl_get_nbr(rpl_parent_t *parent);
|
||||||
void rpl_print_neighbor_list(void);
|
void rpl_print_neighbor_list(void);
|
||||||
|
int rpl_process_srh_header(void);
|
||||||
|
int rpl_srh_get_next_hop(uip_ipaddr_t *ipaddr);
|
||||||
|
|
||||||
/* Per-parent RPL information */
|
/* Per-parent RPL information */
|
||||||
NBR_TABLE_DECLARE(rpl_parents);
|
NBR_TABLE_DECLARE(rpl_parents);
|
||||||
|
|
|
@ -21,6 +21,10 @@ PROJECT_SOURCEFILES += slip-bridge.c
|
||||||
#of the slip connection. Large MSS together with low baud rates without flow
|
#of the slip connection. Large MSS together with low baud rates without flow
|
||||||
#control will overrun the transmit buffer when the style sheet is requested.
|
#control will overrun the transmit buffer when the style sheet is requested.
|
||||||
|
|
||||||
|
ifeq ($(MAKE_WITH_NON_STORING),1)
|
||||||
|
CFLAGS += -DWITH_NON_STORING=1
|
||||||
|
endif
|
||||||
|
|
||||||
WITH_WEBSERVER=1
|
WITH_WEBSERVER=1
|
||||||
ifeq ($(WITH_WEBSERVER),1)
|
ifeq ($(WITH_WEBSERVER),1)
|
||||||
CFLAGS += -DUIP_CONF_TCP=1
|
CFLAGS += -DUIP_CONF_TCP=1
|
||||||
|
|
|
@ -31,6 +31,19 @@
|
||||||
#ifndef PROJECT_ROUTER_CONF_H_
|
#ifndef PROJECT_ROUTER_CONF_H_
|
||||||
#define PROJECT_ROUTER_CONF_H_
|
#define PROJECT_ROUTER_CONF_H_
|
||||||
|
|
||||||
|
#ifndef WITH_NON_STORING
|
||||||
|
#define WITH_NON_STORING 0 /* Set this to run with non-storing mode */
|
||||||
|
#endif /* WITH_NON_STORING */
|
||||||
|
|
||||||
|
#if WITH_NON_STORING
|
||||||
|
#undef RPL_NS_CONF_LINK_NUM
|
||||||
|
#define RPL_NS_CONF_LINK_NUM 40 /* Number of links maintained at the root */
|
||||||
|
#undef UIP_CONF_MAX_ROUTES
|
||||||
|
#define UIP_CONF_MAX_ROUTES 0 /* No need for routes */
|
||||||
|
#undef RPL_CONF_MOP
|
||||||
|
#define RPL_CONF_MOP RPL_MOP_NON_STORING /* Mode of operation*/
|
||||||
|
#endif /* WITH_NON_STORING */
|
||||||
|
|
||||||
#ifndef UIP_FALLBACK_INTERFACE
|
#ifndef UIP_FALLBACK_INTERFACE
|
||||||
#define UIP_FALLBACK_INTERFACE rpl_interface
|
#define UIP_FALLBACK_INTERFACE rpl_interface
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,6 +5,10 @@ PROJECT_SOURCEFILES += collect-common.c
|
||||||
|
|
||||||
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
|
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
|
||||||
|
|
||||||
|
ifeq ($(MAKE_WITH_NON_STORING),1)
|
||||||
|
CFLAGS += -DWITH_NON_STORING=1
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef PERIOD
|
ifdef PERIOD
|
||||||
CFLAGS=-DPERIOD=$(PERIOD)
|
CFLAGS=-DPERIOD=$(PERIOD)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -30,6 +30,10 @@
|
||||||
#ifndef PROJECT_CONF_H_
|
#ifndef PROJECT_CONF_H_
|
||||||
#define PROJECT_CONF_H_
|
#define PROJECT_CONF_H_
|
||||||
|
|
||||||
|
#ifndef WITH_NON_STORING
|
||||||
|
#define WITH_NON_STORING 0 /* Set this to run with non-storing mode */
|
||||||
|
#endif /* WITH_NON_STORING */
|
||||||
|
|
||||||
#undef NBR_TABLE_CONF_MAX_NEIGHBORS
|
#undef NBR_TABLE_CONF_MAX_NEIGHBORS
|
||||||
#undef UIP_CONF_MAX_ROUTES
|
#undef UIP_CONF_MAX_ROUTES
|
||||||
|
|
||||||
|
@ -63,4 +67,13 @@
|
||||||
#undef SICSLOWPAN_CONF_FRAG
|
#undef SICSLOWPAN_CONF_FRAG
|
||||||
#define SICSLOWPAN_CONF_FRAG 0
|
#define SICSLOWPAN_CONF_FRAG 0
|
||||||
|
|
||||||
|
#if WITH_NON_STORING
|
||||||
|
#undef RPL_NS_CONF_LINK_NUM
|
||||||
|
#define RPL_NS_CONF_LINK_NUM 40 /* Number of links maintained at the root. Can be set to 0 at non-root nodes. */
|
||||||
|
#undef UIP_CONF_MAX_ROUTES
|
||||||
|
#define UIP_CONF_MAX_ROUTES 0 /* No need for routes */
|
||||||
|
#undef RPL_CONF_MOP
|
||||||
|
#define RPL_CONF_MOP RPL_MOP_NON_STORING /* Mode of operation*/
|
||||||
|
#endif /* WITH_NON_STORING */
|
||||||
|
|
||||||
#endif /* PROJECT_CONF_H_ */
|
#endif /* PROJECT_CONF_H_ */
|
||||||
|
|
|
@ -15,5 +15,9 @@ ifdef PERIOD
|
||||||
CFLAGS+=-DPERIOD=$(PERIOD)
|
CFLAGS+=-DPERIOD=$(PERIOD)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(MAKE_WITH_NON_STORING),1)
|
||||||
|
CFLAGS += -DWITH_NON_STORING=1
|
||||||
|
endif
|
||||||
|
|
||||||
CONTIKI_WITH_IPV6 = 1
|
CONTIKI_WITH_IPV6 = 1
|
||||||
include $(CONTIKI)/Makefile.include
|
include $(CONTIKI)/Makefile.include
|
||||||
|
|
|
@ -30,6 +30,10 @@
|
||||||
#ifndef PROJECT_CONF_H_
|
#ifndef PROJECT_CONF_H_
|
||||||
#define PROJECT_CONF_H_
|
#define PROJECT_CONF_H_
|
||||||
|
|
||||||
|
#ifndef WITH_NON_STORING
|
||||||
|
#define WITH_NON_STORING 0 /* Set this to run with non-storing mode */
|
||||||
|
#endif /* WITH_NON_STORING */
|
||||||
|
|
||||||
#undef NBR_TABLE_CONF_MAX_NEIGHBORS
|
#undef NBR_TABLE_CONF_MAX_NEIGHBORS
|
||||||
#undef UIP_CONF_MAX_ROUTES
|
#undef UIP_CONF_MAX_ROUTES
|
||||||
|
|
||||||
|
@ -56,4 +60,17 @@
|
||||||
|
|
||||||
#define RPL_CONF_DEFAULT_ROUTE_INFINITE_LIFETIME 1
|
#define RPL_CONF_DEFAULT_ROUTE_INFINITE_LIFETIME 1
|
||||||
|
|
||||||
#endif /* PROJECT_CONF_H_ */
|
#ifndef RPL_CONF_WITH_NON_STORING
|
||||||
|
#define RPL_CONF_WITH_NON_STORING 0 /* Set this to run with non-storing mode */
|
||||||
|
#endif /* RPL_CONF_WITH_NON_STORING */
|
||||||
|
|
||||||
|
#if WITH_NON_STORING
|
||||||
|
#undef RPL_NS_CONF_LINK_NUM
|
||||||
|
#define RPL_NS_CONF_LINK_NUM 40 /* Number of links maintained at the root. Can be set to 0 at non-root nodes. */
|
||||||
|
#undef UIP_CONF_MAX_ROUTES
|
||||||
|
#define UIP_CONF_MAX_ROUTES 0 /* No need for routes */
|
||||||
|
#undef RPL_CONF_MOP
|
||||||
|
#define RPL_CONF_MOP RPL_MOP_NON_STORING /* Mode of operation*/
|
||||||
|
#endif /* WITH_NON_STORING */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -136,6 +136,9 @@
|
||||||
#ifndef UIP_CONF_MAX_ROUTES
|
#ifndef UIP_CONF_MAX_ROUTES
|
||||||
#define UIP_CONF_MAX_ROUTES 300
|
#define UIP_CONF_MAX_ROUTES 300
|
||||||
#endif /* UIP_CONF_MAX_ROUTES */
|
#endif /* UIP_CONF_MAX_ROUTES */
|
||||||
|
#ifndef RPL_NS_CONF_LINK_NUM
|
||||||
|
#define RPL_NS_CONF_LINK_NUM 300
|
||||||
|
#endif /* RPL_NS_CONF_LINK_NUM */
|
||||||
|
|
||||||
#define TCPIP_CONF_ANNOTATE_TRANSMISSIONS 1
|
#define TCPIP_CONF_ANNOTATE_TRANSMISSIONS 1
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ cc26xx/cc26xx-web-demo/srf06-cc26xx:BOARD=launchpad/cc1310 \
|
||||||
cc26xx/very-sleepy-demo/srf06-cc26xx \
|
cc26xx/very-sleepy-demo/srf06-cc26xx \
|
||||||
hello-world/cc2538dk \
|
hello-world/cc2538dk \
|
||||||
ipv6/rpl-border-router/cc2538dk \
|
ipv6/rpl-border-router/cc2538dk \
|
||||||
|
ipv6/rpl-border-router/cc2538dk:MAKE_WITH_NON_STORING=1 \
|
||||||
er-rest-example/cc2538dk \
|
er-rest-example/cc2538dk \
|
||||||
ipso-objects/cc2538dk \
|
ipso-objects/cc2538dk \
|
||||||
webserver-ipv6/cc2538dk \
|
webserver-ipv6/cc2538dk \
|
||||||
|
|
344
regression-tests/23-rpl-non-storing/01-rpl-up-route.csc
Normal file
344
regression-tests/23-rpl-non-storing/01-rpl-up-route.csc
Normal file
|
@ -0,0 +1,344 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype488</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/sender-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype32</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/root-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype352</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/receiver-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>6.9596575829049145</x>
|
||||||
|
<y>-25.866060090958513</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype352</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>132.8019872469463</x>
|
||||||
|
<y>146.1533406452311</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype488</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.026556260457749753</x>
|
||||||
|
<y>39.54055615854325</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype352</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.52021598473031</x>
|
||||||
|
<y>148.11553913271615</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype352</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>62.81690785997944</x>
|
||||||
|
<y>127.1854219328756</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype352</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>32.07579822271361</x>
|
||||||
|
<y>102.33090775806494</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype352</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>5.913151722912886</x>
|
||||||
|
<y>73.55199660828417</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype352</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.0</x>
|
||||||
|
<y>0.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype32</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>0.9555608221893928 0.0 0.0 0.9555608221893928 177.34962387792274 139.71659364731656</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>240</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(1000000, if(lastMsg != -1 && lostMsgs == 0) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>962</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>596</height>
|
||||||
|
<location_x>603</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
344
regression-tests/23-rpl-non-storing/02-rpl-root-reboot.csc
Normal file
344
regression-tests/23-rpl-non-storing/02-rpl-root-reboot.csc
Normal file
|
@ -0,0 +1,344 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype958</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/sender-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype837</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/root-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype358</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/receiver-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-22.5728586847096</x>
|
||||||
|
<y>123.9358664968653</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype358</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype958</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-1.39303771455413</x>
|
||||||
|
<y>100.21446701029119</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype358</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype358</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype358</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype358</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>10.931583432822638</x>
|
||||||
|
<y>69.848248459216</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype358</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.0</x>
|
||||||
|
<y>0.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype837</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 75.2726010197627 15.727272727272757</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>240</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
GENERATE_MSG(1000000, "add-sink");
|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(10000000, if(lastMsg != -1 && lostMsgs == 0) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>962</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>596</height>
|
||||||
|
<location_x>603</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
293
regression-tests/23-rpl-non-storing/03-rpl-28-hours.csc
Normal file
293
regression-tests/23-rpl-non-storing/03-rpl-28-hours.csc
Normal file
|
@ -0,0 +1,293 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype110</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/sender-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype792</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/root-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype964</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/receiver-node.c</source>
|
||||||
|
<commands>make TARGET=cooja clean
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>7.772906112657773</x>
|
||||||
|
<y>86.396910401861</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype964</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>75.54361692539452</x>
|
||||||
|
<y>14.292026223193414</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype110</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>47.962513687652844</x>
|
||||||
|
<y>7.199742533488408</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype964</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>1.8626697045702818</x>
|
||||||
|
<y>47.783365869022624</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype964</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.0</x>
|
||||||
|
<y>0.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype792</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 78.27260101976275 40.72727272727276</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>240</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(2000000, "add-sink");
|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(100000000, if(lastMsg != -1 && lostMsgs == 0) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>962</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>596</height>
|
||||||
|
<location_x>603</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
7058
regression-tests/23-rpl-non-storing/04-rpl-large-network.csc
Normal file
7058
regression-tests/23-rpl-non-storing/04-rpl-large-network.csc
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,342 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype743</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype452</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype782</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-22.5728586847096</x>
|
||||||
|
<y>123.9358664968653</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype782</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype743</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-1.39303771455413</x>
|
||||||
|
<y>100.21446701029119</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype782</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype782</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype782</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype782</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>10.931583432822638</x>
|
||||||
|
<y>69.848248459216</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype782</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.0</x>
|
||||||
|
<y>0.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype452</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 75.2726010197627 15.727272727272757</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>240</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(1000000, if(lostMsgs == 0) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>962</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>596</height>
|
||||||
|
<location_x>603</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
|
@ -0,0 +1,348 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype951</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype170</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype767</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-22.5728586847096</x>
|
||||||
|
<y>123.9358664968653</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype767</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype951</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-1.39303771455413</x>
|
||||||
|
<y>100.21446701029119</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype767</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype767</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype767</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype767</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>10.931583432822638</x>
|
||||||
|
<y>69.848248459216</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype767</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.0</x>
|
||||||
|
<y>0.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype170</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 75.2726010197627 15.727272727272757</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>240</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
GENERATE_MSG(2000000, "add-sink");
|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|

|
||||||
|
// we check that we got up to at least message 62 and
|
||||||
|
// (the simulation is 4000000ms = 66 minutes long)
|
||||||
|
// that we did not lose anything since 45
|
||||||
|
// (the sink is back at 2000000ms = 33 minutes)
|
||||||
|
TIMEOUT(4000000, if(lastMsg >= 62 && lastMissed <= 45) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
lastMissed = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
lastMissed = num;
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>962</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>596</height>
|
||||||
|
<location_x>603</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
|
@ -0,0 +1,647 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype419</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype484</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype718</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-0.4799968467515439</x>
|
||||||
|
<y>98.79087181374759</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>99.56423154395364</x>
|
||||||
|
<y>50.06466731257512</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype419</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-0.4799968467515439</x>
|
||||||
|
<y>0.30173505605854883</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype484</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.779318616702257</x>
|
||||||
|
<y>8.464865358169643</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>9.391922400291703</x>
|
||||||
|
<y>49.22878206790311</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>48.16367625505583</x>
|
||||||
|
<y>33.27520746599595</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>16.582742473429345</x>
|
||||||
|
<y>24.932911331640646</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>8.445564421140666</x>
|
||||||
|
<y>6.770205395698742</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>87.04968129458189</x>
|
||||||
|
<y>34.46536562612724</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>9</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>94.47123252519145</x>
|
||||||
|
<y>18.275940194868184</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>10</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.28044254364556</x>
|
||||||
|
<y>17.683438211793558</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>11</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>56.124622439456076</x>
|
||||||
|
<y>33.88966252832571</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>12</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>98.33149749474546</x>
|
||||||
|
<y>37.448034626592744</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>13</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>58.75337436025891</x>
|
||||||
|
<y>68.64082018992522</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>14</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.83816496627988</x>
|
||||||
|
<y>68.38008376830592</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>15</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>90.88648665466316</x>
|
||||||
|
<y>50.942053906416575</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>16</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>68.80089833632896</x>
|
||||||
|
<y>84.17294684073734</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>17</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>73.6760846183129</x>
|
||||||
|
<y>81.76699743886633</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>18</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.2960103456537466</x>
|
||||||
|
<y>98.5587829617092</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>19</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>8.130479493904208</x>
|
||||||
|
<y>57.642099520821645</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>20</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>30.550120982984865</x>
|
||||||
|
<y>85.58346736403402</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>21</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.65300377698182</x>
|
||||||
|
<y>63.50257213104861</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>22</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>34.92110687576687</x>
|
||||||
|
<y>70.71381297232249</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>23</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype718</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>1.92914676942954 0.0 0.0 1.92914676942954 75.9259843662471 55.41790879138101</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>500</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>function place(id, x, y) {
|
||||||
|
var node = sim.getMoteWithID(id);
|
||||||
|
node.getInterfaces().getPosition().setCoordinates(x, y, 0);
|
||||||
|
}
|
||||||
|

|
||||||
|
function getRandom(min, max) {
|
||||||
|
return Math.random() * (max - min) + min;
|
||||||
|
}
|
||||||
|

|
||||||
|
// From: http://bost.ocks.org/mike/shuffle/
|
||||||
|
function shuffle(array) {
|
||||||
|
var m = array.length, t, i;
|
||||||
|

|
||||||
|
// While there remain elements to shuffle…
|
||||||
|
while (m) {
|
||||||
|

|
||||||
|
// Pick a remaining element…
|
||||||
|
i = Math.floor(Math.random() * m--);
|
||||||
|

|
||||||
|
// And swap it with the current element.
|
||||||
|
t = array[m];
|
||||||
|
array[m] = array[i];
|
||||||
|
array[i] = t;
|
||||||
|
}
|
||||||
|

|
||||||
|
return array;
|
||||||
|
}
|
||||||
|

|
||||||
|
GENERATE_MSG(000000, 'randomize-nodes');
|
||||||
|
GENERATE_MSG(1200000, 'randomize-nodes');
|
||||||
|
GENERATE_MSG(2400000, 'randomize-nodes');
|
||||||
|
GENERATE_MSG(3600000, 'randomize-nodes');
|
||||||
|

|
||||||
|
var numForwarders = 20;
|
||||||
|
var forwardIDStart = 4;
|
||||||
|
packetsReceived = [];
|
||||||
|
var hops;
|
||||||
|

|
||||||
|
TIMEOUT(6000000, if(packetsReceived.length > 50) { log.testOK(); } );
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("randomize-nodes")) {
|
||||||
|
log.log('Rearranging network\n');
|
||||||
|
var allnodes = [];
|
||||||
|
for(var i = 0; i < numForwarders; i++) {
|
||||||
|
allnodes.push(i);
|
||||||
|
}
|
||||||
|
shuffle(allnodes);
|
||||||
|
/* Place 1/4 of the nodes in the first quadrant. */
|
||||||
|
var i = 0;
|
||||||
|
for(; i < numForwarders / 4; i++) {
|
||||||
|
place(i + forwardIDStart, 
|
||||||
|
getRandom(0, 50),
|
||||||
|
getRandom(0, 50));
|
||||||
|
}
|
||||||
|
/* Place 1/4 of the nodes in the second quadrant. */
|
||||||
|
for(; i < 2 * numForwarders / 4; i++) {
|
||||||
|
place(i + forwardIDStart, 
|
||||||
|
getRandom(50, 100),
|
||||||
|
getRandom(0, 50));
|
||||||
|
}
|
||||||
|
/* Place 1/4 of the nodes in the third quadrant. */
|
||||||
|
for(; i < 3 * numForwarders / 4; i++) {
|
||||||
|
place(i + forwardIDStart, 
|
||||||
|
getRandom(50, 100),
|
||||||
|
getRandom(50, 100));
|
||||||
|
} 
|
||||||
|
/* Place 1/4 of the nodes in the fourth quadrant. */
|
||||||
|
for(; i < 4 * numForwarders / 4; i++) {
|
||||||
|
place(i + forwardIDStart, 
|
||||||
|
getRandom(0, 50),
|
||||||
|
getRandom(50, 100));
|
||||||
|
} 
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
var data = msg.split(" ");
|
||||||
|
var num = parseInt(data[14]);
|
||||||
|
packetsReceived.push(num);
|
||||||
|

|
||||||
|
/* Copy packetsReceived array to the packets array. */
|
||||||
|
var packets = packetsReceived.slice();
|
||||||
|
var recvstr = '';
|
||||||
|
for(var i = 0; i < num; i++) {
|
||||||
|
if(packets[0] == i) {
|
||||||
|
recvstr += '*';
|
||||||
|
packets.shift();
|
||||||
|
} else {
|
||||||
|
recvstr += '_'; 
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
log.log(packetsReceived.length + ' packets received: ' + recvstr + '\n');
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>612</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>726</height>
|
||||||
|
<location_x>953</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-0.csc
Normal file
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-0.csc
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype921</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype873</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype812</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-7.199692787830563</x>
|
||||||
|
<y>98.21738321803603</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype812</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype921</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.0</x>
|
||||||
|
<y>68.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype812</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype812</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype812</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype812</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>58.0</x>
|
||||||
|
<y>108.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype812</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-40.352178879596096</x>
|
||||||
|
<y>102.66976131212861</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype873</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>1.6480321712565114 0.0 0.0 1.6480321712565114 98.5016889738719 55.796930342384904</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>500</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|
GENERATE_MSG(000000, 'init-8-and-4');
|
||||||
|
GENERATE_MSG(600000, 'move-8-and-4');
|
||||||
|

|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|
seenMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(2000000, if(seenMsgs > 15) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("init-8-and-4")) { 
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.equals("move-8-and-4")) {
|
||||||
|
log.log('Moving nodes 8 and 4\n');
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
seenMsgs++;
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>612</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>726</height>
|
||||||
|
<location_x>953</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-1.csc
Normal file
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-1.csc
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype672</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype780</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype36</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-7.199692787830563</x>
|
||||||
|
<y>98.21738321803603</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype672</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.0</x>
|
||||||
|
<y>68.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>58.0</x>
|
||||||
|
<y>108.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-25.71843353317142</x>
|
||||||
|
<y>43.05517674255262</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype780</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 75.2726010197627 15.727272727272757</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>500</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|
GENERATE_MSG(000000, 'init-8-and-4');
|
||||||
|
GENERATE_MSG(600000, 'move-8-and-4');
|
||||||
|

|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|
seenMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(2000000, if(seenMsgs > 15) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("init-8-and-4")) { 
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.equals("move-8-and-4")) {
|
||||||
|
log.log('Moving nodes 8 and 4\n');
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
seenMsgs++;
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>612</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>726</height>
|
||||||
|
<location_x>953</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-2.csc
Normal file
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-2.csc
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype672</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype780</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype36</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-7.199692787830563</x>
|
||||||
|
<y>98.21738321803603</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype672</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.0</x>
|
||||||
|
<y>68.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>58.0</x>
|
||||||
|
<y>108.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>16.0472370839803</x>
|
||||||
|
<y>6.017695251870905</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype780</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 75.2726010197627 15.727272727272757</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>500</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|
GENERATE_MSG(000000, 'init-8-and-4');
|
||||||
|
GENERATE_MSG(600000, 'move-8-and-4');
|
||||||
|

|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|
seenMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(2000000, if(seenMsgs > 15) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("init-8-and-4")) { 
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.equals("move-8-and-4")) {
|
||||||
|
log.log('Moving nodes 8 and 4\n');
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
seenMsgs++;
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>612</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>726</height>
|
||||||
|
<location_x>953</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-3.csc
Normal file
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-3.csc
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype672</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype780</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype36</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-7.199692787830563</x>
|
||||||
|
<y>98.21738321803603</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype672</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.0</x>
|
||||||
|
<y>68.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>58.0</x>
|
||||||
|
<y>108.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype36</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>79.48377453078622</x>
|
||||||
|
<y>4.835647970253402</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype780</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 70.27260101976269 60.72727272727276</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>500</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|
GENERATE_MSG(000000, 'init-8-and-4');
|
||||||
|
GENERATE_MSG(600000, 'move-8-and-4');
|
||||||
|

|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|
seenMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(2000000, if(seenMsgs > 15) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("init-8-and-4")) { 
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.equals("move-8-and-4")) {
|
||||||
|
log.log('Moving nodes 8 and 4\n');
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
seenMsgs++;
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>612</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>726</height>
|
||||||
|
<location_x>953</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-4.csc
Normal file
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-4.csc
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype192</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype575</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype912</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-7.199692787830563</x>
|
||||||
|
<y>98.21738321803603</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype912</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype192</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.0</x>
|
||||||
|
<y>68.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype912</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype912</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype912</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype912</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>58.0</x>
|
||||||
|
<y>108.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype912</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>122.82550819009461</x>
|
||||||
|
<y>29.658640884220933</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype575</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.5379695437350276 0.0 0.0 2.5379695437350276 70.27260101976269 60.72727272727276</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>500</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|
GENERATE_MSG(000000, 'init-8-and-4');
|
||||||
|
GENERATE_MSG(600000, 'move-8-and-4');
|
||||||
|

|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|
seenMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(2000000, if(seenMsgs > 15) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("init-8-and-4")) { 
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.equals("move-8-and-4")) {
|
||||||
|
log.log('Moving nodes 8 and 4\n');
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
seenMsgs++;
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>612</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>726</height>
|
||||||
|
<location_x>953</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-5.csc
Normal file
360
regression-tests/23-rpl-non-storing/08-rpl-dao-route-loss-5.csc
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype372</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONFIG_DIR]/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype229</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONFIG_DIR]/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype424</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONFIG_DIR]/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-7.199692787830563</x>
|
||||||
|
<y>98.21738321803603</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype424</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>116.13379149678028</x>
|
||||||
|
<y>88.36698920455684</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype372</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.0</x>
|
||||||
|
<y>68.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype424</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>95.25095618820441</x>
|
||||||
|
<y>63.14998053005015</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype424</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>66.09378990830604</x>
|
||||||
|
<y>38.32698761608261</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype424</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>29.05630841762433</x>
|
||||||
|
<y>30.840688165838436</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype424</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>58.0</x>
|
||||||
|
<y>108.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype424</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>145.93059238811136</x>
|
||||||
|
<y>111.16474110935306</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype229</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>1.6480321712565114 0.0 0.0 1.6480321712565114 98.5016889738719 55.796930342384904</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>500</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink");
|
||||||
|
//GENERATE_MSG(1000000, "remove-sink");
|
||||||
|
//GENERATE_MSG(1020000, "add-sink");
|
||||||
|
GENERATE_MSG(000000, 'init-8-and-4');
|
||||||
|
GENERATE_MSG(600000, 'move-8-and-4');
|
||||||
|

|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|
seenMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(2000000, if(seenMsgs > 15) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink")) {
|
||||||
|
m = sim.getMoteWithID(3);
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink\n");
|
||||||
|
} else if(msg.equals("add-sink")) {
|
||||||
|
if(!sim.getMoteWithID(3)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(3);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("init-8-and-4")) { 
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.equals("move-8-and-4")) {
|
||||||
|
log.log('Moving nodes 8 and 4\n');
|
||||||
|
var node4 = sim.getMoteWithID(4);
|
||||||
|
var node8 = sim.getMoteWithID(8);
|
||||||
|
node4.getInterfaces().getPosition().setCoordinates(12, 68, 0);
|
||||||
|
node8.getInterfaces().getPosition().setCoordinates(58, 108, 0);
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
seenMsgs++;
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>612</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>726</height>
|
||||||
|
<location_x>953</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
256
regression-tests/23-rpl-non-storing/09-rpl-probing.csc
Normal file
256
regression-tests/23-rpl-non-storing/09-rpl-probing.csc
Normal file
|
@ -0,0 +1,256 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype190</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/sender-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype481</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/root-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype692</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/receiver-node.c</source>
|
||||||
|
<commands>make clean TARGET=cooja
|
||||||
|
make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>8.0</x>
|
||||||
|
<y>2.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype481</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-7.19071602882406</x>
|
||||||
|
<y>34.96668248624779</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype190</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-17.870288882812428</x>
|
||||||
|
<y>4.581754854333804</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype692</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<moterelations>true</moterelations>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>2.494541140753371 0.0 0.0 2.494541140753371 168.25302383129448 116.2254386098645</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>597</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>428</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(1000000, "moving root 2 hops away");
|
||||||
|
GENERATE_MSG(1500000, "moving root back");
|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|

|
||||||
|
TIMEOUT(6000000, if(lastMsg != -1 && lastMsgHops == 1 && lostMsgs <= 2 && num > 20) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|
lastMsgHops = -1;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("moving root 2 hops away")) {
|
||||||
|
var root = sim.getMoteWithID(1);
|
||||||
|
root.getInterfaces().getPosition().setCoordinates(5, -20, 0);
|
||||||
|
log.log("moving root 2 hops away\n");
|
||||||
|
} else if(msg.equals("moving root back")) {
|
||||||
|
var root = sim.getMoteWithID(1);
|
||||||
|
root.getInterfaces().getPosition().setCoordinates(8, 2, 0);
|
||||||
|
log.log("moving root back\n");
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
lastMsgHops = hops;
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>605</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>684</height>
|
||||||
|
<location_x>604</location_x>
|
||||||
|
<location_y>14</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
389
regression-tests/23-rpl-non-storing/10-rpl-multi-dodag.csc
Normal file
389
regression-tests/23-rpl-non-storing/10-rpl-multi-dodag.csc
Normal file
|
@ -0,0 +1,389 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/collect-view</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial2pty</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/radiologger-headless</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype301</identifier>
|
||||||
|
<description>Sender</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/sender-node.c</source>
|
||||||
|
<commands>make sender-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype820</identifier>
|
||||||
|
<description>RPL root</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/root-node.c</source>
|
||||||
|
<commands>make root-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype306</identifier>
|
||||||
|
<description>Receiver</description>
|
||||||
|
<source>[CONTIKI_DIR]/regression-tests/12-rpl/code/receiver-node.c</source>
|
||||||
|
<commands>make receiver-node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>9.767954940345236</x>
|
||||||
|
<y>88.75813939592845</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype306</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>63.36720084537501</x>
|
||||||
|
<y>75.88456991067605</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype301</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-20.684049350551753</x>
|
||||||
|
<y>60.49767834794315</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype306</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>64.61229064867878</x>
|
||||||
|
<y>39.88729002781773</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype306</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>37.157272454309606</x>
|
||||||
|
<y>19.60335867526139</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype306</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>-21.976612887408603</x>
|
||||||
|
<y>30.69884249204435</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype306</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>43</x>
|
||||||
|
<y>98</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype820</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>0.0</x>
|
||||||
|
<y>0.0</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype820</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<viewport>1.7624788498159916 0.0 0.0 1.7624788498159916 97.6893062637241 8.72727272727273</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1184</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>240</height>
|
||||||
|
<location_x>402</location_x>
|
||||||
|
<location_y>162</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Notes
|
||||||
|
<plugin_config>
|
||||||
|
<notes>Enter notes here</notes>
|
||||||
|
<decorations>true</decorations>
|
||||||
|
</plugin_config>
|
||||||
|
<width>904</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>680</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.ScriptRunner
|
||||||
|
<plugin_config>
|
||||||
|
<script>GENERATE_MSG(0000000, "add-sink-1");
|
||||||
|
GENERATE_MSG(0000000, "add-sink-2");
|
||||||
|
GENERATE_MSG(0000000, "remove-sink-3");
|
||||||
|

|
||||||
|
GENERATE_MSG(2000000, "remove-sink-1");
|
||||||
|
GENERATE_MSG(4000000, "remove-sink-2");
|
||||||
|
GENERATE_MSG(4000000, "add-sink-3");
|
||||||
|

|
||||||
|
lostMsgs = 0;
|
||||||
|
newDagOk = 0;
|
||||||
|

|
||||||
|
TIMEOUT(6000000, if(newDagOk == 2) { log.testOK(); } );
|
||||||
|

|
||||||
|
lastMsg = -1;
|
||||||
|
newSink = 0;
|
||||||
|
packets = "_________";
|
||||||
|
hops = 0;
|
||||||
|

|
||||||
|
while(true) {
|
||||||
|
YIELD();
|
||||||
|
if(msg.equals("remove-sink-1")) {
|
||||||
|
m = sim.getMoteWithID(7);
|
||||||
|
if(m) {
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink 1\n");
|
||||||
|
}
|
||||||
|
} else if(msg.equals("remove-sink-2")) {
|
||||||
|
m = sim.getMoteWithID(8);
|
||||||
|
if(m) {
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink 2\n");
|
||||||
|
}
|
||||||
|
} else if(msg.equals("remove-sink-3")) {
|
||||||
|
m = sim.getMoteWithID(9);
|
||||||
|
if(m) {
|
||||||
|
sim.removeMote(m);
|
||||||
|
log.log("removed sink 3\n");
|
||||||
|
}
|
||||||
|
} else if(msg.equals("add-sink-1")) {
|
||||||
|
newSink = 1;
|
||||||
|
if(!sim.getMoteWithID(7)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(7);
|
||||||
|
sim.addMote(m);
|
||||||
|
m.getInterfaces().getPosition().setCoordinates(43, 98, 0);
|
||||||
|
log.log("added sink 1\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink 1 as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("add-sink-2")) {
|
||||||
|
newSink = 1;
|
||||||
|
if(!sim.getMoteWithID(8)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(8);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink 2\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink 2 as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.equals("add-sink-3")) {
|
||||||
|
newSink = 1;
|
||||||
|
if(!sim.getMoteWithID(9)) {
|
||||||
|
m = sim.getMoteTypes()[1].generateMote(sim);
|
||||||
|
m.getInterfaces().getMoteID().setMoteID(9);
|
||||||
|
sim.addMote(m);
|
||||||
|
log.log("added sink 3\n");
|
||||||
|
} else {
|
||||||
|
log.log("did not add sink 3 as it was already there\n"); 
|
||||||
|
}
|
||||||
|
} else if(msg.startsWith("Sending")) {
|
||||||
|
hops = 0;
|
||||||
|
} else if(msg.startsWith("#L") && msg.endsWith("1; red")) {
|
||||||
|
hops++;
|
||||||
|
} else if(msg.startsWith("Data")) {
|
||||||
|
data = msg.split(" ");
|
||||||
|
num = parseInt(data[14]);
|
||||||
|
if(newSink) {
|
||||||
|
newDagOk++;
|
||||||
|
newSink = 0;
|
||||||
|
}
|
||||||
|
if(lastMsg != -1) {
|
||||||
|
if(num != lastMsg + 1) {
|
||||||
|
numMissed = num - lastMsg - 1;
|
||||||
|
lostMsgs += numMissed; 
|
||||||
|
log.log("Missed messages " + numMissed + " before " + num + "\n"); 
|
||||||
|
for(i = 0; i < numMissed; i++) {
|
||||||
|
packets = packets.substr(0, lastMsg + i + 1).concat("_"); 
|
||||||
|
}
|
||||||
|
} 
|
||||||
|
}
|
||||||
|
packets = packets.substr(0, num).concat("*");
|
||||||
|
log.log("" + hops + " " + packets + "\n");
|
||||||
|
lastMsg = num;
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<active>true</active>
|
||||||
|
</plugin_config>
|
||||||
|
<width>962</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>596</height>
|
||||||
|
<location_x>603</location_x>
|
||||||
|
<location_y>43</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
1
regression-tests/23-rpl-non-storing/Makefile
Normal file
1
regression-tests/23-rpl-non-storing/Makefile
Normal file
|
@ -0,0 +1 @@
|
||||||
|
include ../Makefile.simulation-test
|
7
regression-tests/23-rpl-non-storing/code/Makefile
Normal file
7
regression-tests/23-rpl-non-storing/code/Makefile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
all: sender-node receiver-node root-node
|
||||||
|
CONTIKI=../../..
|
||||||
|
|
||||||
|
CFLAGS+=-DPROJECT_CONF_H=\"project-conf.h\"
|
||||||
|
|
||||||
|
CONTIKI_WITH_IPV6 = 1
|
||||||
|
include $(CONTIKI)/Makefile.include
|
36
regression-tests/23-rpl-non-storing/code/project-conf.h
Normal file
36
regression-tests/23-rpl-non-storing/code/project-conf.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Inria.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#define TCPIP_CONF_ANNOTATE_TRANSMISSIONS 1
|
||||||
|
|
||||||
|
#undef RPL_CONF_MOP
|
||||||
|
#define RPL_CONF_MOP RPL_MOP_NON_STORING
|
||||||
|
|
||||||
|
/* Add a bit of extra probing in the non-storing case to compensate for reduced DAO traffic */
|
||||||
|
#undef RPL_CONF_PROBING_INTERVAL
|
||||||
|
#define RPL_CONF_PROBING_INTERVAL (60 * CLOCK_SECOND)
|
131
regression-tests/23-rpl-non-storing/code/receiver-node.c
Normal file
131
regression-tests/23-rpl-non-storing/code/receiver-node.c
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Thingsquare, www.thingsquare.com.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "lib/random.h"
|
||||||
|
#include "sys/ctimer.h"
|
||||||
|
#include "sys/etimer.h"
|
||||||
|
#include "net/ip/uip.h"
|
||||||
|
#include "net/ipv6/uip-ds6.h"
|
||||||
|
#include "net/ip/uip-debug.h"
|
||||||
|
|
||||||
|
#include "simple-udp.h"
|
||||||
|
|
||||||
|
#include "net/rpl/rpl.h"
|
||||||
|
#include "dev/leds.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define UDP_PORT 1234
|
||||||
|
|
||||||
|
static struct simple_udp_connection unicast_connection;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS(receiver_node_process, "Receiver node");
|
||||||
|
AUTOSTART_PROCESSES(&receiver_node_process);
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
receiver(struct simple_udp_connection *c,
|
||||||
|
const uip_ipaddr_t *sender_addr,
|
||||||
|
uint16_t sender_port,
|
||||||
|
const uip_ipaddr_t *receiver_addr,
|
||||||
|
uint16_t receiver_port,
|
||||||
|
const uint8_t *data,
|
||||||
|
uint16_t datalen)
|
||||||
|
{
|
||||||
|
printf("Data received from ");
|
||||||
|
uip_debug_ipaddr_print(sender_addr);
|
||||||
|
printf(" on port %d from port %d with length %d: '%s'\n",
|
||||||
|
receiver_port, sender_port, datalen, data);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static uip_ipaddr_t *
|
||||||
|
set_global_address(void)
|
||||||
|
{
|
||||||
|
static uip_ipaddr_t ipaddr;
|
||||||
|
int i;
|
||||||
|
uint8_t state;
|
||||||
|
|
||||||
|
uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
|
||||||
|
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
|
||||||
|
|
||||||
|
printf("IPv6 addresses: ");
|
||||||
|
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
|
||||||
|
state = uip_ds6_if.addr_list[i].state;
|
||||||
|
if(uip_ds6_if.addr_list[i].isused &&
|
||||||
|
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
|
||||||
|
uip_debug_ipaddr_print(&uip_ds6_if.addr_list[i].ipaddr);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ipaddr;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
uint8_t should_blink = 1;
|
||||||
|
static void
|
||||||
|
route_callback(int event, uip_ipaddr_t *route, uip_ipaddr_t *ipaddr, int num_routes)
|
||||||
|
{
|
||||||
|
if(event == UIP_DS6_NOTIFICATION_DEFRT_ADD) {
|
||||||
|
should_blink = 0;
|
||||||
|
} else if(event == UIP_DS6_NOTIFICATION_DEFRT_RM) {
|
||||||
|
should_blink = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS_THREAD(receiver_node_process, ev, data)
|
||||||
|
{
|
||||||
|
static struct etimer et;
|
||||||
|
static struct uip_ds6_notification n;
|
||||||
|
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
set_global_address();
|
||||||
|
|
||||||
|
uip_ds6_notification_add(&n, route_callback);
|
||||||
|
|
||||||
|
simple_udp_register(&unicast_connection, UDP_PORT,
|
||||||
|
NULL, UDP_PORT, receiver);
|
||||||
|
|
||||||
|
etimer_set(&et, CLOCK_SECOND);
|
||||||
|
while(1) {
|
||||||
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||||
|
etimer_reset(&et);
|
||||||
|
if(should_blink) {
|
||||||
|
leds_on(LEDS_ALL);
|
||||||
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||||
|
etimer_reset(&et);
|
||||||
|
leds_off(LEDS_ALL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
135
regression-tests/23-rpl-non-storing/code/root-node.c
Normal file
135
regression-tests/23-rpl-non-storing/code/root-node.c
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Thingsquare, www.thingsquare.com.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "lib/random.h"
|
||||||
|
#include "sys/ctimer.h"
|
||||||
|
#include "sys/etimer.h"
|
||||||
|
#include "net/ip/uip.h"
|
||||||
|
#include "net/ipv6/uip-ds6.h"
|
||||||
|
#include "net/ip/uip-debug.h"
|
||||||
|
|
||||||
|
#include "simple-udp.h"
|
||||||
|
|
||||||
|
#include "net/rpl/rpl.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define UDP_PORT 1234
|
||||||
|
#define SERVICE_ID 190
|
||||||
|
|
||||||
|
#define SEND_INTERVAL (10 * CLOCK_SECOND)
|
||||||
|
#define SEND_TIME (random_rand() % (SEND_INTERVAL))
|
||||||
|
|
||||||
|
static struct simple_udp_connection unicast_connection;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS(unicast_receiver_process, "Unicast receiver example process");
|
||||||
|
AUTOSTART_PROCESSES(&unicast_receiver_process);
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
receiver(struct simple_udp_connection *c,
|
||||||
|
const uip_ipaddr_t *sender_addr,
|
||||||
|
uint16_t sender_port,
|
||||||
|
const uip_ipaddr_t *receiver_addr,
|
||||||
|
uint16_t receiver_port,
|
||||||
|
const uint8_t *data,
|
||||||
|
uint16_t datalen)
|
||||||
|
{
|
||||||
|
printf("Data received from ");
|
||||||
|
uip_debug_ipaddr_print(sender_addr);
|
||||||
|
printf(" on port %d from port %d with length %d: '%s'\n",
|
||||||
|
receiver_port, sender_port, datalen, data);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static uip_ipaddr_t *
|
||||||
|
set_global_address(void)
|
||||||
|
{
|
||||||
|
static uip_ipaddr_t ipaddr;
|
||||||
|
int i;
|
||||||
|
uint8_t state;
|
||||||
|
|
||||||
|
uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
|
||||||
|
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
|
||||||
|
|
||||||
|
printf("IPv6 addresses: ");
|
||||||
|
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
|
||||||
|
state = uip_ds6_if.addr_list[i].state;
|
||||||
|
if(uip_ds6_if.addr_list[i].isused &&
|
||||||
|
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
|
||||||
|
uip_debug_ipaddr_print(&uip_ds6_if.addr_list[i].ipaddr);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ipaddr;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
create_rpl_dag(uip_ipaddr_t *ipaddr)
|
||||||
|
{
|
||||||
|
struct uip_ds6_addr *root_if;
|
||||||
|
|
||||||
|
root_if = uip_ds6_addr_lookup(ipaddr);
|
||||||
|
if(root_if != NULL) {
|
||||||
|
rpl_dag_t *dag;
|
||||||
|
uip_ipaddr_t prefix;
|
||||||
|
|
||||||
|
rpl_set_root(RPL_DEFAULT_INSTANCE, ipaddr);
|
||||||
|
dag = rpl_get_any_dag();
|
||||||
|
uip_ip6addr(&prefix, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
rpl_set_prefix(dag, &prefix, 64);
|
||||||
|
PRINTF("created a new RPL dag\n");
|
||||||
|
} else {
|
||||||
|
PRINTF("failed to create a new RPL DAG\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS_THREAD(unicast_receiver_process, ev, data)
|
||||||
|
{
|
||||||
|
uip_ipaddr_t *ipaddr;
|
||||||
|
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
ipaddr = set_global_address();
|
||||||
|
|
||||||
|
create_rpl_dag(ipaddr);
|
||||||
|
|
||||||
|
simple_udp_register(&unicast_connection, UDP_PORT,
|
||||||
|
NULL, UDP_PORT, receiver);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
PROCESS_WAIT_EVENT();
|
||||||
|
}
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
129
regression-tests/23-rpl-non-storing/code/sender-node.c
Normal file
129
regression-tests/23-rpl-non-storing/code/sender-node.c
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Thingsquare, www.thingsquare.com.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "lib/random.h"
|
||||||
|
#include "sys/ctimer.h"
|
||||||
|
#include "sys/etimer.h"
|
||||||
|
#include "net/ip/uip.h"
|
||||||
|
#include "net/ipv6/uip-ds6.h"
|
||||||
|
#include "net/ip/uip-debug.h"
|
||||||
|
|
||||||
|
#include "simple-udp.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define UDP_PORT 1234
|
||||||
|
|
||||||
|
#define SEND_INTERVAL (60 * CLOCK_SECOND)
|
||||||
|
#define SEND_TIME (random_rand() % (SEND_INTERVAL))
|
||||||
|
|
||||||
|
static struct simple_udp_connection unicast_connection;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS(sender_node_process, "Sender node process");
|
||||||
|
AUTOSTART_PROCESSES(&sender_node_process);
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
receiver(struct simple_udp_connection *c,
|
||||||
|
const uip_ipaddr_t *sender_addr,
|
||||||
|
uint16_t sender_port,
|
||||||
|
const uip_ipaddr_t *receiver_addr,
|
||||||
|
uint16_t receiver_port,
|
||||||
|
const uint8_t *data,
|
||||||
|
uint16_t datalen)
|
||||||
|
{
|
||||||
|
printf("Sender received data on port %d from port %d with length %d\n",
|
||||||
|
receiver_port, sender_port, datalen);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
set_global_address(void)
|
||||||
|
{
|
||||||
|
uip_ipaddr_t ipaddr;
|
||||||
|
int i;
|
||||||
|
uint8_t state;
|
||||||
|
|
||||||
|
uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
|
||||||
|
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
|
||||||
|
|
||||||
|
printf("IPv6 addresses: ");
|
||||||
|
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
|
||||||
|
state = uip_ds6_if.addr_list[i].state;
|
||||||
|
if(uip_ds6_if.addr_list[i].isused &&
|
||||||
|
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
|
||||||
|
uip_debug_ipaddr_print(&uip_ds6_if.addr_list[i].ipaddr);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS_THREAD(sender_node_process, ev, data)
|
||||||
|
{
|
||||||
|
static struct etimer periodic_timer;
|
||||||
|
static struct etimer send_timer;
|
||||||
|
uip_ipaddr_t addr;
|
||||||
|
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
set_global_address();
|
||||||
|
|
||||||
|
simple_udp_register(&unicast_connection, UDP_PORT,
|
||||||
|
NULL, UDP_PORT, receiver);
|
||||||
|
|
||||||
|
etimer_set(&periodic_timer, SEND_INTERVAL);
|
||||||
|
while(1) {
|
||||||
|
|
||||||
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&periodic_timer));
|
||||||
|
etimer_reset(&periodic_timer);
|
||||||
|
etimer_set(&send_timer, SEND_TIME);
|
||||||
|
|
||||||
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&send_timer));
|
||||||
|
|
||||||
|
uip_ip6addr(&addr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0x0201, 0x001, 0x001, 0x001);
|
||||||
|
|
||||||
|
{
|
||||||
|
static unsigned int message_number;
|
||||||
|
char buf[20];
|
||||||
|
|
||||||
|
printf("Sending unicast to ");
|
||||||
|
uip_debug_ipaddr_print(&addr);
|
||||||
|
printf("\n");
|
||||||
|
sprintf(buf, "Message %d", message_number);
|
||||||
|
message_number++;
|
||||||
|
simple_udp_sendto(&unicast_connection, buf, strlen(buf) + 1, &addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
Loading…
Reference in a new issue