// ------------------------------------------------------------------------- // ethernet.c // // 21.12.2003, J. Ahrensfeld // // ------------------------------------------------------------------------- #include #include #include "ethernet.h" #include "ipv4.h" #include "icmp.h" // ------------------------------------------------------------------------- // Testing void ICMPSendRequest(packet_t *pPacket, uint8_t *inet_addr_src, uint8_t *inet_addr_dst, uint8_t *icmp_payload, uint16_t len) { uint16_t sum; ICMP *pICMP; uint8_t *pData; pICMP = (ICMP*)IPV4_create(pPacket, IP_TYPE_ICMP, sizeof(ICMP)+len, inet_addr_src, inet_addr_dst); memset(pICMP, 0, sizeof(ICMP)); pICMP->type = ICMP_ECHO_REQUEST; pICMP->icmp_code = 0x00; pICMP->hdr_chksum = 0x0000; pICMP->data_hdr[0]= 0x00; // Identifier pICMP->data_hdr[1]= 0x00; // Sequence number sum = IPv4ChkSum(pICMP, 0, sizeof(ICMP)); sum = IPv4ChkSum(icmp_payload, sum, len); pICMP->hdr_chksum = ~sum; pData = (uint8_t*)packet_append(pPacket, sizeof(ICMP)); memcpy(pData, icmp_payload, len); packet_append(pPacket, len); } void ICMPSendReply(packet_t *pPacket, uint8_t *inet_addr_src, uint8_t *inet_addr_dst, ICMP *pHdr, uint8_t *icmp_payload, uint16_t len) { uint16_t sum; ICMP *pICMP; uint8_t *pData; pICMP = (ICMP*)IPV4_create(pPacket, ICMP_ECHO_REPLY, sizeof(ICMP) + len, inet_addr_src, inet_addr_dst); memcpy(pICMP, pHdr, sizeof(ICMP)); pICMP->type = ICMP_ECHO_REPLY; pICMP->hdr_chksum = 0x0000; sum = IPv4ChkSum((uint16_t*)pICMP, 0, sizeof(ICMP)); sum = IPv4ChkSum((uint16_t*)icmp_payload, sum, len); pICMP->hdr_chksum = ~sum; pData = (uint8_t*)packet_append(pPacket, sizeof(ICMP)); memcpy(pData, icmp_payload, len); packet_append(pPacket, len); }