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),更多微信文章请扫描关注公众号: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|