Lab2_web / Mbed 2 deprecated webserverBlinky

Dependencies:   mbed

Fork of webserverBlinky by RealTimeCompLab2

Files at this revision

API Documentation at this revision

Comitter:
nixnax
Date:
Tue Aug 08 17:10:29 2017 +0000
Parent:
118:54d1936e3768
Child:
120:bef89e4c906e
Commit message:
Fix dropping of input characters, first packet error.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Aug 08 01:58:22 2017 +0000
+++ b/main.cpp	Tue Aug 08 17:10:29 2017 +0000
@@ -37,7 +37,7 @@
 // The #define below enables/disables a second (OPTIONAL) serial port that prints out interesting diagnostic messages.
 // Change to SERIAL_PORT_MONITOR_YES to enable diagnostics messages. You need to wire a second serial port to your mbed hardware to monitor this.
 // Note - the LPC11U24 does NOT have a second serial port
-#define SERIAL_PORT_MONITOR_NO /* change to SERIAL_PORT_MONITOR_YES for debug messages */
+#define SERIAL_PORT_MONITOR_YES /* change to SERIAL_PORT_MONITOR_YES for debug messages */
 
 // here we define the OPTIONAL, second debug serial port for the various target boards
 // insert your target board's port here if it's not in yet - if it works, please send it to me - thanks!!!
@@ -53,16 +53,14 @@
 #else
 #error Add your target board's second serial port here if you want to use debugging - or choose SERIAL_PORT_MONITOR_NO
 #endif
-#define debug(x...) xx.printf (x) /* if we have a serial port we print debug messages */
-#define debugputc(x...) xx.putc(x)
+#define debugPrintf(x...) xx.printf (x) /* if we have a serial port we print debug messages */
+#define debugPutc(x...) xx.putc(x)
 #define debugBaudRate(x...) xx.baud(x)
-#define debugPuts(x...) xx.puts(x)
 #else
-// if we don't have a debug port the debug functions do nothing
-#define debug(x...) {}
-#define debugputc(x...) {}
+// if we don't have a debug port the debug print functions do nothing
+#define debugPrintf(x...) {}
+#define debugPutc(x...) {}
 #define debugBaudRate(x...) {}
-#define debugPuts(x...) {}
 #endif
 
 // verbosity flags used in debug printouts - change to 1 to see increasingly more detailed debug info.
@@ -110,6 +108,7 @@
     int crc; // for calculating IP and TCP CRCs
     int ledState; // state of LED1
     int httpPageCount;
+    int firstFrame; // cleared after first frame
     struct {
 #define RXBUFLEN (1<<11)
         // the serial port receive buffer and packet buffer, size is RXBUFLEN (currently 2048 bytes)
@@ -150,6 +149,7 @@
     ppp.ledState=0;
     ppp.hdlc.frameStartIndex=0;
     ppp.httpPageCount=0;
+    ppp.firstFrame=1;
 }
 
 void led1Toggle()
@@ -165,7 +165,7 @@
     if ( pc.readable() ) {
         int hd = (ppp.rx.head+1)&(RXBUFLEN-1); // increment/wrap head index
         if ( hd == ppp.rx.rtail ) {
-            debug("\nReceive buffer full\n");
+            debugPrintf("\nReceive buffer full\n");
             return;
         }
         ch = pc.getc(); // read new character
@@ -173,7 +173,7 @@
         if ( ppp.online == 0 ) {
             if (ch == 0x7E) {
                 ppp.online = 1;
-                debug("HDLC Frame (0x7E)\n");
+                debugPrintf("HDLC Frame (0x7E)\n");
             }
         }
         ppp.rx.head = hd; // update head pointer
@@ -182,14 +182,22 @@
 }
 
 // print to debug port while checking for incoming characters
+void putcWhileCheckingInput( char outByte )
+{
+#ifdef SERIAL_PORT_MONITOR_YES
+    fillbuf();
+    debugPutc( outByte );
+    fillbuf();
+#endif
+}
+
 void printWhileCheckingInput( char * data )
 {
 #ifdef SERIAL_PORT_MONITOR_YES
     char * nextChar = data;
     while( *nextChar != 0 ) {
-        debugputc( *nextChar ); // write one character to debug port
+        putcWhileCheckingInput( *nextChar ); // write one character to debug port while checking input
         nextChar++;
-        fillbuf(); // check the PC input stream
     }
 #endif
 }
