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_out
和check_in
动作,是在上章节复杂的初始化SA中的调用栈上有指明:
1 | ... |
通过追踪代码发现,check_out动作的最终都会执行:
1 | ... |
check_in动作最终都会执行
1 | ... |
再继续追踪会发现,check_out
是把ike_sa的对象地址赋值给了线程的私有变量pthread_key,check_in
则是把线程私有变量赋值为NULL。
通过上面的过程分析,我们有理由相信:
charon通过使用线程私有变量pthread_key来保存某个IKE_SA对象,实现线程和SA处理的绑定。当某个线程的私有变量不为NULL时,说明,该线程正在处理某个SA。如果所有线程的私有变量都不为NULL,那么当新的SA被初始化时就要进行等待,直到某个SA协商完毕被线程check_in后线程空闲了,才能处理这个新的SA。