uip協議棧分析(1)

Uip源代碼可以從http://www.sics.se/~adam/uip/index.php/Main_Page上下載得到。

    Uip的源碼目錄結構:

 D:.
├─apps
│  ├─dhcpc
│  ├─hello-world
│  ├─resolv
│  ├─smtp
│  ├─telnetd
│  ├─webclient
│  └─webserver
│      └─httpd-fs
├─doc
│  └─html
├─lib
├─sourceinsight
├─uip
└─unix

App目錄是一些應用層的協議和實例,Doc目錄是文檔,lib目錄下有內存塊管理函數,uip下uip協議棧的源代碼,unix下是unix環境裏的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);

  //應用層初始化

  httpd_init();

 

  //主循環

  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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章