#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 часа: я думаю, что он может проверить хотя бы контрольную сумму, если не в режиме маршрутизации, и отклонить поврежденные пакеты.