arp 協議分析
總的來說,lwip將鏈路層ethernet的協議分組格式分為ether和etherarp
分開處理。ip分組先進入etharp_ip_input更新一下arp表項,然後直接進入
netif的input傳遞給上層ip層。arp分組直接進入etharp_arp_input。
不送如ip層。
奇怪的是,lwip把ether header的結構定義在etharp中。
-arp 資料結構
-- arp表狀態
enum etharp_state ;
-- arp表項結構
struct etharp_entry ;
-- arp 鏈路層協議分組
struct etharp_hdr
- arp 函式
void etharp_init();
初始化所有靜態arp表項,狀態為empty。
static err_t update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags);
首先排除廣播、多播及any位址。然後,
將ipaddr及ethaddr對加入arp表項中,該表項索引由find_entry獲得。
加入後,將該arp表項中還未傳送的ip包(這些ip包是由etharp_ouput函式,在
處理ip包傳送時,由於未找到對應ip的mac位址,由etharp_query加入到
pending arp的未傳送ip包煉表中。現在我們得到mac和ip對應值後,就
可以將這些ip包傳送出去),傳送到netif驅動。
該函式被etharp_ip_input及etharp_arp_input呼叫。
static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags);
查詢包含ipaddr的表項。
查詢優先順序:1. pending 2. stable 3. empty。
find_entry總是根據這些優先順序查詢是否由匹配項,如果有,立刻返回該項
索引。否則根據優先順序產看是否有過期表項,並覆蓋它。
void etharp_ip_input(struct netif *netif, struct pbuf *p);
該函式是再ip分組傳上ip層之前,將ip分組的mac和ip對映到
arp表項中做更新。這樣的設計好像比較浪費。完全可以加大arp
表項,去除該過程
void etharp_arp_input(struct netif *netif,
struct eth_addr *ethaddr, struct pbuf *p);
arp分組到來,直接交給該函式處理。
無論netif的ip位址是否被配置過,都將該arp分組的源ip和mac位址
加入到arp表項中。如果乙個arp請求的目的ip位址是本地ip位址。
則傳送response arp分組。
err_t etharp_output(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q);
該函式分開處理兩種位址型別的網路層包,
1)多播及廣播。直接呼叫netif->linkoutput傳送出去,該函式為網絡卡驅動。
2)單播。單播的ip包又分三種處理方式。a. 目的ip在arp表項中,並且stable。
則直接構造以太頭,呼叫網絡卡驅動,傳送以太幀。b. 目的ip不在arp表項中,
修改arp表項狀態為pending,並呼叫etharp_request,傳送arp request。
c. 目的ip在arp表項中。但狀態為pending(這個狀態是由b條件引起的,可能
arp response在處理該條件時還為返回)。將待傳送的ip包的緩衝區pbuf_ref
替換成pbuf_pool或pbuf_ram(暫時不知道為啥)。這些包將會在update_arp_input
中被傳送。
- arp 協議處理流程圖
lwIP ARP協議分析0
arp 協議分析 總的來說,lwip將鏈路層ethernet的協議分組格式分為ether和etherarp 分開處理。ip分組先進入etharp ip input更新一下arp表項,然後直接進入 netif的input傳遞給上層ip層。arp分組直接進入etharp arp input。不送如ip層...
lwIP ARP協議分析
總的來說,lwip將鏈路層ethernet的協議分組格式分為ether和etherarp 分開處理。ip分組先進入etharp ip input更新一下arp表項,然後直接進入 netif的input傳遞給上層ip層。arp分組直接進入etharp arp input。不送如ip層。奇怪的是,lwi...
小議LWIP ARP協議1
在tcp ip網路中,arp協議始終是相當重要的乙個環節,它主要是負責將32位的ip位址 ipv6則是128位 對映為48位的mac位址 規定每一種網路通訊裝置具備唯一的mac位址 從而可以在底層資料鏈路層中標記不同的網路通訊裝置。由於ip位址和mac位址沒有固定的對映規則,所以為了描述這種對映關係...