@@ -234,11 +242,11 @@
 // In WireShark, use "Import Hex File". Options are: Offset=None, Protocol=PPP.
 void dumpPPPFrame()
 {
-    for(int i=0; i<ppp.pkt.len; i++) debug("%02x ", ppp.pkt.buf[i]);
-    debug(" CRC=%04x Len=%d\n", ppp.pkt.crc, ppp.pkt.len);
+    for(int i=0; i<ppp.pkt.len; i++) debugPrintf("%02x ", ppp.pkt.buf[i]);
+    debugPrintf(" CRC=%04x Len=%d\n", ppp.pkt.crc, ppp.pkt.len);
 }
 
-void processHDLCFrame(int start, int end)   // process received frame
+void processPPPFrame(int start, int end)   // process received frame
 {
     led1Toggle(); // change led1 state on every frame we receive
     if(start==end) {
@@ -275,7 +283,7 @@
     } else {
         if (1) {
             char pbuf[50]; // local print buffer
-            sprintf(pbuf, "\nPPP FCS(crc) Error CRC=%x Length = %d\n",ppp.pkt.crc,ppp.pkt.len); // print a debug line
+            sprintf(pbuf, "PPP FCS(crc) Error CRC=%x Length = %d\n",ppp.pkt.crc,ppp.pkt.len); // print a debug line
             printWhileCheckingInput( pbuf );
             if(0) dumpPPPFrame();
         }
@@ -285,9 +293,12 @@
 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
     } else {
+        fillbuf();
         pc.putc(ch);
     }
 }
@@ -306,11 +317,11 @@
 
 void ipcpConfigRequestHandler()
 {
-    debug("Their IPCP Config Req, Our Ack\n");
+    debugPrintf("Their IPCP Config Req, Our Ack\n");
     ppp.pkt.buf[4]=2; // change code to ack
     send_pppFrame(); // acknowledge everything they ask for - assume it's IP addresses
 
-    debug("Our IPCP Ask (no options)\n");
+    debugPrintf("Our IPCP Ask (no options)\n");
     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)
