在Linux中';s net/ipv4/udp.c,为什么udp数据包需要由xfrm4_policy_check()处理?

在Linux中';s net/ipv4/udp.c,为什么udp数据包需要由xfrm4_policy_check()处理?,c,linux-kernel,C,Linux Kernel,我正在读Linux-net/ipv4/udp.c中的代码。有人能向我解释为什么UDP数据包需要通过xfrm_policy_check()运行吗 据我所知,函数返回: true:非IPsec数据包/有效IPsec数据包 错误:IPsec数据包无效 我可能误解了函数返回值,因为我不完全理解源代码。xfrm4\u policy\u check函数根据策略检查数据包。如果允许处理数据包,则此函数的返回值为1;如果不允许,则返回值为零。例如,如果skb->ip_summated未设置为CHECKSUM

我正在读Linux-net/ipv4/udp.c中的代码。有人能向我解释为什么UDP数据包需要通过xfrm_policy_check()运行吗

据我所知,函数返回:

  • true:非IPsec数据包/有效IPsec数据包
  • 错误:IPsec数据包无效

我可能误解了函数返回值,因为我不完全理解源代码。

xfrm4\u policy\u check
函数根据策略检查数据包。如果允许处理数据包,则此函数的返回值为1;如果不允许,则返回值为零。例如,如果
skb->ip_summated
未设置为
CHECKSUM\u不必要
并且数据包的校验和失败,则IPsec可能会决定丢弃数据包

一个
UDP
数据包显然没有任何IPsec策略(SA?),那么为什么还要麻烦呢?除非它是由另一个代码处理的
ESPinUDP
数据包。@24hours:我认为如果不在路由模式下,它至少可以检查校验和并拒绝损坏的数据包。
int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) {
    struct udp_sock *up = udp_sk(sk);
    int rc;
    int is_udplite = IS_UDPLITE(sk);

    /*
     * Charge it to the socket, dropping if the queue is full.
     */
    if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
        goto drop;

    nf_reset(skb);