详细设计说明书示例 联系客服

发布时间 : 星期四 文章详细设计说明书示例更新完毕开始阅读ae0de4d376a20029bd642d8b

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 */