Como faço para que o strace "decodifique" a comunicação AF_NETLINK como no ioctl?

Como faço para que o strace "decodifique" a comunicação AF_NETLINK como no ioctl?

stracegeralmente "decifra" ioctlchamadas, 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 stracea olhar para AF_NETLINKas 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_NETLINKfamí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_DGRAMe SOCK_RAWnã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 esse SOCK_RAWé sempre o parâmetro, porém o iproute2 usa ambos de forma intercambiável.

informação relacionada