@@ -319,12 +330,12 @@
 
 void ipcpAckHandler()
 {
-    debug("Their IPCP Grant\n");
+    debugPrintf("Their IPCP Grant\n");
 }
 
 void ipcpNackHandler()
 {
-    debug("Their IPCP Nack, Our ACK\n");
+    debugPrintf("Their IPCP Nack, Our ACK\n");
     if (ppp.pkt.buf[8]==3) { // check if the NACK contains an IP address parameter
         ppp.pkt.buf[4]=1; // assume the NACK contains our "suggested" IP address
         send_pppFrame(); // let's request this IP address as ours
@@ -333,7 +344,7 @@
 
 void ipcpDefaultHandler()
 {
-    debug("Their IPCP Other\n");
+    debugPrintf("Their IPCP Other\n");
 }
 
 void IPCPframe()
@@ -373,22 +384,22 @@
 #endif
 #define UDP_HEADER_SIZE 8
     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 %03d", udpLength);
+    if(v0) debugPrintf("UDP %d.%d.%d.%d:%d ", srcIP[0],srcIP[1],srcIP[2],srcIP[3],srcPort);
+    if(v0) debugPrintf("%d.%d.%d.%d:%d ",     dstIP[0],dstIP[1],dstIP[2],dstIP[3],dstPort);
+    if(v0) debugPrintf("Len %03d", udpLength);
     int printSize = udpLength;
     if (printSize > 20) printSize = 20; // print only first 20 characters
     if (v1) {
         for (int i=0; i<printSize; i++) {
             char ch = udpInf[i];
             if (ch>31 && ch<127) {
-                debug("%c", ch);
+                debugPrintf("%c", ch);
             } else {
-                debug("_");
+                debugPrintf("_");
             }
         }
     }
-    if (v0) debug("\n");
+    if (v0) debugPrintf("\n");
 }
 
 unsigned int dataCheckSum(unsigned char * ptr, int len)
@@ -453,8 +464,8 @@
         int icmpIdent = (icmpType[4]<<8)|icmpType[5];
         int icmpSequence = (icmpType[6]<<8)|icmpType[7];
 #endif
-        if(v0) debug("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) debug("Ident %04x Sequence %04d ",icmpIdent,icmpSequence);
+        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);
         char src[4];
         char dst[4];
         memcpy(src, srcAdr,4);
@@ -481,42 +492,31 @@
             for (int i=0; i<printSize; i++) {
                 char ch = icmpData[i];
                 if (ch>31 && ch<127) {
-                    debug("%c",ch);
+                    debugPrintf("%c",ch);
                 } else {
-                    debug("_");
+                    debugPrintf("_");
                 }
             }
-            debug("\n");
+            debugPrintf("\n");
         }
         send_pppFrame(); // reply to the ping
 
     } else {
         if (v0) {
-            debug("ICMP type=%d \n", icmpType[0]);
+            debugPrintf("ICMP type=%d \n", icmpType[0]);
         }
     }
 }
 
 void IGMPpacket()   // internet group management protocol
 {
-    if (v0) debug("IGMP type=%d \n", ppp.pkt.buf[28]);
+    if (v0) debugPrintf("IGMP type=%d \n", ppp.pkt.buf[28]);
 }
 
 void dumpHeaderIP (int outGoing)
 {
-
 #if defined(IP_HEADER_DUMP_YES) && defined(SERIAL_PORT_MONITOR_YES)
-    if(0) {
-        if ( ppp.pkt.buf[37] != 0x10 ) return;
-        if ( pc.readable() ) {
-            printWhileCheckingInput("DH_IP\n");    // flag this condition in debug
-            return;
-        }
-        if ((outGoing==1) && (ppp.pkt.buf[37]==0x11)) {
-            //printWhileCheckingInput("A\n");    // flag this condigtion in debug
-            return;
-        }
-    }
+    fillbuf(); // we are expecting the first character of the next packet
     char * ipPkt = ppp.pkt.buf+4; // ip packet start
     char * ident =      ipPkt+4;  // 2 bytes
 #ifdef UNUSED_IP_VARIABLES
@@ -541,36 +541,30 @@
     int protocolIP = protocol[0];
     unsigned int checksumIP = (headercheck[0]<<8)|headercheck[1];
 #endif
-    int identIP = (ident[0]<<8)|ident[1];
+    int IPv4Id = (ident[0]<<8)|ident[1];
+    char pbuf[50]; // local print buffer
     int n=0;
-    char pbuf[140]; // local print buffer
-#ifdef DUMP_FULL_IP_ADDRESS
-    n=n+sprintf(pbuf+n, "IP %d.%d.%d.%d %d.%d.%d.%d ",srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3], dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3]); // full ip addresses
-#else
-    n=n+sprintf(pbuf+n, "%s ", outGoing ? "ME" : "IP" ); // write ME for outgoing and IP for incoming IP packets
-    n=n+sprintf(pbuf+n, "%05d ",identIP); // ident 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
+    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
+    char * dstAdr =     ipPkt+16; // 4 bytes = total of 20 bytes
+    n=n+sprintf(pbuf+n, " %d.%d.%d.%d %d.%d.%d.%d ",srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3], dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3]); // full ip addresses
 #endif
     printWhileCheckingInput( pbuf );
 #ifndef TCP_HEADER_DUMP_YES
