From 52b10b6389be0fa904c1f595798a4dbfc91ea799 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Sat, 9 Dec 2017 07:27:08 -0800 Subject: [PATCH] RPL border router Web server cleanup --- .../rpl-border-router/webserver/webserver.c | 260 ++++-------------- 1 file changed, 55 insertions(+), 205 deletions(-) diff --git a/examples/rpl-border-router/webserver/webserver.c b/examples/rpl-border-router/webserver/webserver.c index 1343de71d..f71b80915 100644 --- a/examples/rpl-border-router/webserver/webserver.c +++ b/examples/rpl-border-router/webserver/webserver.c @@ -32,46 +32,34 @@ #include "contiki.h" #include "net/routing/routing.h" +#if RPL_WITH_NON_STORING +/* For RPL non-storing specific link printout. + * Note that traditional DS6 routes are printed in addition, + * whenever UIP_MAX_ROUTES != 0 */ +#include "rpl-ns.h" +#endif #include #include /*---------------------------------------------------------------------------*/ -static const char *TOP = "Contiki-NG\n"; -static const char *BOTTOM = "\n"; -#if BUF_USES_STACK -static char *bufptr, *bufend; -#define ADD(...) do { \ - bufptr += snprintf(bufptr, bufend - bufptr, __VA_ARGS__); \ - } while(0) -#else +static const char *TOP = "\n \n Contiki-NG\n \n\n"; +static const char *BOTTOM = "\n\n\n"; static char buf[256]; static int blen; #define ADD(...) do { \ blen += snprintf(&buf[blen], sizeof(buf) - blen, __VA_ARGS__); \ } while(0) -#endif +#define SEND(s) do { \ + SEND_STRING(s, buf); \ + blen = 0; \ +} while(0); /* Use simple webserver with only one page for minimum footprint. * Multiple connections can result in interleaved tcp segments since * a single static buffer is used for all segments. */ #include "httpd-simple.h" -/* The internal webserver can provide additional information if - * enough program flash is available. - */ -#define WEBSERVER_CONF_LOADTIME 0 -#define WEBSERVER_CONF_FILESTATS 0 -#define WEBSERVER_CONF_NEIGHBOR_STATUS 0 -/* Adding links requires a larger RAM buffer. To avoid static allocation - * the stack can be used for formatting; however tcp retransmissions - * and multiple connections can result in garbled segments. - * TODO:use PSOCk_GENERATOR_SEND and tcp state storage to fix this. - */ -#define WEBSERVER_CONF_ROUTE_LINKS 0 -#if WEBSERVER_CONF_ROUTE_LINKS -#define BUF_USES_STACK 1 -#endif /*---------------------------------------------------------------------------*/ static void @@ -99,210 +87,72 @@ ipaddr_add(const uip_ipaddr_t *addr) static PT_THREAD(generate_routes(struct httpd_state *s)) { - static uip_ds6_route_t *r; -#if RPL_WITH_NON_STORING - static rpl_ns_node_t *link; -#endif /* RPL_WITH_NON_STORING */ static uip_ds6_nbr_t *nbr; -#if BUF_USES_STACK - char buf[256]; -#endif -#if WEBSERVER_CONF_LOADTIME - static clock_time_t numticks; - numticks = clock_time(); -#endif PSOCK_BEGIN(&s->sout); - SEND_STRING(&s->sout, TOP); -#if BUF_USES_STACK - bufptr = buf; - bufend = bufptr + sizeof(buf); -#else - blen = 0; -#endif - ADD("Neighbors
");
 
