<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                etharp\_update\_arp\_entry()函數是用于更新ARP緩存表的,它會在收到一個ARP數據包的時候被調用,它會先查找一個ARP表項,如果沒有找到這個ARP表項的記錄,就會去新建一個ARP表項,然后重置ARP表項的參數(狀態、網卡。IP地址與對應的MAC地址以及生存時間等),然后檢測ARP表項中是否掛載數據包,如果有就將這些數據包發送出去,其源碼具體見代碼清單 10?10。 ``` 1 static err_t 2 etharp_update_arp_entry(struct netif *netif, (1) 3 const ip4_addr_t *ipaddr, (2) 4 struct eth_addr *ethaddr, (3) 5 u8_t flags) (4) 6 { 7 s16_t i; 8 9 /* non-unicast address? */ 10 if (ip4_addr_isany(ipaddr) || 11 ip4_addr_isbroadcast(ipaddr, netif) || 12 ip4_addr_ismulticast(ipaddr)) (5) 13 { 14 return ERR_ARG; 15 } 16 /* 查找或者創建ARP表項,并且返回索引值 */ 17 i = etharp_find_entry(ipaddr, flags, netif); (6) 18 19 /* 如果索引值不合法,更新ARP表項失敗 */ 20 if (i < 0) 21 { 22 return (err_t)i; 23 } 24 25 26 /* 設置表項狀態為ETHARP_STATE_STABLE */ 27 arp_table[i].state = ETHARP_STATE_STABLE; (7) 28 29 /* 記錄網卡 */ 30 arp_table[i].netif = netif; (8) 31 /* 插入ARP索引樹 */ 32 mib2_add_arp_entry(netif, &arp_table[i].ipaddr); (9) 33 34 /* 更新緩存表中的MAC地址 */ 35 SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN); (10) 36 /* 重置生存時間 */ 37 arp_table[i].ctime = 0; (11) 38 39 /* 如果表項上與未發送的數據包,那就將這些數據包發送出去 */ 40 #if ARP_QUEUEING 41 while (arp_table[i].q != NULL) 42 { 43 struct pbuf *p; 44 /* 定義q指向ARP表項中的數據包緩存隊列 */ 45 struct etharp_q_entry *q = arp_table[i].q; (12) 46 /* 指向下一個數據包節點 */ 47 arp_table[i].q = q->next; (13) 48 /* 獲取pbuf數據包 */ 49 p = q->p; (14) 50 /* 釋放MEMP_ARP_QUEUE類型的內存塊 */ 51 memp_free(MEMP_ARP_QUEUE, q); (15) 52 #else /* ARP_QUEUEING */ 53 if (arp_table[i].q != NULL) 54 { 55 struct pbuf *p = arp_table[i].q; (16) 56 arp_table[i].q = NULL; 57 #endif /* ARP_QUEUEING */ 58 /* 發送緩存隊列的數據包 */ 59 ethernet_output(netif, p, 60 (struct eth_addr *)(netif->hwaddr), 61 ethaddr, 62 ETHTYPE_IP); (17) 63 /* 釋放pbuf數據包的內存空間 */ 64 pbuf_free(p); (18) 65 } 66 return ERR_OK; 67 } ``` (1):對應表項中的網卡。 (2):對應表項中的IP地址。 (3):對應表項中的MAC地址。 (4):表項的更新方式,動態表項有兩種方式,分別為ETHARP_FLAG_TRY_HARD和ETHARP_FLAG_FIND_ONLY。前者表示無論如何都要創建一個表項,如果ARP緩存表中沒有空間了,那就需要回收較老的表項,將他們刪除,然后建立新的表項。而如果是后者,就讓內核盡量更新表項,如果ARP緩存表中沒有空間了,那么也無能為力,實在是添加不了新的表項。 (5):IP地址驗證,ARP數據包中的目標IP地址不能是廣播、多播地址。 (6):調用etharp_find_entry()函數查找或者創建ARP表項,并且返回索引值,如果索引值不合法,表示更新ARP表項失敗,該函數比較復雜,此處就不做過多講解,想要了解的可以在源碼中查看該函數。 (7):設置表項狀態為ETHARP_STATE_STABLE。 (8):記錄網卡信息。 (9):插入ARP索引樹。 (10):更新表項中的MAC地址。 (11):重置表項的生存時間。 (12):如果表項上與未發送的數據包,那就將這些數據包發送出去。這里通過宏定義ARP_QUEUEING采用哪種方式發送數據包,如果定義了緩存數據包隊列,那就需要將隊列上的所有數據包發送出去,定義q指向ARP表項中的數據包緩存隊列。 (13):指向下一個數據包節點。 (14):獲取pbuf數據包。 (15):釋放MEMP_ARP_QUEUE類型的內存塊。 (16):此處是單個數據包掛載到表項上,無需太多操作,直接將數據包獲取到,然后發送出去即可。 (17):調用ethernet_output()函數發送掛載在表項上的數據包。 (18):釋放pbuf數據包的內存空間。 整個ARP處理的流程示意圖具體見圖 10-9。 ![](https://box.kancloud.cn/09d58b2545f1daad91f6e30fc0262af9_573x710.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看