日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

如下IP命令添加路由表項,默認情況下路由添加在main路由表中:

# ip route add 192.2.0.0/16 via 192.168.1.106## ip route show table main 192.2.0.0/16 via 192.168.1.106 dev ens32

也可指定路由表,如下在local/default表中添加相同目的網絡,但是網關不同的路由項:

# ip route add 192.2.0.0/16 via 192.168.1.1 table local## ip route show table local192.2.0.0/16 via 192.168.1.1 dev ens32 ### ip route add 192.2.0.0/16 via 192.168.1.200 table default## ip route show table default192.2.0.0/16 via 192.168.1.200 dev ens32 

下面使用ping命令測試到目的網段192.2.0.0/16,可見其使用的是local表中的路由項,而不是main表中項:

# tcpdump -i ens32 host 192.2.0.1 -n -e &   // 后臺啟動tcpdump## ping 192.2.0.1PING 192.2.0.1 (192.2.0.1) 56(84) bytes of data.23:05:53.330337 00:0c:29:1e:20:e3 > 00:90:27:fe:c9:34, ethertype IPv4 (0x0800), length 98: 192.168.1.140 > 192.2.0.1: ICMP echo request, id 64942, seq 1, length 64 # # ip neigh show192.168.1.1 dev ens32 lladdr 00:90:27:fe:c9:34 REACHABLE

以下刪除local表中添加的路由,再執行ping操作,這次是main表中的路由生效,網關使用的是192.168.1.106:

# ip route del 192.2.0.0/16 via 192.168.1.1 table local#  # ping 192.2.0.1PING 192.2.0.1 (192.2.0.1) 56(84) bytes of data.23:21:47.752867 00:0c:29:1e:20:e3 > 00:60:e0:6f:9c:e3, ethertype IPv4 (0x0800), length 98: 192.168.1.140 > 192.2.0.1: ICMP echo request, id 528, seq 1, length 64#  # ip neigh show192.168.1.106 dev ens32 lladdr 00:60:e0:6f:9c:e3 STALE

 

最后,刪除main中的路由,

# ip route del 192.2.0.0/16 via 192.168.1.106 table main## ping 192.2.0.1           PING 192.2.0.1 (192.2.0.1) 56(84) bytes of data.23:50:55.690358 00:0c:29:1e:20:e3 > 00:60:e0:85:7a:06, ethertype IPv4 (0x0800), length 98: 192.168.1.140 > 192.2.0.1: ICMP echo request, id 2079, seq 1, length 64# # ip neigh 192.168.1.200 dev ens32 lladdr 00:60:e0:85:7a:06 STALE

路由表創建
在添加表項時,沒有指定路由表ID,或者指定的表ID等于0,內核使用main表RT_TABLE_MAIN,函數fib_trie_table分配一個新的fib_table結構,代表一個新的路由表。對于main表,將其制賦值給命名空間中的fib_main成員。最后將其鏈接到哈希桶fib_table_hash的對應鏈表中。

如果指定的路由表ID等于RT_TABLE_LOCAL,但是此命名空間中沒有配置過IPv4策略路由,也使用main路由表,作為alias,參見fib_trie_table。這種情況下,fib_new_table會在調用自身,參數ID使用RT_TABLE_MAIN,獲取main表的結構,賦值與alias。

對于default表,目前不太清楚其使用情況,在創建之后,內核將其賦值給命名空間的fib_default成員。

struct fib_table *fib_new_table(struct.NET *net, u32 id){    struct fib_table *tb, *alias = NULL;    unsigned int h;    if (id == 0)        id = RT_TABLE_MAIN;    tb = fib_get_table(net, id);    if (tb)        return tb;    if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules)        alias = fib_new_table(net, RT_TABLE_MAIN);    tb = fib_trie_table(id, alias);    if (!tb)        return NULL;    switch (id) {    case RT_TABLE_MAIN:        rcu_assign_pointer(net->ipv4.fib_main, tb);        break;    case RT_TABLE_DEFAULT:        rcu_assign_pointer(net->ipv4.fib_default, tb);        break;    default:        break;    }    h = id & (FIB_TABLE_HASHSZ - 1);    hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]);    return tb;

對于main路由表,以及其它路由表,fib_trie_table的參數alias為空;但是對于local路由表,alias執向main表結構,就不用重新分配trie結構了。對于所有的路由表,都需要分配一個fib_table結構。

對于local路由表,其數據字段指向main路由表的數據字段??梢妉ocal表不是一個完全單獨的路由表,其數據與main表是公用的。所以local路由表不需要進行以下對數據字段的初始化操作。

struct fib_table *fib_trie_table(u32 id, struct fib_table *alias){         struct fib_table *tb;    struct trie *t;    size_t sz = sizeof(*tb);          if (!alias)        sz += sizeof(struct trie);          tb = kzalloc(sz, GFP_KERNEL);    if (!tb)        return NULL;      tb->tb_id = id;    tb->tb_num_default = 0;    tb->tb_data = (alias ? alias->__data : tb->__data);      if (alias)        return tb;    t = (struct trie *) tb->tb_data;    t->kv[0].pos = KEYLENGTH;    t->kv[0].slen = KEYLENGTH;#ifdef CONFIG_IP_FIB_TRIE_STATS    t->stats = alloc_percpu(struct trie_use_stats);    if (!t->stats) {        kfree(tb);        tb = NULL;    }#endif    return tb;

路由查找

如下內核的路由查詢入口函數fib_lookup,可見其查詢順序為:路由策略->main路由表->default路由表。對local路由表的查詢包含在main路由表查詢中。

static inline int fib_lookup(struct net *net, struct flowi4 *flp,                 struct fib_result *res, unsigned int flags){       struct fib_table *tb;    int err = -ENETUNREACH;      flags |= FIB_LOOKUP_NOREF;    if (net->ipv4.fib_has_custom_rules)        return __fib_lookup(net, flp, res, flags);    rcu_read_lock();          res->tclassid = 0;          tb = rcu_dereference_rtnl(net->ipv4.fib_main);    if (tb)        err = fib_table_lookup(tb, flp, res, flags);          if (!err)        goto out;      tb = rcu_dereference_rtnl(net->ipv4.fib_default);    if (tb)        err = fib_table_lookup(tb, flp, res, flags);

由函數fib_insert_alias可知,在trie樹葉子節點中,路由表項時按照表ID由大到小排列的,如果local和main表中存在相同的路由,優先選擇的是local表中的路由,宏RT_TABLE_LOCAL(255)大于RT_TABLE_MAIN(254)。

static int fib_insert_alias(struct trie *t, struct key_vector *tp,                struct key_vector *l, struct fib_alias *new, struct fib_alias *fa, t_key key){    if (!l)        return fib_insert_node(t, tp, new, key);    if (fa) {        hlist_add_before_rcu(&new->fa_list, &fa->fa_list);    } else {        struct fib_alias *last;        hlist_for_each_entry(last, &l->leaf, fa_list) {            if (new->fa_slen < last->fa_slen)                break;            if ((new->fa_slen == last->fa_slen) &&                (new->tb_id > last->tb_id))                break;            fa = last;        }        if (fa)            hlist_add_behind_rcu(&new->fa_list, &fa->fa_list);        else            hlist_add_head_rcu(&new->fa_list, &l->leaf);    }

分享到:
標簽:IPv4
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定