RealtimeCompLab2
Dependencies: mbed
Fork of PPP-Blinky by
Diff: main.cpp
- Revision:
- 6:fba4c2e817b8
- Parent:
- 5:27624c02189f
- Child:
- 7:ab147f5e97ac
--- a/main.cpp Thu Dec 29 04:34:25 2016 +0000 +++ b/main.cpp Thu Dec 29 10:48:57 2016 +0000 @@ -6,7 +6,12 @@ // Note - turn off all authentication, passwords, compression etc. Simplest link possible. -Serial pc(USBTX, USBRX); // The USB com port - Set this up as a Dial-Up Modem +// Nice links +// http://atari.kensclassics.org/wcomlog.htm +// https://technet.microsoft.com/en-us/library/cc957992.aspx +// http://www.sunshine2k.de/coding/javascript/crc/crc_js.html + +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 a second USB serial port to monitor DigitalOut led1(LED1); @@ -24,6 +29,7 @@ int tail; } rx; // serial port buffer struct { + int id; int len; int crc; char * buf; @@ -59,12 +65,11 @@ return -1; } - void scanForConnectString(); // scan for connect attempts from pc int main() { - pc.baud(115200); + pc.baud(19200); xx.baud(115200); xx.puts("\x1b[2J\x1b[H"); // VT100 terminal control code for screen clear/home @@ -111,28 +116,30 @@ special=0; } } - ppp.pkt.crc = crcG; ppp.rx.head=0; // reuse rxbuf ppp.rx.tail=0; // reuse rxbuf - void determinePacketType(); // declare early - determinePacketType(); + ppp.pkt.crc = crcG; + if (crcG == 0xf0b8) { // check for good CRC + void determinePacketType(); // declare early + determinePacketType(); + } } + void sendFrame(){ crcReset(); for(int i=0;i<ppp.pkt.len-2;i++) crcDo(ppp.pkt.buf[i]); - ppp.pkt.buf[ ppp.pkt.len-2 ] = ((~crcG)>>0)&0xff; // update crc lo - ppp.pkt.buf[ ppp.pkt.len-1 ] = ((~crcG)>>8)&0xff; // update crc hi - pc.putc(0x7e); + ppp.pkt.buf[ ppp.pkt.len-2 ] = ((~crcG)>>0); // build crc lo + ppp.pkt.buf[ ppp.pkt.len-1 ] = ((~crcG)>>8); // build crc hi + pc.putc(0x7e); // start of frame for(int i=0;i<ppp.pkt.len;i++) { unsigned int cc = (unsigned int)ppp.pkt.buf[i]; - if (cc>32) pc.putc(cc); - else { - pc.putc(0x7d); pc.putc(cc+32); - } + if (cc>32) pc.putc(cc); else {pc.putc(0x7d);pc.putc(cc+32);} } - pc.putc(0x7e); + pc.putc(0x7e); // end of frame } + + void LCPrequestFrame() { ppp.pkt.buf[4]=2; // change to an ACK packet sendFrame(); // acknowledge their request @@ -155,21 +162,77 @@ xx.printf(" C %02x %02x L=%d\n", ppp.pkt.crc&0xff, (ppp.pkt.crc>>8)&0xff, ppp.pkt.len); } -void iPcpFrame() { - xx.printf("== IPCP Frame ==\n"); - for(int i=0;i<ppp.pkt.len;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); +void rejectIPcompression() { + xx.printf("== IP Compression Reject Frame ==\n"); + generalFrame(); + static char rejectCompression [] = {0x80,0x21,4,0,0,10,2,6,0,45,15,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + // 128/33=IPCP 4=Rej 0=id 0=sizeHigh 10=sizeLow 2,6,0,45,1=RejectCcompression + ppp.pkt.len=sizeof( rejectCompression ); + memcpy( rejectCompression, ppp.pkt.buf, ppp.pkt.len); + ppp.pkt.buf[3]=ppp.pkt.id; + sendFrame(); +} + +void ipRequestHandler(){ + xx.printf("== IP Request Frame ==\n"); + //static char compressRequest[] = {2,6,0,45,15,1}; + //if(0==memcmp(ppp.pkt.buf+6, compressRequest, 6)) rejectIPcompression(); + generalFrame(); + ppp.pkt.buf[2]=2; // ACK + sendFrame(); // acknowledge + + ppp.pkt.buf[2]=1; // request + ppp.pkt.buf[3]++; // next sequence + sendFrame(); // now WE do a request + +} + +void ipAckHandler(){ + xx.printf("== IP Ack Frame ==\n"); +} + +void ipNackHandler(){ + xx.printf("== IP Nack Frame ==\n"); +} + +void ipDefaultHandler(){ + xx.printf("== IP Unknown Frame ==\n"); +} + +void LCPgeneralFrame(){ + xx.printf("== LCP General Handler ==\n"); + generalFrame(); +} + + +void LCPhandler(){ + xx.printf("== LCP Handler ==\n"); + int action = ppp.pkt.buf[4]; + if(0); + else if ( action == 1 ) LCPrequestFrame(); + else if ( action == 2 ) LCPackFrame(); + else LCPgeneralFrame(); +} + +void IPFrame() { led1 = ppp.pkt.buf[3] & 1; // This is the sequence number so the led blinks on packets + ppp.pkt.len = (((unsigned int)ppp.pkt.buf[4])<<8) + (((unsigned int)ppp.pkt.buf[5])<<0); + ppp.pkt.id = ppp.pkt.buf[3]; // remember the sequence number + int action = ppp.pkt.buf[2]; // packet type is here + if(0); + else if ( action == 1 ) ipRequestHandler(); + else if ( action == 2 ) ipAckHandler(); + else if ( action == 3 ) ipNackHandler(); + else ipDefaultHandler(); } void determinePacketType() { - char pktLCPReqType [] = { 0xff, 3, 0xc0, 0x21, 1 }; // LCP requeswt packet - char pktLCPAckType [] = { 0xff, 3, 0xc0, 0x21, 2 }; // LCP ack packet - char pktIPCPtype [] = { 0x80, 0x21, 1 }; // ip control packet + static char pktLCPReqType [] = { 0xff, 3, 0xc0, 0x21 }; // LCP requeswt packet + static char pktIPCPtype [] = { 0x80, 0x21, 1 }; // ip control packet + if(0); - else if (0==memcmp( ppp.pkt.buf,pktLCPReqType,5)) LCPrequestFrame(); - else if (0==memcmp( ppp.pkt.buf,pktLCPAckType,5)) LCPackFrame(); - else if (0==memcmp( ppp.pkt.buf,pktIPCPtype,3 )) iPcpFrame(); + else if (0==memcmp( ppp.pkt.buf,pktLCPReqType,4)) LCPhandler(); + else if (0==memcmp( ppp.pkt.buf,pktIPCPtype, 3)) IPFrame(); else generalFrame(); // default handler }