增加ARP后,Board通过电脑端的APR请求获取PC端MAC地址及IP,所以宏定义内不定义Destination_MAC、Destination_IP。提取到顶层文件用以寄存器存储。
`define Leading_code 64'h55_55_55_55_55_55_55_D5
`define Source_MAC 48'h00_11_22_33_44_08
//`define Destination_MAC 48'h11_22_33_44_55_02
`define IP_TYPE 16'h08_00
`define IP_TYPE_ARP 16'h08_06
`define Source_IP 32'hC0_A8_00_04 //192.168.0.4 //BOARD
`define Source_Gateway 32'hC0_A8_00_01 //192.168.0.1
//`define Destination_IP 32'hC0_A8_00_03 //192.168.0.3
`define Source_Port 16'd8001 //BOARD
`define Destination_Port 16'd8000 //PC
ARP数据更新进程。接收进程接收到ARP包后,将数据复制给reg,并通知接收进程收取完毕(ARP_addr_Get )进程回到正常接收模式。
/*ARP_PROCESS*/
always @(posedge Rx_Clk_i or negedge ETH_RESET_n)
begin
if(!ETH_RESET_n)begin
ARP_addr_Get <= 1'b0;
Eth_Command[2] <= 1'b0;
end
else if (ARP_addr_en)begin
ARP_addr_Get <= 1'b1;
Destination_MAC <= ARP_addr_data[79:32];
Destination_IP <= ARP_addr_data[31: 0];
Eth_Command[2] <= 1'b1;
end
else begin
ARP_addr_Get <= 1'b0;
Eth_Command[2] <= 1'b0;
end
end
Board APR回复数据,需要增加16byte的padding,以太网数据传输有最小包要求。
ARP_Code <= {`Leading_code, Destination_MAC,`Source_MAC,`IP_TYPE_ARP, // 8 + 6 + 6 + 2 = 22
16'h00_01 , 16'h08_00 ,16'h06_04 ,16'h00_02 , // 2 + 2 + 2 + 2 = 8
`Source_MAC , `Source_IP , // 6 + 4 = 10
Destination_MAC,Destination_IP, // 6 + 4 = 10
{18{8'h00}} //padding
};
wireshark实时捕获:
Py测试数据源代码:
from scapy.all import *
pkt = ARP()
pkt.psrc = "192.168.0.35"
pkt.pdst = "192.168.0.4"
for n in range(10):
aaa = send(pkt)
print(aaa)
板级调试