<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于DWC_ether_qos的以太網驅動開發-LWIP的ARP模塊介紹

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-09-18 09:34 ? 次閱讀

本文轉自公眾號歡迎關注
https://mp.weixin.qq.com/s/g4WKu5IaF0OVsxqyoIIhnw

一.前言

TCP/IP通訊第一步需要先調通ARP,否則TCP/IP包都不知道MAC地址要發給誰。這一篇來基于LWIP的ARP實現進行相關的分析。

二.ARP協議回顧

ARP協議可以參考rfc826

幀格式如下:

硬件類型~目的端協議地址部分才是ARP協議部分,其他的為MAC幀頭尾。

總共42字節,注意要+18字節的填充

這樣包括后面4字節的CRC,才滿足42+18+4=64字節的最小幀長要求。

區域目的MAC地址DA源MAC地址SA類型長度Type/len硬件類型Hardware Type協議類型Protocol Type
大小字節66222
請求時一般用FFFFFFFFFFFF廣播,響應時用請求中解析出的對端的地址。本機MAC地址0x0806Ethernet為0x0001IP為0x0800
區域硬件地址長度Hardware Addr Len協議地址長度Prot Addr Len操作碼Opcode發送端硬件地址Prot Addr Len發送端協議地址Sender Protocol Address
大小字節11264
64請求為1響應為2發送端MAC地址發送端IP地址
區域目的端硬件地址Target Hardware Address目的端協議地址Target Protocol Address填充CRC
大小字節64184
目的端MAC地址目的端IP地址

以太網幀是通過MAC地址來定位發送者和接收者的,但是TCP/IP協議則是通過IP地址來定位的。協議層的地址和MAC幀的地址需要一個映射表,這樣底層才知道對應的協議地址需要綁定哪個MAC地址,最終鏈路層看的是MAC地址。

其實ARP協議不僅僅是用于IP和MAC地址的解析,實際它是通用的,可以用于不同地址空間的地址解析,地址的大小也可不同。

使用wireshark可以幫助解析

圖片

圖片

ARP協議的工作過程簡單描述就是,

發送端開始知道IP但是不知道對應的MAC地址,所以先發廣播包問,問該IP的MAC地址是多少,同時附帶了字節IP和MAC地址,

接收端接收到這個廣播包就可以從中解析發送端的IP和MAC地址,添加到自己的ARP表格中。如果某個主機發現詢問的是自己的MAC地址(IP匹配),則會響應自己的IP和MAC地址。

發送端接收到響應之后,就知道IP地址和MAC地址的對應關系,存到ARP表中,就可以發IP包了。

三. LWIP的ARP處理

ARP需要使能宏LWIP_ARP

ARP的處理依賴于定時器,定時器前面有分析。

定時器回調函數是etharp_tmr

周期為1S

#define ARP_TMR_INTERVAL 1000

相關代碼位于

etharp.c/h

ARP表

數據結構

表大小ARP_TABLE_SIZE可配置,默認是10,可配置可存的ARP條目數。

struct etharp_entry {

#if ARP_QUEUEING

/** Pointer to queue of pending outgoing packets on this ARP entry. */

struct etharp_q_entry *q;

#else /* ARP_QUEUEING */

/** Pointer to a single pending outgoing packet on this ARP entry. */

struct pbuf *q;

#endif /* ARP_QUEUEING */

ip4_addr_t ipaddr;

struct netif *netif;

struct eth_addr ethaddr;

u16_t ctime;

u8_t state;

};

static struct etharp_entry arp_table[ARP_TABLE_SIZE];

其中使能ARP_QUEUEING則表示如果當前還不知道IP對應的MAC地址,可以先暫時掛起待發送的包,按照隊列掛起,如果未配置則只能掛起一個待發送的包。

ctime維護一個軟定時器,arp定時器回調時增加1,增加到一定值釋放表項。

在有ARP包IP包更新表項時清零。

Ipaddr ethaddr對應IP和MAC地址

State維護一個狀態機

Netif對應的接口

