RealtimeCompLab2
Dependencies: mbed
Fork of PPP-Blinky by
Diff: main.cpp
- Revision:
- 15:b0154c910143
- Parent:
- 14:c65831c25aaa
- Child:
- 16:cb0b80c24ba2
--- a/main.cpp Sun Jan 01 04:44:30 2017 +0000 +++ b/main.cpp Sun Jan 01 13:25:23 2017 +0000 @@ -15,22 +15,22 @@ // https://en.wikibooks.org/wiki/Serial_Programming/IP_Over_Serial_Connections Serial pc(USBTX, USBRX); // The USB com port - Set this up as a Dial-Up Modem on your pc -Serial xx(PC_10, PC_11); // debug port - use an additional USB serial port to monitor this +Serial xx(PC_10, PC_11); // debug((((( port - use an additional USB serial port to monitor this -#define debug(x) xx.printf( x ) +#define debug(x) xx.printf x DigitalOut led1(LED1); #define FRAME_7E (0x7e) #define BUFLEN (1<<13) -char rxbuf[BUFLEN]; +volatile char rxbuf[BUFLEN]; char frbuf[3000]; // buffer for ppp frame struct { int online; struct { - char * buf; - int head; + volatile char * buf; + volatile int head; int tail; int total; } rx; // serial port buffer @@ -51,11 +51,14 @@ void rxHandler() // serial port receive interrupt handler { - ppp.rx.buf[ppp.rx.head]=pc.getc(); // insert in buffer - __disable_irq(); - ppp.rx.head=(ppp.rx.head+1)&(BUFLEN-1); - ppp.rx.total++; - __enable_irq(); + int next = (ppp.rx.head+1)&(BUFLEN-1); + if (next != ppp.rx.tail) { + ppp.rx.buf[ppp.rx.head]=pc.getc(); // insert in buffer + __disable_irq(); + ppp.rx.head=next; + //ppp.rx.total++; + __enable_irq(); + } } int ledState=0; @@ -71,7 +74,7 @@ int pc_getBuf() // get one character from the buffer { - if (pc_readable()) { + if (ppp.rx.head!=ppp.rx.tail) { int x = ppp.rx.buf[ ppp.rx.tail ]; ppp.rx.tail=(ppp.rx.tail+1)&(BUFLEN-1); return x; @@ -83,7 +86,7 @@ void processFrame(int start, int end) { // process received frame led1Toggle(); // change led1 state when frames are received - if(start==end) { xx.printf("Null Frame c=%d\n",ppp.rx.total); pc.putc(0x7e); return; } + if(start==end) { pc.putc(0x7e); return; } crcReset(); char * dest = ppp.pkt.buf; ppp.pkt.len=0; @@ -102,15 +105,15 @@ void determinePacketType(); // declare early determinePacketType(); } else { // crc error - xx.printf("CRC is %x Len is %d\n",ppp.pkt.crc,ppp.pkt.len); - for(int i=0;i<ppp.pkt.len;i++)xx.printf("%02x ", ppp.pkt.buf[i]); - xx.printf("\n"); + debug(("CRC is %x Len is %d\n",ppp.pkt.crc,ppp.pkt.len)); + for(int i=0;i<ppp.pkt.len;i++) debug(("%02x ", ppp.pkt.buf[i])); + debug(("\n")); } } void dumpFrame() { - for(int i=0;i<ppp.pkt.len/2;i++) xx.printf("%02x ", ppp.pkt.buf[i]); - xx.printf(" C %02x %02x L=%d\n", ppp.pkt.crc&0xff, (ppp.pkt.crc>>8)&0xff, ppp.pkt.len); + for(int i=0;i<ppp.pkt.len/2;i++) debug(("%02x ", ppp.pkt.buf[i])); + debug((" C %02x %02x L=%d\n", ppp.pkt.crc&0xff, (ppp.pkt.crc>>8)&0xff, ppp.pkt.len)); } void sendFrame(){ @@ -119,7 +122,6 @@ ppp.pkt.buf[ ppp.pkt.len-1 ] = (~crc>>8); // fcs hi (crc) pc.putc(0x7e); // frame start flag for(int i=0;i<ppp.pkt.len;i++) { - //xx.printf( "%2x ", ppp.pkt.buf[i]); unsigned int cc = (unsigned int)ppp.pkt.buf[i]; if (cc>32) pc.putc(cc); else {pc.putc(0x7d); pc.putc(cc+32);} } @@ -127,16 +129,16 @@ } void ipRequestHandler(){ - debug("IPCP Conf "); + debug(("IPCP Conf ")); if ( ppp.pkt.buf[7] != 4 ) { - debug("Rej\n"); // reject if any options are requested + debug(("Rej\n")); // reject if any options are requested ppp.pkt.buf[4]=4; sendFrame(); } else { - debug("Ack\n"); + debug(("Ack\n")); ppp.pkt.buf[4]=2; // ack the minimum sendFrame(); // acknowledge - debug("IPCP Ask\n"); + debug(("IPCP Ask\n")); // send our own request now ppp.pkt.buf[4]=1; // request no options ppp.pkt.buf[5]++; // next sequence @@ -144,14 +146,13 @@ } } -void ipAckHandler(){ debug("IPCP Grant\n"); } +void ipAckHandler(){ debug(("IPCP Grant\n")); } -void ipNackHandler(){ debug("IPCP Nack\n"); } +void ipNackHandler(){ debug(("IPCP Nack\n")); } -void ipDefaultHandler(){ debug("IPCP Other\n"); } +void ipDefaultHandler(){ debug(("IPCP Other\n")); } void IPCPframe() { - //ppp.pkt.id = ppp.pkt.buf[5]; // remember the sequence number int code = ppp.pkt.buf[4]; // packet type is here switch (code) { case 1: ipRequestHandler(); break; @@ -178,12 +179,12 @@ char * dstIP = udpPkt+16; // udp dst addr #define UDP_HEADER_SIZE 8 int udpLength = ((udpLen[0]<<8) | udpLen[1]) - UDP_HEADER_SIZE; // size of the actual udp data - xx.printf("UDP %d.%d.%d.%d:%d ", srcIP[0],srcIP[1],srcIP[2],srcIP[3],srcPort); - xx.printf("%d.%d.%d.%d:%d ", dstIP[1],dstIP[1],dstIP[1],dstIP[1],dstPort); - xx.printf("Len %d ", udpLength); + debug(("UDP %d.%d.%d.%d:%d ", srcIP[0],srcIP[1],srcIP[2],srcIP[3],srcPort)); + debug(("%d.%d.%d.%d:%d ", dstIP[1],dstIP[1],dstIP[1],dstIP[1],dstPort)); + debug(("Len %d ", udpLength)); int printSize = udpLength; if (printSize > 20) printSize = 20; // print only first 20 characters - for (int i=0; i<printSize; i++) { char ch = udpInf[i]; if (ch>31 && ch<127) xx.putc(ch); else xx.putc('?'); } - xx.printf("\n"); + for (int i=0; i<printSize; i++) { char ch = udpInf[i]; if (ch>31 && ch<127) { debug(("%c", ch)); } else { debug(("?")); } } + debug(("\n")); } int dataCheckSum(char * ptr, int len) { @@ -229,7 +230,7 @@ ipTTL[0]--; // decrement time to live char * srcAdr = ipPkt+12; char * dstAdr = ipPkt+16; - xx.printf("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]); + debug(("ICMP PING %d.%d.%d.%d %d.%d.%d.%d Head %04d Tail=%04d ", srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3],dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3],ppp.rx.head,ppp.rx.tail)); char src[4]; char dst[4]; memcpy(src, srcAdr,4); memcpy(dst, dstAdr,4); @@ -244,36 +245,38 @@ int dataLength = packetLength - headerSize; // length of ICMP data portion int sum = dataCheckSum( icmpType, dataLength); // this checksum on icmp data portion icmpSum[0]=sum>>8; icmpSum[1]=sum; // new checksum for ICMP data portion - sendFrame(); // reply to the ping int printSize = dataLength-8; // exclude size of icmp header char * icmpData = icmpType+8; // the actual data is after the header - if (printSize > 20) printSize = 20; // print only first 20 characters - for (int i=0; i<printSize; i++) { char ch = icmpData[i]; if (ch>31 && ch<127) xx.putc(ch); else xx.putc('?'); } - xx.putc('\n'); + if (printSize > 10) printSize = 10; // print only first 20 characters + for (int i=0; i<printSize; i++) { char ch = icmpData[i]; if (ch>31 && ch<127) { debug(("%c",ch)); } else { debug(("%c",'?')); }} + debug(("%c",'\n')); + + sendFrame(); // reply to the ping + } else { - xx.printf("ICMP type=%d \n", icmpType[0]); + debug(("ICMP type=%d \n", icmpType[0])); } } void IGMPpacket() { // internet group management protocol - xx.printf("IGMP type=%d \n", ppp.pkt.buf[28]); + debug(("IGMP type=%d \n", ppp.pkt.buf[28])); } void TCPpacket() { - debug("TCP\n"); + debug(("TCP\n")); /* switch (protocol) { case 2: TCPsyn(); break; case 17: TCPack(); break; case 6: TCPpacket(); break; - default: debug( "Other \n"); + default: debug(((( "Other \n"); } */ } void otherProtocol() { - debug("Other IP protocol"); + debug(("Other IP protocol")); } void IPframe() { @@ -285,38 +288,38 @@ case 6: TCPpacket(); break; default: otherProtocol(); } - //xx.printf("IP frame proto %3d len %4d %d.%d.%d.%d %d.%d.%d.%d\n", ppp.pkt.buf[13],(ppp.pkt.buf[6]<<8)+ppp.pkt.buf[7],ppp.pkt.buf[16],ppp.pkt.buf[17],ppp.pkt.buf[18],ppp.pkt.buf[19],ppp.pkt.buf[20],ppp.pkt.buf[21],ppp.pkt.buf[22],ppp.pkt.buf[23] ); + //debug((("IP frame proto %3d len %4d %d.%d.%d.%d %d.%d.%d.%d\n", ppp.pkt.buf[13],(ppp.pkt.buf[6]<<8)+ppp.pkt.buf[7],ppp.pkt.buf[16],ppp.pkt.buf[17],ppp.pkt.buf[18],ppp.pkt.buf[19],ppp.pkt.buf[20],ppp.pkt.buf[21],ppp.pkt.buf[22],ppp.pkt.buf[23] ); } void LCPconfReq() { - debug("LCP Config "); + debug(("LCP Config ")); if (ppp.pkt.buf[7] != 4) { ppp.pkt.buf[4]=4; // allow only no options - debug("Reject\n"); + debug(("Reject\n")); sendFrame(); } else { ppp.pkt.buf[4]=2; // ack zero conf - debug("Ack\n"); + debug(("Ack\n")); sendFrame(); - debug("LCP Ask\n"); + debug(("LCP Ask\n")); ppp.pkt.buf[4]=1; // request no options sendFrame(); } } void LCPconfAck() { - debug("LCP Ack\n"); + debug(("LCP Ack\n")); } void LCPend(){ - debug("LCP End\n"); + debug(("LCP End\n")); ppp.online=0; // start hunting for connect string again ppp.pkt.buf[4]=6; sendFrame(); // acknowledge } void LCPother(){ - debug("LCP Other\n"); + debug(("LCP Other\n")); dumpFrame(); } @@ -331,13 +334,13 @@ } void discardedFrame() { - xx.printf("Dropping frame %02x %02x %02x %02x\n", ppp.pkt.buf[0],ppp.pkt.buf[1],ppp.pkt.buf[2],ppp.pkt.buf[3] ); + debug(("Dropping frame %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"); return;} - if ( ppp.pkt.buf[1] != 3 ) {debug("byte1 != 3\n"); return;} - if ( ppp.pkt.buf[3] != 0x21 ) {debug("byte2 != 21\n"); return;} + if ( ppp.pkt.buf[0] != 0xff ) { debug(("byte0 != ff\n")); return;} + if ( ppp.pkt.buf[1] != 3 ) { debug(("byte1 != 3\n")); return;} + if ( ppp.pkt.buf[3] != 0x21 ) { debug(("byte2 != 21\n")); return;} int packetType = ppp.pkt.buf[2]; switch (packetType) { case 0xc0: LCPframe(); break; // link control @@ -349,12 +352,12 @@ void scanForConnectString() { if ( ppp.online==0 ) { - char * clientFound = strstr( rxbuf, "CLIENTCLIENT" ); // look for PC string + char * clientFound = strstr( (char *)rxbuf, "CLIENTCLIENT" ); // look for PC string if( clientFound ) { strcpy( clientFound, "FOUND!FOUND!" ); // overwrite so we don't get fixated pc.printf("CLIENTSERVER"); // respond to PC ppp.online=1; // we can stop looking for the string - debug("Connect string found\n"); + debug(("Connect string found\n")); } } } @@ -362,7 +365,7 @@ int main() { pc.baud(115200); // USB virtual serial port - xx.baud(115200); // second serial port for debug messages + xx.baud(115200); // second serial port for debug(((((((( messages xx.puts("\x1b[2J\x1b[HReady\n"); // VT100 code for clear screen & home pppInitStruct(); // initialize all the PPP properties