这篇文档将会介绍如何使用W7100A中实现MACRAW。MACRAW是一个低于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相似的互联网协议。具体的详细信息,请参考官网。
<图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函数
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模式下创建好的SOCKET 0调用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应用的执行结果
本篇文档全部内容已介绍完毕,谢谢关注!