Program Listing for File arp.cpp

Return to documentation for file (src/arp.cpp)

#include <arp.h>

std::optional<rte_ether_addr> Arp::GetEtherAddr(const in_addr_t addr) {
    auto it = addr_map.find(addr);
    if (it == addr_map.end())
        return std::nullopt;

    return it->second;
}

void Arp::InsertAddr(const in_addr_t ip, const rte_ether_addr mac) {
    addr_map.insert(std::make_pair(ip, mac));
}

size_t Arp::EraseAddr(const in_addr_t ip) {
    return addr_map.erase(ip);
}

Arp::Error Arp::GenAddrRequest_(const in_addr_t addr, RTEMbuf<DefaultPacket>& resp) {
    rte_arp_hdr arp_data;
    arp_data.arp_hardware = rte_cpu_to_be_16(RTE_ARP_HRD_ETHER);
    arp_data.arp_protocol = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
    arp_data.arp_opcode = rte_cpu_to_be_16(RTE_ARP_OP_REQUEST);
    arp_data.arp_hlen = 6;
    arp_data.arp_plen = 4;

    memset(arp_data.arp_data.arp_tha.addr_bytes, 0xff, RTE_ETHER_ADDR_LEN);
    rte_ether_addr_copy(&own_mac, &arp_data.arp_data.arp_sha);
    arp_data.arp_data.arp_sip = own_ip;
    arp_data.arp_data.arp_tip = addr;

    return ConstructARPPacket_(resp, arp_data);
}

Arp::Error Arp::ConstructARPPacket_(RTEMbuf<DefaultPacket>& msg, rte_arp_hdr arp_data) {
    auto& packet = msg.data<ArpPacket>();

    rte_ether_addr_copy(&arp_data.arp_data.arp_tha, &packet.ether_hdr.dst_addr);
    rte_ether_addr_copy(&arp_data.arp_data.arp_sha, &packet.ether_hdr.src_addr);
    packet.ether_hdr.ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_ARP);

    packet.arp_hdr = arp_data;
    msg.l2_len = sizeof(rte_ether_hdr);
    msg.l3_len = sizeof(rte_arp_hdr);
    msg.data_len = msg.l2_len + msg.l3_len;
    msg.pkt_len = msg.data_len;
    return Error::ARP_OK;
}