網絡子係統66_策略路由初始化
// 策略路由鏈表 // 係統中所有策略路由通過fib_rules鏈接在一起 static struct fib_rule default_rule = { .r_clntref = ATOMIC_INIT(2),//引用計數 .r_preference = 0x7FFF,//路由規則優先級 .r_table = RT_TABLE_DEFAULT,//路由表標示符 .r_action = RTN_UNICAST,//路由類型,間接定義了當路由查找匹配時應采取的動作 }; static struct fib_rule main_rule = { .r_next = &default_rule, .r_clntref = ATOMIC_INIT(2), .r_preference = 0x7FFE, .r_table = RT_TABLE_MAIN, .r_action = RTN_UNICAST, }; static struct fib_rule local_rule = { .r_next = &main_rule, .r_clntref = ATOMIC_INIT(2), .r_table = RT_TABLE_LOCAL, .r_action = RTN_UNICAST, }; static struct fib_rule *fib_rules = &local_rule; // 策略路由初始化 // 向netdev_chain注冊監聽塊 // 調用路徑:ip_rt_init->ip_fib_init->fib_rules_init 2.1 void __init fib_rules_init(void) { register_netdevice_notifier(&fib_rules_notifier); } 2.1 static struct notifier_block fib_rules_notifier = { .notifier_call =fib_rules_event, }; // 策略路由對設備事件的處理 // 隻處理設備注冊,注銷事件 static int fib_rules_event(struct notifier_block *this, unsigned long event, void *ptr) { struct net_device *dev = ptr; //設備注銷,刪除與設備相關的策略路由 if (event == NETDEV_UNREGISTER) fib_rules_detach(dev); else if (event == NETDEV_REGISTER) fib_rules_attach(dev);//添加與設備相關的策略 return NOTIFY_DONE; } // 禁止與設備相關的策略路由 // 將策略路由r_ifindex=-1,禁止策略路由 2.2 static void fib_rules_detach(struct net_device *dev) { struct fib_rule *r; //遍曆係統中所有的策略路由 for (r=fib_rules; r; r=r->r_next) { if (r->r_ifindex == dev->ifindex) {//策略路由使用的設備index write_lock_bh(&fib_rules_lock); r->r_ifindex = -1;//禁止該策略路由 write_unlock_bh(&fib_rules_lock); } } } // 激活設備的策略路由 // fib_rule->r_ifname表示策略應用的設備 2.3 static void fib_rules_attach(struct net_device *dev) { struct fib_rule *r; for (r=fib_rules; r; r=r->r_next) { if (r->r_ifindex == -1 && strcmp(dev->name, r->r_ifname) == 0) { write_lock_bh(&fib_rules_lock); r->r_ifindex = dev->ifindex; write_unlock_bh(&fib_rules_lock); } } }
最後更新:2017-04-03 14:53:48