Skip to content

Commit

Permalink
Simulation test with more RPL nodes than the network can handle that …
Browse files Browse the repository at this point in the history
…attempt to access a remote HTTP server. After completing their connection, they go to feather mode, freeing up route table entries in the network, to let more nodes reach the HTTP server
  • Loading branch information
adamdunkels committed Aug 27, 2015
1 parent bfb29d2 commit 52006ae
Show file tree
Hide file tree
Showing 9 changed files with 1,242 additions and 0 deletions.
1,006 changes: 1,006 additions & 0 deletions regression-tests/21-large-rpl/01-cooja-http-socket-50.csc

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions regression-tests/21-large-rpl/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../Makefile.simulation-test
7 changes: 7 additions & 0 deletions regression-tests/21-large-rpl/code/node/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
CONTIKI=../../../..

MODULES += core/net/http-socket

CFLAGS+=-DPROJECT_CONF_H=\"project-conf.h\"

include $(CONTIKI)/Makefile.include
103 changes: 103 additions & 0 deletions regression-tests/21-large-rpl/code/node/client.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#include "contiki-net.h"
#include "http-socket.h"
#include "ip64-addr.h"
#include "dev/leds.h"
#include "rpl.h"

#include <stdio.h>

static struct http_socket s;
static int bytes_received = 0;
static int restarts;
static struct ctimer reconnect_timer;

static void callback(struct http_socket *s, void *ptr,
http_socket_event_t e,
const uint8_t *data, uint16_t datalen);

