Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of webserverBlinky by
Diff: main.cpp
- Revision:
- 83:cdcb81d1910f
- Parent:
- 82:051f77f7dd72
- Child:
- 84:456e73151f11
--- 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();