網絡協定棧設計(八)
//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[];
u_int8_t source_ip[];
u_int8_t destination_mac[];
u_int8_t destination_ip[];
};
/*
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[];
extern u_int8_t local_ip[];
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 = ;
arp_packet->protocol_addr_length = ;
arp_packet->op_code = htons(ARP_REQUEST);
int i;
for (i = ; i < ; i++)
{
arp_packet->source_mac[i] = local_mac[i];
}
for (i = ; i < ; i++)
{
arp_packet->source_ip[i] = local_ip[i];
}
for (i = ; i < ; i++)
{
//arp請求封包此字段設定為全0
arp_packet->destination_mac[i] = ;
}
for (i = ; i < ; 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接收資料包分析。