//---------------------------------------------------------------------------- //Diese Routine erzeugt ein neues ICMP Packet im eigenen Buffer // in stack.h korrigieren: // #define ICMP_REPLY_LEN 98 void icmp_reply (unsigned long dest_ip,unsigned int icmp_sn, unsigned int icmp_id) { //Variablen zur Berechnung der Checksumme unsigned int result16; struct IP_Header *ip; ip = (struct IP_Header *)ð_buffer[IP_OFFSET]; struct ICMP_Header *icmp; icmp = (struct ICMP_Header *)ð_buffer[ICMP_OFFSET]; //Add ICMP Data //### nicht notwendig // memcpy_P(ð_buffer[ICMP_DATA],PSTR("abcdefghijklmnopqrstuvwabcdefghi"),32); //Das ist ein Echo Reply Packet icmp->ICMP_Type = 0x00; icmp->ICMP_Code = 0x00; icmp->ICMP_Id = icmp_id; icmp->ICMP_SeqNum = icmp_sn; //Berechnung der ICMP Checksumme //Alle Daten im ICMP Header werden addiert checksum wird deshalb //ersteinmal auf null gesetzt icmp->ICMP_Cksum = 0x0000; //Hier wird erstmal der IP Header neu erstellt //##### ??? ip->IP_Pktlen = 0x3C00; //16 Bit Komplette Läng des IP Datagrams in Bytes ip->IP_Pktlen = 0x5400; // 0x54 = 84 ip->IP_Proto = PROT_ICMP; make_ip_header (eth_buffer,dest_ip); //Berechnung der ICMP Header länge //### muss 56+8 = 64 ergeben ! result16 = LBBL_ENDIAN_INT(ip->IP_Pktlen); result16 = result16 - ((ip->IP_Vers_Len & 0x0F) << 2); //pointer wird auf das erste Packet im ICMP Header gesetzt //jetzt wird die Checksumme berechnet result16 = checksum (&icmp->ICMP_Type, result16, 0); //schreibt Checksumme ins Packet icmp->ICMP_Cksum = LBBL_ENDIAN_INT(result16); //Sendet das erzeugte ICMP Packet ETH_PACKET_SEND(ICMP_REPLY_LEN,eth_buffer); }