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 119:e14dd2bf0ea3, committed 2017-08-08
- 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