网络协议栈设计(八)
//Network_ARP_send.h
#pragma once
#include"Header_Include.h"
struct arp_pkt
{
u_int16_t hardware_type;
u_int16_t protocol_type;
u_int8_t hardware_addr_length;
u_int8_t protocol_addr_length;
u_int16_t op_code;
u_int8_t source_mac[6];
u_int8_t source_ip[4];
u_int8_t destination_mac[6];
u_int8_t destination_ip[4];
};
/*
if the needer mac addr is not in arp_table, so request
*/
void load_arp_packet(u_int8_t *destination_ip);
void network_arp_send(u_int8_t *destination_ip, u_int8_t *ethernet_dest_mac);
//Network_ARP_send.cpp
#include"Network_ARP_send.h"
#include"Ethernet.h"
#include"Resource.h"
extern u_int8_t local_mac[6];
extern u_int8_t local_ip[4];
extern int ethernet_upper_len;
u_int8_t arp_buffer[MAX_SIZE];
void load_arp_packet(u_int8_t *destination_ip)
{
struct arp_pkt *arp_packet = (struct arp_pkt *)(arp_buffer);
arp_packet->hardware_type = htons(ARP_HARDWARE);
arp_packet->protocol_type = htons(ETHERNET_IP);
arp_packet->hardware_addr_length = 6;
arp_packet->protocol_addr_length = 4;
arp_packet->op_code = htons(ARP_REQUEST);
int i;
for (i = 0; i < 6; i++)
{
arp_packet->source_mac[i] = local_mac[i];
}
for (i = 0; i < 4; i++)
{
arp_packet->source_ip[i] = local_ip[i];
}
for (i = 0; i < 6; i++)
{
//arp请求报文此字段设置为全0
arp_packet->destination_mac[i] = 0x00;
}
for (i = 0; i < 4; i++)
{
arp_packet->destination_ip[i] = destination_ip[i];
}
}
void network_arp_send(u_int8_t *destination_ip, u_int8_t *ethernet_dest_mac)
{
load_arp_packet(destination_ip);
ethernet_upper_len = sizeof(struct arp_pkt);
ethernet_send_packet(arp_buffer,ethernet_dest_mac, ETHERNET_ARP);
}
ARP发送实现起来比较简单,下一篇我们带来ARP接收数据包分析。