閱讀463 返回首頁    go 阿裏雲 go 技術社區[雲棲]


網絡子係統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

  上一篇:go 網絡子係統67_路由表處理設備事件
  下一篇:go 怎麼做網站的搜索引擎優化