结合tcp_bic.c源码进行分析
1.模块注册
- static int __init bictcp_register(void)
- {
- BUILD_BUG_ON(sizeof(struct bictcp) > ICSK_CA_PRIV_SIZE);
- return tcp_register_congestion_control(&bictcp);//注册bictcp拥塞控制模块
- }
bictcp是struct tcp_congestion_ops类型,这个钩子里面定义了很多操作函数,以后再逐一分析。
所有的注册过的拥塞控制模块都保存在tcp_cong_list这个全局链表中,注册也就是将这个操作函数集合的钩子添加到链表里:
- int tcp_register_congestion_control(struct tcp_congestion_ops *ca)
- {
- ......
- spin_lock(&tcp_cong_list_lock);//对全局变量tcp_cong_list进行写操作,要加锁
- if (tcp_ca_find(ca->name)) {//查找将注册的模块是否已经在链表里
- printk(KERN_NOTICE "TCP %s already registered\n", ca->name);
- ret = -EEXIST;
- } else {
- list_add_tail_rcu(&ca->list, &tcp_cong_list);//将拥塞模块添加到链表的尾部
- printk(KERN_INFO "TCP %s registered\n", ca->name);
- }
- spin_unlock(&tcp_cong_list_lock);
- ......
- }
2.删除模块
- void tcp_unregister_congestion_control(struct tcp_congestion_ops *ca)
- {
- spin_lock(&tcp_cong_list_lock);//同样是写操作,需要加锁
- list_del_rcu(&ca->list);//删除链表节点
- spin_unlock(&tcp_cong_list_lock);
- }
阅读(2891) | 评论(0) | 转发(0) |