Comments 11
То есть вы решили не использовать libnl и написали всё с нуля?
У самурая нет цели, есть только путь)
Так заглянуть под капот libnl - это ведь самое интересное!
Изначально я планировал сделать всё на базе кода из iproute, я потратил много времени на его изучение и разбор протокола, и в итоге, в момент, когда я отказался от идеи взять оттуда код, я достаточно разбирался в протоколе и уже было проще сделать самому, чем брать libnl3.
Есть еще классная утилита nltrace (https://github.com/socketpair/nltrace), которая запускается как strace, но выводит на консоль всю работу netlink в красивом виде.
Например так:
Скрытый текст
$ sudo ./nltrace ipset -L
netlink send(3):
Setting msg proto to 12
-------------------------- BEGIN NETLINK MESSAGE ---------------------------
[NETLINK HEADER] 16 octets
.nlmsg_len = 28
.type = 1537 <0x601>
.flags = 1
.seq = 1738840167
.port = 0
[PAYLOAD] 12 octets
02 00 00 00 05 00 01 00 07 00 00 00 ............
--------------------------- END NETLINK MESSAGE ---------------------------
netlink recv(3):
Setting msg proto to 12
-------------------------- BEGIN NETLINK MESSAGE ---------------------------
[NETLINK HEADER] 16 octets
.nlmsg_len = 36
.type = 1537 <0x601>
.flags = 0 <>
.seq = 1738840167
.port = 963725
[PAYLOAD] 20 octets
02 00 00 00 05 00 01 00 07 00 00 00 05 00 0a 00 ................
06 00 00 00 ....
--------------------------- END NETLINK MESSAGE ---------------------------
netlink send(3):
Setting msg proto to 12
-------------------------- BEGIN NETLINK MESSAGE ---------------------------
[NETLINK HEADER] 16 octets
.nlmsg_len = 28
.type = 1543 <0x607>
.flags = 773
.seq = 1738840168
.port = 0
[PAYLOAD] 12 octets
02 00 00 00 05 00 01 00 07 00 00 00 ............
--------------------------- END NETLINK MESSAGE ---------------------------
netlink recv(3):
Setting msg proto to 12
-------------------------- BEGIN NETLINK MESSAGE ---------------------------
[NETLINK HEADER] 16 octets
.nlmsg_len = 20
.type = 3
.flags = 2
.seq = 1738840168
.port = 963725
[PAYLOAD] 4 octets
00 00 00 00 ....
--------------------------- END NETLINK MESSAGE ---------------------------
Destroying descriptor fd 3
А в чём заключается "подводный камень" в третьем примере?
Спасибо , не знал про такой инструмент .
Есть хорошая дока по netlink прямо в сорцах ядра Линукса: linux/Documentation/networking/ethtool-netlink.rst
Как отслеживать состояние сетевых интерфейсов на Linux с помощью netlink