首页 存档 技术 查看内容

Linux网络子系统安全性模块详细分析之文件xfrm_policy.c文件综述

2018-3-30 13:00 |来自: 互联网 477 0

摘要: 2.4.5文件五xfrm_policy.c 2.4.5.1文件描述 该文件的路径是linux-3.5.4/net/xfrm/xfrm_policy.c。 IPsec的核心模块,主要提供策略SP的管理,诸如策略的分配、插入、查找、删除等操作,除此之处,还提供了审计功能。 ...

2.4.5文件五xfrm_policy.c

2.4.5.1文件描述

该文件的路径是linux-3.5.4/net/xfrm/xfrm_policy.c

IPsec的核心模块,主要提供策略SP的管理,诸如策略的分配、插入、查找、删除等操作,除此之处,还提供了审计功能。


2.4.5.2主要变量及宏定义

static struct dst_entry *xfrm_policy_sk_bundles;//提供安全路由

static struct xfrm_policy_afinfo *xfrm_policy_afinfo[NPROTO];//策略相关的协议处理结构

static struct kmem_cache *xfrm_dst_cache __read_mostly;//xfrm_dst的缓冲区

static struct pernet_operations __net_initdata xfrm_net_ops = {

.init = xfrm_net_init,

.exit = xfrm_net_exit,

};//xfrm网络命名空间的初始化和垃圾回收结构


2.4.5.3 结构体定义

1、策略结构xfrm_policy的定义如下:


struct xfrm_policy {

struct net*xp_net;//网络命名空间

struct hlist_nodebydst;//目的地址Hash

struct hlist_nodebyidx;//策略索引Hash

rwlock_tlock;//策略锁

atomic_trefcnt;//策略引用计数

struct timer_listtimer;//策略定时器

struct flow_cache_object flo;//流操作结构

atomic_tgenid;//策略ID

u32priority;//策略优先级

u32index;//策略索引号

struct xfrm_markmark;//策略标记

struct xfrm_selectorselector;//策略选择子

struct xfrm_lifetime_cfg lft;//策略生存期

struct xfrm_lifetime_cur curlft;//策略当前生存期

struct xfrm_policy_walk_entry walk;//策略管理结构

u8type;//策略类型

u8action;//策略动作

u8flags;//策略标志

u8xfrm_nr;//策略的数量

u16family;//策略对应的协议簇

struct xfrm_sec_ctx*security;//安全上下文

struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH];//状态模块,用于查找SA

};


2、具体协议簇下策略处理操作的结构体定义如下:

struct xfrm_policy_afinfo {

unsigned shortfamily;//协议簇

struct dst_ops*dst_ops;//目的操作结构

void(*garbage_collect)(struct net *net);//垃圾回收钩子函数

struct dst_entry*(*dst_lookup)(struct net *net, int tos,const xfrm_address_t *saddr,

const xfrm_address_t *daddr);//安全路由搜索

int(*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr);//获取源地址

void(*decode_session)(struct sk_buff *skb,struct flowi *fl,int reverse);//解码会话

int(*get_tos)(const struct flowi *fl);

int(*init_path)(struct xfrm_dst *path,struct dst_entry *dst,

int nfheader_len);//初始化安全路径

int(*fill_dst)(struct xfrm_dst *xdst,struct net_device *dev,

const struct flowi *fl);//填充安全路由

struct dst_entry*(*blackhole_route)(struct net *net, struct dst_entry *orig);

};


3、xfrm_tmpl描述了SA的模板,使用此模板可以通过策略快速的查找到相应的SA,其结构体定义如下:

struct xfrm_tmpl {

struct xfrm_idid;//SA与策略SP关联的ID

xfrm_address_tsaddr;//源地址

unsigned shortencap_family;//封装协议簇

u32reqid;//序列号

u8mode;//工作模式

u8share;//共享模式

u8optional;//或选选项

u8allalgs;//认证、加密、压缩算法的检查

u32aalgos;//认证算法掩码位

u32ealgos;//加密算法掩码位

u32calgos;//压缩算法掩码位

};


4、dst_entry结构描述了路由的相关信息,其结构定义如下:

struct dst_entry {

struct rcu_headrcu_head;

struct dst_entry*child;//后继路由

struct net_device *dev;//关联的设备

struct dst_ops*ops;//路由操作结构

unsigned long_metrics;

union {

unsigned long expires;//超时时间值

struct dst_entry *from;//拷贝自哪里

};

struct dst_entry*path;//路由的路径

struct neighbour __rcu*_neighbour;//为该路由绑定的邻居节点(ARP相关)

struct xfrm_state*xfrm;

int(*input)(struct sk_buff*);//输入钩子函数

int(*output)(struct sk_buff*);//输出钩子函数

intflags;//路由的相关标志,用在多路径情况下

shorterror;

shortobsolete;//标记是否过时

unsigned shortheader_len;//路由的头部长度

unsigned shorttrailer_len;//路由的尾部长度

atomic_t__refcnt;//路由的引用计数

int__use;

unsigned longlastuse;//上次使用的时间,可以度量路由的有效性

union {

struct dst_entry*next;

struct rtable __rcu*rt_next;

struct rt6_info*rt6_next;

struct dn_route __rcu*dn_next;

};

};


本文转载于微信公众号: Linux内核之旅(LinuxKernelTravel),更多微信文章请扫描关注公众号:

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部