В Linux net / ipv4 / udp.c, почему UDP-пакет должен обрабатываться xfrm4_policy_check()?

#c #linux-kernel

#c #linux-kernel

Вопрос:

 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);
  

Я читаю код в Linux net / ipv4 / udp.c. Может кто-нибудь объяснить мне, почему UDP-пакет должен выполняться через xfrm_policy_check()?

Насколько я знаю, функция возвращает:

  • true: пакет, не относящийся к IPSec / действительный пакет IPSec
  • false: недопустимый пакет IPSec

Возможно, я неправильно понял возвращаемое значение функции, поскольку не совсем понимаю исходный код.

Ответ №1:

xfrm4_policy_check функция проверяет пакет на соответствие политикам IPSec. Возвращаемое значение этой функции равно 1, если обработка пакета разрешена, и нулю, если это не так. Например, IPSec может решить отбросить пакет, если skb->ip_summed значение не установлено CHECKSUM_UNNECESSASRY , и пакет не соответствует контрольной сумме.

Комментарии:

1. UDP Пакет, очевидно, не будет иметь никакой политики IPSec (SA?), Так зачем беспокоиться? , Если только это ESPinUDP не пакет, который обрабатывается другим кодом..

2. @24 часа: я думаю, что он может проверить хотя бы контрольную сумму, если не в режиме маршрутизации, и отклонить поврежденные пакеты.