Lab2_web / Mbed 2 deprecated webserverBlinky

Dependencies:   mbed

Fork of webserverBlinky by RealTimeCompLab2

Revision:
83:cdcb81d1910f
Parent:
82:051f77f7dd72
Child:
84:456e73151f11
diff -r 051f77f7dd72 -r cdcb81d1910f main.cpp
--- a/main.cpp	Sun Jul 16 13:54:08 2017 +0000
+++ b/main.cpp	Tue Jul 18 00:17:03 2017 +0000
@@ -39,7 +39,7 @@
 #endif
 
 // verbosity flag used in debug printouts - change to 0 to see less debug info. Lots of interesting info.
-#define v0 0
+#define v0 1
 // verbosity flag used in debug printouts - change to 0 to see less debug info. Lots of interesting info.
 #define v1 0
 // verbosity flag used in debug printouts - change to 0 to see less debug info. Lots of interesting info.
@@ -123,7 +123,7 @@
     __enable_irq();
     ppp.rx.buflevel=0;
     ppp.pkt.len=0;
-    ppp.ident=0;
+    ppp.ident=1000;
     ppp.ledState=0;
     ppp.hdlc.frameFound=0;
     ppp.hdlc.frameStartIndex=0;
@@ -159,7 +159,10 @@
 {
     while ( pc.readable() ) {
         int hd = (ppp.rx.head+1)&(RXBUFLEN-1); // increment/wrap
-        if ( hd == ppp.rx.tail ) break; // watch for buffer full
+        if ( hd == ppp.rx.tail ) {
+            debug("Receive buffer is full. ppp.rx.buflevel = %d\n",ppp.rx.buflevel);
+            break; // watch for buffer full
+        }
         ppp.rx.buf[ppp.rx.head]=pc.getc(); // insert in rx buffer
         ppp.rx.head = hd; // update head pointer
         ppp.rx.buflevel++;
@@ -323,7 +326,7 @@
     int udpLength = ((udpLen[0]<<8) | udpLen[1]) - UDP_HEADER_SIZE; // size of the actual udp data
     if(v0) debug("UDP %d.%d.%d.%d:%d ", srcIP[0],srcIP[1],srcIP[2],srcIP[3],srcPort);
     if(v0) debug("%d.%d.%d.%d:%d ",     dstIP[0],dstIP[1],dstIP[2],dstIP[3],dstPort);
-    if(v0) debug("Len %d ", udpLength);
+    if(v0) debug("Len %03d", udpLength);
     int printSize = udpLength;
     if (printSize > 20) printSize = 20; // print only first 20 characters
     if (v1) {
@@ -335,8 +338,8 @@
                 debug("_");
             }
         }
-        debug("\n");
     }
+    if (v0) debug("\n");
 }
 
 unsigned int dataCheckSum(unsigned char * ptr, int len)
