Skip to contentSkip to conversation

extensions: libxt_devgroup: Add translation to nft

PATCH In review Shivani Bhardwaj 2 participants 4 messages Dec 20, 2015 – Dec 22, 2015 netfilter

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 extensions: libxt_devgroup: Add translation to nft

Add translation of device group to nftables.

Examples:

$ sudo iptables-translate -A FORWARD -m devgroup --dst-group 0xc/0xc -j ACCEPT
nft add rule ip filter FORWARD  oifgroup and 0xc == 0xc counter accept
$ sudo iptables-translate -A FORWARD -m devgroup --src-group 20 -j ACCEPT
nft add rule ip filter FORWARD  iifgroup 0x14 counter accept
$ sudo iptables-translate -t mangle -A PREROUTING -p tcp --dport 46000 -m devgroup --src-group 23 -j ACCEPT
nft add rule ip mangle PREROUTING tcp dport 46000  iifgroup 0x17 counter accept
---
 extensions/libxt_devgroup.c | 62 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 57 insertions(+), 5 deletions(-)
extensions/libxt_devgroup.c +57 -5
index 4a69c82..281b223 100644
@@ -37,6 +37,7 @@ static struct xtables_lmap *devgroups;
 static void devgroup_init(struct xt_entry_match *match)
 {
 	const char file[] = "/etc/iproute2/group_map";
+
 	devgroups = xtables_lmap_init(file);
 	if (devgroups == NULL && errno != ENOENT)
 		fprintf(stderr, "Warning: %s: %s\n", file, strerror(errno));
@@ -52,7 +53,7 @@ static void devgroup_parse_groupspec(const char *arg, unsigned int *group,
 	if (ok && (*end == '/' || *end == '\0')) {
 		if (*end == '/')
 			ok = xtables_strtoui(end + 1, NULL, mask,
-			                     0, UINT32_MAX);
+					     0, UINT32_MAX);
 		else
 			*mask = ~0U;
 		if (!ok)
@@ -124,12 +125,12 @@ static void devgroup_show(const char *pfx, const struct xt_devgroup_info *info,
 		if (info->flags & XT_DEVGROUP_INVERT_DST)
 			printf(" !");
 		printf(" %sdst-group ", pfx);
-		print_devgroup(info->src_group, info->src_mask, numeric);
+		print_devgroup(info->dst_group, info->dst_mask, numeric);
 	}
 }
 
 static void devgroup_print(const void *ip, const struct xt_entry_match *match,
-                        int numeric)
+			   int numeric)
 {
 	const struct xt_devgroup_info *info = (const void *)match->data;
 
@@ -147,8 +148,58 @@ static void devgroup_check(struct xt_fcheck_call *cb)
 {
 	if (cb->xflags == 0)
 		xtables_error(PARAMETER_PROBLEM,
-			      "devgroup match: You must specify either "
-			      "'--src-group' or '--dst-group'");
+			      "devgroup match: You must specify either '--src-group' or '--dst-group'");
+}
+
+static void
+print_devgroup_xlate(unsigned int id, unsigned int mask,
+		     struct xt_buf *buf, int numeric)
+{
+	const char *name = NULL;
+
+	if (mask != 0xffffffffU)
+		xt_buf_add(buf, "and 0x%x == 0x%x ", id, mask);
+	else {
+		if (numeric == 0)
+			name = xtables_lmap_id2name(devgroups, id);
+		if (name)
+			xt_buf_add(buf, "%s ", name);
+		else
+			xt_buf_add(buf, "0x%x ", id);
+	}
+}
+
+static void
+devgroup_show_xlate(const char *pfx, const struct xt_devgroup_info *info,
+		    struct xt_buf *buf, int numeric)
+{
+	if (info->flags & XT_DEVGROUP_MATCH_SRC) {
+		if (info->flags & XT_DEVGROUP_INVERT_SRC)
+			xt_buf_add(buf, " !=");
+
+		xt_buf_add(buf, " %siifgroup ", pfx);
+		print_devgroup_xlate(info->src_group, info->src_mask,
+				     buf, numeric);
+	}
+
+	if (info->flags & XT_DEVGROUP_MATCH_DST) {
+		if (info->flags & XT_DEVGROUP_INVERT_DST)
+			xt_buf_add(buf, " !=");
+
+		xt_buf_add(buf, " %soifgroup ", pfx);
+		print_devgroup_xlate(info->dst_group, info->dst_mask,
+				     buf, numeric);
+	}
+}
+
+static int devgroup_xlate(const struct xt_entry_match *match,
+			   struct xt_buf *buf, int numeric)
+{
+	const struct xt_devgroup_info *info = (const void *)match->data;
+
+	devgroup_show_xlate("", info, buf, 0);
+
+	return 1;
 }
 
 static struct xtables_match devgroup_mt_reg = {
@@ -164,6 +215,7 @@ static struct xtables_match devgroup_mt_reg = {
 	.x6_parse	= devgroup_parse,
 	.x6_fcheck	= devgroup_check,
 	.x6_options	= devgroup_opts,
+	.xlate		= devgroup_xlate,
 };
 
 void _init(void)
Signature · 1 line
1.9.1
#1 lore raw
Quoted 1 line · Shivani Bhardwaj

Add translation of device group to nftables.

git am /tmp/extensions-libxt_devgroup-Add-translation-to-nft.patch -s
Applying: extensions: libxt_devgroup: Add translation to nft
error: patch failed: extensions/libxt_devgroup.c:37
error: extensions/libxt_devgroup.c: patch does not apply Patch failed at 0001 extensions: libxt_devgroup: Add translation to nft The copy of the patch that failed is found in:
/home/pablo/devel/scm/git-netfilter/iptables/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort".

This one doesn't apply for some reason.

#2 lore raw
Quoted 14 lines · Pablo Neira Ayuso
Quoted 1 line · Shivani Bhardwaj

Add translation of device group to nftables.

git am /tmp/extensions-libxt_devgroup-Add-translation-to-nft.patch -s
Applying: extensions: libxt_devgroup: Add translation to nft
error: patch failed: extensions/libxt_devgroup.c:37
error: extensions/libxt_devgroup.c: patch does not apply Patch failed at 0001 extensions: libxt_devgroup: Add translation to nft The copy of the patch that failed is found in:
/home/pablo/devel/scm/git-netfilter/iptables/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort".

Quoted 1 line

This one doesn't apply for some reason.

Should I be sending this one again then?

#3 lore raw
Quoted 15 lines · Shivani Bhardwaj
Quoted 14 lines · Pablo Neira Ayuso
Quoted 1 line · Shivani Bhardwaj

Add translation of device group to nftables.

git am /tmp/extensions-libxt_devgroup-Add-translation-to-nft.patch -s
Applying: extensions: libxt_devgroup: Add translation to nft
error: patch failed: extensions/libxt_devgroup.c:37
error: extensions/libxt_devgroup.c: patch does not apply Patch failed at 0001 extensions: libxt_devgroup: Add translation to nft The copy of the patch that failed is found in:
/home/pablo/devel/scm/git-netfilter/iptables/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort".

Quoted 3 lines
Quoted 1 line

This one doesn't apply for some reason.

Should I be sending this one again then?

Of course. If you can't see a patch here:

http://git.netfilter.org/iptables/log/?h=xlate3

Then it needs to be submitted again.