UIP協議一

 UIP協議多用於嵌入式產品。
     結合如CP2200芯片的網卡芯片,組成嵌入式網卡,硬件提供能力,UIP提供的是策略。
     由上往下逐步封裝用戶的數據,如:
     應用層----------傳輸層--------網絡層------數據鏈路層-----物理層
     應用數據---TCP封裝頭部---IP封裝頭部-----mac封裝+尾部-----發送 
    任何的事物需要經過一定的初始階段,在UIP協議裏面通過uip_init()來初始化。
    在uip_init()函數裏面主要工作是:
     1. 將uip_state結構體全部清零。
     2. 初始化用於TCP鏈接的uip_conn結構體,將連接狀態置爲close。
     3. 設置用於TCP鏈接的端口lastport = 4096;應該是最大的端口號,待查證。
     4. 如果定義了UDP,同樣進行初始化。
  1. void uip_init(void) {
  2.     // clean statistics
  3.     char* ptr= (char*) &uip_stat;
  4.     for (int i = 0; i<sizeof (uip_stat); i++) {
  5.         ptr[i] = 0;   
  6.     }

  7.     for (= 0; c < UIP_LISTENPORTS; ++c) {
  8.         uip_listenports[c] = 0;
  9.     }
  10.     for (= 0; c < UIP_CONNS; ++c) {
  11.         uip_conns[c].tcpstateflags = UIP_CLOSED;
  12.     }
  13.     lastport = 4096;

  14. #if UIP_UDP
  15.     for (= 0; c < UIP_UDP_CONNS; ++c) {
  16.         uip_udp_conns[c].lport = 0;
  17.     }
  18. #endif /* UIP_UDP */


  19.     /* IPv4 initialization. */
  20. #if UIP_FIXEDADDR == 0
  21.     /* uip_hostaddr[0] = uip_hostaddr[1] = 0;*/
  22. #endif /* UIP_FIXEDADDR */

  23. }
   同樣,我在ourdev.cn上下載了,一份總結,一點一點上傳,感謝ourdev.cn。
   uip_arp_init(); arp協議的初始化,其中進行的是構造arp協議的緩存。
   在配置UIP協議的時候要主要配置超時。
   // 摘自uip協議包main.c
  1. struct timer periodic_timer, arp_timer;
  2. timer_set(&periodic_timer, CLOCK_SECOND / 2);
  3. timer_set(&arp_timer, CLOCK_SECOND * 10);
   還要進行的配置是,比如配置主機地址,ip地址,還有掩碼,以太網mac地址等信息,或者配置dhcp。
   這些配置完成之後,進入協議的主循環,接受,和發送等等的過程了。
   要應用到實際的使用中,還需要結合硬件,比如CP2200芯片,使用過程中,需要有接收,和發送函
   數,這個需要自己實現,循環的流程如下:
  
  1. while(1)
  2.  {
  3.     uip_len = tapdev_read();  // 接收的函數
  4.     if(uip_len > 0)
  5.     {
  6.       if(BUF->type == htons(UIP_ETHTYPE_IP))
  7.       {
  8.           uip_arp_ipin();
  9.           uip_input();  // 這個是實際的從上往下封裝包的函數
  10.          /* If the above function invocation resulted in data that
  11.           should be sent out on the network, the global variable
  12.            uip_len is set to a value > 0. */
  13.           if(uip_len > 0)
  14.           {
  15.               uip_arp_out();
  16.               tapdev_send(); // 發送的實際函數 
  17.           }
  18.       } 
  19.       else if(BUF->type == htons(UIP_ETHTYPE_ARP))
  20.       {
  21.           uip_arp_arpin();
  22.           /* If the above function invocation resulted in data that
  23.           should be sent out on the network, the global variable
  24.           uip_len is set to a value > 0. */
  25.           if(uip_len > 0) 
  26.           {
  27.            tapdev_send();
  28.           }
  29.       }

  30.     } 
  31.     else if(timer_expired(&periodic_timer))
  32.      {
  33.          timer_reset(&periodic_timer);
  34.          for(= 0; i < UIP_CONNS; i++)
  35.          {
  36.              uip_periodic(i);
  37.              /* If the above function invocation resulted in data that
  38.              should be sent out on the network, the global variable
  39.              uip_len is set to a value > 0. */
  40.              if(uip_len > 0)
  41.              {
  42.                  uip_arp_out();
  43.                  tapdev_send();
  44.              }
  45.         }

  46. #if UIP_UDP
  47.       for(= 0; i < UIP_UDP_CONNS; i++)
  48.        {
  49.            uip_udp_periodic(i);
  50.            /* If the above function invocation resulted in data that
  51.             should be sent out on the network, the global variable
  52.              uip_len is set to a value > 0. */
  53.            if(uip_len > 0)
  54.             {
  55.                 uip_arp_out();
  56.                 tapdev_send();
  57.            }
  58.       }
  59. #endif /* UIP_UDP */

  60.       /* Call the ARP timer function every 10 seconds. */
  61.       if(timer_expired(&arp_timer))
  62.        {
  63.            timer_reset(&arp_timer);
  64.            uip_arp_timer();
  65.       }
  66.     }
  67.   }
    在主循環裏面,還有好多需要分析的,特別是uip_input(),各種跳轉...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章