2012年9月24日星期一

W7100A單片機的MACRAW模式及簡單的ARP應用



       這篇文檔將會介紹如何使用W7100A中實現MACRAWMACRAW是一個低於IP層的乙太網MAC通信,它能夠靈活使用目的主機的上層協定。W7100A是全硬體的TCP/IP協定棧晶片,它不僅包括OSI4層,還包括4層之外的應用層。因此,W7100A能夠簡單且穩定地應用於嵌入式互聯網中。

      在第一章簡單介紹下MACRAW模式,第二章介紹MACRAW SOCKET,第三章則是ARP(位址解析通訊協定)。希望對大家有所幫助。


1. 简介

MACRAW是一个低于IP层的以太网MAC通信,它能够灵活使用目的主机的上层协议。图1显示了通过协议栈的数据封装形式。W7100A是全硬件的TCP/IP协议栈芯片,它不仅包括OSI4层,还包括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相似的互联网协议。具体的详细信息,请参考官网。

<图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_bufSOCKET仍然是在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实现

W7100AARP过程是通过硬件逻辑方式执行的。在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函数

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/
官方Blogblog.iwiznet.cn
公共郵箱:wiznetbj@wiznettechnology.com

 

没有评论:

发表评论