diff --git a/apps/webserver-nano/Makefile.webserver-nano b/apps/webserver-nano/Makefile.webserver-nano index 1929865ec..0c6ecc3f2 100644 --- a/apps/webserver-nano/Makefile.webserver-nano +++ b/apps/webserver-nano/Makefile.webserver-nano @@ -1,2 +1,12 @@ webserver-nano_src = webserver-nogui.c httpd.c psock.c memb.c httpd-fs.c httpd-cgi.c webserver-nano_dsc = webserver-dsc.c + +#Run makefsdata to regenerate httpd-fsdata.c when web content has been edited. This requires PERL. +# Note: Deleting files or transferring pages from makefsdata.ignore will not trigger this rule +# when there is no change in modification dates. +$(CONTIKI)/apps/webserver-nano/httpd-fsdata.c : $(CONTIKI)/apps/webserver-nano/httpd-fs/*.* + $(CONTIKI)/tools/makefsdata -d $(CONTIKI)/apps/webserver-nano/httpd-fs -o $(CONTIKI)/apps/webserver-nano/httpd-fsdata.c + +#Rebuild httpd-fs.c when makefsdata has changed httpd-fsdata.c +$(CONTIKI)/apps/webserver-nano/httpd-fs.c: $(CONTIKI)/apps/webserver-nano/httpd-fsdata.c + touch $(CONTIKI)/apps/webserver-nano/httpd-fs.c diff --git a/apps/webserver-nano/httpd-cgi.c b/apps/webserver-nano/httpd-cgi.c index dec9c5d02..7608a9da2 100644 --- a/apps/webserver-nano/httpd-cgi.c +++ b/apps/webserver-nano/httpd-cgi.c @@ -88,9 +88,10 @@ static const char rtes_name[] HTTPD_STRING_ATTR = "routes"; #if WEBSERVER_CONF_TICTACTOE static const char tictac_name[] HTTPD_STRING_ATTR = "tictac"; #endif +#endif /*Process states for processes cgi*/ -#endif + #if WEBSERVER_CONF_PROCESSES || WEBSERVER_CONF_TCPSTATS static const char closed[] HTTPD_STRING_ATTR = "CLOSED"; static const char syn_rcvd[] HTTPD_STRING_ATTR = "SYN-RCVD"; @@ -178,42 +179,58 @@ generate_header(void *arg) { unsigned short numprinted=0; #if WEBSERVER_CONF_HEADER_W3C +#define _MSS1 100 static const char httpd_cgi_headerw[] HTTPD_STRING_ATTR = ""; numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerw); #endif #if WEBSERVER_CONF_HEADER_ICON +#define _MSS2 105 static const char httpd_cgi_header1[] HTTPD_STRING_ATTR = "Contiki-nano"; #else +#define _MSS2 52 static const char httpd_cgi_header1[] HTTPD_STRING_ATTR = "Contiki-nano"; #endif numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_header1); #if WEBSERVER_CONF_HEADER_MENU +#define _MSS3 32 static const char httpd_cgi_headerm1[] HTTPD_STRING_ATTR = "
Front page";
   numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerm1);
 #if WEBSERVER_CONF_SENSORS
+#define _MSS4 34
   static const char httpd_cgi_headerm2[] HTTPD_STRING_ATTR = "|Status";
   numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerm2);
 #endif
 #if WEBSERVER_CONF_TCPSTATS
+#define _MSS5 44
   static const char httpd_cgi_headerm3[] HTTPD_STRING_ATTR = "|Network connections";
   numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerm3);
 #endif
 #if WEBSERVER_CONF_PROCESSES
+#define _MSS6 46
   static const char httpd_cgi_headerm4[] HTTPD_STRING_ATTR = "|System processes";
   numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerm4);
 #endif
 #if WEBSERVER_CONF_FILESTATS
+#define _MSS7 45
   static const char httpd_cgi_headerm5[] HTTPD_STRING_ATTR = "|File statistics";
   numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerm5);
 #endif
 #if WEBSERVER_CONF_TICTACTOE
+#define _MSS8 44
   static const char httpd_cgi_headerm6[] HTTPD_STRING_ATTR = "|TicTacToe";
   numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerm6);
 #endif
   static const char httpd_cgi_headerme[] HTTPD_STRING_ATTR = "
"; numprinted+=httpd_snprintf((char *)uip_appdata+numprinted, uip_mss()-numprinted, httpd_cgi_headerme); #endif /* WEBSERVER_CONF_MENU */ + +#if UIP_RECEIVE_WINDOW < _MSS1+_MSS2+_MSS3_+MSS4_+MSS5_MSS6+_MSS7+_MSS8 +#warning ************************************************************ +#warning UIP_RECEIVE_WINDOW not large enough for header cgi output. +#warning Web pages will not render properly! +#warning ************************************************************ +#endif return numprinted; } /*---------------------------------------------------------------------------*/ @@ -546,6 +563,14 @@ generate_sensor_readings(void *arg) m=s/60; s=s-m*60; numprinted+=httpd_snprintf((char *)uip_appdata + numprinted, uip_mss() - numprinted, httpd_cgi_sensor3, h,m,s); + +/* TODO: some gcc's have a bug with %02d format that adds a zero byte and extra chars to the end of the string. + * Seen with arm-none-eabi-gcc.exe (Sourcery G++ Lite 2008q3-66) 4.3.2 + * Quick cosmetic fix to strip that off: */ + if (*(char *)(uip_appdata + numprinted-3)==0) {numprinted-=3;} + else if (*(char *)(uip_appdata + numprinted-2)==0) {numprinted-=2;} + else if (*(char *)(uip_appdata + numprinted-1)==0) {numprinted-=1;} + #if 0 if (sleepseconds) { p1=100UL*sleepseconds/seconds; diff --git a/apps/webserver-nano/httpd.h b/apps/webserver-nano/httpd.h index 671510218..9f093e305 100644 --- a/apps/webserver-nano/httpd.h +++ b/apps/webserver-nano/httpd.h @@ -43,8 +43,22 @@ * Firefox network.http.max-connections-per-server is set to a lower number. * The RAM needed for each entry depends on script enabling and buffer sizes; see struct httpd_state below. * Typical range is 100 - 200 bytes per connection + * cgi's that use PSOCK_GENERATOR_SEND will have truncated output if UIP_CONF_RECEIVE_WINDOW and UIP_CONF_TCP_MSS + * are not large enough. The header-menu cgi needs ~340 bytes if all options are enabled, while the file-stats * cgi + * can exceed any MSS if there are enough files to display (e.g. tic-tac-toe). + * The advertised MSS is easily seen in wireshark. + * Some example set a small MSS by default. rpl-border-router for example uses a receive window of 60. */ +#ifndef WEBSERVER_CONF_NANO #if CONTIKI_TARGET_SKY || CONTIKI_TARGET_STK500 +#define WEBSERVER_CONF_NANO 1 +#else +#define WEBSERVER_CONF_NANO 3 +#endif +#endif + +#if WEBSERVER_CONF_NANO==1 +/* nano-size for constrained MCUs */ #define WEBSERVER_CONF_CONNS 2 #define WEBSERVER_CONF_NAMESIZE 16 #define WEBSERVER_CONF_BUFSIZE 40 @@ -84,7 +98,12 @@ extern char httpd_query[WEBSERVER_CONF_PASSQUERY]; /* Include referrer in log */ #define WEBSERVER_CONF_REFERER 0 -#else /* !sky */ +#elif WEBSERVER_CONF_NANO==2 +/* webserver-mini having more content */ +#error webserver-micro not implemented + +#elif WEBSERVER_CONF_NANO==3 +/* webserver-mini having all content */ #define WEBSERVER_CONF_CONNS 6 #define WEBSERVER_CONF_NAMESIZE 20 #define WEBSERVER_CONF_BUFSIZE 40 @@ -123,7 +142,10 @@ extern char httpd_query[WEBSERVER_CONF_PASSQUERY]; #define WEBSERVER_CONF_LOG 1 /* Include referrer in log */ #define WEBSERVER_CONF_REFERER 1 -#endif + +#else +#error Specified WEBSERVER_CONF_NANO configuration not supported. +#endif /* WEBSERVER_CONF_NANO */ /* Address printing used by cgi's and logging, but it can be turned off if desired */ #if WEBSERVER_CONF_LOG || WEBSERVER_CONF_ADDRESSES || WEBSERVER_CONF_NEIGHBORS || WEBSERVER_CONF_ROUTES diff --git a/apps/webserver-nano/webserver-nogui.c b/apps/webserver-nano/webserver-nogui.c index a5ce9c664..fd1cf029a 100644 --- a/apps/webserver-nano/webserver-nogui.c +++ b/apps/webserver-nano/webserver-nogui.c @@ -35,9 +35,7 @@ #include #include "contiki.h" -#include "sys/log.h" -//#include "http-strings.h" #include "webserver-nogui.h" #include "httpd.h" @@ -59,11 +57,11 @@ PROCESS_THREAD(webserver_nogui_process, ev, data) PROCESS_END(); } +#if WEBSERVER_CONF_LOG /*---------------------------------------------------------------------------*/ void webserver_log_file(uip_ipaddr_t *requester, char *file) { -#if LOG_CONF_ENABLED /* Print out IP address of requesting host. */ #if UIP_CONF_IPV6 @@ -81,14 +79,14 @@ webserver_log_file(uip_ipaddr_t *requester, char *file) sprintf(buf, "%d.%d.%d.%d: ", requester->u8[0], requester->u8[1], requester->u8[2], requester->u8[3]); #endif /* UIP_CONF_IPV6 */ - - log_message(buf, file); -#endif /* LOG_CONF_ENABLED */ +//log_message(buf, file); + printf("%s%s\n", buf, file); } /*---------------------------------------------------------------------------*/ void webserver_log(char *msg) { - log_message(msg, ""); +//log_message(msg, ""); + printf("%s\n", msg); } -/*---------------------------------------------------------------------------*/ +#endif /* WEBSERVER_CONF_LOG */