struct inet_protocol esp_protocol 同上;
inet_add_protocol函数在net/ipv4/protocol.c里实现: void inet_add_protocol(struct inet_protocol *prot) {
unsigned char hash; struct inet_protocol *p2;
hash = prot->protocol & (MAX_INET_PROTOS - 1); prot ->next = inet_protos[hash]; inet_protos[hash] = prot; prot->copy = 0;
p2 = (struct inet_protocol *) prot->next; while(p2 != NULL)
{
if (p2->protocol == prot->protocol) {
prot->copy = 1; break;
}
p2 = (struct inet_protocol *) p2->next;
}
}
这个函数是生成了一个hash表,然后每个hash表项都是一个链表头,然后通过这个hash表加链表的方式访问每个协议结构体。
3.2.1.3函数说明
登记及初始化模块包括以下一些函数: init_modules(),
ipsec_init(),cleanup_module(),
ipsec_cleanup(),
ipsec_eroute_get_info(),ipsec_spi_get_info(),ipsec_spigrp_get_info(), ipsec_tncfg_get_info(),ipsec_version_get_info(),ipsec_spi_get_new()
3.2.1.3.1 int init_module(void) 目的: 参数:
装载ipsec时进行登记及初始化工作。 无
返回值: 0 ―― 初始化成功,非0值 ―― 初始化未成功 算法描述: 调用ipsec_init()。 3.2.1.3.2 int cleanup_module(void) 目的: 参数:
卸载ipsec进行清除工作。 无
返回值: 0 ―― 初始化成功,非0值――初始化未成功 算法描述: 调用ipsec_cleanup()。 3.2.1.3.3 int ipsec_int(void) 目的: 参数:
装载ipsec时进行登记及初始化工作。。 无
返回值: 0 ―― 初始化成功,非0值――初始化未成功
算法描述:
1.将定义好的几个proc_dir_entry结构注册到系统中,如: proc_register(proc_net,&ipsec_eroute);/*PROC_FS_21*/ 或
proc_register_dynamic(&proc_net,&ipsec_eroute); 或
proc_net_create(“ipsec_eroute”,0,ipsec_eroute_get_info);
proc_register为系统调用,在fs/proc/root.c中实现,主要就是在proc_net对应的目录下面生成每个协议的子目录。用户可以通过访问/proc/net目录下面的相应目录得到相关的资料。
2.调用ipsec_tdbinit()函数初始化SA数据库,此函数在ipsec_tdb.c文件中实现; 3.调用ipsec_radijinit()函数初始化SPD数据库,此函数在ipsec_radij.c文件中实现; 4.调用pfkey_init()函数初始化PFKEY,此函数在pfkey_v2.c文件中实现;
5.调用register_netdevice_notifier(&ipsec_dev_notifier)函数向系统中注册已定义的ipsec_dev_notifier结构,register_netdevice_ntifier()为系统调用;
6.调用inet_add_protocol(&esp_protocol)和inet_add_protocol(&ah_protocol)函数向系统中注册ESP协议和AH协议,inet_add_protocol()为系统调用;
7.调用ipsec_tunnel_init_devices()函数,登记并初始化ipsec虚接口,此函数定义在ipsec_tunnel.c文件中。
3.2.1.3.4 int ipsec_cleanup(void) 目的: 参数:
卸载ipsec进行清除工作。 无
返回值: 0 ―― 清除成功,非0值――清除未成功 算法描述:
1.调用ipsec_tunnel_cleanup_device(void)函数,清除向系统登记的ipsec虚接口,此函数在ipsec_xform.c中实现;
2.调用inet_del_protocol(&ah_protocol)和inet_del_protocol(&esp_protocol)清除掉在系统中注册的ESP协议和AH协议;
3.调用系统调用unregister_netdevice_notifier(&ipsec_dev_notifier)清除掉系统中注册的ipsec_dev_notifier;
4.调用ipsec_tdbcleanup(0)清除系统中的SA数据库,此函数在ipsec_tdb.c中文件实现; 5.调用ipsec_radijcleanup()清除系统中的SPD数据库,此函数在ipsec_radij.c文件中实现;
6.调用pfkey_cleanup()做pfkey清除工作;
7.调用系统调用proc_net_unregister()清除freeswan在系统中登记的各个proc文件。
3.2.2虚接口模块
3.2.2.1概要说明 3.2.2.1.1功能
为了在不改变现有的操作系统的网络协议栈的状况下,更好地将IPsec嵌入,本程序采用了虚接口的概念。实现中,将创建4个ipsec虚接口,可以将虚接口绑定在物理接口上。对于从tcp/udp协议层传下来的数据,将首先查询eroute表,根据eroute表项决定将数据包发往哪一个接口,物理接口与虚接口将被视为一致的。此时,如果数据包发往虚接口,则调用函数进行处理。(该程序类似于网卡驱动程序的编写) 3.2.2.1.2构成文件
ipsec_tunnel.c
3.2.2.2变量说明 3.2.2.2.1 device结构
虚接口定义为struct device结构,如:
static struct device dev_ipsec0 = {
\ 0, 0, 0, 0, 0x0, 0,
/* name */
/* recv memory end */ /* recv memory start */ /* memory end */ /* memory start */ /* base I/O address */ /* IRQ */
/* flags */
0, 0, 0, NULL,
/* next device */
ipsec_tunnel_probe /* setup */ };
3.2.2.2.2 ipsecpriv结构 struct ipsecpriv {
struct sk_buff_head sendq; struct device *dev;
struct wait_queue *wait_queue; char locked;
int (*hard_start_xmit) (struct sk_buff *skb, struct device *dev); int (*hard_header) (struct sk_buff *skb, struct device *dev, unsigned short type, void *daddr, void *saddr, unsigned len); #ifdef NET_21
int (*rebuild_header)(struct sk_buff *skb); #else /* NET_21 */
int (*rebuild_header)(void *buff, struct device *dev, unsigned long raddr, struct sk_buff *skb); #endif /* NET_21 */