釋放表項****etharp_free_entry

設置表項狀態為EMPTY即可,注意如果有掛起的包也需要釋放。

查找表項etharp_find_entry

查找已有的表項,或者沒有則找一個空閑的位置存新的信息。

如果找不到空閑位置則釋放最早的掛起的表項騰出位置。

更新表項etharp_update_arp_entry

調用etharp_update_arp_entry查找表項,

如果有表項有掛起數據包則發送該掛起的IP包ethernet_output

靜態添加表項etharp_add_static_entry

需要配置宏ETHARP_SUPPORT_STATIC_ENTRIES

調用etharp_update_arp_entry手動添加表項

靜態釋放表項etharp_remove_static_entry

需要配置宏ETHARP_SUPPORT_STATIC_ENTRIES

調用etharp_find_entry查找表項再釋放

清除所有表項etharp_cleanup_netif

遍歷清除etharp_free_entry

查找地址etharp_find_addr

調用etharp_find_entry,根據IP地址查找MAC地址

根據索引查找地址****etharp_get_entry

直接根據ARP表索引返回對應的表項信息

超時處理

對于ARP表項,需要有一個有效時間,如果長時間未有對應的ARP包或者IP包則需要釋放表項。

etharp_tmr

定時器前面已經介紹過,etharp_tmr會以默認1S的間隔調用。

遍歷所有表項

如果某個表項超過ARP_MAXAGE(默認300S)沒有更新時,就會釋放。

定時器是在etharp_find_entry,etharp_query, etharp_update_arp_entry時清零的,也就是說超過300S沒收收到對應的地址的IP包和ARP包就認為超時需要釋放。

如果表項處于ETHARP_STATE_PENDING狀態且超過ARP_MAXAGE(默認是5)時也要釋放表項。即比如一開始給某個IP發包,但是MAC地址不知道,于是發了ARP請求包,但是此時還沒有收到響應,所以設置ARP表項為ETHARP_STATE_PENDING狀態,同時掛起待發送的包,等收到ARP響應了再發這個掛起的包。掛起的超時時間就是ARP_MAXAGE,實際值要根據etharp_tmr間隔來,間隔是1S則實際是1x2x5=10S。

這里x2是因為。

如果處于ETHARP_STATE_PENDING狀態則發送,ARP請求etharp_request,直到ARP_MAXAGE超時釋放表項。

如果是以下狀態則間隔1S切換到下一狀態

ETHARP_STATE_STABLE_REREQUESTING_1->ETHARP_STATE_STABLE_REREQUESTING_2->ETHARP_STATE_STABLE

數據流

主動廣播

手動發請求etharp_gratuitous

即廣播問IP地址是本機的MAC地址是多少,

為什么這里問的是自己的IP不是別人的呢?因為這是自己的IP或者狀態變了,實際是廣播一下告訴別人。

修改IP,LINK UP時會手動發一次請求,比如如下接口調用時

netif_do_set_ipaddr

netif_set_up

netif_set_link_up

ARP包輸入處理

etharp_input

根據收到的ARP包,不管是請求還是響應包,都可以從源IP地址和源MAC地址獲取信息,更新ARP表。比如ARP廣播請求哪怕不是發給自己的也可以知道網絡上有源IP地址和源MAC的設備,可以更新ARP表,下次如果要給這個IP發包就可以直接發,注意如果源IP地址不是單播地址也不處理。如是請求自己的ARP包就進行響應。

圖片

發包

etharp_output->

etharp_output_to_arp_index

在IP包上添加MAC地址,

相應的接口直接查看源碼

etharp_query

etharp_raw

etharp_request_dst

etharp_request

ACD檢測

沖突地址檢測ACD

