linux核心 路由fib表之輸出查詢

2021-07-16 22:25:31 字數 3164 閱讀 6560

2.2.3.2 輸出路由查詢

ip_route_output_key

功能:

呼叫ip_route_output_flow

ip_route_output_flow

功能:

1)路由發包查詢

2)ipsec處理流程

int ip_route_output_flow(struct net *net, struct rtable **rp, struct flowi *flp,struct sock *sk, int flags)

//引數說明:net為網路裝置;

// rp當查詢成功,返回查詢到的路由快取項;

// flp用於查詢快取項的條件;

// sk,flags用於ipsec路由查詢

return 0;

}

__ip_route_output_key

功能:

查詢路由快取

未找到快取,慢速傳送

int __ip_route_output_key(struct net *net, struct rtable **rp,const struct flowi *flp)

rt_cache_stat_inc(out_hlist_search);

}rcu_read_unlock_bh();

slow_output:

return ip_route_output_slow(net, rp, flp);//慢速傳送

}

2.2.3.2.1 ip_route_output_slow慢速查詢輸出

功能:查路由表

不論是否查到,都進行策略路由查詢

程式流程圖:

if (ipv4_is_local_multicast(oldflp->fl4_dst) ||//目的位址是本地多播或者受限廣播

oldflp->fl4_dst == htonl(0xffffffff))

if (!fl.fl4_src)

}if (!fl.fl4_dst)

debug_v4route("%s-->\n",__function__);

if (fib_lookup(net, &fl, &res))

#endif

res.fi = null;

if (oldflp->oif)

if (dev_out)

dev_put(dev_out);

err = -enetunreach;

goto out;

}free_res = 1;

if (res.type == rtn_local)

#ifdef config_fw_policy

else if(fib_res_nh(res).nh_scope == rt_scope_host)else

}#endif

proute_ok:

#ifdef config_ip_route_multipath

if (res.fi->fib_nhs > 1 && fl.oif == 0)

fib_select_multipath(&fl, &res);

else

#endif//如果路由的子網掩碼為0.0.0.0,同時路由為單播,且沒有設定輸出介面,則選擇預設閘道器

if (!res.prefixlen && res.type == rtn_unicast && !fl.oif)

fib_select_default(net, &fl, &res);

if (!fl.fl4_src)

fl.fl4_src = fib_res_prefsrc(res);

if (dev_out)

dev_put(dev_out);

dev_out = fib_res_dev(res);

dev_hold(dev_out);

fl.oif = dev_out->ifindex;//將輸出裝置資訊替換為查詢到的路由條目的輸出介面

make_route:

err = ip_mkroute_output(rp, &res, &fl, oldflp, dev_out, flags);//構造輸出快取項

if(res.prset)

if (free_res)

fib_res_put(&res);

if (dev_out)

dev_put(dev_out);

out: return err;

}

linux核心 路由fib表之初始化

1 路由表操作 主要實現下列功能 a 路由表初始化 b 路由建立 c 路由刪除 1.1 路由表的初始化 路由表的初始化由ip fib init函式實現的,功能 a 註冊路由操作相關函式 b 將路由模組新增到網路命令空間 c 註冊網路裝置狀態和位址變化到通知鏈 d 為fib node和fib alia...

Linux 核心路由發現過程

路由查詢 這個函式負責從fib table中查詢fn key相匹配的fib node,然後找到相應的fib info,將結果存放在fib result結構中 傳入引數fz divisor是linux kernel 2.6的變化,在2.4.x中是直接傳入key的,而flp引數裡面包含了資料報的全部位址...

linux核心 策略路由之新增

4.3策略規則的新增 對於策略規則的新增,也可以抽象出通用規則介面函式,然後根據傳參進入協議相關的策略規則的介面函式 4.3.1 通用規則的新增 在規則初始化時,會註冊新增函式fib nl newrule rtnl register pf unspec,rtm newrule,fib nl newr...