2 * Copyright (c) 2018 Chen Jingpiao <chenjingpiao@gmail.com>
3 * Copyright (c) 2018 The strace developers.
6 * SPDX-License-Identifier: LGPL-2.1-or-later
11 #ifdef HAVE_LINUX_NETFILTER_NFNETLINK_H
13 # include "print_fields.h"
16 # include <netinet/in.h>
17 # include <arpa/inet.h>
19 # include <linux/netfilter/nfnetlink.h>
21 # include "xlat/netfilter_versions.h"
22 # include "xlat/nl_netfilter_msg_types.h"
23 # include "xlat/nl_netfilter_subsys_ids.h"
26 decode_netlink_netfilter(struct tcb *const tcp,
27 const struct nlmsghdr *const nlmsghdr,
28 const kernel_ulong_t addr,
29 const unsigned int len)
31 if (nlmsghdr->nlmsg_type == NLMSG_DONE)
34 struct nfgenmsg nfmsg;
36 if (len < sizeof(nfmsg))
37 printstr_ex(tcp, addr, len, QUOTE_FORCE_HEX);
38 else if (!umove_or_printaddr(tcp, addr, &nfmsg)) {
39 const uint8_t subsys_id = (uint8_t) (nlmsghdr->nlmsg_type >> 8);
40 uint16_t res_id = ntohs(nfmsg.res_id);
42 PRINT_FIELD_XVAL("{", nfmsg, nfgen_family, addrfams, "AF_???");
43 PRINT_FIELD_XVAL(", ", nfmsg, version, netfilter_versions,
47 * Work around wrong endianness in res_id field,
48 * see linux commit v4.3-rc1~28^2~47^2~1
51 if (subsys_id == NFNL_SUBSYS_NFTABLES
52 && res_id == NFNL_SUBSYS_NFTABLES) {
53 print_xlat_ex(nfmsg.res_id,
54 "htons(NFNL_SUBSYS_NFTABLES)",
56 } else if (subsys_id == NFNL_SUBSYS_NFTABLES
57 && nfmsg.res_id == NFNL_SUBSYS_NFTABLES) {
58 print_xlat_ex(nfmsg.res_id, "NFNL_SUBSYS_NFTABLES",
61 tprintf("htons(%d)", res_id);
64 const size_t offset = NLMSG_ALIGN(sizeof(nfmsg));
67 if ((nlmsghdr->nlmsg_type >= NFNL_MSG_BATCH_BEGIN
68 && nlmsghdr->nlmsg_type <= NFNL_MSG_BATCH_END)
69 || nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE)
70 printstr_ex(tcp, addr + offset,
71 len - offset, QUOTE_FORCE_HEX);
73 decode_nlattr(tcp, addr + offset, len - offset,
74 NULL, NULL, NULL, 0, NULL);
81 #endif /* HAVE_LINUX_NETFILTER_NFNETLINK_H */