/*---------------------------------------------------------------------------*/
PROCESS(http_example_process, "HTTP Example");
AUTOSTART_PROCESSES(&http_example_process);
/*---------------------------------------------------------------------------*/
static void
reconnect(void *dummy)
{
rpl_set_mode(RPL_MODE_MESH);
http_socket_get(&s, "http://www.contiki-os.org/", 0, 0,
callback, NULL);
}
/*---------------------------------------------------------------------------*/
static void
restart(void)
{
int scale;
restarts++;
printf("restart %d\n", restarts);

scale = restarts;
if(scale > 5) {
scale = 5;
}
ctimer_set(&reconnect_timer, random_rand() % ((CLOCK_SECOND * 10) << scale),
reconnect, NULL);
}
/*---------------------------------------------------------------------------*/
static void
callback(struct http_socket *s, void *ptr,
http_socket_event_t e,
const uint8_t *data, uint16_t datalen)
{
if(e == HTTP_SOCKET_ERR) {
printf("HTTP socket error\n");
} else if(e == HTTP_SOCKET_TIMEDOUT) {
printf("HTTP socket error: timed out\n");
restart();
} else if(e == HTTP_SOCKET_ABORTED) {
printf("HTTP socket error: aborted\n");
restart();
} else if(e == HTTP_SOCKET_HOSTNAME_NOT_FOUND) {
printf("HTTP socket error: hostname not found\n");
restart();
} else if(e == HTTP_SOCKET_CLOSED) {
if(bytes_received > 0) {
printf("HTTP socket closed, %d bytes received\n", bytes_received);
leds_off(LEDS_RED);
rpl_set_mode(RPL_MODE_FEATHER);
} else {
restart();
}
} else if(e == HTTP_SOCKET_DATA) {
bytes_received += datalen;
printf("HTTP socket received %d bytes of data\n", datalen);
}
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(http_example_process, ev, data)
{
static struct etimer et;
uip_ip4addr_t ip4addr;
uip_ip6addr_t ip6addr;

PROCESS_BEGIN();

uip_ipaddr(&ip4addr, 8,8,8,8);
ip64_addr_4to6(&ip4addr, &ip6addr);
uip_nameserver_update(&ip6addr, UIP_NAMESERVER_INFINITE_LIFETIME);

etimer_set(&et, CLOCK_SECOND * 20);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

http_socket_init(&s);
http_socket_get(&s, "http://www.contiki-os.org/", 0, 0,
callback, NULL);
leds_on(LEDS_RED);
restarts = 0;
etimer_set(&et, CLOCK_SECOND);
while(1) {
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
etimer_reset(&et);
}

PROCESS_END();
}
/*---------------------------------------------------------------------------*/
6 changes: 6 additions & 0 deletions regression-tests/21-large-rpl/code/node/project-conf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#define QUEUEBUF_CONF_STATS 1
#define RESOLV_CONF_SUPPORTS_MDNS 0
#define COOJA_MTARCH_STACKSIZE 4096

#define UIP_CONF_MAX_ROUTES 3
#define NBR_TABLE_CONF_MAX_NEIGHBORS 3
5 changes: 5 additions & 0 deletions regression-tests/21-large-rpl/code/router/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CONTIKI=../../../..

CFLAGS+=-DPROJECT_CONF_H=\"project-conf.h\"

include $(CONTIKI)/Makefile.include
9 changes: 9 additions & 0 deletions regression-tests/21-large-rpl/code/router/project-conf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#define QUEUEBUF_CONF_STATS 1
#define RESOLV_CONF_SUPPORTS_MDNS 0
#define COOJA_MTARCH_STACKSIZE 4096

#define UIP_CONF_MAX_ROUTES 8
#define NBR_TABLE_CONF_MAX_NEIGHBORS 8

/*#define RPL_CONF_DEFAULT_LIFETIME_UNIT 10
#define RPL_CONF_DEFAULT_LIFETIME 10*/
27 changes: 27 additions & 0 deletions regression-tests/21-large-rpl/code/router/router.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include "contiki.h"
#include "contiki-net.h"
#include "ip64.h"
#include "net/netstack.h"

/*---------------------------------------------------------------------------*/
PROCESS(router_node_process, "Router node");
AUTOSTART_PROCESSES(&router_node_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(router_node_process, ev, data)
{
PROCESS_BEGIN();

/* Set us up as a RPL root node. */
rpl_dag_root_init_dag();

/* Initialize the IP64 module so we'll start translating packets */
ip64_init();

/* ... and do nothing more. */
while(1) {
PROCESS_WAIT_EVENT();
}

PROCESS_END();
}
/*---------------------------------------------------------------------------*/
78 changes: 78 additions & 0 deletions regression-tests/21-large-rpl/testscript.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@

TIMEOUT(2400000); /* 40 minutes */

var NR_FEATHERS = mote.getSimulation().getMotesCount() - 1;

/* conf */
var travis = java.lang.System.getenv().get("TRAVIS");
if (travis == null) {
/* Instant Contiki */
CMD_TUNNEL = "echo '-vj' > ~/.slirprc && make Connect.class && java Connect 'nc localhost 60001' 'script -t -f -c slirp'";
CMD_PING = "ping -c 5 8.8.8.8";
CMD_DIR = "../../wpcapslip";
} else {
/* Travis */
CMD_TUNNEL = "cd $TRAVIS_BUILD_DIR/tools/wpcapslip && sudo apt-get install slirp && echo '-vj' > ~/.slirprc && make Connect.class && java Connect 'nc localhost 60001' 'script -t -f -c slirp'";
CMD_PING = "ping -c 5 8.8.8.8";
CMD_DIR = ".";
}

/* delay */
GENERATE_MSG(1000, "continue");
YIELD_THEN_WAIT_UNTIL(msg.equals("continue"));

/* realtime speed */
sim.setSpeedLimit(2.0);

/* tunnel interface */
log.log("opening tunnel interface: " + CMD_TUNNEL + "\n");
launcher = new java.lang.ProcessBuilder["(java.lang.String[])"](['sh','-c',CMD_TUNNEL]);
launcher.directory(new java.io.File(CMD_DIR));
launcher.redirectErrorStream(true);
tunProcess = launcher.start();
tunRunnable = new Object();
tunRunnable.run = function() {
var stdIn = new java.io.BufferedReader(new java.io.InputStreamReader(tunProcess.getInputStream()));
while ((line = stdIn.readLine()) != null) {
if (line != null && !line.trim().equals("")) {
//log.log("TUN> " + line + "\n");
}
}
tunProcess.destroy();
}
new java.lang.Thread(new java.lang.Runnable(tunRunnable)).start();

GENERATE_MSG(1000, "continue");
YIELD_THEN_WAIT_UNTIL(msg.equals("continue"));

/* ping */
log.log("pinging: " + CMD_PING + "\n");
launcher = new java.lang.ProcessBuilder["(java.lang.String[])"](['sh','-c',CMD_PING]);
launcher.directory(new java.io.File(CMD_DIR));
launcher.redirectErrorStream(true);
tunProcess = launcher.start();
tunRunnable = new Object();
tunRunnable.run = function() {
var stdIn = new java.io.BufferedReader(new java.io.InputStreamReader(tunProcess.getInputStream()));
while ((line = stdIn.readLine()) != null) {
if (line != null && !line.trim().equals("")) {
log.log("PING> " + line + "\n");
}
}
tunProcess.destroy();
}
new java.lang.Thread(new java.lang.Runnable(tunRunnable)).start();

var completed = {};
while(Object.keys(completed).length < NR_FEATHERS) {
if (!msg.startsWith("#L") && !msg.startsWith("E")) {
//log.log(mote + ": " + msg + "\n");
}
if (id != 1 && msg.startsWith("HTTP socket closed")) {
completed[id] = id;
log.log("Data compelete " + id + ", heard " + Object.keys(completed).length + " in total\n");
}
YIELD();
}

log.testOK();

0 comments on commit 52006ae

Please sign in to comment.