Files
mips/src/common/network/icmp.c
T
jens b7909dcca1 - refactored packet into own module
git-svn-id: http://moon:8086/svn/mips@227 a8ebac50-d88d-4704-bea3-6648445a41b3
2021-12-22 12:47:46 +00:00

68 lines
1.8 KiB
C

// -------------------------------------------------------------------------
// ethernet.c
//
// 21.12.2003, J. Ahrensfeld
//
// -------------------------------------------------------------------------
#include <string.h>
#include <libsys/libsys.h>
#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);
}