深入解读状态发现策略及CAN协议中SA查找流程详解
4.6 状态发现策略与状态关联详解
状态发现策略和状态关联通过xfrm_state_find()实现SA的查找和建立。此函数由策略处理函数xfrm_tmpl_resolve_one()调用,当内核检测到数据包符合安全策略且需要加密时,它会尝试匹配对应的SA。查找流程:
- 使用模板(tmpl)进行匹配,若匹配成功则返回对应的SA;
- 若未匹配成功,则通知用户空间进行IKE协商,并生成状态为ACQUIRE的SA(临时SA),待用户空间协商成功后更新为可用状态。
代码流程解析:
在xfrm_state_find函数中,通过xfrm_dst_hash生成哈希值,并在state_bydst哈希桶中查找符合条件的SA。
代码片段(简要):
struct xfrm_state * xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, const struct flowi *fl, struct xfrm_tmpl *tmpl, struct xfrm_policy *pol, int *err, unsigned short family) {
…
spin_lock_bh(&net->xfrm.xfrm_state_lock);
h = xfrm_dst_hash(net, daddr, saddr, tmpl->reqid, encap_family);
hlist_for_each_entry(x, net->xfrm.state_bydst + h, bydst) {
if (x->props.family == encap_family && x->props.reqid == tmpl->reqid &&
(mark & x->mark.m) == x->mark.v && !(x->props.flags & XFRM_STATE_WILDRECV) &&
xfrm_state_addr_check(x, daddr, saddr, encap_family) &&
tmpl->mode == x->props.mode && tmpl->id.proto == x->id.proto &&
(tmpl->id.spi == x->id.spi || !tmpl->id.spi)) {
xfrm_state_look_at(pol, x, fl, encap_family, &best, &acquire_in_progress, &error);
}
}
}
流程解读:
1. SA状态可用时,通过选择器和状态生命周期选择最优的SA。
2. 若SA状态为ACQ,则标识acquire_in_progress,等待用户协商。
3. 当选择器匹配但SA不可用时,返回错误提示。
892.77KB
文件大小:
评论区