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
main.cpp@11:f58998c24f0b, 2016-12-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |