1、什么是UIP協(xié)議棧:
UIP是一種適用于小型嵌入式通信的TCP/IP協(xié)議棧,由瑞典計算機科學院的人開發(fā)編寫的,它去掉了完整的TCP/IP中不常用的功能,簡化了通訊過程,但其保留了網絡通信中必須使用的協(xié)議,把設計重點放在IP、TCP和ARP協(xié)議的實現上。簡單易用、占用資源少是它的設計特點。
2、協(xié)議棧接口
UIP協(xié)議棧通過一系列接口函數與底層函數和上層應用程序通信,在兩者之中,UIP接口函數處于中間。其中UIP提供兩個個接口函數給底層系統(tǒng)。分別是
(1)uip_input()
當網卡驅動收到一個輸入包時,將放入全局緩沖區(qū)uip_buf中,包的大小由全局變量uip_len約束。同時將調用 uip_input() 函數,這個函數將會根據包首部的協(xié)議處理這個包和需要時調用應用程序。當 uip_input() 返回時,一個輸出包同樣放在全局緩沖區(qū)uip_buf里,大小賦給uip_len。如果uip_len 是0,則說明沒有包要發(fā)送。否則調用底層系統(tǒng)的發(fā)包函數將包發(fā)送到網絡上。
(2)uip_periodic()
uIP 周期計時是用于驅動所有的uIP 內部時鐘事件。當周期計時激發(fā),每一個TCP 連接都會調用uIP 函數uip_periodic() 。類似于 uip_input() 函數。uip_periodic()函數返回時,輸出的IP 包要放到uip_buf中,供底層系統(tǒng)查詢uip_len的大小發(fā)送。
UIP提供一個調用函數uip——appcall()與上位機應用程序通信。當uip在接收到底層傳來的數據包后,直接調用uip_appcall()就可以把數據傳送到上層應用程序進行處理。
系統(tǒng)底層其實在一開始時還需要調用初始化UIP的函數——uip_init(),主要是初始化協(xié)議棧的偵聽端口和默認所有連接都是關閉的。
3、UIP協(xié)議棧在STM32上的移植
(1)DM9000A初始化和UIP初始化;
tapdev_init();uip_init();
(2)設置IP地址
uip_ipaddr(ipaddr, 192,168,1,10);
(3)設置默認的路由器地址
uip_ipaddr(ipaddr, 192,168,1,1);
(4)設置網絡掩碼
uip_setnetmask(ipaddr);
(5)當DM9000A接收到數據后會產生中斷,這時候從DM9000A讀取一個IP包,返回數據長度;
uip_len = tapdev_read();
(6)校驗處理數據包
BUF->type == htons(UIP_ETHTYPE_IP
(7)去除以太網幀頭結構,更新ARP表
uip_arp_ipin();
(8)IP包處理
uip_input();