#define ETHERNET 1
#define
PROTO_IP 0x800
#define PROTO_ARP 0x806
#define HW_ADDR_LEN 6
#define IP_ADDR_LEN 4
#define ARP_REQUEST 1
#define ARP_REPLY 2
#define ARP_PACKET_LEN sizeof(NetArpPkt)
const INT8U broadcast[HW_ADDR_LEN] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };
int
NetArpSnd(INT16U operation, INT8U * target_hw_addr, INT32U target_ip_addr)
{
NetArpPkt * pArpPkt;
/*
* Allocate a network buffer.
*/
pArpPkt = (NetArpPkt *) NETMemGet(NET_ARP, ARP_PACKET_LEN);
/*
* Fill in the ARP
header fields.
*/
pArpPkt->arpHdr.operation = htons(operation);
pArpPkt->arpHdr.hw_type = htons(ETHERNET);
pArpPkt->arpHdr.prot_type = htons(PROTO_IP);
pArpPkt->arpHdr.hw_len = HW_ADDR_LEN;
pArpPkt->arpHdr.prot_len = IP_ADDR_LEN;
/*
* Fill in the address fields.
*/
memcpy(pArpPkt->target_hw_addr, target_hw_addr, HW_ADDR_LEN);
pArpPkt->target_ip_addr = target_ip_addr;
memcpy(pArpPkt->sender_hw_addr, local_hw_addr(), HW_ADDR_LEN);
pArpPkt->sender_ip_addr = local_ip_addr();
/*
* Broadcast the request over the network.
*/
return (NetPhySnd(broadcast, htons(PROTO_ARP), (unsigned char *) pArpPkt,
ARP_PACKET_LEN));
} /* NetArpSnd() */
|