1.什麼是鄰居子系統
鄰居:是指同乙個ip區域網內的主機,或者鄰居之間在三層上僅相隔一跳距離。
以ipv4 傳送資料為例,在傳送資料時,先進行路由查詢,如果查詢到目的位址路徑,再檢視鄰居表中是否存在響應的對映關係,
如果沒有則新建鄰居關係,然後判斷鄰居是否可用,如果不可用則將報文快取到傳送佇列,然後傳送建立鄰居請求,在接收到應答後,
將鄰居設定為可用狀態,並且將快取中的報文傳送出去。如果在指定時間內沒有收到響應報文,則將對應鄰居設定為無用狀態,並且超時後將
2、鄰居系統相關引數
2.1鄰居子系統的狀態
/** neighbor cache entry states. */
#define nud_incomplete 0x01
#define nud_reachable 0x02
#define nud_stale 0x04
#define nud_delay 0x08
#define nud_probe 0x10
#define nud_failed 0x20
/*dummy states
*/#define nud_noarp 0x40
#define nud_permanent 0x80
#define nud_none 0x00
/*nud_noarp & nud_permanent are pseudostates, they never change
and make no address resolution or nud.
nud_permanent is also cannot be deleted by garbage collectors. */
/** nud stands for "neighbor unreachability detection" */
#define nud_in_timer (nud_incomplete|nud_reachable|nud_delay|nud_probe)
#define nud_valid (nud_permanent|nud_noarp|nud_reachable|nud_probe|nud_stale|nud_delay)
#define nud_connected (nud_permanent|nud_noarp|nud_reachable)
nud_incomplete :該狀態是請求報文已傳送,但尚未收到應答的狀態。該狀態下還沒解析到硬體位址,因此尚無可用硬體位址,如果有報文要輸出到該鄰居,會將其快取起來。這個狀態會啟動乙個定時器,如果在定時器到期時還沒有接收到鄰居的回應,則會重**送請求報文,否則傳送請求報文的次數打到上限,便會進入nud_failed。nud_reachable :該狀態以及得到並快取了鄰居的硬體位址。進入該狀態首先設定鄰居項相關的output函式(該狀態使用neighbors_ops結構的connectd_outpt),然後檢視是否存在要傳送給該鄰居的報文。如果在該狀態下閒置時間達到上限,便會進入nud_statle。這些是基本狀態,根據這些基本狀態組合了幾個相對有語義的狀態。 2.2 鄰居表項的新增和刪除nud_stale :該狀態一旦有報文要輸出到該鄰居,則會進入nud_delay並將該報文輸出。如果在該狀態下閒置時間達到上限,且此時的引用計數為1,
則通過垃圾**機制將其刪除,在該狀態下,報文的輸出不收限制,使用慢速傳送過程
nud_delay :該狀態下表示nud_state狀態下傳送的報文已經發出,需得到鄰居的可達性確認的狀態。在為接收到鄰居的應答或確認時也會定時地重發請求,
如果傳送請求報文的次數到上限,如果收到鄰居的應答,進入nud_reachable,否則進入nud_failed,在該狀態下,報文的輸出不收限制,使用慢速傳送過程。
nud_probe :過渡狀態,和nud_incomplete 狀態類似,在未收到鄰居狀態的應答或者確認時,也會定時的重發請求,直到收到鄰居的應答、確認、或者嘗試傳送請求報文的次數達到上限,如果收到
應答或者確認就會進入nud_reachable,如果嘗試傳送請求到達上限,則進入nud_faild狀態,在該狀態,報文的輸出也不受限制,使用慢速傳送過程。
nud_failed :由於沒有收到應答報文而無法訪問狀態,
nud_noarp :標識鄰居無需將三層位址協議對映到二層位址協議。發往lo回環介面的報文其arp表項為nud_noarp
nud_permanent : 設定鄰居表項的硬體位址已經變味靜態,不需要去將三層位址翻譯對映到二層位址。
應用層可以通過arp ip 命令新增 刪除鄰居表項;在新增路由項和路徑繫結時也會觸發建立鄰居項。當接收到並非請求的應答報文同樣也能觸發建立鄰居表項。
鄰居表項的刪除除了ip arp 外就是在垃圾定時器****中處理。
有關鄰居操作的netlink訊息:
執行ip neighbour del 等 會呼叫核心的neigh_del neigh_add 函式
static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) 詳見 核心,再次不做詳細說明
資料報傳送與鄰居子系統
資料報從l4傳到ip後,ip呼叫路由子系統來查詢路由,並且在查詢到路由後,建立乙個新的鄰居項 struct neigh 與該路由項繫結。該neigh的初始狀態為incomplete,此時在呼叫傳送函式ip finish output2中呼叫 if dst hh return neigh hh out...
輸入子系統
驅動函式操作步驟 在初始化函式中 1.分配乙個input dev結構體 struct input dev buttons dev buttons dev input allocate device 2.設定 2.1 能產生哪類事件 set bit ev key,buttons dev evbit s...
中斷子系統
linux kernel的中斷子系統之 一 綜述 linux kernel的中斷子系統之 二 irq domain介紹 linux kernel的中斷子系統之 三 irq number和中斷描述符 linux kernel的中斷子系統之 四 high level irq event handler ...