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 + -
显示快捷键?