存在多個主機使用同一IP地址的問題,在RFC5227中定義了ACD的概念,其中定義了兩種ARP報文:ARP Probe和ARP Announcement。ARP Probe用于探測當前廣播域是否有其他主機使用某個IP地址,ARP Probe報文的發送者IP地址字段是全0,這是為了避免ARP污染(因為ARP請求報文會在廣播域內廣播到每個主機上,所以主機收到帶發送者IP地址的ARP報文后都會創建緩存表項,太多ARP報文會造成域內主機上的緩存浪費)。而前面代碼中可以看出對于發送端即源IP地址為0的并不會更新到緩存。

即etharp_update_arp_entry的

如下處理ip4_addr_isany(ipaddr)

/* non-unicast address? */


if (ip4_addr_isany(ipaddr) ||


    ip4_addr_isbroadcast(ipaddr, netif) ||


    ip4_addr_ismulticast(ipaddr)) {


  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cachen"));


  return ERR_ARG;


}

ARP Announcement報文用于通告域內主機自己的IP地址和MAC地址,特征是其目標硬件地址字段全0,該報文不希望某個特定的主機回應,只需要域內主機創建起ARP表項即可。

也是對應上述代碼的處理。

需要使能宏LWIP_ACD

對應兩個接口

etharp_acd_probe

etharp_acd_announce

其他代碼位于acd.c中

四.調試

#define ETHARP_DEBUG LWIP_DBG_ON 使能調試打印

ping一下設備可以看到打印如下(這里的printf不支持某些格式所以一些打印不正常)

可以借助wireshark抓包分析。

ethernet_input: dest:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, src:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, type:%hx


etharp_find_entry: found empty entry 0


etharp_find_entry: selecting empty entry 0


etharp_request: sending ARP request.


etharp_raw: sending raw ARP packet.


ethernet_output: sending packet 0x28214a18


etharp_query: queued packet 0x28214ae8 on ARP entry %hu


ethernet_input: dest:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, src:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, type:%hx


etharp_update_arp_entry: %hu.%hu.%hu.%hu - %02hx:%02hx:%02hx:%02hx:%02hx:%02hx


etharp_find_entry: found matching entry 0


etharp_update_arp_entry: updating stable entry %hd


ethernet_output: sending packet 0x28214ae8


etharp_input: incoming ARP reply


etharp_timer


ethernet_input: dest:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, src:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, type:%hx


ethernet_output: sending packet 0x28214ae8


etharp_timer


etharp_timer


ethernet_input: dest:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, src:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, type:%hx


ethernet_output: sending packet 0x28214ae8


etharp_timer


ct: dest:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, src:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, type:%hx


ethernet_output: sending packet 0x28214ae8


etharp_timer


ethernet_input: dest:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, src:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx, type:%hx


etharp_update_arp_entry: %hu.%hu.%hu.%hu - %02hx:%02hx:%02hx:%02hx:%02hx:%02hx


etharp_find_entry: found matching entry 0


etharp_update_arp_entry: updating stable entry %hd


etharp_input: incoming ARP request


etharp_raw: sending raw ARP packet.


ethernet_output: sending packet 0x28214a18


etharp_timer


etharp_timer


etharp_timer


etharp_timer


etharp_timer


etharp_timer

五.總結

主要了解ARP表項的更新,以及超時處理。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 以太網
    +關注

    關注

    40

    文章

    5145

    瀏覽量

    167022
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1285

    瀏覽量

    78476
  • ARP
    ARP
    +關注

    關注

    0

    文章

    50

    瀏覽量

    14666
  • LwIP
    +關注

    關注

    2

    文章

    82

    瀏覽量

    26738
  • 驅動開發
    +關注

    關注

    0

    文章

    129

    瀏覽量

    12021
