W7100A单片机的MACRAW模式及简单的ARP应用

这篇文档将会介绍如何使用W7100A中实现MACRAWMACRAW是一个低于IP层的以太网MAC通信,它能够灵活使用目的主机的上层协议。W7100A是全硬件的TCP/IP协议栈芯片,它不仅包括OSI的4层,还包括4层之外的应用层。因此,W7100A能够简单且稳定地应用于嵌入式互联网中。

 

在第一章简单介绍下MACRAW模式,第二章介绍MACRAW SOCKET,第三章则是ARP(地址解析协议)。希望对大家有所帮助。

 

 

1. 简介

MACRAW是一个低于IP层的以太网MAC通信,它能够灵活使用目的主机的上层协议。图1显示了通过协议栈的数据封装形式。W7100A是全硬件的TCP/IP协议栈芯片,它不仅包括OSI的4层,还包括4层之外的应用层。因此,W7100A能够简单且稳定地应用于嵌入式互联网中。如果在链路层需要进行数据处理,可以使用MACRAW模式下的软件TCP/IP协议来完成。

MACRAW模式支持链路层的地址解析协议(ARP)。在W7100A中,ARP请求和回复都已经通过硬件逻辑进行了处理。尽管如此,它仍然可以在MACRAW模式下打开SOCKET0 (第0个  socket)(MACRAW模式下只能使用SOCKET0)。利用该SOCKET0,用户便能够处理软件TCP/IP协议栈指定的协议,例如ARP等。本文主要介绍W7100A单片机的MACRAW模式以及简单的

ARP应用。

 

<图1>通过协议栈的数据封装形式

2.  MACRAW SOCKET

MACRAW模式下的通信只支持SOCKET0,但是此时SOCKET1~7也能同时工作于硬件

TCP/IP协议栈下。SOCKET0作为NIC(网络接口控制器)使用,这样便可实现软件TCP/IP协议栈。这就是W7100A单片机的混合TCP/IP协议栈:支持硬件TCP/IP和软件TCP/IP协议栈。对于普通的数据传输,软件TCP/IP能够通过MACRAW模式进行处理。MACRAW模式下的SOCKET0能够处理除了SOCKET1~7需要使用的协议之外的其它所有协议。由于MACRAW是处理纯以太网数据包的通信方法,这就要求工程师具备软件TCP/IP协议栈的知识背景。

图2显示了MACRAW的数据格式。MACRAW数据由两个字节的PACKET-INF0以及数据包组成。PACKET-INFO包含数据包的字节大小,而数据包又包括6字节的目的MAC地址、6字节的源MAC地址、2字节的类型(Type)以及46~1500字节的有效载荷(payload)。其中有效载荷

(payload)具有和ARP或者IP相似的互联网协议。具体的详细信息,请参考:

http://www.iana.org/assignments/ethernet-numbers.

<图2>MACRAW的数据格式

2.1  打开(OPEN)

将SOCKET号设置为‘0’之后,在MACRAW模式下通过调用socket()函数打开SOCKET,之后等待直到Sn_SR寄存器的值变成SOCK_MACRAW(0x42)。Sn_SR再次调用getSn_SR()函数来查看其状态。当Sn_SR的状态变成SOCK_MACRAW时,表示SOCKET打开(OPEN)过程完成。

/*设置协议号  */

s = 0; // 只可使用SOCKET0.

/*打开MACRAW模式下的SOCKET0*/

socket(s,Sn_MR_MACRAW,port,mode);

while(getSn_SR(s)  != SOCK_MACRAW);

例2.1打开(OPEN)Socket

2.2   发送(SEND)

通过sento()函数将data_buf发送到目的地址(add)。如果主机发送的数据长度小于60字节,在实际发送以太网数据包时会利用内部的“0填充”将数据填充到60字节。

/*向指定的目的端发送Ping请求*/

//max_size_tx_buf的值必须小于TX缓存器的最大存储空间

*  data_buf[max_size_tx_buf] = (uint8 *)0x7000;//设定数据缓存器的位置

sendto(s,(uint8  *)&data_buf,sizeof(data_buf),addr,port)

例2.2发送(SEND) 数据

2.3  接收(RECEIVE)

通过recvfrom()函数接收发送给目的地址(add)的data_buf。SOCKET仍然是在MACRAW模式下打开的,并且使用指定的端口。

/* 检测接收到的数据*/

//rlen表示RX缓存器中接收到的数据大小

//rlen的值必须小于RX缓存器的最大存储空间

if ( (rlen =  getSn_RX_RSR(s) ) > 0)

/* 接收到的数据 */

//len包括PACKET-INFO以及DATA数据包的长度

