2007年10月9日 星期二

Fast path vs Slow path in linux kernel routing

Fast path vs Slow path in Linux kernel routing

執行順序
先做Fast Path Routing, 如果找不到, 才會做 Slow Path Routing
ip_input.c: ip_rcv_finish: PREROUTING CHAIN traversal 之後的function, 做ip packet receive 後的最後處理
ip_input.c: ip_rcv_finish: function 定義於此
ip_input.c: ip_route_input: 做fast path routing, 作法為利用rcu_dereference 循序去撈出rt_hash_table[hash] 裡面的 chain 為rth (struct rtable), 然後和 source, destination, iif, mark, tos 等作比較, 若符合, 則update lastuse 為jiffies, 另外設定 skb->dst = (struct dst_entry*)rth, 讓之後可以使用
route.c: ip_route_input: function 定義於此
route.c: ip_route_input_slow: 如果fast path routing 找不到之前的routing cache, 我們就做slow path routeing
route.c: ip_route_input_slow: function 定義於此
route.c fib_lookup: 執行fib search
net/ipv4/fib_rules.c: fib_lookup: function 定義於此
net/ipv4/fib_rules.c: fib_rules_lookup: 帶了定義在fib_rules.c 裡面特有的參數, 利用fib4_rules_ops 這個變數
net/core/fib_rules.c: fib_rules_lookup: function 定義於此
net/core/fib_rules.c: fib_rules_lookup: 利用 list_for_each_entry_rcu 去逐步檢查每個
ops->rules_list 的rule 和 fl (struct flowi) 是否符合
net/core/fib_rules.c: ops->action: 執行match rule->action
net/ipv4/fib_rules.c: fib4_rule_action: function 定義於此
net/ipv4/fib_rules.c: fib4_rule_action: 當rule->action 為 FR_ACT_TO_TBL時, 執行 include/net/ip_fib.h: fib_get_table: 如果是non-Local, 則為ip_fib_main_table, 如果是Local, 則為ip_fib_local_table
net/ipv4/fib_rules.c: tbl->tb_lookup




Fast path
* using routing cache
* accomplish by ip_route_input function
compare the data of routing cache (rth->fl, rtable->flow)



Slow path
* using FIB(Forwarding Information Base)
* accomplish by ip_route_input_slow, fib_lookup