// Simple demo tcpdump http://anntguide.free.fr #include <EtherCard.h> #define Ethernet ENC28J60 // ethernet interface mac address, must be unique on the LAN byte mymac[] = { 0,1,2,3,4,5 }; //byte PEERIP[4]={81,57,148,97}; byte PEERIP[4]={192,168,0,235}; //byte MACCLIENT[6]={3,4,5,6,7,8}; byte MACCLIENT[6]={0,36,33,7,142,37}; // acer m1641 byte tampon[2000]; #define PORT 1000 #define LAGMACFROM 6 #define LAGIPFROM 30 #define MAXLOAD 1300 //#define LONPREMS 1300 #define LONTETEUDP 40 // ntete UDP #define PINCS 10 byte ENC28J60::buffer[500]; uint32_t timer; static int biglen; int ICMP=1; int TCP=0; int okmac=0 ; // passe a true si recu un paquet du client int okpeer=0; // passe a 1 si pauet (udp, recu de peer) int okreste=0 ; // paquet bifide int numin=0; int numout=0; void setup () { Serial.begin(9600); Serial.println("[Gadget]"); digitalWrite(10,HIGH); Serial.print( "Aaccess Ethernet controller..."); if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) { Serial.println( "Failed!"); return; } Serial.println( "Succes.!"); if (!ether.dhcpSetup()) Serial.println("DHCP failed"); ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip); // prtdump("andiamo",10); testsendudp(); } void testsendudp (){ tampon[0]=44; ether.sendUdp((char*)tampon,1,PORT,PEERIP,PORT); } void prhexa(int base,int nb, char *t){ for (int iii=0;iii<nb;iii=iii+1) { Serial.print((byte) ether.buffer[base+iii]); Serial.print(" "); } Serial.print("<-- "); Serial.println(t); } void dump (int deb, int fin){ Serial.print("dump buffer a partir de " ); Serial.print(deb); Serial.print(" à "); Serial.println(fin); for (int iii=deb;iii<fin;iii=iii+1) Serial.print ((char)ether.buffer[iii]); Serial.println(""); Serial.println("------------------"); for (int iii=deb;iii<fin;iii=iii+1) { Serial.print (ether.buffer[iii]); Serial.print(" "); } Serial.println("------------------"); } void prtdump(char *tt,int tout){ Serial.println("------------------"); Serial.println(tt); Serial.println("------------------"); prhexa(0,6,"to mac "); prhexa(6,6,"from mac "); prhexa(12,2,"ehr type (8) "); prhexa(14,1," version "); prhexa(15,1," service "); prhexa(16,2," big len "); biglen=ether.buffer[16]*256+ether.buffer[17]; Serial.print(" "); Serial.print(biglen);Serial.println(" decimal "); prhexa(18,2," id "); prhexa(20,2," flag "); prhexa(22,1," ttl "); prhexa(23,1," next "); if (ether.buffer[23]==1){ ICMP=1;Serial.println("ICMP");} if (ether.buffer[23]==6) {TCP=1;Serial.println("TCP");} prhexa(24,2," chk "); prhexa(26,4," source ip "); prhexa(30,4," dest ip "); if (ICMP) { prhexa(34,1," type 8 "); prhexa(35,1," code 0 "); prhexa(36,2," chk "); prhexa(38,2," id 4019 "); prhexa(40,2," seq num "); dump (42,biglen); } if (TCP) { prhexa(34,2," source port "); prhexa(36,2," dest port "); prhexa(38,4," seq num "); prhexa(42,4," ack num "); prhexa(46,2," hdr len "); prhexa(48,2," reserved "); dump (50,biglen); } Serial.println(""); Serial.println("------------------"); } void loop () { if (okmac>0) { Serial.println("envoyer a peer en 1 ou deux bouts du paquet reçu du clientt"); // evoyer tout le début // void EtherCard::sendUdp (char *data,byte datalen,word sport, byte *dip, word dport) { int londeb=okmac; int lonsup=-1; if (okmac<=MAXLOAD) { }else{ londeb=MAXLOAD; lonsup=okmac-MAXLOAD ; // may be 0! } ether.sendUdp((char*)tampon,londeb,PORT,PEERIP,PORT); if (lonsup>=0) ether.sendUdp((char*)tampon+MAXLOAD,lonsup,PORT,PEERIP,PORT); okmac=0; // is il en reste okreste=1; return; } if (okreste) { Serial.println("envoyer a peer le este (eventuellement vide) du paquet client"); // evoyer le reste okreste=0; // is il en reste okreste=1; return; } word q= ether.packetReceive(); if (q>64) { prtdump("recu",q);} if (q>0) { Serial.print("recu paquet de lon=");Serial.println(q); // tester from mac okmac=1; for (int imac=0;imac<6;imac=imac+1) if (ether.buffer[LAGMACFROM+imac]!=MACCLIENT[imac]) { Serial.print("different a ");Serial.print(ether.buffer[LAGMACFROM+imac]); Serial.print("<>"); Serial.print(MACCLIENT[imac]);Serial.print(" at ");Serial.println(imac) ; okmac=0; } if (okmac) { // mettre de côté lepaqut Serial.println("recu paquet de client"); for (int imac=0;imac<q;imac=imac+1) tampon[imac]=ether.buffer[imac]; okmac=q; return; }else Serial.println("pas du client"); // tester si paquet vient de peer ? okpeer=1; for (int iip=0;iip<4;iip=iip+1) if (ether.buffer[LAGIPFROM+iip]!=PEERIP[iip]) okpeer=0; if (okpeer) { numin=numin+1; Serial.print (numin); Serial.print(" recu paquet de peer lon= "); Serial.println(q); // gaffe si plusieurs if (q==MAXLOAD) { // conserver for (int iprem=0;iprem<q;iprem=iprem+1) tampon[iprem]=ether.buffer[LONTETEUDP+iprem]; Serial.println("memorise paquet == mMAXLOAD "); return; } // copier au bout // envoyer tout Serial.println("envoyer contenu du paquet "); ether.sendEthernet((char*)tampon+LONTETEUDP,okmac-LONTETEUDP,PORT); } } word resu= ether.packetLoop(q); if (resu>0){ Serial.print(resu); Serial.println("");} }