@@ -494,7 +497,7 @@
 
 void dumpHeaderTCP()
 {
-    if( v1 ) {
+    if( v0 ) {
 
         int headerSizeIP     = (ppp.pkt.buf[4]&0xf)*4; // header size of ip portion
         char * tcpStart      =  ppp.pkt.buf+4+headerSizeIP; // start of tcp packet
@@ -530,44 +533,42 @@
 {
     int n=0; // number of bytes we have printed so far
     int nHeader; // byte size of HTTP header
+    int contentLengthStart; // index where HTML starts
 
     if(strncmp(dataStart, "GET / HTTP/1.1", 14) == 0 ) {
         n=n+sprintf(n+dataStart,"HTTP/1.1 200 OK\r\nServer: PPP-Blinky\r\n"); // http header
-        n=n+sprintf(n+dataStart,"Content-Length: "); // http header
-        int contentLengthStart = n; // remember where Content-Length is in buffer
-        n=n+sprintf(n+dataStart,"?????\r\n"); // leave five spaces for content length - will be updated later
-        n=n+sprintf(n+dataStart,"Connection: close\r\n"); // close connection immediately
-        n=n+sprintf(n+dataStart,"Content-Type: text/html; charset=us-ascii\r\n\r\n"); // http header must end with empty line (\r\n)
-        nHeader=n; // size of HTTP header
-        // this is where we insert our web page into the buffer
-        n=n+sprintf(n+dataStart,"%s\r\n", ourWebPage);
-
-#define CONTENTLENGTHSIZE 5
-        char contentLengthString[CONTENTLENGTHSIZE+1]; // temporary buffer to create Content-Length string
-        snprintf(contentLengthString,CONTENTLENGTHSIZE+1,"%*d",CONTENTLENGTHSIZE,n-nHeader); // print Content-Length with leading spaces and fixed width equal to csize
-        memcpy(dataStart+contentLengthStart, contentLengthString, CONTENTLENGTHSIZE); // copy Content-Length to it's place in the send buffer
-
-    } else { // all remaining requests get 404 Not Found response and heap size
+    } else {
         n=n+sprintf(n+dataStart,"HTTP/1.1 404 Not Found\r\nServer: PPP-Blinky\r\n"); // http header
-        n=n+sprintf(n+dataStart,"Content-Length: "); // http header
-        int contentLengthStart = n; // remember where Content-Length is in buffer
-        n=n+sprintf(n+dataStart,"?????\r\n"); // leave five spaces for content length - will be updated later
-        n=n+sprintf(n+dataStart,"Connection: close\r\n"); // close connection immediately
-        n=n+sprintf(n+dataStart,"Content-Type: text/html; charset=us-ascii\r\n\r\n"); // http header must end with empty line (\r\n)
-        nHeader=n; // size of HTTP header
+    }
+    
+    n=n+sprintf(n+dataStart,"Content-Length: "); // http header
+    contentLengthStart = n; // remember where Content-Length is in buffer
+    n=n+sprintf(n+dataStart,"?????\r\n"); // leave five spaces for content length - will be updated later
+    n=n+sprintf(n+dataStart,"Connection: close\r\n"); // close connection immediately
+    n=n+sprintf(n+dataStart,"Content-Type: text/html; charset=us-ascii\r\n\r\n"); // http header must end with empty line (\r\n)
+    nHeader=n; // size of HTTP header
 
+    if(strncmp(dataStart, "GET / HTTP/1.1", 14) == 0 ) {
+        // this is where we insert our web page into the buffer
+        n=n+sprintf(n+dataStart,"%s", ourWebPage);
+    } else { 
+        // all other requests get 404 Not Found response a
         n=n+sprintf(n+dataStart,"<!DOCTYPE html><html><head></head>"); // html start
-        n=n+sprintf(n+dataStart,"<body><h1>File Not Found. Stack=0x%08x</h1></body>",&nHeader);
-        n=n+sprintf(n+dataStart,"</html>\r\n"); // html end
+        n=n+sprintf(n+dataStart,"<body>Not Found %06d</body>",ppp.ident); // here we print a variable in the html
+        n=n+sprintf(n+dataStart,"</html>"); // html end
+    }
+    
+    while( (n%4)!= 2)
+        n=n+sprintf(n+dataStart," "); // insert spaces until n is exactly two away from a multiple of four
+    n=n+sprintf(n+dataStart,"\r\n");  // add the last \r\n sequence - n is now an exact multiple of four
+#define CONTENTLENGTHSIZE 5
+    char contentLengthString[CONTENTLENGTHSIZE+1];
+    snprintf(contentLengthString,CONTENTLENGTHSIZE+1,"%*d",CONTENTLENGTHSIZE,n-nHeader); // print Content-Length with leading spaces and fixed width equal to csize
+    memcpy(dataStart+contentLengthStart, contentLengthString, CONTENTLENGTHSIZE); // copy Content-Length to it's place in the send buffer
 
-        char contentLengthString[CONTENTLENGTHSIZE+1]; // temporary buffer to create Content-Length string
-        snprintf(contentLengthString,CONTENTLENGTHSIZE+1,"%*d",CONTENTLENGTHSIZE,n-nHeader); // print Content-Length with leading spaces and fixed width equal to csize
-        memcpy(dataStart+contentLengthStart, contentLengthString, CONTENTLENGTHSIZE); // copy Content-Length to it's place in the send buffer
-    }
     if (v2) {
         debug("HTTP Response: HTTP-header %d HTTP-content %d HTTP-total %d\n",nHeader,n-nHeader,n);
     }
-
     return n; // total byte size of our response
 }
 
@@ -575,19 +576,16 @@
 void tcpHandler()
 {
     char * ipPkt = ppp.pkt.buf+4; // ip packet start
-    char * headercheck= ipPkt+10; // 2 bytes
     char * ihl =        ipPkt;    // bottom 4 bits
+    char * pktLen =     ipPkt+2;  // 2 bytes
     char * ident =      ipPkt+4;  // 2 bytes
-    char * pktLen =     ipPkt+2;  // 2 bytes
     char * protocol =   ipPkt+9;  // 1 byte
+    char * headercheck= ipPkt+10; // 2 bytes
     char * srcAdr =     ipPkt+12; // 4 bytes
     char * dstAdr =     ipPkt+16; // 4 bytes = total of 20 bytes
     int headerSizeIP = (ihl[0]&0xf)*4;
     int packetLength = (pktLen[0]<<8)|pktLen[1]; // ip total packet length
 
-    ident[0] = ppp.ident>>8;
-    ident[1] = ppp.ident>>0; // insert OUR ident
-
     char * s             = ppp.pkt.buf+4+headerSizeIP; // start of tcp packet
     char * srctcp        = s + 0;  // 2 bytes
     char * dsttcp        = s + 2;  // 2 bytes
@@ -668,6 +666,10 @@
     // The TCP flag handling is now done
     // Now we have to recalculate all the header sizes, swap IP address/port source and destination, and do the IP and TCP checksums
 
+    ppp.ident++; //
+    ident[0] = ppp.ident>>8;
+    ident[1] = ppp.ident>>0; // insert OUR ident
+
     char tempHold[12]; // it's 12 long because we later reuse it when building the TCP pseudo-header
     memcpy(tempHold, srcAdr,4);
     memcpy(srcAdr, dstAdr,4);
@@ -676,7 +678,7 @@
     memcpy(tempHold, srctcp,2);
     memcpy(srctcp, dsttcp,2);
     memcpy(dsttcp, tempHold,2); // swap ip port source/dest
-    
+
     windowsizetcp[0]=16; // ignore window size negotiation
     windowsizetcp[1]=0; // ignore winodw size negotiation
 
@@ -731,8 +733,9 @@
         // remove the wait to respond faster
         // wait(0.2);
     }
+    sendFrame(); // All preparation complete - send the TCP response
+    dumpHeaderIP();
     dumpHeaderTCP();
-    sendFrame(); // All preparation complete - send the TCP response
 }
 
 void dumpDataTCP()
@@ -752,44 +755,7 @@
 
 void TCPpacket()
 {
-    char * ipPkt = ppp.pkt.buf+4; // ip packet start
-#ifndef SERIAL_PORT_MONITOR_NO
-    char * version =    ipPkt;    // top 4 bits
-    char * ihl =        ipPkt;    // bottom 4 bits
-    char * dscp =       ipPkt+1;  // top 6 bits
-    char * ecn =        ipPkt+1;  // lower 2 bits
-    char * pktLen =     ipPkt+2;  // 2 bytes
-    char * ident =      ipPkt+4;  // 2 bytes
-    char * flags =      ipPkt+6;  // 2 bits
-    char * ttl =        ipPkt+8;  // 1 byte
-    char * protocol =   ipPkt+9;  // 1 byte
-    char * headercheck= ipPkt+10; // 2 bytes
-#endif
-    char * srcAdr =     ipPkt+12; // 4 bytes
-    char * dstAdr =     ipPkt+16; // 4 bytes = total of 20 bytes
-
-#ifndef SERIAL_PORT_MONITOR_NO
-    int versionIP = (version[0]>>4)&0xf;
-    int headerSizeIP = (ihl[0]&0xf)*4;
-    int dscpIP = (dscp[0]>>2)&0x3f;
-    int ecnIP = ecn[0]&3;
-    int packetLength = (pktLen[0]<<8)|pktLen[1]; // ip total packet length
-    int identIP = (ident[0]<<8)|ident[1];
-    int flagsIP = flags[0]>>14&3;
-    int ttlIP = ttl[0];
-    int protocolIP = protocol[0];
-    int checksumIP = (headercheck[0]<<8)|headercheck[1];
-#endif
-    char srcIP [16];
-    snprintf(srcIP,16, "%d.%d.%d.%d", srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3]);
-    char dstIP [16];
-    snprintf(dstIP,16, "%d.%d.%d.%d", dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3]);
-    if (v0) {
-        debug("IP %s %s v%d h%d d%d e%d L%03d ",srcIP,dstIP,versionIP,headerSizeIP,dscpIP,ecnIP,packetLength);
-    }
-    if (v0) {
-        debug("i%04x f%d t%d p%d C%04x\n",identIP,flagsIP,ttlIP,protocolIP,checksumIP);
-    }
+    dumpHeaderIP();
     dumpHeaderTCP();
     if (v2) {
         dumpDataTCP();