extensions: libxt_connmark: Add translation to nft
PATCH v3 1/1 extensions: libxt_connmark: Add translation to nft
Add translation for connmark to nftables.
Examples:
$ sudo iptables-translate -A INPUT -m connmark --mark 2 -j ACCEPT nft add rule ip filter INPUT ct mark 0x2 counter accept
$ sudo iptables-translate -A INPUT -m connmark ! --mark 2 -j ACCEPT nft add rule ip filter INPUT ct mark != 0x2 counter accept
$ sudo iptables-translate -A INPUT -m connmark --mark 10/10 -j ACCEPT nft add rule ip filter INPUT ct mark and 0xa == 0xa counter accept
$ sudo iptables-translate -A INPUT -m connmark ! --mark 10/10 -j ACCEPT nft add rule ip filter INPUT ct mark and 0xa != 0xa counter accept
$ sudo iptables-translate -t mangle -A PREROUTING -p tcp --dport 40 -m connmark --mark 0x40 nft add rule ip mangle PREROUTING tcp dport 40 ct mark 0x40 counter
---
Changes in v3:
Replace the string added in v2 with enum to make code look better
extensions/libxt_connmark.c | 47 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-)
extensions/libxt_connmark.c +46 -1
@@ -89,7 +89,8 @@ connmark_print(const void *ip, const struct xt_entry_match *match, int numeric) }static void -connmark_mt_print (const void *ip,const struct xt_entry_match *match,int numeric) +connmark_mt_print (const void *ip,const struct xt_entry_match *match, +int numeric) {const struct xt_connmark_mtinfo1 *info = (const void *)match->data;
@@ -122,6 +123,48 @@ connmark_mt_save(const void *ip, const struct xt_entry_match *match)print_mark (info->mark, info->mask); } +static void print_mark_xlate (unsigned int mark,unsigned int mask, +struct xt_buf *buf,uint32_t op) +{ +if (mask !=0xffffffffU ) +xt_buf_add (buf," and 0x%x %s 0x%x " , mark, + op ==XT_OP_EQ ?"==" :"!=" , mask); +else +xt_buf_add (buf," %s0x%x " , + op ==XT_OP_EQ ?"" :"!= " , mark); +} + +static int connmark_xlate (const struct xt_entry_match *match, +struct xt_buf *buf,int numeric) +{ +const struct xt_connmark_info *info = (const void *)match->data; +enum xt_op op =XT_OP_EQ ; + +if (info->invert) + op =XT_OP_NEQ ; + +xt_buf_add (buf,"ct mark" ); +print_mark_xlate (info->mark, info->mask, buf, op); + +return 1 ; +} + +static int +connmark_mt_xlate (const struct xt_entry_match *match, +struct xt_buf *buf,int numeric) +{ +const struct xt_connmark_mtinfo1 *info = (const void *)match->data; +enum xt_op op =XT_OP_EQ ; + +if (info->invert) + op =XT_OP_NEQ ; + +xt_buf_add (buf,"ct mark" ); +print_mark_xlate (info->mark, info->mask, buf, op); + +return 1 ; +} +static struct xtables_match connmark_mt_reg[] = { { .family =NFPROTO_UNSPEC ,
@@ -135,6 +178,7 @@ static struct xtables_match connmark_mt_reg[] = { .save = connmark_save, .x6_parse = connmark_parse, .x6_options = connmark_mt_opts, + .xlate = connmark_xlate, }, { .version = XTABLES_VERSION,
@@ -148,6 +192,7 @@ static struct xtables_match connmark_mt_reg[] = { .save = connmark_mt_save, .x6_parse = connmark_mt_parse, .x6_options = connmark_mt_opts, + .xlate = connmark_mt_xlate, }, };
Signature · 1 line
1.9.1
Pablo Neira Ayuso
maintainerQuoted 12 lines · Shivani Bhardwaj
static struct
xtables_matchconnmark_mt_reg[] = {extensions/libxt_connmark.c +1
-0{ .family = NFPROTO_UNSPEC,@@ -135,6 +178,7 @@ static struct xtables_match connmark_mt_reg[] = { .save = connmark_save, .x6_parse = connmark_parse, .x6_options = connmark_mt_opts, + .xlate = connmark_xlate, }, { .version = XTABLES_VERSION,
extensions/libxt_connmark.c static struct xtables_match connmark_mt_reg[] = { · line 195
Quoted 4 lines
extensions/libxt_connmark.c +1
-0@@ -148,6 +192,7 @@ static struct xtables_match connmark_mt_reg[] = { .save = connmark_mt_save, .x6_parse = connmark_mt_parse, .x6_options = connmark_mt_opts, + .xlate = connmark_mt_xlate,
Careful.
The different revisions use different structure definitions, ie. the structure binary layout is different, therefore you cannot reuse the same connmark_mt_xlate() for the two different revision.
Let me make sure I clarify this, this is revision 0:
struct xt_connmark_info {
unsigned long mark, mask;
uint8_t invert;
};This is revision 1:
struct xt_connmark_mtinfo1 {
__u32 mark, mask;
__u8 invert;
};The size of unsigned long depends on the architecture, so this code will not work correctly.
You have to add a connmark_mt_xlate_v0() and connmark_mt_xlate_v1(), in each of these functions you have to cast data to the right structure layout.
Thanks.
Quoted 38 lines · Pablo Neira Ayuso
Quoted 12 lines · Shivani Bhardwaj
static struct
xtables_matchconnmark_mt_reg[] = {
{
.family =NFPROTO_UNSPEC,extensions/libxt_connmark.c +1
-0@@ -135,6 +178,7 @@ static struct xtables_match connmark_mt_reg[] = { .save = connmark_save, .x6_parse = connmark_parse, .x6_options = connmark_mt_opts, + .xlate = connmark_xlate, }, { .version = XTABLES_VERSION,extensions/libxt_connmark.c static struct xtables_match connmark_mt_reg[] = { · line 195
Quoted 4 lines
extensions/libxt_connmark.c +1
-0@@ -148,6 +192,7 @@ static struct xtables_match connmark_mt_reg[] = { .save = connmark_mt_save, .x6_parse = connmark_mt_parse, .x6_options = connmark_mt_opts, + .xlate = connmark_mt_xlate,Careful.
The different revisions use different structure definitions, ie. the structure binary layout is different, therefore you cannot reuse the same
connmark_mt_xlate()for the two different revision.Let me make sure I clarify this, this is revision 0:
struct xt_connmark_info { unsigned long mark, mask; uint8_t invert; };This is revision 1:
struct xt_connmark_mtinfo1 { __u32 mark, mask; __u8 invert; };
Quoted 8 lines
The size of unsigned long depends on the architecture, so this code will not work correctly.
You have to add a
connmark_mt_xlate_v0()andconnmark_mt_xlate_v1(), in each of these functions you have to cast data to the right structure layout.Thanks.
Thanks for explaining. I understand it now but why is this patch wrong? I have used connmark_xlate() and connmark_mt_xlate() in their respective places. Do I still get it wrong?
I'm correcting this mistake for MARK.
Thank you
Pablo Neira Ayuso
maintainerQuoted 8 lines · Shivani Bhardwaj
Quoted 7 lines · Pablo Neira Ayuso
The size of unsigned long depends on the architecture, so this code will not work correctly.
You have to add a
connmark_mt_xlate_v0()andconnmark_mt_xlate_v1(), in each of these functions you have to cast data to the right structure layout.
Quoted 7 lines
Quoted 1 line
Thanks.
Thanks for explaining. I understand it now but why is this patch wrong? I have used
connmark_xlate()andconnmark_mt_xlate()in their respective places. Do I still get it wrong?I'm correcting this mistake for MARK.
This patch correctly handles what I indicated above, but MARK is still wrong.
So I'm applying this patch, thanks.