如何讓 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 可以互換使用這兩個選項。

相關內容