天天看點

網絡協定棧設計(八)---網絡層ARP協定代碼實作(發送)

網絡協定棧設計(八)

//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接收資料包分析。

繼續閱讀