收藏 人收藏

    評論

    相關推薦

    基于DWC_ether_qos以太網驅動開發-MAC幀格式介紹

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-MAC幀格式介紹 (qq.com) 一.前言 ? 在
    的頭像 發表于 08-30 09:23 ?1416次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-MAC幀格式<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網驅動開發-MDIO驅動編寫與測試

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-MDIO驅動編寫與測試 一.前言
    的頭像 發表于 08-30 09:37 ?2667次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-MDIO<b class='flag-5'>驅動</b>編寫與測試

    基于DWC_ether_qos以太網驅動開發-描述符鏈表介紹

    本文轉自公眾號歡迎關注 一.描述符概述 1.0 前言 對于DWC Ethernet QoS驅動的編寫來說,初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發表于 08-30 09:39 ?3113次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-描述符鏈表<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網驅動開發-數據流驗證過程

    轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太網驅動開發-數據流驗證過程
    的頭像 發表于 08-31 08:41 ?1312次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-數據流驗證過程

    基于DWC_ether_qos以太網驅動開發-收發驅動編寫與調試

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-收發驅動編寫與調試 (qq.com) https://mp.wei
    的頭像 發表于 09-05 08:47 ?1556次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-收發<b class='flag-5'>驅動</b>編寫與調試

    基于DWC_ether_qos以太網驅動開發-無OS環境移植LWIP

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-無OS環境移植LWIP (qq.com) https://mp.we
    的頭像 發表于 09-06 08:40 ?968次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-無OS環境移植<b class='flag-5'>LWIP</b>

    基于DWC_ether_qos以太網驅動開發-LWIP的內存池介紹

    本文轉自公眾號,歡迎關注 https://mp.weixin.qq.com/s/mBoGSf_u9edFF01U_OZT9g 一.前言 lwIP為基礎結構提供了專用的內存池管理,比如netconn
    的頭像 發表于 09-07 08:45 ?1004次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的內存池<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網驅動開發-LWIP的堆管理介紹

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-LWIP的堆管理介紹 (
    的頭像 發表于 09-08 08:40 ?828次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的堆管理<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網驅動開發-LWIP的堆(內存池)未對齊導致問題的案例分享

    本文轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog 一.?前言 內存未對齊訪問問題這個已經是老生常談的問題了, 由于LWIP
    的頭像 發表于 09-09 08:44 ?1305次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的堆(內存池)未對齊導致問題的案例分享

    基于DWC_ether_qos以太網驅動開發-RTOS環境移植LWIP與性能測試

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-RTOS環境移植LWIP與性能測試 (qq.com) https:
    的頭像 發表于 09-11 11:20 ?1312次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-RTOS環境移植<b class='flag-5'>LWIP</b>與性能測試

    基于DWC_ether_qos以太網驅動開發-LWIP在PC上進行開發調試

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-LWIP在PC上進行開發
    的頭像 發表于 09-11 08:40 ?1357次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>在PC上進行<b class='flag-5'>開發</b>調試

    基于DWC_ether_qos以太網驅動開發-LWIP的定時器模塊詳解

    一. 前言 LWIP的定時器模塊,實現了通用的軟件定時器,用于內部的周期事件處理,比如arp,tcp的超時等,用戶也可以使用。這一篇來分析該模塊的實現。 二.代碼分析 2.1源碼 源碼
    的頭像 發表于 09-18 09:33 ?1031次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的定時器<b class='flag-5'>模塊</b>詳解

    設計軟件核心以太網服務質量數據手冊免費下載

    本文描述Synopsys設計軟件核心以太網服務質量DWC以太網QoS核心5.10A。DWC以太網
    發表于 10-23 08:00 ?15次下載
    設計軟件核心<b class='flag-5'>以太網</b>服務質量數據手冊免費下載

    基于DWC_ether_qos以太網驅動開發-包過濾

    以太網上數據非常多,如果所有數據都接收交給軟件去處理軟件負載會非常重,所以一般只需要接收發給自己的數據即可
    的頭像 發表于 09-02 09:19 ?1014次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-包過濾

    基于DWC_ether_qos以太網驅動開發-軟復位介紹與問題案例

    一般模塊都會有軟復位的功能,軟復位在驅動編寫中很重要。一般初始化時執行軟復位使得模塊進入確定的初始狀態以提高可靠性,異常時也可以重新初始化來恢復,所以軟復位在驅動中一般是必須要做的動作
    的頭像 發表于 09-02 09:17 ?998次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-軟復位<b class='flag-5'>介紹</b>與問題案例
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>