更新于   阅读: loading

IKE_SA Manager

IKE_SA 管理和维护是整个charon的核心,在具体实现上charon有一套独特的机制,下面我们就一起看看。

IKE_SA Manager

IKE_SA Manager作为charon的一个独立模块,对应源文件ike_sa_manager.c。在框架介绍中,我们说:每个IKE_SA必须严格执行check_out,同时在IKE_SA被使用后必须严格执行check_in,每个SA同一时间只能被一个线程处理。 我看了下代码,大概的知道了它的实现机制。

具体的check_outcheck_in动作,是在上章节复杂的初始化SA中的调用栈上有指明:

1
2
3
4
	...
ike_sa_manager.c +1425 haron->ike_sa_manager->checkout_by_config(...)
...
charon->ike_sa_manager->checkin(...)

通过追踪代码发现,check_out动作的最终都会执行:

1
2
...
charon->bus->set_sa(charon->bus, ike_sa);

check_in动作最终都会执行

1
2
...
charon->bus->set_sa(charon->bus, NULL);

再继续追踪会发现,check_out是把ike_sa的对象地址赋值给了线程的私有变量pthread_keycheck_in则是把线程私有变量赋值为NULL

通过上面的过程分析,我们有理由相信:

charon通过使用线程私有变量pthread_key来保存某个IKE_SA对象,实现线程和SA处理的绑定。当某个线程的私有变量不为NULL时,说明,该线程正在处理某个SA。如果所有线程的私有变量都不为NULL,那么当新的SA被初始化时就要进行等待,直到某个SA协商完毕被线程check_in后线程空闲了,才能处理这个新的SA。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @Yake Pei 创建,使用 Stellar 作为主题。