-    debugputc('\n'); // there is no TCP header dump, so terminate the line with \n
+    printWhileCheckingInput('\x1b[30m\n'); // there is no TCP header dump, so terminate the line with \n and VT100 code for black
 #endif
 #endif
 }
 
 void dumpHeaderTCP(int outGoing)
 {
-
 #if defined(TCP_HEADER_DUMP_YES) && defined(SERIAL_PORT_MONITOR_YES)
-    if (0) {
-        if ( ppp.pkt.buf[37] != 0x10 ) return;
-        if ( pc.readable() ) {
-            printWhileCheckingInput("DH_TCP\n");    // flag this condition in debug
-            return;
-        }
-        if ((outGoing==1) && (ppp.pkt.buf[37]==0x11)) {
-            return;
-        }
-    }
     int headerSizeIP     = (ppp.pkt.buf[4]&0xf)*4; // header size of ip portion
     char * tcpStart      =  ppp.pkt.buf+4+headerSizeIP; // start of tcp packet
     char * seqtcp        = tcpStart + 4;  // 4 bytes
@@ -581,10 +575,11 @@
     if (seq && ack) {} // shut up the compiler about unused variables
     int flags = ((flagbitstcp[0]&1)<<8)|flagbitstcp[1];
 
-    char flagInfo[9]; // text string presentating the 8 most important TCP flags
+    char flagInfo[9]; // text string presenting the 8 most important TCP flags
+#define PRINT_ALL_TCP_FLAGS_YES
+#ifdef PRINT_ALL_TCP_FLAGS_YES
     memset(flagInfo,'.', 8); // fill string with "........"
     flagInfo[8]=0; // null terminate string
-
     if (flags & (1<<0)) flagInfo[7]='F';
     if (flags & (1<<1)) flagInfo[6]='S';
     if (flags & (1<<2)) flagInfo[5]='R';
@@ -593,27 +588,24 @@
     if (flags & (1<<5)) flagInfo[2]='U';
     if (flags & (1<<6)) flagInfo[1]='E';
     if (flags & (1<<7)) flagInfo[0]='C';
-
-    char sflagInfo[4];
-    if (flags & (1<<1)) sflagInfo[0]='S';
-    if (flags & (1<<4)) sflagInfo[0]='A';
-    if (flags & (1<<3)) sflagInfo[0]='P';
-    if (flags & (1<<0)) sflagInfo[0]='F';
-    if (flags & (1<<2)) sflagInfo[0]='R';
-    sflagInfo[1]=' ';
-    sflagInfo[2]=0;
-    sflagInfo[3]=0;
-
-    //char pbuf[140]; // local print buffer
-#ifdef DUMP_IP_SEQUENCE_NUMBER
-    //sprintf(pbuf, "%s Seq %10u\n", flagInfo, seq); // tcp flags and the sequence number
 #else
-    //sprintf(pbuf, "%s\n", flagInfo); // tcp flags only
+    if (flags & (1<<4)) flagInfo[0]='A'; // choose the most important flag to print
+    if (flags & (1<<1)) flagInfo[0]='S';
+    if (flags & (1<<0)) flagInfo[0]='F';
+    if (flags & (1<<3)) flagInfo[0]='P';
+    if (flags & (1<<2)) flagInfo[0]='R';
+    flagInfo[1]=' ';
+    flagInfo[2]=0;
 #endif
-    printWhileCheckingInput( sflagInfo );
-    if( outGoing && ( ppp.pkt.buf[37] == 0x11 ) ) { // if this is an outgoing ACK/FIN with no data its probably the end of the TCP link
-        debugputc('\n'); // so insert an extra line to mark the end of the conversation
+    printWhileCheckingInput( flagInfo );
+#define EVERY_PACKET_ON_A_NEW_LINE_YES
+#ifdef EVERY_PACKET_ON_A_NEW_LINE_YES
+    putcWhileCheckingInput('\n'); // write a newline after every packet
+#endif
+    if( outGoing && ( flags == 0x11 ) ) { // ACK/FIN - if this is an outgoing ACK/FIN its the end of a tcp conversation
+        putcWhileCheckingInput('\n'); // insert an extra new line to mark the end of an HTTP the conversation
     }
+    if( pc.readable()) printWhileCheckingInput( "Char2\n");
 #endif
 }
 
@@ -628,7 +620,7 @@
 
     httpGetRoot = strncmp(dataStart, "GET / HTTP/1.", 13); // found GET, respond to both HTTP/1.<anything>
     xFetch = strncmp(dataStart, "GET /x", 6); // found GET /x , respond to both HTTP/1.<anything>
-    // for example, in linux, xFetch can be used as:   echo GET /x | nc 172.10.10.2
+    // for example, you could try this using netcat (nc):    echo "GET /x" | nc 172.10.10.2
     if( (httpGetRoot==0) || (xFetch==0) ) {
         n=n+sprintf(n+dataStart,"HTTP/1.1 200 OK\r\nServer: mbed-PPP-Blinky\r\n"); // 200 OK header
     } else {
@@ -655,7 +647,7 @@
 #else
 #define BENCHMARK_USING_BROWSER_NO /* set to _YES if you want to use your browser as a benchmark tool */
 #ifndef BENCHMARK_USING_BROWSER_NO
-            // a small script that reloads the page after 10 ms - handy for benchmarking using your web browser, use http://172.10.10.2/x
+            // semd a small browser script that will reload the page after 10 ms - handy for benchmarking with your web browser, use http://172.10.10.2/x
             n=n+sprintf(n+dataStart, "<script>setTimeout(function(){location.reload();},10);</script><body>%d</body>",ppp.httpPageCount);
 #else
             n=n+sprintf(n+dataStart,"%d",ppp.httpPageCount); // not valid html but fast, most browsers and curl are ok with it
@@ -677,7 +669,7 @@
     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);
+        debugPrintf("HTTP Response: HTTP-header %d HTTP-content %d HTTP-total %d\n",nHeader,n-nHeader,n);
     }
     return n; // total byte size of our response
 }
