Lab2_web / Mbed 2 deprecated webserverBlinky

Dependencies:   mbed

Fork of webserverBlinky by RealTimeCompLab2

Committer:
nixnax
Date:
Sat Dec 31 14:35:27 2016 +0000
Revision:
11:f58998c24f0b
Parent:
10:74f8233f72c0
Child:
12:db0dc91f0231
UDP and ICMP-ping working!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nixnax 0:2cf4880c312a 1 #include "mbed.h"
nixnax 0:2cf4880c312a 2
nixnax 0:2cf4880c312a 3 // Proof-of-concept for TCP/IP using Windows 7/8/10 Dial Up Networking over MBED USB Virtual COM Port
nixnax 0:2cf4880c312a 4
nixnax 4:a469050d5b80 5 // Toggles LED1 every time the PC sends an IP packet over the PPP link
nixnax 4:a469050d5b80 6
nixnax 4:a469050d5b80 7 // Note - turn off all authentication, passwords, compression etc. Simplest link possible.
nixnax 0:2cf4880c312a 8
nixnax 9:0992486d4a30 9 // Handy links
nixnax 6:fba4c2e817b8 10 // http://atari.kensclassics.org/wcomlog.htm
nixnax 6:fba4c2e817b8 11 // https://technet.microsoft.com/en-us/library/cc957992.aspx
nixnax 6:fba4c2e817b8 12 // http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
nixnax 9:0992486d4a30 13 // https://en.wikibooks.org/wiki/Serial_Programming/IP_Over_Serial_Connections
nixnax 6:fba4c2e817b8 14
nixnax 6:fba4c2e817b8 15 Serial pc(USBTX, USBRX); // The USB com port - Set this up as a Dial-Up Modem on your pc
nixnax 4:a469050d5b80 16 Serial xx(PC_10, PC_11); // debug port - use a second USB serial port to monitor
nixnax 0:2cf4880c312a 17
nixnax 9:0992486d4a30 18 #define debug(x) xx.printf( x )
nixnax 9:0992486d4a30 19
nixnax 4:a469050d5b80 20 DigitalOut led1(LED1);
nixnax 4:a469050d5b80 21
nixnax 4:a469050d5b80 22 #define FRAME_7E (0x7e)
nixnax 9:0992486d4a30 23 #define BUFLEN (1<<12)
nixnax 4:a469050d5b80 24 char rxbuf[BUFLEN];
nixnax 4:a469050d5b80 25 char frbuf[3000]; // buffer for ppp frame
nixnax 0:2cf4880c312a 26
nixnax 4:a469050d5b80 27 struct {
nixnax 4:a469050d5b80 28 int online;
nixnax 4:a469050d5b80 29 struct {
nixnax 4:a469050d5b80 30 char * buf;
nixnax 4:a469050d5b80 31 int head;
nixnax 4:a469050d5b80 32 int tail;
nixnax 9:0992486d4a30 33 int total;
nixnax 4:a469050d5b80 34 } rx; // serial port buffer
nixnax 4:a469050d5b80 35 struct {
nixnax 6:fba4c2e817b8 36 int id;
nixnax 4:a469050d5b80 37 int len;
nixnax 4:a469050d5b80 38 int crc;
nixnax 4:a469050d5b80 39 char * buf;
nixnax 4:a469050d5b80 40 } pkt; // ppp buffer
nixnax 4:a469050d5b80 41 } ppp;
nixnax 0:2cf4880c312a 42
nixnax 9:0992486d4a30 43 void pppInitStruct(){ ppp.online=0; ppp.rx.buf=rxbuf; ppp.rx.tail=0; ppp.rx.head=0; ppp.rx.total=0; ppp.pkt.buf=frbuf; ppp.pkt.len=0;}
nixnax 4:a469050d5b80 44
nixnax 4:a469050d5b80 45 int crcG; // frame check sequence (CRC) holder
nixnax 4:a469050d5b80 46 void crcDo(int x){for (int i=0;i<8;i++){crcG=((crcG&1)^(x&1))?(crcG>>1)^0x8408:crcG>>1;x>>=1;}} // crc calculator
nixnax 4:a469050d5b80 47 void crcReset(){crcG=0xffff;} // crc restart
nixnax 9:0992486d4a30 48 int crcBuf(char * buf, int size){crcReset();for(int i=0;i<size;i++)crcDo(*buf++);return crcG;} // crc on a block of memory
nixnax 0:2cf4880c312a 49
nixnax 0:2cf4880c312a 50 void rxHandler() // serial port receive interrupt handler
nixnax 0:2cf4880c312a 51 {
nixnax 4:a469050d5b80 52 ppp.rx.buf[ppp.rx.head]=pc.getc(); // insert in buffer
nixnax 0:2cf4880c312a 53 __disable_irq();
nixnax 4:a469050d5b80 54 ppp.rx.head=(ppp.rx.head+1)&(BUFLEN-1);
nixnax 9:0992486d4a30 55 ppp.rx.total++;
nixnax 0:2cf4880c312a 56 __enable_irq();
nixnax 0:2cf4880c312a 57 }
nixnax 0:2cf4880c312a 58
nixnax 0:2cf4880c312a 59 int pc_readable() // check if buffer has data
nixnax 0:2cf4880c312a 60 {
nixnax 4:a469050d5b80 61 return (ppp.rx.head==ppp.rx.tail) ? 0 : 1 ;
nixnax 0:2cf4880c312a 62 }
nixnax 0:2cf4880c312a 63
nixnax 0:2cf4880c312a 64 int pc_getBuf() // get one character from the buffer
nixnax 0:2cf4880c312a 65 {
nixnax 0:2cf4880c312a 66 if (pc_readable()) {
nixnax 4:a469050d5b80 67 int x = ppp.rx.buf[ ppp.rx.tail ];
nixnax 4:a469050d5b80 68 ppp.rx.tail=(ppp.rx.tail+1)&(BUFLEN-1);
nixnax 0:2cf4880c312a 69 return x;
nixnax 0:2cf4880c312a 70 }
nixnax 0:2cf4880c312a 71 return -1;
nixnax 0:2cf4880c312a 72 }
nixnax 0:2cf4880c312a 73
nixnax 4:a469050d5b80 74 void scanForConnectString(); // scan for connect attempts from pc
nixnax 1:9e03798d4367 75
nixnax 9:0992486d4a30 76 void processFrame(int start, int end) { // process received frame
nixnax 9:0992486d4a30 77 if(start==end) { xx.printf("Null Frame c=%d\n",ppp.rx.total); pc.putc(0x7e); return; }
nixnax 9:0992486d4a30 78 crcReset();
nixnax 9:0992486d4a30 79 char * dest = ppp.pkt.buf;
nixnax 9:0992486d4a30 80 ppp.pkt.len=0;
nixnax 9:0992486d4a30 81 int unstuff=0;
nixnax 9:0992486d4a30 82 for (int i=start; i<end; i++) {
nixnax 9:0992486d4a30 83 if (unstuff==0) {
nixnax 9:0992486d4a30 84 if (rxbuf[i]==0x7d) unstuff=1;
nixnax 9:0992486d4a30 85 else { *dest++ = rxbuf[i]; ppp.pkt.len++; crcDo(rxbuf[i]);}
nixnax 9:0992486d4a30 86 } else {
nixnax 9:0992486d4a30 87 *dest++ = rxbuf[i]^0x20; ppp.pkt.len++; crcDo((int)rxbuf[i]^0x20);
nixnax 9:0992486d4a30 88 unstuff=0;
nixnax 9:0992486d4a30 89 }
nixnax 9:0992486d4a30 90 }
nixnax 9:0992486d4a30 91 ppp.pkt.crc = crcG & 0xffff;
nixnax 9:0992486d4a30 92 if (ppp.pkt.crc == 0xf0b8) { // check for good CRC
nixnax 9:0992486d4a30 93 void determinePacketType(); // declare early
nixnax 9:0992486d4a30 94 determinePacketType();
nixnax 9:0992486d4a30 95 } else {
nixnax 9:0992486d4a30 96 xx.printf("CRC was %x \n",ppp.pkt.crc);
nixnax 9:0992486d4a30 97 for(int i=0;i<ppp.pkt.len;i++)xx.printf("%02x ", ppp.pkt.buf[i]);
nixnax 9:0992486d4a30 98 xx.printf("\nLen = %d\n", ppp.pkt.len);
nixnax 9:0992486d4a30 99 }
nixnax 9:0992486d4a30 100 }
nixnax 9:0992486d4a30 101
nixnax 11:f58998c24f0b 102 void dumpFrame() {
nixnax 11:f58998c24f0b 103 for(int i=0;i<ppp.pkt.len/2;i++) xx.printf("%02x ", ppp.pkt.buf[i]);
nixnax 11:f58998c24f0b 104 xx.printf(" C %02x %02x L=%d\n", ppp.pkt.crc&0xff, (ppp.pkt.crc>>8)&0xff, ppp.pkt.len);
nixnax 11:f58998c24f0b 105 }
nixnax 9:0992486d4a30 106
nixnax 9:0992486d4a30 107 void generalFrame() {
nixnax 9:0992486d4a30 108 debug("== General Frame ==\n");
nixnax 11:f58998c24f0b 109 dumpFrame();
nixnax 9:0992486d4a30 110 }
nixnax 9:0992486d4a30 111
nixnax 9:0992486d4a30 112 void sendFrame(){
nixnax 9:0992486d4a30 113 int crc = crcBuf(ppp.pkt.buf, ppp.pkt.len-2); // get crc
nixnax 9:0992486d4a30 114 ppp.pkt.buf[ ppp.pkt.len-2 ] = (~crc>>0); // fcs lo
nixnax 9:0992486d4a30 115 ppp.pkt.buf[ ppp.pkt.len-1 ] = (~crc>>8); // fcs hi
nixnax 9:0992486d4a30 116 pc.putc(0x7e); // frame flag
nixnax 9:0992486d4a30 117 for(int i=0;i<ppp.pkt.len;i++) {
nixnax 11:f58998c24f0b 118 //xx.printf( "%2x ", ppp.pkt.buf[i]);
nixnax 9:0992486d4a30 119 unsigned int cc = (unsigned int)ppp.pkt.buf[i];
nixnax 9:0992486d4a30 120 if (cc>32) pc.putc(cc); else {pc.putc(0x7d); pc.putc(cc+32);}
nixnax 9:0992486d4a30 121 }
nixnax 9:0992486d4a30 122 pc.putc(0x7e); // frame flag
nixnax 9:0992486d4a30 123 }
nixnax 9:0992486d4a30 124
nixnax 9:0992486d4a30 125 void ipRequestHandler(){
nixnax 9:0992486d4a30 126 debug("IPCP Conf ");
nixnax 9:0992486d4a30 127 if ( ppp.pkt.buf[7] != 4 ) {
nixnax 9:0992486d4a30 128 debug("Rej\n"); // reject if any options are requested
nixnax 9:0992486d4a30 129 ppp.pkt.buf[4]=4;
nixnax 9:0992486d4a30 130 sendFrame();
nixnax 9:0992486d4a30 131 } else {
nixnax 9:0992486d4a30 132 debug("Ack\n");
nixnax 9:0992486d4a30 133 ppp.pkt.buf[4]=2; // ack the minimum
nixnax 9:0992486d4a30 134 sendFrame(); // acknowledge
nixnax 9:0992486d4a30 135 // send our own request now
nixnax 9:0992486d4a30 136 debug("IPCP Ask\n");
nixnax 9:0992486d4a30 137 ppp.pkt.buf[4]=1; // request the minimum
nixnax 9:0992486d4a30 138 ppp.pkt.buf[5]++; // next sequence
nixnax 9:0992486d4a30 139 sendFrame(); // this is our request
nixnax 9:0992486d4a30 140 }
nixnax 9:0992486d4a30 141 }
nixnax 9:0992486d4a30 142
nixnax 9:0992486d4a30 143 void ipAckHandler(){ debug("IPCP Grant\n"); }
nixnax 9:0992486d4a30 144
nixnax 9:0992486d4a30 145 void ipNackHandler(){ debug("IPCP Nack\n"); }
nixnax 9:0992486d4a30 146
nixnax 9:0992486d4a30 147 void ipDefaultHandler(){ debug("IPCP Other\n"); }
nixnax 9:0992486d4a30 148
nixnax 9:0992486d4a30 149 void IPCPframe() {
nixnax 9:0992486d4a30 150 led1 = ppp.pkt.buf[5] & 1; // This is the sequence number so the led blinks on packets
nixnax 9:0992486d4a30 151 //ppp.pkt.id = ppp.pkt.buf[5]; // remember the sequence number
nixnax 9:0992486d4a30 152 int code = ppp.pkt.buf[4]; // packet type is here
nixnax 9:0992486d4a30 153 switch (code) {
nixnax 9:0992486d4a30 154 case 1: ipRequestHandler(); break;
nixnax 9:0992486d4a30 155 case 2: ipAckHandler(); break;
nixnax 9:0992486d4a30 156 case 3: ipNackHandler(); break;
nixnax 9:0992486d4a30 157 default: ipDefaultHandler();
nixnax 9:0992486d4a30 158 }
nixnax 9:0992486d4a30 159 }
nixnax 9:0992486d4a30 160
nixnax 10:74f8233f72c0 161 void UDPpacket() {
nixnax 10:74f8233f72c0 162 int idx = 4+((ppp.pkt.buf[4]&0xf)*4);
nixnax 10:74f8233f72c0 163 int srcPort = (ppp.pkt.buf[idx+0]<<8)|ppp.pkt.buf[idx+1];
nixnax 11:f58998c24f0b 164 int dstPort = (ppp.pkt.buf[idx+2]<<8)|ppp.pkt.buf[idx+3];
nixnax 11:f58998c24f0b 165 xx.printf("UDP %d.%d.%d.%d:%d ", ppp.pkt.buf[16],ppp.pkt.buf[17],ppp.pkt.buf[18],ppp.pkt.buf[19],srcPort);
nixnax 11:f58998c24f0b 166 xx.printf("%d.%d.%d.%d:%d\n", ppp.pkt.buf[20],ppp.pkt.buf[21],ppp.pkt.buf[22],ppp.pkt.buf[23],dstPort);
nixnax 11:f58998c24f0b 167 }
nixnax 11:f58998c24f0b 168
nixnax 11:f58998c24f0b 169
nixnax 11:f58998c24f0b 170 int dataCheckSum(char * ptr, int len) {
nixnax 11:f58998c24f0b 171 int sum=0;
nixnax 11:f58998c24f0b 172
nixnax 11:f58998c24f0b 173 for (int i=0;i<len/2;i++) {
nixnax 11:f58998c24f0b 174 int hi = *ptr; ptr++;
nixnax 11:f58998c24f0b 175 int lo = *ptr; ptr++;
nixnax 11:f58998c24f0b 176 int val = ( lo & 0xff ) | ( (hi<<8) & 0xff00 );
nixnax 11:f58998c24f0b 177 sum = sum + val;
nixnax 11:f58998c24f0b 178 }
nixnax 11:f58998c24f0b 179 sum = sum + (sum>>16);
nixnax 11:f58998c24f0b 180 sum = ~sum;
nixnax 11:f58998c24f0b 181 return sum;
nixnax 11:f58998c24f0b 182 }
nixnax 11:f58998c24f0b 183
nixnax 11:f58998c24f0b 184
nixnax 11:f58998c24f0b 185 void headerCheckSum() {
nixnax 11:f58998c24f0b 186 int len =(ppp.pkt.buf[4]&0xf)*4; // length of header in bytes
nixnax 11:f58998c24f0b 187 char * ptr = ppp.pkt.buf+4; // start of ip packet
nixnax 11:f58998c24f0b 188 int sum=0;
nixnax 11:f58998c24f0b 189
nixnax 11:f58998c24f0b 190 for (int i=0;i<len/2;i++) {
nixnax 11:f58998c24f0b 191 int hi = *ptr; ptr++;
nixnax 11:f58998c24f0b 192 int lo = *ptr; ptr++;
nixnax 11:f58998c24f0b 193 int val = ( lo & 0xff ) | ( (hi<<8) & 0xff00 );
nixnax 11:f58998c24f0b 194 sum = sum + val;
nixnax 11:f58998c24f0b 195 }
nixnax 11:f58998c24f0b 196 sum = sum + (sum>>16);
nixnax 11:f58998c24f0b 197 sum = ~sum;
nixnax 11:f58998c24f0b 198 ppp.pkt.buf[14]= (sum>>8);
nixnax 11:f58998c24f0b 199 ppp.pkt.buf[15]= (sum );
nixnax 11:f58998c24f0b 200
nixnax 11:f58998c24f0b 201
nixnax 11:f58998c24f0b 202
nixnax 9:0992486d4a30 203 }
nixnax 9:0992486d4a30 204
nixnax 11:f58998c24f0b 205 void ICMPpacket() { // internet control message protocol
nixnax 11:f58998c24f0b 206
nixnax 11:f58998c24f0b 207 int headerSize = ((ppp.pkt.buf[4]&0xf)*4);
nixnax 11:f58998c24f0b 208 int idx = headerSize + 4;
nixnax 11:f58998c24f0b 209 xx.printf("ICMP type=%d \n", ppp.pkt.buf[idx]);
nixnax 11:f58998c24f0b 210 if ( ppp.pkt.buf[idx] == 8 ) {
nixnax 11:f58998c24f0b 211 ppp.pkt.buf[12] = ppp.pkt.buf[12]-1; // TTL decrement
nixnax 11:f58998c24f0b 212 char src[4]; char dst[4];
nixnax 11:f58998c24f0b 213 memcpy(src, ppp.pkt.buf+16,4);
nixnax 11:f58998c24f0b 214 memcpy(dst, ppp.pkt.buf+20,4);
nixnax 11:f58998c24f0b 215 memcpy(ppp.pkt.buf+16,dst,4);
nixnax 11:f58998c24f0b 216 memcpy(ppp.pkt.buf+20,src,4); // swap src & dest ip
nixnax 11:f58998c24f0b 217 ppp.pkt.buf[15]=0;
nixnax 11:f58998c24f0b 218 ppp.pkt.buf[14]=0;
nixnax 11:f58998c24f0b 219 headerCheckSum(); // calc ip header checksum
nixnax 11:f58998c24f0b 220
nixnax 11:f58998c24f0b 221
nixnax 11:f58998c24f0b 222 int packetLength = (ppp.pkt.buf[6]<<8)|ppp.pkt.buf[7];
nixnax 11:f58998c24f0b 223 int dataLength = packetLength - headerSize;
nixnax 11:f58998c24f0b 224 ppp.pkt.buf[idx]=0; ppp.pkt.buf[idx+2]=0; ppp.pkt.buf[idx+3]=0;
nixnax 11:f58998c24f0b 225 int sum = dataCheckSum( ppp.pkt.buf+idx, dataLength); // calc icmp data checksum
nixnax 11:f58998c24f0b 226 ppp.pkt.buf[idx+2]=(sum>>8); ppp.pkt.buf[idx+3]=(sum );
nixnax 11:f58998c24f0b 227 sendFrame();
nixnax 11:f58998c24f0b 228 }
nixnax 11:f58998c24f0b 229 }
nixnax 11:f58998c24f0b 230
nixnax 11:f58998c24f0b 231 void IGMPpacket() { // internet group management protocol
nixnax 11:f58998c24f0b 232 xx.printf("IGMP type=%d \n", ppp.pkt.buf[28]);
nixnax 11:f58998c24f0b 233 }
nixnax 11:f58998c24f0b 234
nixnax 11:f58998c24f0b 235 void TCPpacket() {
nixnax 11:f58998c24f0b 236 debug("TCP\n");
nixnax 10:74f8233f72c0 237 /*
nixnax 11:f58998c24f0b 238 switch (protocol) {
nixnax 11:f58998c24f0b 239 case 2: TCPsyn(); break;
nixnax 11:f58998c24f0b 240 case 17: TCPack(); break;
nixnax 11:f58998c24f0b 241 case 6: TCPpacket(); break;
nixnax 11:f58998c24f0b 242 default: debug( "Other \n");
nixnax 11:f58998c24f0b 243 }
nixnax 10:74f8233f72c0 244 */
nixnax 10:74f8233f72c0 245 }
nixnax 10:74f8233f72c0 246
nixnax 11:f58998c24f0b 247 void otherProtocol() {
nixnax 11:f58998c24f0b 248 debug("Other protocol");
nixnax 11:f58998c24f0b 249 }
nixnax 11:f58998c24f0b 250
nixnax 10:74f8233f72c0 251 void IPframe() {
nixnax 10:74f8233f72c0 252 int protocol = ppp.pkt.buf[13];
nixnax 10:74f8233f72c0 253 switch (protocol) {
nixnax 11:f58998c24f0b 254 case 1: ICMPpacket(); break;
nixnax 11:f58998c24f0b 255 case 2: IGMPpacket(); break;
nixnax 11:f58998c24f0b 256 case 17: UDPpacket(); break;
nixnax 11:f58998c24f0b 257 case 6: TCPpacket(); break;
nixnax 11:f58998c24f0b 258 default: otherProtocol();
nixnax 10:74f8233f72c0 259 }
nixnax 10:74f8233f72c0 260 //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] );
nixnax 10:74f8233f72c0 261 }
nixnax 9:0992486d4a30 262
nixnax 9:0992486d4a30 263
nixnax 9:0992486d4a30 264 void LCPconfReq() {
nixnax 11:f58998c24f0b 265 debug("LCP Config ");
nixnax 9:0992486d4a30 266 if (ppp.pkt.buf[7] != 4) {
nixnax 11:f58998c24f0b 267 ppp.pkt.buf[4]=4; // allow only no options
nixnax 11:f58998c24f0b 268 debug("Reject\n");
nixnax 9:0992486d4a30 269 sendFrame();
nixnax 9:0992486d4a30 270 } else {
nixnax 9:0992486d4a30 271 ppp.pkt.buf[4]=2; // ack zero conf
nixnax 9:0992486d4a30 272 debug("Ack\n");
nixnax 9:0992486d4a30 273 sendFrame();
nixnax 10:74f8233f72c0 274 debug("LCP Ask\n");
nixnax 11:f58998c24f0b 275 ppp.pkt.buf[4]=1; // request no options
nixnax 9:0992486d4a30 276 sendFrame();
nixnax 9:0992486d4a30 277 }
nixnax 9:0992486d4a30 278 }
nixnax 9:0992486d4a30 279
nixnax 9:0992486d4a30 280 void LCPconfAck() {
nixnax 9:0992486d4a30 281 debug("LCP Ack\n");
nixnax 9:0992486d4a30 282 }
nixnax 9:0992486d4a30 283
nixnax 9:0992486d4a30 284 void LCPend(){
nixnax 9:0992486d4a30 285 debug("LCP End\n");
nixnax 9:0992486d4a30 286 ppp.online=0;
nixnax 9:0992486d4a30 287 ppp.pkt.buf[4]=6;
nixnax 9:0992486d4a30 288 sendFrame();
nixnax 9:0992486d4a30 289 }
nixnax 9:0992486d4a30 290
nixnax 9:0992486d4a30 291 void LCPother(){
nixnax 9:0992486d4a30 292 debug("LCP Other\n");
nixnax 9:0992486d4a30 293 generalFrame();
nixnax 9:0992486d4a30 294 }
nixnax 9:0992486d4a30 295
nixnax 9:0992486d4a30 296 void LCPframe(){
nixnax 9:0992486d4a30 297 int code = ppp.pkt.buf[4];
nixnax 9:0992486d4a30 298 switch (code) {
nixnax 9:0992486d4a30 299 case 1: LCPconfReq(); break;
nixnax 9:0992486d4a30 300 case 2: LCPconfAck(); break;
nixnax 9:0992486d4a30 301 case 5: LCPend(); break;
nixnax 9:0992486d4a30 302 default: LCPother();
nixnax 9:0992486d4a30 303 }
nixnax 9:0992486d4a30 304 }
nixnax 9:0992486d4a30 305
nixnax 9:0992486d4a30 306 void xx21frame() {
nixnax 9:0992486d4a30 307 debug("Unknown frame type ff 03 xx 21\n");
nixnax 9:0992486d4a30 308 }
nixnax 9:0992486d4a30 309
nixnax 9:0992486d4a30 310 void determinePacketType() {
nixnax 9:0992486d4a30 311 if ( ppp.pkt.buf[0] != 0xff ) {debug("byte0 != ff\n"); return;}
nixnax 9:0992486d4a30 312 if ( ppp.pkt.buf[1] != 3 ) {debug("byte1 != 3\n"); return;}
nixnax 9:0992486d4a30 313 if ( ppp.pkt.buf[3] != 0x21 ) {debug("byte2 != 21\n"); return;}
nixnax 9:0992486d4a30 314 int packetType = ppp.pkt.buf[2];
nixnax 9:0992486d4a30 315 switch (packetType) {
nixnax 9:0992486d4a30 316 case 0xc0: LCPframe(); break;
nixnax 9:0992486d4a30 317 case 0x80: IPCPframe(); break;
nixnax 9:0992486d4a30 318 case 0x00: IPframe(); break;
nixnax 9:0992486d4a30 319 default: xx21frame(); break;
nixnax 9:0992486d4a30 320 }
nixnax 9:0992486d4a30 321 }
nixnax 9:0992486d4a30 322
nixnax 9:0992486d4a30 323 void scanForConnectString() {
nixnax 9:0992486d4a30 324 if ( ppp.online==0 ) {
nixnax 9:0992486d4a30 325 char * clientFound = strstr( rxbuf, "CLIENTCLIENT" ); // look for PC string
nixnax 9:0992486d4a30 326 if( clientFound ) {
nixnax 9:0992486d4a30 327 strcpy( clientFound, "FOUND!FOUND!" ); // overwrite so we don't get fixated
nixnax 9:0992486d4a30 328 pc.printf("CLIENTSERVER"); // respond to PC
nixnax 9:0992486d4a30 329 ppp.online=1; // we can stop looking for the string
nixnax 9:0992486d4a30 330 debug("Connect string found\n");
nixnax 9:0992486d4a30 331 }
nixnax 9:0992486d4a30 332 }
nixnax 9:0992486d4a30 333 }
nixnax 9:0992486d4a30 334
nixnax 0:2cf4880c312a 335 int main()
nixnax 0:2cf4880c312a 336 {
nixnax 9:0992486d4a30 337 pc.baud(9600);
nixnax 4:a469050d5b80 338 xx.baud(115200);
nixnax 9:0992486d4a30 339 xx.puts("\x1b[2J\x1b[HReady\n"); // VT100 code for clear screen & home
nixnax 4:a469050d5b80 340
nixnax 9:0992486d4a30 341 pppInitStruct(); // initialize all the PPP properties
nixnax 4:a469050d5b80 342
nixnax 9:0992486d4a30 343 pc.attach(&rxHandler,Serial::RxIrq); // start the receive handler
nixnax 4:a469050d5b80 344
nixnax 9:0992486d4a30 345 int frameStartIndex, frameEndIndex; int frameBusy=0;
nixnax 4:a469050d5b80 346
nixnax 0:2cf4880c312a 347 while(1) {
nixnax 9:0992486d4a30 348 if ( ppp.online==0 ) scanForConnectString(); // try to connect
nixnax 0:2cf4880c312a 349 while ( pc_readable() ) {
nixnax 1:9e03798d4367 350 int rx = pc_getBuf();
nixnax 9:0992486d4a30 351 wait(0.001);
nixnax 4:a469050d5b80 352 if (frameBusy) {
nixnax 4:a469050d5b80 353 if (rx==FRAME_7E) {
nixnax 4:a469050d5b80 354 frameBusy=0; // done gathering frame
nixnax 4:a469050d5b80 355 frameEndIndex=ppp.rx.tail-1; // remember where frame ends
nixnax 4:a469050d5b80 356 void processFrame(int start, int end); // process a received frame
nixnax 4:a469050d5b80 357 processFrame(frameStartIndex, frameEndIndex);
nixnax 4:a469050d5b80 358 }
nixnax 4:a469050d5b80 359 }
nixnax 4:a469050d5b80 360 else {
nixnax 4:a469050d5b80 361 if (rx==FRAME_7E) {
nixnax 4:a469050d5b80 362 frameBusy=1; // start gathering frame
nixnax 9:0992486d4a30 363 frameStartIndex=ppp.rx.tail; // remember where frame started
nixnax 4:a469050d5b80 364 }
nixnax 0:2cf4880c312a 365 }
nixnax 4:a469050d5b80 366 }
nixnax 7:ab147f5e97ac 367 }
nixnax 7:ab147f5e97ac 368 }