基于openswan klips的IPsec实现分析(七)内核SADB维护(1)
转载请注明出处:http://blog.csdn.net/rosetta
上一节讲了应用层pluto是如何构造SADB消息发送给内核的,这节将讲内核对SADB的维护,所有SA处理函数都在指针数组msg_parsers[]中。
SADB(SA Database)即SA数据库,一般听到数据库三字就会想到众所周知的Mysql、Oracle等,但klips对于SA的维护使用的数据库其实就是一个哈希表ipsec_sadb_hash[](以下称sa哈希表),其每一个成员都是structipsec_sa结构,定义在ipsec_sa.c里:
struct ipsec_sa *ipsec_sadb_hash[SADB_HASHMOD];
结构体struct ipsec_sa成员比较多就不给出了。
三元组said (spi,目的地址,协议),用以唯一标识SA
typedefstruct { /* to identify an SA, weneed: */
ip_address dst; /* A. destination host */
ipsec_spi_t spi; /* B. 32-bit SPI, assigned by dest. host */
# define SPI_PASS 256 /* magic values...*/
# define SPI_DROP 257 /* ...for use...*/
# define SPI_REJECT 258 /* ...with SA_INT*/
# define SPI_HOLD 259
# define SPI_TRAP 260
# define SPI_TRAPSUBNET 261
int proto; /* C. protocol */
# define SA_ESP 50 /* IPPROTO_ESP */
# define SA_AH 51 /* IPPROTO_AH */
# define SA_IPIP 4 /* IPPROTO_IPIP */
# define SA_COMP 108 /* IPPROTO_COMP */
# define SA_INT 61 /* IANA reserved for internal use */
} ip_said;
隧