歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux 內核路由發現過程

Linux 內核路由發現過程

日期:2017/3/1 10:49:32   编辑:Linux編程

簡單來講fn_hash_lookup這個函數通過在一張路由表(struct fib_table)中,根據查詢路由的目的IP地址(key)在其路由哈希表(struct fn_hash)中找到一個路由域(struct fn_zone),並在路由域中匹配到一個key相等的路由節點(struct fib_node),取其路由別名(struct fib_alias)和路由信息(struct fib_info),生成一個路由查詢結果(struct fib_result)。 路由查詢結果還不能直接供發送IP數據報使用,接下來,還必須根據這個查詢結果生成一個路由目的入口(dst_entry),根據目的入口才可以發送IP數據報,目的入口用結構體struct dst_entry表示,在實際使用時,還在它的外面包裝了一層,形成一個結構體struct rtable。

struct rtable的定義如下:
struct rtable
{
union{
struct dst_entry dst;
struct rtable *rt_next;
}u;
struct in_device *idev;
unsigned rt_flags;
__u16 rt_type;
__u16 rt_multipath_alg;
__u32 rt_dst;
__u32 rt_src;
int rt_iif;
__u32 rt_gateway;
struct flowi fl;
__u32 rt_spec_dst;
struct inet_peer *peer;
};
rt_flags是一組標志位,按目的入口查詢的執行順序:如果路由使用本地環回接口,則rt_flags上加標志RTCF_LOCAL,如果路由結果類型是廣播,則加標志RTCF_BROADCAST和RTCF_LOCAL,如果結果是組播,則加標志RTCF_MULTICAST和RTCF_LOCAL,該標志最終決定了目的入口使用哪一個IP數據報輸入函數和輸出函數,如果是RTCF_LOCAL,則使用輸入函數ip_local_deliver,如果是RTCF_BROADCAST或RTCF_MULTICAST,並且帶有RTCF_LOCAL標志,並且輸出設備不是環回接口設備,則使用輸出函數ip_mc_output,否則使用輸出函數ip_output。
rt_type是路由類型,如果路由是LOOPBACK,則置類型為RTN_LOCAL,單播路由類型為RTN_UNICAST,如果目的地址為0xFFFFFFFF,則路由類型為RTN_BROADCAST,如果目的地址是組播地址,則路由類型為RTN_MULTICAST。rt_type跟rt_flags關系比較密切。
rt_multipath_alg跟路由多路徑相關,暫時略過。rt_dst是路由的目的地址,rt_src是路由的源地址,rt_iif是路由的輸入設備接口的索引號。rt_gateway是路由網關的IP地址。
在試驗環境中,網絡設備接口mylo的IP地址是127.10.0.1,它在內核中的表示是struct net_device myloopback_dev,測試程序往IP地址127.10.0.1發送DUMMY協議的數據報,協議棧為其生成的路由目的入口如下:
the dst_entry:
the dev name: mylo
the error: 0
the obsolete: 0
the flag: DST_HOST
expires: 0, now: 110343
header len: 0
rt_flag: RTCF_LOCAL
rt_type: RTN_LOCAL
rt_dst: 127.10.0.1
rt_src: 127.10.0.1
rt_iif: 4
rt_gateway: 127.10.0.1
rt_spec_dst: 127.10.0.1
試驗環境中的網絡設備接口eth0的IP地址是172.16.48.2,測試程序往該IP地址所在子網內的IP地址172.16.48.1發送DUMMY協議的數據報,協議棧為其生成的路由目的入口如下:
the dst_entry:
the dev name: eth0
the error: 0
the obsolete: 0
the flag: DST_HOST
expires: 0, now: 850858
header len: 0
rt_flag: 0
rt_type: RTN_UNICAST
rt_dst: 172.16.48.1
rt_src: 172.16.48.2
rt_iif: 2
rt_gateway: 172.16.48.1
rt_spec_dst: 172.16.48.2

Copyright © Linux教程網 All Rights Reserved