snifer

[原创]基于嵌入式系统STM32的ARP 网络寻址实战

0
阅读(3431)

最近拿到了一款新的嵌入式设备STM32,这款设备比较新颖,非常漂亮,大家看看。

最近无线连接你我他,我就做一下ARP的寻址测试实战。
主要原理:
本开发板上带有DM9000A网卡芯片,DM9000系列网卡芯片在嵌入式开发板上很常见,尤其是有关的网络连接部分,几乎都是采用该芯片实现的,该芯片的电路原理图如下:

ARP协议原理简述
在网络上标识一台计算机,这台计算机必须有一个惟一的地址,这就是人们熟知的IP网硬件设备并不了理解 地址但是以太
IP( 地址,它们寻址必须基于以太网控制器的物理地址,也就是介质访问控制地址MAC)地址来进行。因此,IP地址必须转换(或映射)到物理地址上,这个工作就由ARP议来完成。而从物理地址向 地址解析协IP地址映射是由RARP反向地址解析协议实现的。ARP的工作原理类似日常生活中的广播找人。假设节点A要查询与某个IP地址相对应的物理地址,它就向自身所在的子网发送一个包含该IP地址的广播消息(ARP数据包格式),这个广播消息发送给子网上的每一个节点。子网中与要解析的这个IP地址相匹配的节点B将作出回应,并将自己的物理地址发送给节点A,若目标机接收到此请求,它就发送一个ARP应答,这个应答是明确发给请求者的,应答中有MAC地址。接到了这个应答,就知道了目标机的MAC地址,就可以进行以后的通信了。

具体的测试代码如下:

#include "arp.h"
#include <string.h>
#include <stdio.h>

#define packet_len 42

unsigned char ip_addr[4] = { 192, 168, 12, 134 };      //开发板IP
unsigned char host_ip_addr[4] = { 192, 168, 12, 110 }; //目标机IP      
unsigned char host_mac_addr[6]={ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; //广播地址

void arp_request(struct arp_frame *parp_frame)
{
  int i;
  memcpy(parp_frame->d_mac,host_mac_addr,6);
  memcpy(parp_frame->s_mac, mac_addr,6);
  parp_frame->type=HON(0x0806);
  parp_frame->hwtype=HON(0x01);
  parp_frame->protocol=HON(0x0800);
  parp_frame->hwlen = 0x06;
  parp_frame->protolen = 0x04;
  parp_frame->opcode = HON(0x01);
  for(i=0;i<6;i++)
    parp_frame->smac[i]= mac_addr[i];
  for(i=0;i<4;i++)
    parp_frame->sipaddr[i]= ip_addr[i];
  memcpy(parp_frame->dmac,host_mac_addr,6);
  for(i=0;i<4;i++)
    parp_frame->dipaddr[i]= host_ip_addr[i];

  sendpacket( (unsigned char *)parp_frame, packet_len );
}

通过超级终端,就能看到以下的情况:

若没有打印DM9000 LINK ok!就说明没有连上,可能存在网络问题,是不是有很多启发呢。