summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2018-05-11 23:17:16 +0200
committerFlorian Westphal <fw@strlen.de>2018-05-14 01:25:28 +0200
commitfbc0768cb69686d00035456f1e9e0613927b1d4f (patch)
tree3eb0d73a4cbd4c110c5a24a1614305145593d2d7
parent3b71baba43fa1ce53fa034257b17954e05c230fb (diff)
nftables: xt: don't use hard-coded AF_INET
We need to check which revision type is requested (match, target) and wheter its ipv4 or ipv6, then set family based on that. This allows nft ipv6 family to display compat entries if a translation is available. Signed-off-by: Florian Westphal <fw@strlen.de>
-rw-r--r--src/xt.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/xt.c b/src/xt.c
index 4a954dc9..95d0c5f2 100644
--- a/src/xt.c
+++ b/src/xt.c
@@ -293,14 +293,30 @@ static int nft_xt_compatible_revision(const char *name, uint8_t rev, int opt)
struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
- uint32_t portid, seq, type;
+ uint32_t portid, seq, type, family;
struct nfgenmsg *nfg;
int ret = 0;
- if (opt == IPT_SO_GET_REVISION_MATCH)
+ switch (rev) {
+ case IPT_SO_GET_REVISION_MATCH:
+ family = NFPROTO_IPV4;
type = 0;
- else
+ break;
+ case IPT_SO_GET_REVISION_TARGET:
+ family = NFPROTO_IPV4;
type = 1;
+ break;
+ case IP6T_SO_GET_REVISION_MATCH:
+ family = NFPROTO_IPV6;
+ type = 0;
+ break;
+ case IP6T_SO_GET_REVISION_TARGET:
+ family = NFPROTO_IPV6;
+ type = 1;
+ break;
+ default: /* No revision support, assume ok */
+ return 1;
+ }
nlh = mnl_nlmsg_put_header(buf);
nlh->nlmsg_type = (NFNL_SUBSYS_NFT_COMPAT << 8) | NFNL_MSG_COMPAT_GET;
@@ -308,7 +324,7 @@ static int nft_xt_compatible_revision(const char *name, uint8_t rev, int opt)
nlh->nlmsg_seq = seq = time(NULL);
nfg = mnl_nlmsg_put_extra_header(nlh, sizeof(*nfg));
- nfg->nfgen_family = AF_INET;
+ nfg->nfgen_family = family;
nfg->version = NFNETLINK_V0;
nfg->res_id = 0;