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
Revision 124:18ef53f1d8b7, committed 2017-08-09
- Comitter:
- nixnax
- Date:
- Wed Aug 09 12:37:01 2017 +0000
- Parent:
- 123:fc64fc6caae0
- Child:
- 125:ea88200b1df6
- Commit message:
- Added input checking to more functions.
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Aug 08 20:22:19 2017 +0000 +++ b/main.cpp Wed Aug 09 12:37:01 2017 +0000 @@ -65,7 +65,7 @@ // verbosity flags used in debug printouts - change to 1 to see increasingly more detailed debug info. #define v0 1 -#define v1 1 +#define v1 0 #define v2 0 #define IP_HEADER_DUMP_YES /* YES for ip header dump */ #define TCP_HEADER_DUMP_YES /* YES for tcp header dump */ @@ -110,7 +110,7 @@ int httpPageCount; int firstFrame; // cleared after first frame struct { -#define RXBUFLEN (1<<11) +#define RXBUFLEN (1<<15) // the serial port receive buffer and packet buffer, size is RXBUFLEN (currently 2048 bytes) char buf[RXBUFLEN]; // RXBUFLEN MUST be a power of two because we use & operator for fast wrap-around in ring buffer int head; @@ -198,10 +198,16 @@ while( *nextChar != 0 ) { putcWhileCheckingInput( *nextChar ); // write one character to debug port while checking input nextChar++; - } + } #endif } +// a sniffer tool to assist in figuring out where in the code we are having characters in the input buffer +void qq() +{ + if ( pc.readable() ) printWhileCheckingInput( "Character available!\n" ); +} + void crcReset() { ppp.crc=0xffff; // crc restart @@ -213,7 +219,7 @@ ppp.crc=((ppp.crc&1)^(x&1))?(ppp.crc>>1)^0x8408:ppp.crc>>1; // crc calculator x>>=1; } - // fillbuf(); + fillbuf(); // handle input } int crcBuf(char * buf, int size) // crc on an entire block of memory @@ -223,12 +229,6 @@ return ppp.crc; } -int rxbufNotEmpty() // check if rx buffer has data -{ - int emptyStatus = (ppp.rx.head==ppp.rx.tail) ? 0 : 1 ; - return emptyStatus; -} - int pc_getBuf() // get one character from the buffer { int x = ppp.rx.buf[ ppp.rx.tail ]; @@ -244,15 +244,15 @@ { char pbuf[30]; for(int i=0; i<ppp.pkt.len; i++) { - fillbuf(); - sprintf(pbuf, "%02x ", ppp.pkt.buf[i]); - fillbuf(); - printWhileCheckingInput(pbuf); - } - fillbuf(); - sprintf(pbuf, " CRC=%04x Len=%d\n", ppp.pkt.crc, ppp.pkt.len); - fillbuf(); - printWhileCheckingInput(pbuf); + fillbuf(); + sprintf(pbuf, "%02x ", ppp.pkt.buf[i]); + fillbuf(); + printWhileCheckingInput(pbuf); + } + fillbuf(); + sprintf(pbuf, " CRC=%04x Len=%d\n", ppp.pkt.crc, ppp.pkt.len); + fillbuf(); + printWhileCheckingInput(pbuf); } void processPPPFrame(int start, int end) // process received frame @@ -267,6 +267,7 @@ int unstuff=0; int idx = start; while(1) { + fillbuf(); if (unstuff==0) { if (ppp.rx.buf[idx]==0x7d) unstuff=1; else { @@ -291,27 +292,31 @@ void determinePacketType(); // declaration only determinePacketType(); } else { - if (0) { // set to 1 to report FCS errors +#ifdef REPORT_FCS_ERROR_YES char pbuf[50]; // local print buffer fillbuf(); - sprintf(pbuf, "PPP FCS(crc) Error CRC=%x Length = %d\n",ppp.pkt.crc,ppp.pkt.len); // print a debug line + sprintf(pbuf, "\nPPP FCS(crc) Error CRC=%x Length = %d\n",ppp.pkt.crc,ppp.pkt.len); // print a debug line fillbuf(); printWhileCheckingInput( pbuf ); if(0) dumpPPPFrame(); // set to 1 to dump frames with errors in them - } +#endif } } +void pcPutcWhileCheckingInput(int ch) +{ + fillbuf(); // check input + pc.putc(ch); + fillbuf(); +} + void hdlcPut(int ch) // do hdlc handling of special (flag) characters { if ( (ch<0x20) || (ch==0x7d) || (ch==0x7e) ) { - fillbuf(); - pc.putc(0x7d); - fillbuf(); - pc.putc(ch^0x20); // these characters need special handling + pcPutcWhileCheckingInput(0x7d); + pcPutcWhileCheckingInput(ch^0x20); // these characters need special handling } else { - fillbuf(); - pc.putc(ch); + pcPutcWhileCheckingInput(ch); } } @@ -320,11 +325,11 @@ int crc = crcBuf(ppp.pkt.buf, ppp.pkt.len-2); // update crc ppp.pkt.buf[ ppp.pkt.len-2 ] = (~crc>>0); // fcs lo (crc) ppp.pkt.buf[ ppp.pkt.len-1 ] = (~crc>>8); // fcs hi (crc) - pc.putc(0x7e); // hdlc start-of-frame "flag" + pcPutcWhileCheckingInput(0x7e); // hdlc start-of-frame "flag" for(int i=0; i<ppp.pkt.len; i++) { hdlcPut( ppp.pkt.buf[i] ); // send a character } - pc.putc(0x7e); // hdlc end-of-frame "flag" + pcPutcWhileCheckingInput(0x7e); // hdlc end-of-frame "flag" } void ipcpConfigRequestHandler() @@ -337,7 +342,7 @@ ppp.pkt.buf[4]=1; // change code to request ppp.pkt.buf[7]=4; // no options in this request ppp.pkt.len=10; // no options in this request shortest ipcp packet possible (4 ppp + 4 ipcp + 2 crc) - send_pppFrame(); // send our request + send_pppFrame(); // send our request } void ipcpAckHandler() @@ -423,6 +428,7 @@ ptr[len]=0; } for (int i=0; i<len/2; i++) { + fillbuf(); unsigned int hi = *ptr; ptr++; unsigned int lo = *ptr; @@ -451,6 +457,7 @@ ptr++; int val = ( lo & 0xff ) | ( (hi<<8) & 0xff00 ); sum = sum + val; + fillbuf(); } sum = sum + (sum>>16); sum = ~sum; @@ -459,7 +466,7 @@ } void ICMPpacket() // internet control message protocol -{ +{ char * ipPkt = ppp.pkt.buf+4; // ip packet start char * pktLen = ipPkt+2; int packetLength = (pktLen[0]<<8) | pktLen[1]; // icmp packet length @@ -472,12 +479,20 @@ ipTTL[0]--; // decrement time to live char * srcAdr = ipPkt+12; char * dstAdr = ipPkt+16; -#ifndef SERIAL_PORT_MONITOR_NO +#ifdef SERIAL_PORT_MONITOR_YES int icmpIdent = (icmpType[4]<<8)|icmpType[5]; int icmpSequence = (icmpType[6]<<8)|icmpType[7]; -#endif - if(v0) debugPrintf("ICMP PING %d.%d.%d.%d %d.%d.%d.%d ", srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3],dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3]); - if(v0) debugPrintf("Ident %04x Sequence %04d ",icmpIdent,icmpSequence); + if(0) { + char pbuf[50]; + fillbuf(); + sprintf(pbuf, "ICMP PING %d.%d.%d.%d %d.%d.%d.%d ", srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3],dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3]); + printWhileCheckingInput( pbuf ); + fillbuf(); + sprintf(pbuf, "Ident %04x Sequence %04d ",icmpIdent,icmpSequence); + fillbuf(); + printWhileCheckingInput( pbuf ); + } +#endif char src[4]; char dst[4]; memcpy(src, srcAdr,4); @@ -500,24 +515,23 @@ int printSize = icmpLength-8; // exclude size of icmp header char * icmpData = icmpType+8; // the actual payload data is after the header if (printSize > 10) printSize = 10; // print up to 20 characters - if (v0) { + if (0) { for (int i=0; i<printSize; i++) { char ch = icmpData[i]; if (ch>31 && ch<127) { - debugPrintf("%c",ch); + putcWhileCheckingInput(ch); } else { - debugPrintf("_"); + putcWhileCheckingInput('_'); } } - debugPrintf("\n"); + putcWhileCheckingInput('\n'); } send_pppFrame(); // reply to the ping - } else { if (v0) { debugPrintf("ICMP type=%d \n", icmpType[0]); } - } + } } void IGMPpacket() // internet group management protocol @@ -556,11 +570,8 @@ int IPv4Id = (ident[0]<<8)|ident[1]; char pbuf[50]; // local print buffer int n=0; - fillbuf(); // we are expecting the first character of the next packet n=n+sprintf(pbuf+n, outGoing ? "\x1b[34m" : "\x1b[30m" ); // VT100 color code, print black for incoming, blue for outgoing headers - fillbuf(); // we are expecting the first character of the next packet n=n+sprintf(pbuf+n, "%05d ",IPv4Id); // IPv4Id is a good way to correlate our dumps with net monitor or wireshark traces - fillbuf(); // we are expecting the first character of the next packet #define DUMP_FULL_IP_ADDRESS_YES #ifdef DUMP_FULL_IP_ADDRESS_YES char * srcAdr = ipPkt+12; // 4 bytes @@ -606,7 +617,7 @@ if (flags & (1<<0)) flagInfo[0]='F'; if (flags & (1<<3)) flagInfo[0]='P'; if (flags & (1<<2)) flagInfo[0]='R'; - flagInfo[1]=' '; + flagInfo[1]=0; // ' ' flagInfo[2]=0; #endif printWhileCheckingInput( flagInfo ); @@ -724,6 +735,8 @@ char * flagbitstcp = tcp + 12; // 9 bits char * windowsizetcp = tcp + 14; // 2 bytes char * checksumtcp = tcp + 16; // 2 bytes + + if(ident) {}; // shut up unused variable reference warning int tcpSize = packetLength - headerSizeIP; int headerSizeTCP = ((offset[0]>>4)&0x0f)*4; // size of tcp header only @@ -814,8 +827,8 @@ // increment our outgoing ip packet counter ppp.ip.ident++; // get next ident number for our packet - ident[0] = ppp.ip.ident>>8; - ident[1] = ppp.ip.ident>>0; // insert OUR ident + //ident[0] = ppp.ip.ident>>8; + //ident[1] = ppp.ip.ident>>0; // insert OUR ident // Now we recalculate all the header sizes int newPacketSize = headerSizeIP + headerSizeTCP + dataLen; // calculate size of the outgoing packet @@ -849,9 +862,9 @@ memcpy( tcp-12, tempHold, 12); // restore the 12 bytes that the pseudo-header overwrote dumpHeaderIP(1); // dump outgoing IP header dumpHeaderTCP(1); // dump outgoing TCP header - for (int i=0; i<60000/50; i++) { // a 60 ms delay before sending frame - typical internet delay time + for (int i=0; i<70*1000/10; i++) { // 70 ms delay before sending frame - a typical internet delay time fillbuf(); // catch any incoming characters - wait_us(50); // wait less than 1 character duration at 115200 + wait_us(10); // wait less than 1 character duration at 115200 } send_pppFrame(); // All preparation complete - send the TCP response } @@ -877,12 +890,12 @@ } void TCPpacket() -{ +{ dumpHeaderIP(0); // dump incoming packet header dumpHeaderTCP(0); // dump incoming packet header if (v2) { dumpDataTCP(); - } + } tcpHandler(); } @@ -1008,7 +1021,7 @@ { while(1) { fillbuf(); // handle received characters - if ( rxbufNotEmpty() ) { + if ( ppp.rx.head != ppp.rx.tail ) { int oldTail = ppp.rx.tail; // remember where the character is located in the buffer int rx = pc_getBuf(); // get the character if (rx==FRAME_7E) {