netlink: add a basic netlink attribute parser of AF_PACKET diag

* linux/packet_diag.h (PACKET_DIAG_*): New enum.
* netlink_sock_diag.c: Include "xlat/packet_diag_attrs.h".
(decode_packet_diag_msg): Use decode_nlattr.
* xlat/packet_diag_attrs.in: New file.

Co-authored-by: Fabien Siron <fabien.siron@epita.fr>
This commit is contained in:
JingPiao Chen 2017-06-27 18:10:04 +08:00 committed by Dmitry V. Levin
parent 4c511a1c99
commit 6cc89c0314
3 changed files with 31 additions and 1 deletions

View File

@ -26,4 +26,15 @@ struct packet_diag_msg {
uint32_t pdiag_cookie[2];
};
enum {
PACKET_DIAG_INFO,
PACKET_DIAG_MCLIST,
PACKET_DIAG_RX_RING,
PACKET_DIAG_TX_RING,
PACKET_DIAG_FANOUT,
PACKET_DIAG_UID,
PACKET_DIAG_MEMINFO,
PACKET_DIAG_FILTER,
};
#endif /* !STRACE_LINUX_PACKET_DIAG_H */

View File

@ -49,6 +49,7 @@
#include "xlat/netlink_diag_show.h"
#include "xlat/netlink_states.h"
#include "xlat/packet_diag_attrs.h"
#include "xlat/packet_diag_show.h"
#ifdef AF_SMC
@ -271,7 +272,8 @@ decode_packet_diag_msg(struct tcb *const tcp,
const kernel_ulong_t len)
{
struct packet_diag_msg msg = { .pdiag_family = family };
const size_t offset = sizeof(msg.pdiag_family);
size_t offset = sizeof(msg.pdiag_family);
bool decode_nla = false;
PRINT_FIELD_XVAL("{", msg, pdiag_family, addrfams, "AF_???");
tprints(", ");
@ -284,10 +286,18 @@ decode_packet_diag_msg(struct tcb *const tcp,
PRINT_FIELD_U(", ", msg, pdiag_num);
PRINT_FIELD_U(", ", msg, pdiag_ino);
PRINT_FIELD_COOKIE(", ", msg, pdiag_cookie);
decode_nla = true;
}
} else
tprints("...");
tprints("}");
offset = NLA_ALIGN(sizeof(msg));
if (decode_nla && len > offset) {
tprints(", ");
decode_nlattr(tcp, addr + offset, len - offset,
packet_diag_attrs, "PACKET_DIAG_???");
}
}
static void

View File

@ -0,0 +1,9 @@
#unconditional
PACKET_DIAG_INFO
PACKET_DIAG_MCLIST
PACKET_DIAG_RX_RING
PACKET_DIAG_TX_RING
PACKET_DIAG_FANOUT
PACKET_DIAG_UID
PACKET_DIAG_MEMINFO
PACKET_DIAG_FILTER