Моя система - Ubuntu, uname -r = 4.15.0-23-generic
.Я установил символы отладки для ядра.
Моя проблема:
Я пытаюсь использовать socket(AF_PACKET, SOCK_DGRAM, 0)
для целей передачи.Для sendto(fd, 0,0,0,0,0)
системного вызова у меня есть EINVAL
(неверный аргумент), и я пытаюсь выяснить, в чем причина.
Поэтому, чтобы выяснить, что возвращает EINVAL
IЯ использую SystemTap.Приведенный ниже скрипт отслеживает оператор выполнения с помощью оператора tpacket_snd
.
моей тестовой программы: info.stp
probe kernel.statement("tpacket_snd@*:*") {
tokenize(pp(),"@");
printf("HIT %s\n", tokenize("","@"))
}
А вот вывод sudo stap info.stp
для моей реализации такой передачи:
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2619")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2627")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2628")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2636")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2638")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2640")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2641")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2656")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2659")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2658")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2662")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2663")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2669")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2671")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2674")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2672")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2675")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2680")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2688")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2692")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2694")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2693")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2706")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2710")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2707")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2708")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2709")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2712")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2743")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2728")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2736")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2735")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2785")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2787")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2789")
[https://elixir.bootlin.com/linux/v4.15/source/net/packet/af_packet.c#L2618]
Мой вопрос: этот вывод не имеет значения (не соответствует) с исходным кодом,потому что:
- Во-первых, указано, что строка af_packet.c:
2707
была выполнена после того, как 2710
2710
не содержит инструкции перехода.
Во-вторых, из моего исследования я мог бы заключить это условие: [строки 2741-2745]
if (po-> has_vnet_hdr && virtio_net_hdr_to_skb (skb, vnet_hdr, vio_le ())) {tp_len =-EINVAL;goto tpacket_error;}
было оценено как истинное замечание, что SystemTap указывает, что строка 2743 была выполнена.Но, с другой стороны, я исследовал с помощью SystemTap, что po->has_vnet_hdr
равен 0, поэтому невозможно выполнить if body.Тем не менее, SystemTap указывает на это.
Мой вопрос:
Как его починить или что я делаю неправильно?