arp.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 80 行
C
80 行
//-----------------------------------------------------------------------------
// ARP
//-----------------------------------------------------------------------------
#include <string.h>
#include "tcpip_stack.h"
#include "arp.h"
#include "hal_mac.h"
//-----------------------------------------------------------------------------
//Name:Tx_Arp_Frame()
//Funcionality: Fills the Ethernet and Arp header part,
//calls the MAC driver
//-----------------------------------------------------------------------------
void Tx_Arp_Frame(EthernetFrame *frame, u16 operation)
{
ether_hdr *tx_eth_hdr = (ether_hdr *)(frame);
ether_arp *tx_eth_arp = (ether_arp *)((u8 *)frame + ETHER_HEADER_LENGTH); //arp header + data
u16 nLength = 0;
//Arp header
tx_eth_arp->eth_arp_hdr.hw = ARP_HRD_ETHER; //Hardware type = Ethernet
tx_eth_arp->eth_arp_hdr.mac_hdr_len = MAC_ADDR_LEN; //Hardware size = 6 = mac addr e.g. 12:15:02:14:25:14
tx_eth_arp->eth_arp_hdr.ip_hdr_len = IP_ADDR_LEN; //Protocol size = 4 = e.g 192.164.12.2
tx_eth_arp->eth_arp_hdr.opcode = operation; //Operational code request/reply
memcpy(&tx_eth_arp->eth_arp_hdr.protocol, etherIP, 2); //Protocol = IP
memcpy(tx_eth_arp->srcMAC, srcMAC, MAC_ADDR_LEN);
memcpy(tx_eth_arp->srcIP, srcIP, IP_ADDR_LEN);
memcpy(tx_eth_arp->destMAC, destMAC, MAC_ADDR_LEN);
memcpy(tx_eth_arp->destIP, destIP, IP_ADDR_LEN);
//Ethernet header
memcpy(tx_eth_hdr->dest_mac, destMAC, MAC_ADDR_LEN);
memcpy(tx_eth_hdr->src_mac, srcMAC, MAC_ADDR_LEN);
memcpy(tx_eth_hdr->type, etherARP, 2);
nLength += ETHER_HEADER_LENGTH + sizeof(ether_arp);
//Ethernet MAC driver
MAC_Send(frame, nLength);
}
//-----------------------------------------------------------------------------
//Name:Rx_Arp_Frame()
//Funcionality: Checks validity of the Arp header
//-----------------------------------------------------------------------------
u8 Rx_Arp_Frame(EthernetFrame *frame)
{
ether_arp *rx_eth_arp = (ether_arp *)((u8*)frame + ETHER_HEADER_LENGTH);
// make sure the ARP packet is Ethernet and IP
if ((rx_eth_arp->eth_arp_hdr.hw == (u16)ARP_HRD_ETHER) && (rx_eth_arp->eth_arp_hdr.protocol == (u16)ETHER_IP_R))
{
// make sure the ARP packet is a request destined for us
if ((rx_eth_arp->eth_arp_hdr.opcode == ARP_REQUEST) && (!memcmp(srcIP, rx_eth_arp->destIP, IP_ADDR_LEN)))
{
// send a reply
memcpy(destMAC, rx_eth_arp->srcMAC, MAC_ADDR_LEN);
memcpy(destIP, rx_eth_arp->srcIP, IP_ADDR_LEN);
return 1;
}
// else discard packet
}
return 0;
}
//-----------------------------------------------------------------------------
//Name:Receive_ARP()
//Funcionality: Entry point for the ARP stack part
//-----------------------------------------------------------------------------
void Receive_ARP(EthernetFrame *frame){
if(Rx_Arp_Frame(frame)) Tx_Arp_Frame(frame, ARP_REPLY);
}
//-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?