68 lines
1.8 KiB
C
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);
|
|
|
|
}
|
|
|
|
|