1. 程式人生 > >linux 讀書筆記(三)

linux 讀書筆記(三)

ip_queue_xmit   //傳送TCPS或SCTP資料包
ip_appent_date ip_appent_page //儲存IP分片,直到呼叫ip_push_pending_frams
ip_route_input   //查詢入口資料包的資訊,得到其路由型別(RTN_**),ARP模組中有使用
ip_route_output_key  //查找出口路由資訊

ip_route_input_slow ip_route_output_slow 和 ip_route_input ip_route_output_key
的區別是速度的區別,當ip_route_input或ip_route_output在cache查詢失敗時會呼叫
ip_route_input_slow或ip_route_output_slow

struct fib ---- 儲存路由資訊
struct flowi ---- fib搜尋的key
struct fib_node ---- 每個路由entry
struct fib_zone ---- 和掩碼有關,應該是快速查詢
struct fib_info ---- 儲存各路由的共享資訊
struct fib_nh ---- next hop
struct fib_hash ---- 包含兩個元素,一個指向當前33各fn_zone的指標和一個儲存當前活動fn_zone的list


//下面應該是重量級結構體
struct dst_entry ---- 路由表cache entry
struct dst_ope ---- 虛擬函式表
struct rtable ---- IPv4的路由表cache entry(其實在IPv4下就常常和dst_entry互相轉換)


struct kern_rta ---- IPROUTE2工具新增或刪除路由時儲存資訊的結構體
struct rtentry ---- route 命令新增或刪除路由時儲存資訊的結構體

//此外還有多路路由結構體,略

inet_ifa_byprefix ---- 給定字首和掩碼,在dev上找出與此相應的地址並返回(可作做判斷用)
fib_get_table ---- 根據給定編號取得fibtable

//根據書上所說,fib_new_table將建立並初始化一個routing table並加入fib table,
//但下面怎麼會這樣。汗,終於查明,2.6.11後的版本已經不提供建立routing table表了
static inline struct fib_table *fib_get_table(u32 id)
{
        if (id != RT_TABLE_LOCAL)
                return ip_fib_main_table;
        return ip_fib_local_table;
}

static inline struct fib_table *fib_new_table(u32 id)
{
        return fib_get_table(id);
}

//一般來說echo 200 wade >> /etc/iproute2/rt_tables可以新增一個新的路由表
//但現在ip ru ls顯不出來新加的,應該是沒能創建出來,這可能和fib_new_table有關

                                                                          ----fib_rules_init
                                                                         |
路由初始化呼叫過程  ip_init-->ip_rt_init-->devinet_init-->ip_fib_init----|
                                                                         |
                                                                          ----fib_hash_ini


幾個函式
fib_add_ifaddr
fib_del_ifaddr

rt_intern_hash  //為route cache新增cache
arp_bind_neighbour //arp與route繫結


route的查詢
1)先查詢cache
2)若1失敗查詢route table

//幾個函式,還是幾乎不可呼叫,沒有EXPORT
fib_validate_source //檢查裝置收到包的源IP是否在企圖欺騙自己,除非不對稱路由啟用
inet_select_addr //給定一個dev,dst和scope,從中找出裝置的第一地址??
   //我理解錯了,但真的得到了網絡卡的第一地址
rt_set_nexthop  //把根據引數res 把route cache(rtabke)補充完整

dst->input 可被指向以下函式:  ip_local_deliver //本地處理
                                   ip_forwarding //代理
                                   ip_mr_input  //多播代理
                                   ip_error  //目標不可到達
                                   ip_discard_in //扔掉

dst->output 可被指向以下函式:  ip_output  //能夠處理
                                   ip_mc_output  //多播地址
                                   ip_rt_bug  //出錯
                                   dst_discard_out //扔掉


//路由表的初始化
由fib_hash_init完成
它建立一個fib_table結構,並將虛擬函式指標初始化如下
tb_lookup  fn_hash_lookup
tb_insert  fn_hash_insert
tb_delete  fn_hash_delete
tb_flush  fn_hash_flush
tb_select_default fn_hash_select_default
tb_dump   fn_hash_dump

//幾個函式
inet_add_protocol //新增一個L4的協議
inet_del_protocol //刪除一個L4的協議