這篇文檔將會介紹如何使用W7100A中實現MACRAW。MACRAW是一個低於IP層的乙太網MAC通信,它能夠靈活使用目的主機的上層協定。W7100A是全硬體的TCP/IP協定棧晶片,它不僅包括OSI的4層,還包括4層之外的應用層。因此,W7100A能夠簡單且穩定地應用於嵌入式互聯網中。
在第一章簡單介紹下MACRAW模式,第二章介紹MACRAW SOCKET,第三章則是ARP(位址解析通訊協定)。希望對大家有所幫助。
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
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)
/*向指定的目的端发送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.3 接收(RECEIVE)
/* 检测接收到的数据*/ //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 (地址解析协议)
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实现
#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回复。
函数名 | 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.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应用的执行结果
本篇文檔介紹完畢,明天繼續新的內容,多謝關注!
没有评论:
发表评论