len = (recvfrom(s, (uint8 *)data_buf,rlen,addr,&port);

例2.3接收(RECEIVE) 数据

2.4  关闭(CLOSE)

如果不再使用IPRAW SOCKETn,通过调用close()函数来关闭SOCKETn。

3.  ARP (地址解析协议)

    ARP是查找存在于网络中的节点地址,同时将数据从源节点发送给目的节点的过程,发送的这些数据含有目标以太网的地址。目的节点接收到的信息可以使源节点唯一地识别请求的网络系统,进而提供需要的地址。当源节点接收到来自目的端的响应时,表示地址解析过程完成,该响应包含请求的地址。为了减少ARP请求的次数,以太网地址会保存在NIC中一段时间。需要注意的是,W7100A只能保存一个以太网地址,所以在每次建立连接时都需要ARP发送请求。表4显示了ARP信息格式。

Byte

Byte

Byte

Byte

Hardware (H) Type

Protocol (P) Type

H Length

P Length

Operation

Sender H Address ( Octets 0-3 )

Sender H Address ( Octets 4-5 )

Sender IP ( Octets 0-1 )

Sender IP ( Octets 2-3 )

Target H Address ( Octets 0-1 )

Target H Address ( Octets 2-5 )

Target IP Address ( Octets 0-3 )

表3.1 ARP信息格式

3.1  ARP实现

W7100A的ARP过程是通过硬件逻辑方式执行的。在W7100A初始化完成后,ARP自动执行。如果ARP应用是由软件栈设计或者需要其他链路层的协议时,W7100A用户必须直接处理RAW数据。需要注意的是,如果SOCKET0是在MACRAW模式下创建的,那么硬件化的ARP逻辑操作就不能执行。为了能够更简单的定义ARP信息,见表3.1.1所示的ARPMSG结构定义。

#define  ARP_TYPE         0x0806

#define  ARP_TYPE_HI           0x08

#define  ARP_TYPE_LO     0x06

#define  ETHER_TYPE     0x0001

#define  PRO_TYPE        0x0800

#define  HW_SIZE               6

#define  PRO_SIZE          4

#define ARP_REQUEST          0x0001

#define  ARP_REPLY       0x0002

 

typedefstruct  _ARPMSG

{

uint8   dst_mac[6];   //  ff.ff.ff.ff.ff.ff

uint8   src_mac[6];  

uint16 msg_type;   // ARP (0x0806)

uint16 hw_type;      // Ethernet (0x0001)

uint16 pro_type;      // IP (0x0800)

uint8   hw_size;       // 6

uint8   pro_size;      // 4

uint16 opcode; //要求(request) (0x0001), 回复(reply)(0x0002)

uint8   sender_mac[6];   

uint8   sender_ip[4];            

uint8   tgt_mac[6];   //  00.00.00.00.00.00

uint8   tgt_ip[4];

uint8   trailer[18];    // 全部是0

}ARPMSG;

表3.1.1ARP信息结构

ARP应用程序可以设计成与W7100A驱动程序的Socket API中与UDP相关的应用程序接口(API)。表3.1.2为Socket API函数。

API 函数名

定义

socket

在MACRAW模式下打开socket

sendto

向目的端发送Ping请求

recvfrom

接收来自目的端的Ping回复

close

关闭Socket

表3.1.2Socket API函数

通过设定目标IP地址、端口号等等,可以实现ARP应用接收来自指定目的端的ARP回复。

void arp(SOCKETs, uint16 Port, uint8 SrcIp, uint8 SrcMac, uint8 TgtIp)

函数名 Arp
参数 S           – socket号

port        –发送/接收端口号

SrcIP      -源(发送端)IP地址

SrcMac    -源 (发送端) MAC地址

TgtIp      -目标IP地址

表3.1.3ARP函数

void send_request(SOCKET s, uint16 port, uint8 *SrcIp,uint8 *SrcMac, uint8 *TgtIp)

函数名 send_request
参数 s– socket号

port       –发送/接收端口号

SrcIP      – 源(发送端)IP地址

SrcMac    – 源(发送端) MAC地址

TgtIp      – 目标IP地址

表3.1.4send_request函数

 

void send_reply(SOCKET s, uint16 port, uint8 *SrcMac)

函数名 send_reply
参数 S           – 端口号

Port        –发送/接收端口号

SrcMac      -源(发送端) MAC地址

表3.1.5send_reply函数

图3.1.1-2所示为简单的ARP应用流程图。ARP的请求和回复都是通过3.1节中所提到的函数来执行并且完成的。

o    调用ARP函数

要执行ARP函数,需要知道目标IP地址、源IP地址以及源MAC地址等参数。在设置ARP应用参数和网络配置完成后,才可以执行ARP函数。ARP函数先在MACRAW模式下创建SOCKET0,然后根据第n-1个SOCKET状态寄存器(Sn_SR)的状态执行命令。例3.1.2所示为ARP函数的执行过程。

/* arp.c */

switch(getSn_SR(s))

{

case  SOCK_CLOSED:

close(s);                        // 关闭SOCEKT

socket(s,Sn_MR_MACRAW,aPort,0);//在MACRAW模式下打开SOCKET

break;

 

case  SOCK_MACRAW:

send_request () ;//处理ARP请求

recv_reply();//处理ARP回复

break;

default:           

break;

}

例3.1.2处理ARP函数

  ARP请求的处理过程

ARP请求处理进程是创建并且向目的端发送数据包的过程。Ping请求的处理过程如例3.1.3所示。当在设定数据包时,需要定义MAC地址、类型、目的(目标)端的有效载荷(Payload)、源端(发送端)的有效载荷(Payload)。在数据包的校验和(checksum)计算完成之后,才能够利用sendto()函数将ARP信息发送到广播地址。

/* arp.c */

uint32 tip =  0xFFFFFFFF;

uint16 i =0;

for( i=0;  i<6 ; i++) {

pARPMSG.dst_mac[i]  = 0xFF;//BROADCAST_MAC[i];

pARPMSG.src_mac[i]  = SrcMac[i];//BROADCAST_MAC[i];

pARPMSG.sender_mac[i]  = SrcMac[i];//SOURCE_MAC[i];

pARPMSG.tgt_mac[i]  = 0;

}

pARPMSG.msg_type = htons(ARP_TYPE);

pARPMSG.hw_type   = htons(ETHER_TYPE);

pARPMSG.pro_type  = htons(PRO_TYPE);   // IP   (0x0800)

pARPMSG.hw_size   =  HW_SIZE;          // 6

pARPMSG.pro_size   = PRO_SIZE;          // 4

pARPMSG.opcode    =  htons(ARP_REQUEST); //要求(request) (0x0001), 回复(reply)(0x0002)

for( i=0;  i<4 ; i++) {

pARPMSG.sender_ip[i]  = SrcIp[i];//SOURCE_IP[i];

pARPMSG.tgt_ip[i]  = TgtIp[i];//TAGET_IP[i];

}

sendto(s,(uint8*)&pARPMSG,sizeof(pARPMSG),(uint8  *)&tip,port)

例3.1.3ARP请求的处理过程

   ARP回复的处理过程

例3.1.4所示为ARP回复的处理过程,该过程是通过在MACRAW模式下创建好的SOCKET0调用RECEVFROM()函数来接收RAW数据。如果接收的RAW数据类型和OPCODE分别为

ARP_TYPE(0x0806)和ARP Reply(0x02),将会显示ARP信息。

 

/* arp.c */

/*接收来自对端的数据*/

len  = recvfrom(s,(uint8 *)data_buf,rlen,mac_destip,&mac_destport);

/*检测TYPE 0x0806 */

if(  data_buf[12]==ARP_TYPE_HI && data_buf[13]==ARP_TYPE_LO ){

/*检测ARP REPLY */

if(  ((aARPMSG->opcode) == ARP_REPLY  ) {

 

}else{     

未知信息

}

}

例 3.1.4ARP请求的处理过程

 

 

3.2  APR应用演示

在下载完成ARP应用的二进制文件后,按照下面的顺序来确认iMCUW7100API中的数据包能够实现ARP。(详细的信息,请参考iMCUW7100 ISP用户指南和iMCUW7100调试程序用户指南)

 

1.    确认测试环境

o   利用UTP线直接连接PC测试机和iMCUW7100API

o   利用串口线直接连接PC测试机和iMCUW7100API

o   将5V电源适配器连接到PC测试机

2.    按照下面的流程确认PC测试机的网络信息

o   源IP地址 : 192.168.0.2(取决于用户的PC测试机)

o    网关IP地址 : 192.168.0.1

o    子网掩码:255.255.255.0

3.在执行完串行终端机程序(超级终端机)后,如下进行性能设置:

          属性

配置值

Bits Per second (波特率) 15200 bps (Max 230400bps)
数据位 8 Bits
停止位 1 Bits
串行校驗 None
流量控制 None

表3.2设置串行终端机程序

4. 打开iMCUW7100API的电源开关

– 在上电后确认iMCUW7100API的电源指示灯LED(D13)

 

图3.2所示的为ARP应用的执行结果。结果显示了W7100A(本地主机)的网络信息以及来自目的端主机的ARP回复。

==============================================

       W7100   Net Config Information       

==============================================

MAC ADDRESS IP : 00.08.dc.00.00.00

SUBNET MASK  :  255.255.255.000

G/W IP ADDRESS : 192.168.001.001

LOCAL IP ADDRESS : 192.168.001.002

 

——-ARP_TEST_START——–

Destination IP  :  192.168.1.3

Who has 192.168.1.3 ?    Tell 192.168.1.2 ?

192.168.1.3  is  at  00.19.66.58.D1.C7

Who has 192.168.1.3 ?    Tell 192.168.1.2 ?

192.168.1.3  is  at  00.19.66.58.D1.C7

Who has 192.168.1.3 ?    Tell 192.168.1.2 ?

192.168.1.3  is  at  00.19.66.58.D1.C7

——-ARP_TEST_END——–

<图3.2>ARP应用的执行结果

本篇文档介绍完毕,明天继续新的内容,多谢关注! 

想了解更多,请登录我们的网站:http://www.iwiznet.cn/

官方博客:blog.iwiznet.cn
公共邮箱:[email protected]