2.4.4 文件四 xfrm_state.c 2.4.4.1 文件描述 该文件的路径是linux-3.5.4/net/xfrm/xfrm_state.c。 该文件是IPsec的核心模块,主要提供SA的管理,诸如SA的分配、插入、查找、删除等操作,除此之处,还提供了审计功能。 2.4.4.2 主要变量及定义 #define XFRM_PROTO_ESP50//描述各协议对应的编号 #define XFRM_PROTO_AH51 #define XFRM_PROTO_COMP108 #define XFRM_PROTO_IPIP4 #define XFRM_PROTO_IPV641 #define XFRM_PROTO_ROUTINGIPPROTO_ROUTING #define XFRM_PROTO_DSTOPTSIPPROTO_DSTOPTS 2.4.4.3 结构体定义 1、描述安全关联SA的结构体定义如下 struct xfrm_state { struct net*xs_net;//网络命名空间结构 struct hlist_nodebysrc;//源地址hash表 struct hlist_nodebyspi;//spi hash表 struct xfrm_idid;//SA与SP关联的ID,即目的地址、SPI、协议三元组 struct xfrm_selectorsel;//SA选择子 u32genid;//SA标志ID,防止发生碰撞 struct xfrm_state_walkkm;//密钥管理结构 struct { u32reqid;//序列号 u8mode;//工作模式
u8replay_window;//防重放窗口 u8aalgo, ealgo, calgo;//认证、加密、压缩算法ID u8flags;//标志,防止溢出 u16family;//所使用协议 xfrm_address_tsaddr;//源地址,用于封装使用 intheader_len;//添加的协议头长度 inttrailer_len;//添加的协议尾长度 } props;
struct xfrm_lifetime_cfg lft;//SA生存时间配置 struct xfrm_algo_auth*aalg;//认证算法 struct xfrm_algo*ealg;//加密算法 struct xfrm_algo*calg;//压缩算法 struct xfrm_algo_aead*aead;//校验算法
struct xfrm_encap_tmpl*encap;//NAT封装信息 struct xfrm_state*tunnel;//IPIP通信处理的SA struct xfrm_replay*repl;//重放检测结构 struct timer_listrtimer;//定时器 struct xfrm_mode*inner_mode;//工作模式 struct xfrm_sec_ctx*security;//安全上下文 void*data;//私有数据 }; 2、具体协议簇下SA处理操作的结构体定义如下: struct xfrm_state_afinfo { unsigned intfamily;//协议簇 unsigned intproto;//协议 __be16eth_proto; struct module*owner;//协议模块 const struct xfrm_type*type_map[IPPROTO_MAX];//存储协议结构的数组 struct xfrm_mode*mode_map[XFRM_MODE_MAX];//存储工作模式的数组 int(*init_flags)(struct xfrm_state *x);//初始化SA的标志 void(*init_tempsel)(struct xfrm_selector *sel,const struct flowi *fl);//初始化模板选择 void(*init_temprop)(struct xfrm_state *x,const struct xfrm_tmpl *tmpl,constxfrm_address_t *daddr,const xfrm_address_t *saddr);//初始化SA中prop int(*output)(struct sk_buff *skb);//发送数据时SA处理 int(*output_finish)(struct sk_buff *skb);//发送完成时SA的处理 }; 3、描述IPsec协议的结构体定义如下: struct xfrm_type { char*description;//描述字符串 struct module*owner;//协议模块 u8proto;//协议 u8flags;//标志 int(*init_state)(struct xfrm_state *x);//初始化SA void(*destructor)(struct xfrm_state *);//析构SA int(*input)(struct xfrm_state *, struct sk_buff *skb);//数据包进入处理 int(*output)(struct xfrm_state *, struct sk_buff *pskb);//数据包发送处理 int(*reject)(struct xfrm_state *, struct sk_buff *,const struct flowi *);//拒绝数据包 int(*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **);//获取头部偏移 u32(*get_mtu)(struct xfrm_state *, int size);//获取MTU }; 本文转载于微信公众号: Linux内核之旅(LinuxKernelTravel),更多微信文章请扫描关注公众号: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|