RealtimeCompLab2

Dependencies:   mbed

Fork of PPP-Blinky by Nicolas Nackel

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
 }