在DPDK中,当发送ARP请求时,目标MAC地址应该写0x00,0x00,0x00,0x00,0x00,0x00。这是因为ARP协议需要获取目标MAC地址,并且MAC地址还未知。
以下是一个使用C语言实现填写并发送ARP请求的示例代码,其中包括将目标MAC地址添加到ARP请求中:
#include <rte_ether.h>
#include <rte_arp.h>
/* Ethernet header */
struct ether_hdr eth_hdr;
/* ARP header */
struct arp_hdr arp_hdr;
/* Destination MAC address */
uint8_t dst_mac[ETHER_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
/* Source MAC address */
uint8_t src_mac[ETHER_ADDR_LEN];
/* Target IP address */
uint32_t target_ip = IPv4(192, 168, 0, 1);
/* Local IP address */
uint32_t local_ip = IPv4(192, 168, 0, 2);
/* Fill in the Ethernet header */
memset(ð_hdr, 0, sizeof(struct ether_hdr));
ether_addr_copy(dst_mac, ð_hdr.d_addr);
ether_addr_copy(src_mac, ð_hdr.s_addr);
eth_hdr.ether_type = rte_cpu_to_be_16(ETHER_TYPE_ARP);
/* Fill in the ARP header */
memset(&arp_hdr, 0, sizeof(struct arp_hdr));
arp_hdr.htype = rte_cpu_to_be_16(ARP_HTYPE_ETH);
arp_hdr.ptype = rte_cpu_to_be_16(ARP_PTYPE_IPv4);
arp_hdr.hlen = ETHER_ADDR_LEN;
arp_hdr.plen = sizeof(uint32_t);
arp_hdr.opcode = rte_cpu_to_be_16(ARP_OP_REQUEST);
ether_addr_copy(src_mac, &arp_hdr.sha);
arp_hdr.sip = rte_cpu_to_be_32(local_ip);
ether_addr_copy(dst_mac, &arp_hdr.tha);
arp_hdr.tip = rte_cpu_to_be_32(target_ip);
/* Send the ARP request */
rte_eth_tx_burst(port_id, queue_id, ð_hdr, sizeof(struct ether_hdr) + sizeof(struct arp_hdr));
在此示例代码中,我们使用DPDK的ETHER和ARP头文件来创建以太网和ARP头。首先,我们填写以太网头,将目标MAC地址设置为广播地址0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,并将源MAC地址设置为本机MAC地址。
接下来,我们填写ARP头,指定HTYPE、PTYPE、HLEN、PLEN、OPCODE等字段。在此示例中,我们使用请求操作码,并设置源MAC地址和源IP地址。对于目标MAC地址和目标IP地址,我们将它们保持为0x00,0x00,0x00,0x00,0x00,0x00和目标IP地址。
最后,我们使用DPDK的rte_eth_tx_burst()函数将以太网和ARP头发送到网络上。这将触发ARP请求,并尝试获取目标MAC地址。