如何使 strace 与 ioctl 一样“解码”AF_NETLINK 通信?

如何使 strace 与 ioctl 一样“解码”AF_NETLINK 通信?

strace通常“破译”ioctl调用,显示它们的含义,甚至解析网络接口名称等。

但使用 AF_NETLINK 执行的相同操作在strace.我怎样才能教导我们strace去观察AF_NETLINK事物呢?有具有此功能的补丁或分叉吗?

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

“煮熟的”strace 输出示例ioctl

ioctl(4, SIOCGIFFLAGS, {ifr_name="veth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_ALLMULTI}) = 0

AF_NETLINK 背景

摘自维基百科

AF_NETLINK系列提供多个协议子集。每个接口都连接到不同的内核组件,并具有不同的消息传递子集。以下字段中引用了以下协议:

  int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)

缺乏标准,SOCK_DGRAM并且SOCK_RAW不保证在给定的 Linux(或其他操作系统)版本中实现。一些消息来源指出这两个选项都是合法的,并且下面来自 Red Hat 的参考指出该SOCK_RAW参数始终是参数,但是 iproute2 可以互换使用这两个选项。

相关内容