
strace
geralmente "decifra" ioctl
chamadas, mostrando o que elas significam, até resolvendo nomes de interfaces de rede e assim por diante.
Mas a mesma operação realizada usando AF_NETLINK permanece opaca no strace
. Como posso ensinar strace
a olhar para AF_NETLINK
as coisas? Existem patches ou forks com esse recurso?
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\32\0\1\0\323K\255S\0\0\0\0\n\200\0\0\0\0\0\0\0\0\0\0\24\0\1\0"..., 48}], msg_controllen=0, msg_flags=0}, 0) = 48
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\224\0\0\0\30\0\0\0\323K\255S\3674\0\0\n\200\200\0\0\2\0\7\0\0\0\0\10\0\17\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 148
Exemplo de saída de strace "cozida" comioctl
ioctl(4, SIOCGIFFLAGS, {ifr_name="veth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_ALLMULTI}) = 0
Histórico em AF_NETLINK
trecho deWikipédia
A
AF_NETLINK
família oferece vários subconjuntos de protocolos. Cada um faz interface com um componente de kernel diferente e possui um subconjunto de mensagens diferente. O seguinte protocolo é referenciado no campo abaixo:int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)
Não possuem um padrão
SOCK_DGRAM
eSOCK_RAW
não têm garantia de implementação em uma determinada versão do Linux (ou outro sistema operacional). Algumas fontes afirmam que ambas as opções são legítimas, e a referência abaixo da Red Hat afirma que esseSOCK_RAW
é sempre o parâmetro, porém o iproute2 usa ambos de forma intercambiável.