@@ -690,7 +682,7 @@
     n=n+sprintf(n+dataStart,"Got %04d bytes.\n",len); // report the number of bytes received
     while( (n%4)!= 0) n=n+sprintf(n+dataStart,"*"); // insert spaces until n is exactly two away from a multiple of four
     if (v2) {
-        debug("TCP response %d byes\n",n);
+        debugPrintf("TCP response %d bytes\n",n);
     }
     return n; // total byte size of our response
 }
@@ -698,7 +690,7 @@
 void tcpHandler()
 {
     // IP header
-    //fillbuf();
+
     char * ipPkt = ppp.pkt.buf+4; // ip packet start
     char * ihl =        ipPkt;    // bottom 4 bits
     char * pktLen =     ipPkt+2;  // 2 bytes
@@ -756,15 +748,15 @@
     int flagsOut = TCP_FLAG_ACK; // the default case is an ACK packet
     int flagsTCP = ((flagbitstcp[0]&1)<<8)|flagbitstcp[1]; // the tcp flags we received
 
-    windowsizetcp[0]=2; // tcp window size = 700
-    windowsizetcp[1]=0xbc; // tcp windows size = 700
+    windowsizetcp[0] = (700 >> 8  );   // tcp window size hi byte
+    windowsizetcp[1] = (700 & 0xff);   // tcp window size lo byte
 
     // A sparse TCP flag interpreter that implements stateless TCP connections
 
     switch ( flagsTCP ) {
         case TCP_FLAG_SYN:
             flagsOut = TCP_FLAG_SYN | TCP_FLAG_ACK; // something wants to connect - acknowledge it
-            seq_out = seq_in+0x10000000U; // create a new sequence number using their sequence as a base
+            seq_out = seq_in+0x10000000U; // create a new sequence number using their sequence as a starting point, increase the highest digit
             ack_out++; // for SYN flag we have to increase the sequence by 1
             break;
         case TCP_FLAG_ACK | TCP_FLAG_PSH:
@@ -846,10 +838,10 @@
     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<1; i++) {
-   //     wait_ms(1);    // wait long enough to ensure we will be given time to dump the headers if we wanted to
-     //   fillbuf();
-    //}
+    for (int i=0; i<35000/50; i++) { // a 35 ms delay before sending frame
+        fillbuf(); // catch any incoming characters
+        wait_us(50); // wait less than 1 character duration at 115200
+    }
     send_pppFrame(); // All preparation complete - send the TCP response
 }
 
@@ -860,11 +852,11 @@
     int headerSizeTCP = ((ppp.pkt.buf[4+ipHeaderLen+12]>>4)&0xf)*4;; // length of tcp header
     int dataLen = ipPktLen - ipHeaderLen - headerSizeTCP; // data is what's left after the two headers
     if (v1) {
-        debug("TCP %d ipHeader %d tcpHeader %d Data %d\n", ipPktLen, ipHeaderLen, headerSizeTCP, dataLen);    // 1 for more verbose
+        debugPrintf("TCP %d ipHeader %d tcpHeader %d Data %d\n", ipPktLen, ipHeaderLen, headerSizeTCP, dataLen);    // 1 for more verbose
     }
     if (dataLen > 0) {
         ppp.pkt.buf[4+ipHeaderLen+headerSizeTCP+dataLen]=0; // insert a null after the data so debug printf stops printing after the data
-        debug("%s\n",ppp.pkt.buf+4+ipHeaderLen+headerSizeTCP);    // show the data
+        debugPrintf("%s\n",ppp.pkt.buf+4+ipHeaderLen+headerSizeTCP);    // show the data
     }
 }
 
@@ -880,7 +872,7 @@
 
 void otherProtocol()
 {
-    debug("Other IP protocol");
+    debugPrintf("Other IP protocol");
 }
 
 void IPframe()
@@ -906,16 +898,16 @@
 
 void LCPconfReq()
 {
-    debug("LCP Config ");
+    debugPrintf("LCP Config ");
     if (ppp.pkt.buf[7] != 4) {
         ppp.pkt.buf[4]=4; // allow only "no options" which means Maximum Receive Unit (MRU) is default 1500 bytes
-        debug("Reject\n");
+        debugPrintf("Reject\n");
         send_pppFrame();
     } else {
         ppp.pkt.buf[4]=2; // ack zero conf
-        debug("Ack\n");
+        debugPrintf("Ack\n");
         send_pppFrame();
-        debug("LCP Ask\n");
+        debugPrintf("LCP Ask\n");
         ppp.pkt.buf[4]=1; // request no options
         send_pppFrame();
     }
@@ -923,7 +915,7 @@
 
 void LCPconfAck()
 {
-    debug("LCP Ack\n");
+    debugPrintf("LCP Ack\n");
 }
 
 void LCPend()
@@ -932,12 +924,12 @@
     send_pppFrame(); // acknowledge
     ppp.online=0; // start hunting for connect string again
     pppInitStruct(); // flush the receive buffer
-    debug("LCP End\n");
+    debugPrintf("LCP End\n");
 }
 
 void LCPother()
 {
-    debug("LCP Other\n");
+    debugPrintf("LCP Other\n");
     dumpPPPFrame();
 }
 