+  ADD("  Neighbors\n  
    \n"); + SEND(&s->sout); for(nbr = nbr_table_head(ds6_neighbors); nbr != NULL; nbr = nbr_table_next(ds6_neighbors, nbr)) { - -#if WEBSERVER_CONF_NEIGHBOR_STATUS -#if BUF_USES_STACK - { char *j = bufptr + 25; - ipaddr_add(&nbr->ipaddr); - while(bufptr < j) ADD(" "); - switch(nbr->state) { - case NBR_INCOMPLETE: ADD(" INCOMPLETE"); - break; - case NBR_REACHABLE: ADD(" REACHABLE"); - break; - case NBR_STALE: ADD(" STALE"); - break; - case NBR_DELAY: ADD(" DELAY"); - break; - case NBR_PROBE: ADD(" NBR_PROBE"); - break; - } - } -#else - { uint8_t j = blen + 25; - ipaddr_add(&nbr->ipaddr); - while(blen < j) ADD(" "); - switch(nbr->state) { - case NBR_INCOMPLETE: ADD(" INCOMPLETE"); - break; - case NBR_REACHABLE: ADD(" REACHABLE"); - break; - case NBR_STALE: ADD(" STALE"); - break; - case NBR_DELAY: ADD(" DELAY"); - break; - case NBR_PROBE: ADD(" NBR_PROBE"); - break; - } - } -#endif -#else + ADD("
  • "); ipaddr_add(&nbr->ipaddr); -#endif - - ADD("\n"); -#if BUF_USES_STACK - if(bufptr > bufend - 45) { - SEND_STRING(&s->sout, buf); - bufptr = buf; - bufend = bufptr + sizeof(buf); - } -#else - if(blen > sizeof(buf) - 45) { - SEND_STRING(&s->sout, buf); - blen = 0; - } -#endif + ADD("
  • \n"); + SEND(&s->sout); } - ADD("
Routes
\n");
-  SEND_STRING(&s->sout, buf);
-#if BUF_USES_STACK
-  bufptr = buf;
-  bufend = bufptr + sizeof(buf);
-#else
-  blen = 0;
-#endif
+  ADD("  \n");
+  SEND(&s->sout);
 
-  for(r = uip_ds6_route_head(); r != NULL; r = uip_ds6_route_next(r)) {
-
-#if BUF_USES_STACK
-#if WEBSERVER_CONF_ROUTE_LINKS
-    ADD("ipaddr);
-    ADD("]/status.shtml>");
-    ipaddr_add(&r->ipaddr);
-    ADD("");
-#else
-    ipaddr_add(&r->ipaddr);
-#endif
-#else
-#if WEBSERVER_CONF_ROUTE_LINKS
-    ADD("ipaddr);
-    ADD("]/status.shtml>");
-    SEND_STRING(&s->sout, buf);
-    blen = 0;
-    ipaddr_add(&r->ipaddr);
-    ADD("");
-#else
-    ipaddr_add(&r->ipaddr);
-#endif
-#endif
-    ADD("/%u (via ", r->length);
-    ipaddr_add(uip_ds6_route_nexthop(r));
-    if(1 || (r->state.lifetime < 600)) {
-      ADD(") %lus\n", (unsigned long)r->state.lifetime);
-    } else {
-      ADD(")\n");
+#if (UIP_MAX_ROUTES != 0)
+  {
+    static uip_ds6_route_t *r;
+    ADD("  Routes\n  
    \n"); + SEND(&s->sout); + for(r = uip_ds6_route_head(); r != NULL; r = uip_ds6_route_next(r)) { + ADD("
  • "); + ipaddr_add(&r->ipaddr); + ADD("/%u (via ", r->length); + ipaddr_add(uip_ds6_route_nexthop(r)); + ADD(") %lus", (unsigned long)r->state.lifetime); + ADD("
  • \n"); + SEND(&s->sout); } - SEND_STRING(&s->sout, buf); -#if BUF_USES_STACK - bufptr = buf; - bufend = bufptr + sizeof(buf); -#else - blen = 0; -#endif + ADD("
\n"); + SEND(&s->sout); } - ADD("
"); +#endif /* UIP_MAX_ROUTES != 0 */ #if RPL_WITH_NON_STORING - ADD("Links
\n");
-  SEND_STRING(&s->sout, buf);
-#if BUF_USES_STACK
-  bufptr = buf;
-  bufend = bufptr + sizeof(buf);
-#else
-  blen = 0;
-#endif
-  for(link = rpl_ns_node_head(); link != NULL; link = rpl_ns_node_next(link)) {
-    if(link->parent != NULL) {
-      uip_ipaddr_t child_ipaddr;
-      uip_ipaddr_t parent_ipaddr;
+  {
+    static rpl_ns_node_t *link;
+    ADD("  Routing links\n  
    \n"); + SEND(&s->sout); + for(link = rpl_ns_node_head(); link != NULL; link = rpl_ns_node_next(link)) { + if(link->parent != NULL) { + uip_ipaddr_t child_ipaddr; + uip_ipaddr_t parent_ipaddr; - rpl_ns_get_node_global_addr(&child_ipaddr, link); - rpl_ns_get_node_global_addr(&parent_ipaddr, link->parent); + rpl_ns_get_node_global_addr(&child_ipaddr, link); + rpl_ns_get_node_global_addr(&parent_ipaddr, link->parent); -#if BUF_USES_STACK -#if WEBSERVER_CONF_ROUTE_LINKS - ADD(""); - ipaddr_add(&child_ipaddr); - ADD(""); -#else - ipaddr_add(&child_ipaddr); -#endif -#else -#if WEBSERVER_CONF_ROUTE_LINKS - ADD(""); - SEND_STRING(&s->sout, buf); - blen = 0; - ipaddr_add(&child_ipaddr); - ADD(""); -#else - ipaddr_add(&child_ipaddr); -#endif -#endif + ADD("
  • "); + ipaddr_add(&child_ipaddr); - ADD(" (parent: "); - ipaddr_add(&parent_ipaddr); - if(1 || (link->lifetime < 600)) { - ADD(") %us\n", (unsigned int)link->lifetime); - } else { - ADD(")\n"); + ADD(" (parent: "); + ipaddr_add(&parent_ipaddr); + ADD(") %us", (unsigned int)link->lifetime); + + ADD("
  • \n"); + SEND(&s->sout); } - SEND_STRING(&s->sout, buf); -#if BUF_USES_STACK - bufptr = buf; - bufend = bufptr + sizeof(buf); -#else - blen = 0; -#endif } + ADD("
"); + SEND(&s->sout); } - ADD("
"); #endif /* RPL_WITH_NON_STORING */ -#if WEBSERVER_CONF_FILESTATS - static uint16_t numtimes; - ADD("
This page sent %u times", ++numtimes); -#endif - -#if WEBSERVER_CONF_LOADTIME - numticks = clock_time() - numticks + 1; - ADD(" (%u.%02u sec)", numticks / CLOCK_SECOND, (100 * (numticks % CLOCK_SECOND)) / CLOCK_SECOND)); -#endif - - SEND_STRING(&s->sout, buf); SEND_STRING(&s->sout, BOTTOM); PSOCK_END(&s->sout);