Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148791
  • 博文数量: 24
  • 博客积分: 791
  • 博客等级: 军士长
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 11:00
文章存档

2011年(18)

2010年(6)

分类: LINUX

2011-04-28 12:48:17

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

2.删除模块

  1. void tcp_unregister_congestion_control(struct tcp_congestion_ops *ca)
  2. {
  3.     spin_lock(&tcp_cong_list_lock);//同样是写操作,需要加锁
  4.     list_del_rcu(&ca->list);//删除链表节点
  5.     spin_unlock(&tcp_cong_list_lock);
  6. }
阅读(2891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~