@@ -962,22 +954,22 @@
 void discardedFrame()
 {
     if (v0) {
-        debug("Frame is not IP, IPCP or LCP: %02x %02x %02x %02x\n", ppp.pkt.buf[0],ppp.pkt.buf[1],ppp.pkt.buf[2],ppp.pkt.buf[3]);
+        debugPrintf("Frame is not IP, IPCP or LCP: %02x %02x %02x %02x\n", ppp.pkt.buf[0],ppp.pkt.buf[1],ppp.pkt.buf[2],ppp.pkt.buf[3]);
     }
 }
 
 void determinePacketType()
 {
     if ( ppp.pkt.buf[0] != 0xff ) {
-        debug("byte0 != ff\n");
+        debugPrintf("byte0 != ff\n");
         return;
     }
     if ( ppp.pkt.buf[1] != 3    ) {
-        debug("byte1 !=  3\n");
+        debugPrintf("byte1 !=  3\n");
         return;
     }
     if ( ppp.pkt.buf[3] != 0x21 ) {
-        debug("byte2 != 21\n");
+        debugPrintf("byte2 != 21\n");
         return;
     }
     int packetType = ppp.pkt.buf[2];
@@ -996,7 +988,7 @@
     }
 }
 
-void wait_for_HDLC_frame()
+void wait_for_PPP_frame()
 {
     while(1) {
         fillbuf(); // handle received characters
@@ -1004,13 +996,17 @@
             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) {
-                ppp.hdlc.frameEndIndex=oldTail; // mark the frame end character
-
-                processHDLCFrame(ppp.hdlc.frameStartIndex, ppp.hdlc.frameEndIndex); // process the frame
-
-                ppp.rx.rtail = ppp.rx.tail;
-                ppp.hdlc.frameStartIndex = ppp.rx.tail; // where next frame will start
-                break;
+                if (ppp.firstFrame) { // is this the first frame start
+                    ppp.firstFrame=0;
+                    ppp.hdlc.frameStartIndex = ppp.rx.tail; // remember first frame start
+                    break;
+                }  else {
+                    ppp.hdlc.frameEndIndex=oldTail; // mark the frame end character
+                    processPPPFrame(ppp.hdlc.frameStartIndex, ppp.hdlc.frameEndIndex); // process the frame
+                    ppp.rx.rtail = ppp.rx.tail;
+                    ppp.hdlc.frameStartIndex = ppp.rx.tail; // where next frame will start
+                    break;
+                }
             }
         }
     }
@@ -1024,47 +1020,24 @@
         char * found1 = strstr( (char *)ppp.rx.buf, "CLIENT" );
         if (found1 != NULL) {
             // respond with Windows Dialup networking expected "Direct Connection Between Two Computers" response string
-            if (v0) debug("Found connect string \"CLIENT\", sent \"CLIENTSERVER\"\n");
+            if (v0) debugPrintf("Found connect string \"CLIENT\", sent \"CLIENTSERVER\"\n");
             pc.puts("CLIENTSERVER");
             ppp.online=1; // we are connected, so we can stop looking for the connect string
+            fillbuf();
         }
     }
 }
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 int main()
 {
     pc.baud(115200); // USB virtual serial port
     debugBaudRate(115200); // baud rate for our debug port if we have one
-    debugPuts("\x1b[2J\x1b[HReady\n"); // VT100 code for clear screen & home on our debug port
+    debugPrintf("\x1b[2J\x1b[HReady\n"); // VT100 code for clear screen & home on our debug port - Tera Term is a good VT100 terminal
     pppInitStruct(); // initialize all the PPP properties
     while(1) {
-        scanForConnectString(); // respond to connect command from windows dial up networking
+        scanForConnectString(); // wait for connect command from windows dial up networking
         while(ppp.online) {
-            wait_for_HDLC_frame();
+            wait_for_PPP_frame(); 
         }
     }
 }
\ No newline at end of file