uip協議棧分析(1)

2021-08-21 21:22:49 字數 1823 閱讀 9810

uip的原始碼目錄結構:

研究unix下的**可以知道uip是如何使用的,關鍵是理解uip協議棧的主控制迴圈。

int main(void)

int i;

uip_ipaddr_t ipaddr;

struct timer periodic_timer, arp_timer;

//設定tcp超時處理時間和arp老化時間

timer_set(&periodic_timer, clock_second / 2);

timer_set(&arp_timer, clock_second * 10);

//驅動初始化

tapdev_init();

//協議棧初始化

uip_init();

//設定ip位址、閘道器等引數

uip_ipaddr(ipaddr, 192,168,0,2);

uip_sethostaddr(ipaddr);

uip_ipaddr(ipaddr, 192,168,0,1);

uip_setdraddr(ipaddr);

uip_ipaddr(ipaddr, 255,255,255,0);

uip_setnetmask(ipaddr);

//應用層初始化

//主迴圈

while(1)

//從網絡卡讀取資料

uip_len = tapdev_read();

//如果資料存在則按協議處理

if(uip_len > 0)

//如果收到的是ip資料,呼叫uip_input()處理

if(buf->type == htons(uip_ethtype_ip))

uip_arp_ipin();

uip_input();

/* 處理完成後如果uip_buf裡有資料,即

uip_len>0,則呼叫tapdev_send傳送出去*/

if(uip_len > 0) {

uip_arp_out();

tapdev_send();

//如果收到的是arp資料,呼叫uip_arp_arpin處理

else if(buf->type == htons(uip_ethtype_arp))

uip_arp_arpin();

/* 檢視是否有要傳送的資料並傳送*/

if(uip_len > 0)

tapdev_send();

//檢視0.5s是否到了,呼叫uip_periodic處理tcp超時程式

else if(timer_expired(&periodic_timer))

timer_reset(&periodic_timer);

for(i = 0; i < uip_conns; i++)

uip_periodic(i);

if(uip_len > 0)

uip_arp_out();

tapdev_send();

#if uip_udp

//處理udp超時程式

for(i = 0; i < uip_udp_conns; i++)

uip_udp_periodic(i);

if(uip_len > 0)

uip_arp_out();

tapdev_send();

#endif /* uip_udp */

/* 10s到了就處理arp*/

if(timer_expired(&arp_timer))

timer_reset(&arp_timer);

uip_arp_timer();

return 0;

uIP協議棧分析

uip特性 由於uip協議棧專門為嵌進式系統而設計,因此還具有如下優越功能 1 非常少,其協議棧 不到6k,很方便閱讀和移植。2 占用的記憶體數非常少,ram占用僅幾百位元組。3 其硬體處理層 協議棧層和應用層共用乙個全域性快取區,不存在資料的拷貝,且傳送和接收都是依靠這個快取區,極大的節省空間和時...

uip協議棧分析(2)

uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb 巨集宣告。記憶體從宣告的記憶體塊裡用memb alloc 分配,用memb free 釋放。因為命名空間的衝突,每個c模組只能有乙個memb 巨集宣告。先看memb.h...

uip協議棧分析(2)

uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb 巨集宣告。記憶體從宣告的記憶體塊裡用memb alloc 分配,用memb free 釋放。因為命名空間的衝突,每個c模組只能有乙個memb 巨集宣告。先看memb.h...