Linux路由表實現 1

2021-06-03 00:38:04 字數 1577 閱讀 3138

今天開始學習kernel中的路由表fib的實現,kernel支援兩種fib的儲存方式:一種是hash,另外一種是單詞查詢樹trie。分別由編譯選項config_ip_fib_hash和config_ip_fib_trie決定。

(據說新版本的kernel已經去掉了hash的實現方式)

下面首先看一下fib中的資料結構,大部分資料結構都在檔案ip_fib.h中

struct fib_config ;

struct fib_config主要用於將外部的route的配置/引數形式轉為fib的內部配置形式。如使用ip命令新增/刪除route時,或者路由daemon向linux新增/刪除時,都需要將其傳入系統api的引數轉為fib的內部配置結構。

/*

* this structure contains data shared by many of routes.

*/struct fib_info ;

struct fib_info用於儲存路由條目的一些共用的引數。

struct fib_table ;

恩,下面開始學習**,對於路由來說,最重要的就是路由的查詢:

static inline int fib_lookup(struct net *net, const struct flowi *flp,

struct fib_result *res)

fib_get_table比較簡單,就是通過id,從net->ipv4.fib_table_hash中取出對應的路由表——對於ipv4來說。

那麼查詢路由的核心函式就為fib_table_lookup,這個函式的實現依賴於編譯選項,共有兩種實現方式,hash和trie。其中hash的實現比較簡單,今天先學習hash的實現方式。

int fib_table_lookup(struct fib_table *tb,

const struct flowi *flp, struct fib_result *res)

}err = 1;

out:

read_unlock(&fib_hash_lock);

return err;

}

從上面看,路由表的hash查詢是比較簡單的。唯一的疑惑就是這個struct fn_zone。

下面是路由hash表的資料結構

struct fn_hash ;

路由hash表將路由條目按照掩碼長度分到不同的33個fn_zones中,掩碼長度為0即對應fn_zones[0],掩碼長度為1即fn_zones[1],一直到掩碼長度為32,則對應fn_zones[32]。而fn_zone_list指向的是最長的有路由條目的fn_zones。這樣查詢路由的時候,通過fn_zone_list順序查詢,從而實現了路由的最佳匹配。

今天基本上學習了kernel的路由表的hash實現方式。下面有可能將hash實現的完整的路由資料組織結構寫出來,或者轉到路由表trie的實現方式。

linux路由表配置

1 路由表 table 從0到255進行編號,每個編號可以對應乙個別名,編號和別名的對應關係在linux下放在 etc iproute2 rt tables這個檔案裡,一般0編號的table對應的別名為upspec,255編號對應的別名為local,254和253對應的別名分別為main和defau...

linux下新增路由表

redhat config network 使用ifconfig命令配置並檢視網路介面情況 配置eth0的ip,同時啟用裝置 ifconfig eth0 192.168.168.119 netmask 255.255.255.0 up 配置eth0別名裝置 eth0 1 的ip,並新增路由 ifco...

Linux 如何新增路由表

linux下靜態路由修改命令 方法一 新增路由 route add net 192.168.0.0 24 gw 192.168.0.1 route add host 192.168.1.1 dev 192.168.0.1 刪除路由 route del net 192.168.0.0 24 gw 19...