這篇文檔將會介紹如何使用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相似的互聯網協議。具體的詳細信息,請參考:
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]