From ae9a65663203641f0309da3804a0e650c215198f Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Sat, 9 Jun 2018 14:38:19 +0200 Subject: [PATCH 01/14] Added examples/benchmarks directory, with code for testbed nightly runs --- examples/benchmarks/rpl-req-resp/Makefile | 26 ++ examples/benchmarks/rpl-req-resp/node.c | 156 ++++++++++ examples/benchmarks/rpl-req-resp/parse.py | 269 +++++++++++++++++ .../benchmarks/rpl-req-resp/project-conf.h | 48 +++ examples/benchmarks/rpl-req-resp/sim.csc | 275 ++++++++++++++++++ examples/benchmarks/testbeds/cooja8.c | 14 + examples/benchmarks/testbeds/sics-firefly.c | 31 ++ 7 files changed, 819 insertions(+) create mode 100644 examples/benchmarks/rpl-req-resp/Makefile create mode 100644 examples/benchmarks/rpl-req-resp/node.c create mode 100644 examples/benchmarks/rpl-req-resp/parse.py create mode 100644 examples/benchmarks/rpl-req-resp/project-conf.h create mode 100644 examples/benchmarks/rpl-req-resp/sim.csc create mode 100644 examples/benchmarks/testbeds/cooja8.c create mode 100644 examples/benchmarks/testbeds/sics-firefly.c diff --git a/examples/benchmarks/rpl-req-resp/Makefile b/examples/benchmarks/rpl-req-resp/Makefile new file mode 100644 index 000000000..4be6d431b --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/Makefile @@ -0,0 +1,26 @@ +CONTIKI_PROJECT = node +all: $(CONTIKI_PROJECT) + +MODULES_REL += ../testbeds +MODULES += os/services/deployment +MODULES += os/services/simple-energest + +CONFIG?=CONFIG_TSCH_OPTIMS + +ifeq ($(CONFIG),CONFIG_CSMA) +MAKE_MAC = MAKE_MAC_CSMA +else ifeq ($(CONFIG),CONFIG_TSCH) +MAKE_MAC = MAKE_MAC_TSCH +MODULES += os/services/orchestra +else ifeq ($(CONFIG),CONFIG_TSCH_OPTIMS) +MAKE_MAC = MAKE_MAC_TSCH +MODULES += os/services/orchestra +CFLAGS += -DCONFIG_OPTIMS=1 +else ifeq ($(CONFIG),CONFIG_TSCH_OPTIMS2) +MAKE_MAC = MAKE_MAC_TSCH +MODULES += os/services/orchestra +CFLAGS += -DCONFIG_OPTIMS=2 +endif + +CONTIKI = ../../.. +include $(CONTIKI)/Makefile.include diff --git a/examples/benchmarks/rpl-req-resp/node.c b/examples/benchmarks/rpl-req-resp/node.c new file mode 100644 index 000000000..4b92415f9 --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/node.c @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018, RISE SICS. + * 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 + * Benchmark: the root sends requests to all nodes in a randomized + * order, and receives resopnses back. + * \author + * Simon Duquennoy + */ + +#include "contiki.h" +#include "contiki-net.h" +#include "services/deployment/deployment.h" + +/* Log configuration */ +#include "sys/log.h" +#define LOG_MODULE "App" +#define LOG_LEVEL LOG_LEVEL_INFO + +#define UDP_PORT 8214 +#define SEND_INTERVAL (CLOCK_SECOND) + +static struct simple_udp_connection udp_conn; + +/*---------------------------------------------------------------------------*/ +PROCESS(app_process, "App process"); +AUTOSTART_PROCESSES(&app_process); + +/*---------------------------------------------------------------------------*/ +static void +udp_rx_callback(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) +{ + uint32_t count; + int is_response; + /* Copy and parse payload */ + memcpy(&count, data, sizeof(uint32_t)); + /* Most significant bit: request (0) / response (1) */ + is_response = count & 0x80000000; + count &= 0x7fffffff; + + if(is_response) { + LOG_INFO("Received response %"PRIu32" from ", count); + LOG_INFO_6ADDR(sender_addr); + LOG_INFO_("\n"); + } else { + LOG_INFO("Received request %"PRIu32" from ", count); + LOG_INFO_6ADDR(sender_addr); + LOG_INFO_("\n"); + LOG_INFO("Sending response %"PRIu32" to ", count); + LOG_INFO_6ADDR(sender_addr); + LOG_INFO_("\n"); + /* Set most significant bit to signal a response */ + count |= 0x80000000; + simple_udp_sendto(&udp_conn, &count, sizeof(count), sender_addr); + } +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(app_process, ev, data) +{ + static struct etimer timer; + static uip_ipaddr_t dest_ipaddr; + + PROCESS_BEGIN(); + + /* Initialize UDP connection */ + simple_udp_register(&udp_conn, UDP_PORT, NULL, + UDP_PORT, udp_rx_callback); + + if(node_id == ROOT_ID) { + /* Wait 5 seconds before starting */ + etimer_set(&timer, CLOCK_SECOND * 5); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); + + /* We are the root, start a DAG */ + NETSTACK_ROUTING.root_start(); + /* Set dest_ipaddr with DODAG ID, so we get the prefix */ + NETSTACK_ROUTING.get_root_ipaddr(&dest_ipaddr); + /* Setup a periodic timer that expires after 10 seconds. */ + etimer_set(&timer, CLOCK_SECOND * 10); + /* Wait until all nodes have joined */ + do { + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); + etimer_reset(&timer); + + if(deployment_node_count() > NETSTACK_MAX_ROUTE_ENTRIES) { + LOG_WARN("Not enough routing entries for deployment: %u/%u\n", + deployment_node_count(), NETSTACK_MAX_ROUTE_ENTRIES); + } + LOG_INFO("Node count: %u/%u\n", uip_sr_num_nodes(), deployment_node_count()); + + } while(uip_sr_num_nodes() < deployment_node_count()); + + /* Now start requesting nodes at random */ + etimer_set(&timer, SEND_INTERVAL); + while(uip_sr_num_nodes() == deployment_node_count()) { + static uint32_t count = 0; + uint16_t dest_id; + + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); + etimer_reset(&timer); + + /* Select a destination at random. Iterate until we do not select ourselve */ + do { + dest_id = deployment_id_from_index(random_rand() % deployment_node_count()); + } while(dest_id == ROOT_ID); + /* Prefix was already set, set IID now */ + deployment_iid_from_id(&dest_ipaddr, dest_id); + + /* Request: most significant bit not unset */ + LOG_INFO("Sending request %"PRIu32" to ", count); + LOG_INFO_6ADDR(&dest_ipaddr); + LOG_INFO_("\n"); + simple_udp_sendto(&udp_conn, &count, sizeof(count), &dest_ipaddr); + count++; + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/benchmarks/rpl-req-resp/parse.py b/examples/benchmarks/rpl-req-resp/parse.py new file mode 100644 index 000000000..a15b9c49b --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/parse.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python + +import re +import os +import fileinput +import math +import yaml +import pandas as pd +from pandas import * +from pylab import * +from datetime import * +from collections import OrderedDict +from IPython import embed +import matplotlib as mpl + +pd.set_option('display.max_rows', 48) +pd.set_option('display.width', None) +pd.set_option('display.max_columns', None) + +networkFormationTime = None +parents = {} + +def calculateHops(node): + hops = 0 + while(parents[node] != None): + node = parents[node] + hops += 1 + # safeguard, in case of scrambled logs + if hops > 50: + return hops + return hops + +def calculateChildren(node): + children = 0 + for n in parents.keys(): + if(parents[n] == node): + children += 1 + return children + +def updateTopology(child, parent): + global parents + if not child in parents: + parents[child] = {} + if not parent in parents: + parents[parent] = None + parents[child] = parent + +def parseRPL(log): + res = re.compile('.*? rank (\d*).*?dioint (\d*).*?nbr count (\d*)').match(log) + if res: + rank = int(res.group(1)) + trickle = (2**int(res.group(2)))/(60*1000.) + nbrCount = int(res.group(3)) + return {'event': 'rank', 'rank': rank, 'trickle': trickle } + res = re.compile('parent switch: .*? -> .*?-(\d*)$').match(log) + if res: + parent = int(res.group(1)) + return {'event': 'switch', 'pswitch': parent } + res = re.compile('sending a (.+?) ').match(log) + if res: + message = res.group(1) + return {'event': 'sending', 'message': message } + res = re.compile('links: 6G-(\d+)\s*to 6G-(\d+)').match(log) + if res: + child = int(res.group(1)) + parent = int(res.group(2)) + updateTopology(child, parent) + return None + res = re.compile('links: end of list').match(log) + if res: + # This was the last line, commit full topology + return {'event': 'topology' } + return None + +def parseEnergest(log): + res = re.compile('Radio Tx\s*:\s*(\d*)/\s*(\d+)').match(log) + if res: + tx = float(res.group(1)) + total = float(res.group(2)) + return {'channel-utilization': 100.*tx/total } + res = re.compile('Radio total\s*:\s*(\d*)/\s*(\d+)').match(log) + if res: + radio = float(res.group(1)) + total = float(res.group(2)) + return {'duty-cycle': 100.*radio/total } + return None + +def parseApp(log): + res = re.compile('Sending (.+?) (\d+) to 6G-(\d+)').match(log) + if res: + type = res.group(1) + id = int(res.group(2)) + dest = int(res.group(3)) + return {'event': 'send', 'type': type, 'id': id, 'node': dest } + res = re.compile('Received (.+?) (\d+) from 6G-(\d+)').match(log) + if res: + type = res.group(1) + id = int(res.group(2)) + src = int(res.group(3)) + return {'event': 'recv', 'type': type, 'id': id, 'src': src } + return None + +def parseLine(line): + res = re.compile('\s*([.\d]+)\\tID:(\d+)\\t\[(.*?):(.*?)\](.*)$').match(line) + if res: + time = float(res.group(1)) + nodeid = int(res.group(2)) + level = res.group(3).strip() + module = res.group(4).strip() + log = res.group(5).strip() + return time, nodeid, level, module, log + return None, None, None, None, None + +def doParse(file): + global networkFormationTime + + time = None + lastPrintedTime = 0 + + arrays = { + "packets": [], + "energest": [], + "ranks": [], + "trickle": [], + "switches": [], + "topology": [], + } + +# print("\nProcessing %s" %(file)) + # Filter out non-printable chars from log file + os.system("cat %s | tr -dc '[:print:]\n\t' | sponge %s" %(file, file)) + for line in open(file, 'r').readlines(): + # match time, id, module, log; The common format for all log lines + time, nodeid, level, module, log = parseLine(line) + + if time == None: + # malformed line + continue + + if time - lastPrintedTime >= 60: +# print("%u, "%(time / 60),end='', flush=True) + lastPrintedTime = time + + entry = { + "timestamp": timedelta(seconds=time), + "node": nodeid, + } + + try: + if module == "App": + ret = parseApp(log) + if(ret != None): + entry.update(ret) + if(ret['event'] == 'send' and ret['type'] == 'request'): + # populate series of sent requests + entry['pdr'] = 0. + arrays["packets"].append(entry) + if networkFormationTime == None: + networkFormationTime = time + elif(ret['event'] == 'recv' and ret['type'] == 'response'): + # update sent request series with latency and PDR + txElement = [x for x in arrays["packets"] if x['event']=='send' and x['id']==ret['id']][0] + txElement['latency'] = time - txElement['timestamp'].seconds + txElement['pdr'] = 100. + + if module == "Energest": + ret = parseEnergest(log) + if(ret != None): + entry.update(ret) + arrays["energest"].append(entry) + + if module == "RPL": + ret = parseRPL(log) + if(ret != None): + entry.update(ret) + if(ret['event'] == 'rank'): + arrays["ranks"].append(entry) + arrays["trickle"].append(entry) + elif(ret['event'] == 'switch'): + arrays["switches"].append(entry) + elif(ret['event'] == 'sending'): + if not ret['message'] in arrays: + arrays[ret['message']] = [] + arrays[ret['message']].append(entry) + elif(ret['event'] == 'topology'): + for n in parents.keys(): + nodeEntry = entry.copy() + nodeEntry["node"] = n + nodeEntry["hops"] = calculateHops(n) + nodeEntry["children"] = calculateChildren(n) + arrays["topology"].append(nodeEntry) + except: # typical exception: failed str conversion to int, due to lossy logs + print("Exception: %s" %(str(sys.exc_info()[0]))) + continue + +# print("") + + # Remove last few packets -- might be in-flight when test stopped + arrays["packets"] = arrays["packets"][0:-10] + + dfs = {} + for key in arrays.keys(): + if(len(arrays[key]) > 0): + df = DataFrame(arrays[key]) + dfs[key] = df.set_index("timestamp") + + return dfs + +def outputStats(dfs, key, metric, agg, name, metricLabel = None): + if not key in dfs: + return + + df = dfs[key] + perNode = getattr(df.groupby("node")[metric], agg)() + perTime = getattr(df.groupby([pd.Grouper(freq="2Min")])[metric], agg)() + + print(" %s:" %(metricLabel if metricLabel != None else metric)) + print(" name: %s" %(name)) + print(" per-node:") + print(" x: [%s]" %(", ".join(["%u"%x for x in sort(df.node.unique())]))) + print(" y: [%s]" %(', '.join(["%.4f"%(x) for x in perNode]))) + print(" per-time:") + print(" x: [%s]" %(", ".join(["%u"%x for x in range(0, 2*len(df.groupby([pd.Grouper(freq="2Min")]).mean().index), 2)]))) + print(" y: [%s]" %(', '.join(["%.4f"%(x) for x in perTime]).replace("nan", "null"))) + +def main(): + if len(sys.argv) < 1: + return + else: + file = sys.argv[1].rstrip('/') + + # Parse the original log + dfs = doParse(file) + + if len(dfs) == 0: + return + + print("global-stats:") + print(" pdr: %.4f" %(dfs["packets"]["pdr"].mean())) + print(" loss-rate: %.e" %(1-(dfs["packets"]["pdr"].mean()/100))) + print(" packets-sent: %u" %(dfs["packets"]["pdr"].count())) + print(" packets-received: %u" %(dfs["packets"]["pdr"].sum()/100)) + print(" latency: %.4f" %(dfs["packets"]["latency"].mean())) + print(" duty-cycle: %.2f" %(dfs["energest"]["duty-cycle"].mean())) + print(" channel-utilization: %.2f" %(dfs["energest"]["channel-utilization"].mean())) + print(" network-formation-time: %.2f" %(networkFormationTime)) + print("stats:") + + # Output relevant metrics + outputStats(dfs, "packets", "pdr", "mean", "Round-trip PDR (%)") + outputStats(dfs, "packets", "latency", "mean", "Round-trip latency (s)") + + outputStats(dfs, "energest", "duty-cycle", "mean", "Radio duty cycle (%)") + outputStats(dfs, "energest", "channel-utilization", "mean", "Channel utilization (%)") + + outputStats(dfs, "ranks", "rank", "mean", "RPL rank (ETX-128)") + outputStats(dfs, "switches", "pswitch", "count", "RPL parent switches (#)") + outputStats(dfs, "trickle", "trickle", "mean", "RPL Trickle period (min)") + + outputStats(dfs, "DIS", "message", "count", "RPL DIS sent (#)", "rpl-dis") + outputStats(dfs, "unicast-DIO", "message", "count", "RPL uDIO sent (#)", "rpl-udio") + outputStats(dfs, "multicast-DIO", "message", "count", "RPL mDIO sent (#)", "rpl-mdio") + outputStats(dfs, "DAO", "message", "count", "RPL DAO sent (#)", "rpl-dao") + outputStats(dfs, "DAO-ACK", "message", "count", "RPL DAO-ACK sent (#)", "rpl-daoack") + + outputStats(dfs, "topology", "hops", "mean", "RPL hop count (#)") + outputStats(dfs, "topology", "children", "mean", "RPL children count (#)") + +main() diff --git a/examples/benchmarks/rpl-req-resp/project-conf.h b/examples/benchmarks/rpl-req-resp/project-conf.h new file mode 100644 index 000000000..1140bb9e5 --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/project-conf.h @@ -0,0 +1,48 @@ +#ifndef PROJECT_CONF_H_ +#define PROJECT_CONF_H_ + +/* Testbed configuration */ +#define ROOT_ID 1 +#if CONTIKI_TARGET_COOJA +#define DEPLOYMENT_MAPPING deployment_cooja8 +#else /* CONTIKI_TARGET_COOJA */ +#define DEPLOYMENT_MAPPING deployment_sics_firefly +#endif /* CONTIKI_TARGET_COOJA */ +#define IEEE802154_CONF_PANID 0x8921 + +/* Logging */ +#define LOG_CONF_LEVEL_RPL LOG_LEVEL_INFO +#define LOG_CONF_LEVEL_MAC LOG_LEVEL_WARN +#define LOG_CONF_WITH_COMPACT_ADDR 1 + +/* Provisioning */ +#define NETSTACK_MAX_ROUTE_ENTRIES 25 +#define NBR_TABLE_CONF_MAX_NEIGHBORS 8 + +#if CONFIG_OPTIMS >= 1 + +/* RPL configuration */ +#define RPL_MRHOF_CONF_SQUARED_ETX 1 +#define RPL_CONF_MAX_RANKINC 0 + +/* TSCH configuration */ +#define TSCH_CONF_RX_WAIT 1000 +#define ORCHESTRA_CONF_UNICAST_PERIOD 7 + +#if CONFIG_OPTIMS == 2 + +/* Five nines reliability paper used the config below */ +#define RPL_CONF_DIO_INTERVAL_MIN 14 /* 2^14 ms = 16.384 s */ +#define RPL_CONF_DIO_INTERVAL_DOUBLINGS 6 /* 2^(14+6) ms = 1048.576 s */ +#define RPL_CONF_PROBING_INTERVAL (60 * CLOCK_SECOND) + +/* Five nines reliability paper used the config below */ +#define TSCH_CONF_KEEPALIVE_TIMEOUT (20 * CLOCK_SECOND) +#define TSCH_CONF_MAX_KEEPALIVE_TIMEOUT (60 * CLOCK_SECOND) +//#define TSCH_CONF_EB_PERIOD (16 * CLOCK_SECOND) +//#define TSCH_CONF_MAX_EB_PERIOD (50 * CLOCK_SECOND) + +#endif +#endif + +#endif /* PROJECT_CONF_H_ */ diff --git a/examples/benchmarks/rpl-req-resp/sim.csc b/examples/benchmarks/rpl-req-resp/sim.csc new file mode 100644 index 000000000..d973a1d8d --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/sim.csc @@ -0,0 +1,275 @@ + + + [APPS_DIR]/mrm + [APPS_DIR]/mspsim + [APPS_DIR]/avrora + [APPS_DIR]/serial_socket + [APPS_DIR]/powertracker + + My simulation + 123456 + 1000000 + + org.contikios.cooja.radiomediums.UDGM + 50.0 + 100.0 + 1.0 + 1.0 + + + 40000 + + + org.contikios.cooja.contikimote.ContikiMoteType + mtype90 + Cooja Mote Type #1 + [CONTIKI_DIR]/examples/benchmarks/rpl-req-resp/node.c + make node.cooja TARGET=cooja + org.contikios.cooja.interfaces.Position + org.contikios.cooja.interfaces.Battery + org.contikios.cooja.contikimote.interfaces.ContikiVib + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + org.contikios.cooja.contikimote.interfaces.ContikiRS232 + org.contikios.cooja.contikimote.interfaces.ContikiBeeper + org.contikios.cooja.interfaces.RimeAddress + org.contikios.cooja.contikimote.interfaces.ContikiIPAddress + org.contikios.cooja.contikimote.interfaces.ContikiRadio + org.contikios.cooja.contikimote.interfaces.ContikiButton + org.contikios.cooja.contikimote.interfaces.ContikiPIR + org.contikios.cooja.contikimote.interfaces.ContikiClock + org.contikios.cooja.contikimote.interfaces.ContikiLED + org.contikios.cooja.contikimote.interfaces.ContikiCFS + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + org.contikios.cooja.interfaces.Mote2MoteRelations + org.contikios.cooja.interfaces.MoteAttributes + false + + + + org.contikios.cooja.interfaces.Position + 12.478629242391953 + 42.201041276604826 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 1 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 25.625935608473608 + 82.53975431376661 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 2 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 51.615094138350024 + 59.70602651475372 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 3 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 41.04314122620578 + 121.24693889311891 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 4 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 64.9463558635099 + 104.25039302469283 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 5 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 93.59263858654369 + 75.40399148300003 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 6 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 75.6297158696234 + 139.97002035548905 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 7 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 104.34293924684245 + 116.07658566915099 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 8 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.plugins.SimControl + 280 + 2 + 160 + 400 + 0 + + + org.contikios.cooja.plugins.Visualizer + + true + org.contikios.cooja.plugins.skins.IDVisualizerSkin + org.contikios.cooja.plugins.skins.GridVisualizerSkin + org.contikios.cooja.plugins.skins.TrafficVisualizerSkin + org.contikios.cooja.plugins.skins.UDGMVisualizerSkin + 2.4250860844175466 0.0 0.0 2.4250860844175466 35.26895372864869 -46.9106236441515 + + 400 + 3 + 400 + 1 + 1 + + + org.contikios.cooja.plugins.LogListener + + App + + + + 827 + 0 + 665 + 681 + -1 + + + org.contikios.cooja.plugins.TimeLine + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + 500.0 + + 1539 + 1 + 263 + 0 + 709 + + diff --git a/examples/benchmarks/testbeds/cooja8.c b/examples/benchmarks/testbeds/cooja8.c new file mode 100644 index 000000000..f6ccaec97 --- /dev/null +++ b/examples/benchmarks/testbeds/cooja8.c @@ -0,0 +1,14 @@ +#include "services/deployment/deployment.h" + +/** \brief A mapping table for a 8-node Cooja mote simulation. */ +const struct id_mac deployment_cooja8[] = { + { 1, {{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01}}}, + { 2, {{0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02}}}, + { 3, {{0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03}}}, + { 4, {{0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04}}}, + { 5, {{0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05}}}, + { 6, {{0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06}}}, + { 7, {{0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07}}}, + { 8, {{0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08}}}, + { 0, {{0}}} +}; diff --git a/examples/benchmarks/testbeds/sics-firefly.c b/examples/benchmarks/testbeds/sics-firefly.c new file mode 100644 index 000000000..0478dc65d --- /dev/null +++ b/examples/benchmarks/testbeds/sics-firefly.c @@ -0,0 +1,31 @@ +#include "services/deployment/deployment.h" + +/** \brief The 25-node RISE SICS node testbed. Firefly-reva nodes. */ +const struct id_mac deployment_sics_firefly[] = { + { 1, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb6,0x14}}}, + { 2, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xe7}}}, + { 3, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x35}}}, + { 4, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xcf}}}, + { 5, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb2,0x06}}}, + { 6, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x5f}}}, + { 8, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x91}}}, + { 7, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x29}}}, + { 9, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xc6}}}, + { 10, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x63}}}, + { 12, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb2,0x03}}}, + { 11, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x3b}}}, + { 13, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb6,0x0d}}}, + { 14, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb5,0x66}}}, + { 15, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb5,0x8a}}}, + { 16, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x49}}}, + { 17, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x35}}}, + { 18, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb2,0x15}}}, + { 19, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb5,0xfc}}}, + { 20, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xa8}}}, + { 21, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x6a}}}, + { 22, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x5b}}}, + { 23, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xe6}}}, + { 24, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb6,0x00}}}, + { 25, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xb8}}}, + { 0, {{0}}} +}; From fd310067b981df1989f182e378ae92c55de63335 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Sat, 9 Jun 2018 14:40:35 +0200 Subject: [PATCH 02/14] Added CI test for benchmarks/rpl-req-resp --- tests/03-compile-arm-ports-02/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/03-compile-arm-ports-02/Makefile b/tests/03-compile-arm-ports-02/Makefile index 7efb1b14b..190d36e4d 100644 --- a/tests/03-compile-arm-ports-02/Makefile +++ b/tests/03-compile-arm-ports-02/Makefile @@ -39,6 +39,7 @@ libs/data-structures/zoul \ libs/ipv6-uipbuf/zoul \ nullnet/zoul \ slip-radio/zoul \ +benchmarks/rpl-req-resp/zoul \ dev/gpio-hal/zoul:BOARD=remote-reva \ dev/gpio-hal/zoul:BOARD=remote-revb \ dev/gpio-hal/zoul:BOARD=firefly-reva \ From 3cb82e7d6c521fda0a9e4a2e01724f3cce139f97 Mon Sep 17 00:00:00 2001 From: tdesmet Date: Tue, 14 Aug 2018 21:23:11 +0200 Subject: [PATCH 03/14] Add option to validate dio before init dag --- os/net/routing/rpl-lite/rpl-conf.h | 7 +++++++ os/net/routing/rpl-lite/rpl-dag.c | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/os/net/routing/rpl-lite/rpl-conf.h b/os/net/routing/rpl-lite/rpl-conf.h index 8d2f4b7b9..9b8a12adb 100644 --- a/os/net/routing/rpl-lite/rpl-conf.h +++ b/os/net/routing/rpl-lite/rpl-conf.h @@ -191,6 +191,13 @@ #define RPL_DEFAULT_LEAF_ONLY 0 #endif +/* + * Function used to validate dio before using it to init dag + */ +#ifdef RPL_CONF_VALIDATE_DIO_FUNC +#define RPL_VALIDATE_DIO_FUNC RPL_CONF_VALIDATE_DIO_FUNC +#endif + /******************************************************************************/ /********************************** Timing ************************************/ /******************************************************************************/ diff --git a/os/net/routing/rpl-lite/rpl-dag.c b/os/net/routing/rpl-lite/rpl-dag.c index 68d9e7aaa..09caa9625 100644 --- a/os/net/routing/rpl-lite/rpl-dag.c +++ b/os/net/routing/rpl-lite/rpl-dag.c @@ -61,6 +61,12 @@ static int init_dag_from_dio(rpl_dio_t *dio); /* Allocate instance table. */ rpl_instance_t curr_instance; +/*---------------------------------------------------------------------------*/ + +#ifdef RPL_VALIDATE_DIO_FUNC +int RPL_VALIDATE_DIO_FUNC(rpl_dio_t *dio); +#endif /* RPL_PROBING_SELECT_FUNC */ + /*---------------------------------------------------------------------------*/ const char * rpl_dag_state_to_str(enum rpl_dag_state state) @@ -542,6 +548,13 @@ init_dag_from_dio(rpl_dio_t *dio) static int process_dio_init_dag(uip_ipaddr_t *from, rpl_dio_t *dio) { +#ifdef RPL_VALIDATE_DIO_FUNC + if(!RPL_VALIDATE_DIO_FUNC(dio)) { + LOG_WARN("DIO validation failed\n"); + return 0; + } +#endif + /* Check MOP */ if(dio->mop != RPL_MOP_NO_DOWNWARD_ROUTES && dio->mop != RPL_MOP_NON_STORING) { LOG_WARN("ignoring DIO with an unsupported MOP: %d\n", dio->mop); From 8930ca7b2df91ae04214597621203362f8866ff1 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Wed, 22 Aug 2018 23:39:41 +0100 Subject: [PATCH 04/14] Update cc2538-bsl to latest This commit updates cc2538-bsl to its latest version. This latest version improves CC2640R2 detection and also adds support for detection of more chip packages. --- tools/cc2538-bsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cc2538-bsl b/tools/cc2538-bsl index edb3c8c73..59fd804b8 160000 --- a/tools/cc2538-bsl +++ b/tools/cc2538-bsl @@ -1 +1 @@ -Subproject commit edb3c8c73c4688ebd336b278450db216512a769b +Subproject commit 59fd804b80aec868d74ce37c6195086b817981ea From b18320415d208292c0951d0320ef3e13777c3dbe Mon Sep 17 00:00:00 2001 From: Andreas Urke Date: Thu, 30 Aug 2018 13:48:36 +0200 Subject: [PATCH 05/14] Fix incorrect parsing of record TTL into expiration time --- os/net/ipv6/resolv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/os/net/ipv6/resolv.c b/os/net/ipv6/resolv.c index f75a084a9..2bcd3983b 100644 --- a/os/net/ipv6/resolv.c +++ b/os/net/ipv6/resolv.c @@ -1017,7 +1017,8 @@ newdata(void) namemapptr->state = STATE_DONE; #if RESOLV_SUPPORTS_RECORD_EXPIRATION - namemapptr->expiration = ans->ttl[1] + (ans->ttl[0] << 8); + namemapptr->expiration = (uint32_t) uip_ntohs(ans->ttl[0]) << 16 | + (uint32_t) uip_ntohs(ans->ttl[1]); namemapptr->expiration += clock_seconds(); #endif /* RESOLV_SUPPORTS_RECORD_EXPIRATION */ From cbba3750b64e67cdd4bf95916b4437d2a21f74ef Mon Sep 17 00:00:00 2001 From: Tom De Smet Date: Fri, 31 Aug 2018 08:50:45 +0200 Subject: [PATCH 06/14] Bump tinydtls to latest commit --- os/net/security/tinydtls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/os/net/security/tinydtls b/os/net/security/tinydtls index 5da931eeb..53a0d97da 160000 --- a/os/net/security/tinydtls +++ b/os/net/security/tinydtls @@ -1 +1 @@ -Subproject commit 5da931eeb78d1cd4a1e0068a91de9b78bd3f66de +Subproject commit 53a0d97da748a67093c49cb38744650c71d58c4d From 54e5944d89853634b12540431a762eb6cf3de7d5 Mon Sep 17 00:00:00 2001 From: Olav Frengstad Date: Fri, 31 Aug 2018 14:56:11 +0200 Subject: [PATCH 07/14] RPL-CLASSIC: Add guard for urgent probing Compiling with RPL_CONF_WITH_PROBING := 0 was not possible due to `urgent_probing_target` not present. --- os/net/routing/rpl-classic/rpl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/os/net/routing/rpl-classic/rpl.c b/os/net/routing/rpl-classic/rpl.c index ecbcdc158..751bc6ef1 100644 --- a/os/net/routing/rpl-classic/rpl.c +++ b/os/net/routing/rpl-classic/rpl.c @@ -268,9 +268,11 @@ rpl_link_callback(const linkaddr_t *addr, int status, int numtx) if(parent != NULL) { /* If this is the neighbor we were probing urgently, mark urgent probing as done */ +#if RPL_WITH_PROBING if(instance->urgent_probing_target == parent) { instance->urgent_probing_target = NULL; } +#endif /* RPL_WITH_PROBING */ /* Trigger DAG rank recalculation. */ PRINTF("RPL: rpl_link_callback triggering update\n"); parent->flags |= RPL_PARENT_FLAG_UPDATED; From 61f6b704dbcca529b20043213ee0de0716ab6a25 Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Fri, 31 Aug 2018 17:22:04 +0100 Subject: [PATCH 08/14] TSCH: improve the readability of add_link and remove_link messages --- os/net/mac/tsch/tsch-schedule.c | 51 ++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/os/net/mac/tsch/tsch-schedule.c b/os/net/mac/tsch/tsch-schedule.c index 4f94b8e30..3785cacb2 100644 --- a/os/net/mac/tsch/tsch-schedule.c +++ b/os/net/mac/tsch/tsch-schedule.c @@ -171,6 +171,45 @@ tsch_schedule_get_link_by_handle(uint16_t handle) return NULL; } /*---------------------------------------------------------------------------*/ +static const char * +print_link_options(uint16_t link_options) +{ + static char buffer[20]; + unsigned length; + + buffer[0] = '\0'; + if(link_options & LINK_OPTION_TX) { + strcat(buffer, "Tx|"); + } + if(link_options & LINK_OPTION_RX) { + strcat(buffer, "Rx|"); + } + if(link_options & LINK_OPTION_SHARED) { + strcat(buffer, "Sh|"); + } + length = strlen(buffer); + if(length > 0) { + buffer[length - 1] = '\0'; + } + + return buffer; +} +/*---------------------------------------------------------------------------*/ +static const char * +print_link_type(uint16_t link_type) +{ + switch(link_type) { + case LINK_TYPE_NORMAL: + return "NORMAL"; + case LINK_TYPE_ADVERTISING: + return "ADV"; + case LINK_TYPE_ADVERTISING_ONLY: + return "ADV_ONLY"; + default: + return "?"; + } +} +/*---------------------------------------------------------------------------*/ /* Adds a link to a slotframe, return a pointer to it (NULL if failure) */ struct tsch_link * tsch_schedule_add_link(struct tsch_slotframe *slotframe, @@ -218,8 +257,10 @@ tsch_schedule_add_link(struct tsch_slotframe *slotframe, } linkaddr_copy(&l->addr, address); - LOG_INFO("add_link %u %u %u %u %u ", - slotframe->handle, link_options, link_type, timeslot, channel_offset); + LOG_INFO("add_link sf=%u opt=%s type=%s ts=%u ch=%u addr=", + slotframe->handle, + print_link_options(link_options), + print_link_type(link_type), timeslot, channel_offset); LOG_INFO_LLADDR(address); LOG_INFO_("\n"); /* Release the lock before we update the neighbor (will take the lock) */ @@ -260,8 +301,10 @@ tsch_schedule_remove_link(struct tsch_slotframe *slotframe, struct tsch_link *l) if(l == current_link) { current_link = NULL; } - LOG_INFO("remove_link %u %u %u %u ", - slotframe->handle, l->link_options, l->timeslot, l->channel_offset); + LOG_INFO("remove_link sf=%u opt=%s type=%s ts=%u ch=%u addr=", + slotframe->handle, + print_link_options(l->link_options), + print_link_type(l->link_type), l->timeslot, l->channel_offset); LOG_INFO_LLADDR(&l->addr); LOG_INFO_("\n"); From d953adf0cb0b908f153437e3055c0773ef1d77f2 Mon Sep 17 00:00:00 2001 From: Olav Frengstad Date: Tue, 4 Sep 2018 18:31:48 +0200 Subject: [PATCH 09/14] Make cc26xx radio driver configurable in prop mode operation It's already possible to override the default radio driver when operating in IEEE mode. This patch opens up for users defining their own radio driver when using prop mode. This is useful when overriding certain radio driver functions. --- arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-conf.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-conf.h b/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-conf.h index df1ca0440..6ff047ebe 100644 --- a/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-conf.h +++ b/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-conf.h @@ -71,7 +71,9 @@ #endif /* CPU_FAMILY_CC13XX */ #if CC13XX_CONF_PROP_MODE +#ifndef NETSTACK_CONF_RADIO #define NETSTACK_CONF_RADIO prop_mode_driver +#endif /* NETSTACK_CONF_RADIO */ /* Channels count from 0 upwards in IEEE 802.15.4g */ #ifndef IEEE802154_CONF_DEFAULT_CHANNEL From 57f1042bf3c6fbe52d98ba454f0be8c0a898659a Mon Sep 17 00:00:00 2001 From: Afonso Oliveira Date: Fri, 7 Sep 2018 16:39:53 +0100 Subject: [PATCH 10/14] add qualifier const to uip-ds6-route methods --- os/net/ipv6/tcpip.c | 10 +++++----- os/net/ipv6/uip-ds6-route.c | 22 +++++++++++----------- os/net/ipv6/uip-ds6-route.h | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/os/net/ipv6/tcpip.c b/os/net/ipv6/tcpip.c index 5db4b9a21..8d546c1d7 100644 --- a/os/net/ipv6/tcpip.c +++ b/os/net/ipv6/tcpip.c @@ -480,7 +480,7 @@ output_fallback(void) } /*---------------------------------------------------------------------------*/ static void -annotate_transmission(uip_ipaddr_t *nexthop) +annotate_transmission(const uip_ipaddr_t *nexthop) { #if TCPIP_CONF_ANNOTATE_TRANSMISSIONS static uint8_t annotate_last; @@ -495,10 +495,10 @@ annotate_transmission(uip_ipaddr_t *nexthop) #endif /* TCPIP_CONF_ANNOTATE_TRANSMISSIONS */ } /*---------------------------------------------------------------------------*/ -static uip_ipaddr_t* +static const uip_ipaddr_t* get_nexthop(uip_ipaddr_t *addr) { - uip_ipaddr_t *nexthop; + const uip_ipaddr_t *nexthop; uip_ds6_route_t *route; LOG_INFO("output: processing %u bytes packet from ", uip_len); @@ -597,7 +597,7 @@ send_queued(uip_ds6_nbr_t *nbr) } /*---------------------------------------------------------------------------*/ static int -send_nd6_ns(uip_ipaddr_t *nexthop) +send_nd6_ns(const uip_ipaddr_t *nexthop) { int err = 1; @@ -638,7 +638,7 @@ tcpip_ipv6_output(void) uip_ipaddr_t ipaddr; uip_ds6_nbr_t *nbr = NULL; const uip_lladdr_t *linkaddr; - uip_ipaddr_t *nexthop; + const uip_ipaddr_t *nexthop; if(uip_len == 0) { return; diff --git a/os/net/ipv6/uip-ds6-route.c b/os/net/ipv6/uip-ds6-route.c index a8fdd88fb..08cfce80c 100644 --- a/os/net/ipv6/uip-ds6-route.c +++ b/os/net/ipv6/uip-ds6-route.c @@ -133,8 +133,8 @@ assert_nbr_routes_list_sane(void) /*---------------------------------------------------------------------------*/ #if UIP_DS6_NOTIFICATIONS static void -call_route_callback(int event, uip_ipaddr_t *route, - uip_ipaddr_t *nexthop) +call_route_callback(int event, const uip_ipaddr_t *route, + const uip_ipaddr_t *nexthop) { int num; struct uip_ds6_notification *n; @@ -199,7 +199,7 @@ uip_ds6_route_nexthop_lladdr(uip_ds6_route_t *route) } #endif /* (UIP_MAX_ROUTES != 0) */ /*---------------------------------------------------------------------------*/ -uip_ipaddr_t * +const uip_ipaddr_t * uip_ds6_route_nexthop(uip_ds6_route_t *route) { #if (UIP_MAX_ROUTES != 0) @@ -263,7 +263,7 @@ uip_ds6_route_num_routes(void) } /*---------------------------------------------------------------------------*/ uip_ds6_route_t * -uip_ds6_route_lookup(uip_ipaddr_t *addr) +uip_ds6_route_lookup(const uip_ipaddr_t *addr) { #if (UIP_MAX_ROUTES != 0) uip_ds6_route_t *r; @@ -321,8 +321,8 @@ uip_ds6_route_lookup(uip_ipaddr_t *addr) } /*---------------------------------------------------------------------------*/ uip_ds6_route_t * -uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, - uip_ipaddr_t *nexthop) +uip_ds6_route_add(const uip_ipaddr_t *ipaddr, uint8_t length, + const uip_ipaddr_t *nexthop) { #if (UIP_MAX_ROUTES != 0) uip_ds6_route_t *r; @@ -350,7 +350,7 @@ uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, one first. */ r = uip_ds6_route_lookup(ipaddr); if(r != NULL) { - uip_ipaddr_t *current_nexthop; + const uip_ipaddr_t *current_nexthop; current_nexthop = uip_ds6_route_nexthop(r); if(current_nexthop != NULL && uip_ipaddr_cmp(nexthop, current_nexthop)) { /* no need to update route - already correct! */ @@ -580,7 +580,7 @@ rm_routelist_callback(nbr_table_item_t *ptr) #endif /* (UIP_MAX_ROUTES != 0) */ /*---------------------------------------------------------------------------*/ void -uip_ds6_route_rm_by_nexthop(uip_ipaddr_t *nexthop) +uip_ds6_route_rm_by_nexthop(const uip_ipaddr_t *nexthop) { #if (UIP_MAX_ROUTES != 0) /* Get routing entry list of this neighbor */ @@ -601,7 +601,7 @@ uip_ds6_defrt_head(void) } /*---------------------------------------------------------------------------*/ uip_ds6_defrt_t * -uip_ds6_defrt_add(uip_ipaddr_t *ipaddr, unsigned long interval) +uip_ds6_defrt_add(const uip_ipaddr_t *ipaddr, unsigned long interval) { uip_ds6_defrt_t *d; @@ -684,7 +684,7 @@ uip_ds6_defrt_rm(uip_ds6_defrt_t *defrt) } /*---------------------------------------------------------------------------*/ uip_ds6_defrt_t * -uip_ds6_defrt_lookup(uip_ipaddr_t *ipaddr) +uip_ds6_defrt_lookup(const uip_ipaddr_t *ipaddr) { uip_ds6_defrt_t *d; if(ipaddr == NULL) { @@ -700,7 +700,7 @@ uip_ds6_defrt_lookup(uip_ipaddr_t *ipaddr) return NULL; } /*---------------------------------------------------------------------------*/ -uip_ipaddr_t * +const uip_ipaddr_t * uip_ds6_defrt_choose(void) { uip_ds6_defrt_t *d; diff --git a/os/net/ipv6/uip-ds6-route.h b/os/net/ipv6/uip-ds6-route.h index 9f435824c..69ab18f5b 100644 --- a/os/net/ipv6/uip-ds6-route.h +++ b/os/net/ipv6/uip-ds6-route.h @@ -89,8 +89,8 @@ void uip_ds6_route_init(void); #define UIP_DS6_NOTIFICATION_ROUTE_RM 3 typedef void (* uip_ds6_notification_callback)(int event, - uip_ipaddr_t *route, - uip_ipaddr_t *nexthop, + const uip_ipaddr_t *route, + const uip_ipaddr_t *nexthop, int num_routes); struct uip_ds6_notification { struct uip_ds6_notification *next; @@ -201,11 +201,11 @@ typedef struct uip_ds6_defrt { /** \name Default router list basic routines */ /** @{ */ uip_ds6_defrt_t *uip_ds6_defrt_head(void); -uip_ds6_defrt_t *uip_ds6_defrt_add(uip_ipaddr_t *ipaddr, +uip_ds6_defrt_t *uip_ds6_defrt_add(const uip_ipaddr_t *ipaddr, unsigned long interval); void uip_ds6_defrt_rm(uip_ds6_defrt_t *defrt); -uip_ds6_defrt_t *uip_ds6_defrt_lookup(uip_ipaddr_t *ipaddr); -uip_ipaddr_t *uip_ds6_defrt_choose(void); +uip_ds6_defrt_t *uip_ds6_defrt_lookup(const uip_ipaddr_t *ipaddr); +const uip_ipaddr_t *uip_ds6_defrt_choose(void); void uip_ds6_defrt_periodic(void); /** @} */ @@ -213,13 +213,13 @@ void uip_ds6_defrt_periodic(void); /** \name Routing Table basic routines */ /** @{ */ -uip_ds6_route_t *uip_ds6_route_lookup(uip_ipaddr_t *destipaddr); -uip_ds6_route_t *uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, - uip_ipaddr_t *next_hop); +uip_ds6_route_t *uip_ds6_route_lookup(const uip_ipaddr_t *destipaddr); +uip_ds6_route_t *uip_ds6_route_add(const uip_ipaddr_t *ipaddr, uint8_t length, + const uip_ipaddr_t *next_hop); void uip_ds6_route_rm(uip_ds6_route_t *route); -void uip_ds6_route_rm_by_nexthop(uip_ipaddr_t *nexthop); +void uip_ds6_route_rm_by_nexthop(const uip_ipaddr_t *nexthop); -uip_ipaddr_t *uip_ds6_route_nexthop(uip_ds6_route_t *); +const uip_ipaddr_t *uip_ds6_route_nexthop(uip_ds6_route_t *); int uip_ds6_route_num_routes(void); uip_ds6_route_t *uip_ds6_route_head(void); uip_ds6_route_t *uip_ds6_route_next(uip_ds6_route_t *); From f6fff896fcf77c83cde6af76a2e442af22c0591f Mon Sep 17 00:00:00 2001 From: Afonso Oliveira Date: Sat, 8 Sep 2018 01:14:22 +0100 Subject: [PATCH 11/14] add const qualifier to tests that require it --- tests/15-rpl-classic/code/receiver-node.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/15-rpl-classic/code/receiver-node.c b/tests/15-rpl-classic/code/receiver-node.c index 20bf165f8..798aea84d 100644 --- a/tests/15-rpl-classic/code/receiver-node.c +++ b/tests/15-rpl-classic/code/receiver-node.c @@ -94,7 +94,7 @@ set_global_address(void) #if RPL_WITH_STORING uint8_t should_blink = 1; static void -route_callback(int event, uip_ipaddr_t *route, uip_ipaddr_t *ipaddr, int num_routes) +route_callback(int event, const uip_ipaddr_t *route, const uip_ipaddr_t *ipaddr, int num_routes) { if(event == UIP_DS6_NOTIFICATION_DEFRT_ADD) { should_blink = 0; From bce71648278ece87e70183b3b018549cc7a5a2bb Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 9 Sep 2018 20:10:53 +0100 Subject: [PATCH 12/14] Fix RPL classic compilation for TARGET sky --- os/net/routing/rpl-classic/rpl-dag-root.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/os/net/routing/rpl-classic/rpl-dag-root.c b/os/net/routing/rpl-classic/rpl-dag-root.c index 17ac24d33..3a0162627 100644 --- a/os/net/routing/rpl-classic/rpl-dag-root.c +++ b/os/net/routing/rpl-classic/rpl-dag-root.c @@ -48,6 +48,7 @@ static void set_global_address(uip_ipaddr_t *prefix, uip_ipaddr_t *iid) { static uip_ipaddr_t root_ipaddr; + int i; /* Assign a unique local address (RFC4193, http://tools.ietf.org/html/rfc4193). */ @@ -68,7 +69,7 @@ set_global_address(uip_ipaddr_t *prefix, uip_ipaddr_t *iid) uint8_t state; LOG_DBG("IPv6 addresses: "); - for(int i = 0; i < UIP_DS6_ADDR_NB; i++) { + 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)) { From dc294cbabb58a91fcc3a44e9d3543970e3e240a8 Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Sun, 9 Sep 2018 21:49:10 +0100 Subject: [PATCH 13/14] build-all.sh: there is also launchpad/cc1310 board --- tests/compile-all/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/compile-all/build.sh b/tests/compile-all/build.sh index 795343eeb..d790d7f50 100755 --- a/tests/compile-all/build.sh +++ b/tests/compile-all/build.sh @@ -100,7 +100,7 @@ do if [[ "$platform" == "srf06-cc26xx" ]] then # srf06-cc26xx has multiple boards - BOARDS="srf06/cc26xx srf06/cc13xx launchpad/cc2650 launchpad/cc1350 sensortag/cc2650 sensortag/cc1350" + BOARDS="srf06/cc26xx srf06/cc13xx launchpad/cc2650 launchpad/cc1310 launchpad/cc1350 sensortag/cc2650 sensortag/cc1350" elif [[ "$platform" == "zoul" ]] then # Zoul has multiple boards From 1e7e721395c04e4f9f0d13fbc191331d4d2ffa0b Mon Sep 17 00:00:00 2001 From: Afonso Oliveira Date: Mon, 10 Sep 2018 10:49:06 +0100 Subject: [PATCH 14/14] correct identation --- os/net/ipv6/uip-ds6-route.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/os/net/ipv6/uip-ds6-route.c b/os/net/ipv6/uip-ds6-route.c index 08cfce80c..ed263edc4 100644 --- a/os/net/ipv6/uip-ds6-route.c +++ b/os/net/ipv6/uip-ds6-route.c @@ -134,7 +134,7 @@ assert_nbr_routes_list_sane(void) #if UIP_DS6_NOTIFICATIONS static void call_route_callback(int event, const uip_ipaddr_t *route, - const uip_ipaddr_t *nexthop) + const uip_ipaddr_t *nexthop) { int num; struct uip_ds6_notification *n; @@ -322,7 +322,7 @@ uip_ds6_route_lookup(const uip_ipaddr_t *addr) /*---------------------------------------------------------------------------*/ uip_ds6_route_t * uip_ds6_route_add(const uip_ipaddr_t *ipaddr, uint8_t length, - const uip_ipaddr_t *nexthop) + const uip_ipaddr_t *nexthop) { #if (UIP_MAX_ROUTES != 0) uip_ds6_route_t *r;