歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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