XFRM 架构目的
主要服务于IP Security, 俗称IPsec. 应用程序主要是strongswan结合,企业级的VPN基本基于这个构建。
xfrm函数调用流程
正常的数据报文。
sendto/sendmsg -> udp_sendmsg-> ip_make_skb()->ip_send_skb()->ip_local_out(skb)
udp_rcv->__udp4_lib_rcv->udp_queue_rcv_skb->encap_rcv
up->encap_rcv = xfrm4_udp_encap_rcv;
xfrm4_udp_encap_rcv->xfrm4_rcv_encap->xfrm_input
nexthdr = x->type->input(x, skb);
static const struct xfrm_type esp_type =
{
.description = "ESP4",
.owner = THIS_MODULE,
.proto = IPPROTO_ESP,
.flags = XFRM_TYPE_REPLAY_PROT,
.init_state = esp_init_state,
.destructor = esp_destroy,
.get_mtu = esp4_get_mtu,
.input = esp_input,
.output = esp_output
};
上述是正常的内核处理逻辑,如果你用的是带有硬件加速的硬件,某些步骤可能会被略过,比如我用lantiq的mpe,发现esp input就没有走,来的数据报文内核收到的都是解密过后的。