src: add redirect support
PATCH 1/1 src: add redirect support
This patch adds redirect support for nft.
The syntax is:
% nft add rule nat prerouting redirect [port|nat_flags]
--- include/statement.h | 10 +++++++++ src/evaluate.c | 42 ++++++++++++++++++++++++++++++++++++ src/netlink_delinearize.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ src/netlink_linearize.c | 49 ++++++++++++++++++++++++++++++++++++++++++ src/parser.y | 23 ++++++++++++++++++-- src/scanner.l | 1 + src/statement.c | 29 +++++++++++++++++++++++++ 7 files changed, 204 insertions(+), 2 deletions(-)
include/statement.h +10 -0
@@ -79,6 +79,13 @@ struct masq_stmt {extern struct stmt *masq_stmt_alloc (const struct location *loc); +struct redir_stmt { +struct expr *proto; +uint32_t flags; +}; + +extern struct stmt *redir_stmt_alloc (const struct location *loc); +struct queue_stmt {struct expr *queue;uint16_t flags;
@@ -110,6 +117,7 @@ extern struct stmt *ct_stmt_alloc(const struct location *loc,* @STMT_REJECT: REJECT statement * @STMT_NAT: NAT statement * @STMT_MASQ: masquerade statement +* @STMT_REDIR: redirect statement * @STMT_QUEUE: QUEUE statement * @STMT_CT: conntrack statement */
@@ -124,6 +132,7 @@ enum stmt_types {STMT_REJECT ,STMT_NAT ,STMT_MASQ , +STMT_REDIR ,STMT_QUEUE , STMT_CT, };
@@ -172,6 +181,7 @@ struct stmt {struct reject_stmt reject;struct nat_stmt nat;struct masq_stmt masq; +struct redir_stmt redir;struct queue_stmt queue;struct ct_stmt ct; };
src/evaluate.c +42 -0
54 lines not on this page · raw message
src/netlink_delinearize.c +52 -0
70 lines not on this page · raw message
src/netlink_linearize.c +49 -0
61 lines not on this page · raw message
src/parser.y +21 -2
@@ -375,6 +375,7 @@ static void location_update(struct location *loc, struct location *rhs, int n) %token SNAT "snat" %token DNAT "dnat" %token MASQUERADE "masquerade" +%token REDIRECT "redirect" %token RANDOM "random" %token RANDOM_FULLY "random-fully" %token PERSISTENT "persistent"
@@ -440,8 +441,8 @@ static void location_update(struct location *loc, struct location *rhs, int n) %type <val> time_unit %type <stmt> reject_stmt reject_stmt_alloc %destructor { stmt_free($$); } reject_stmt reject_stmt_alloc -%type <stmt> nat_stmt nat_stmt_alloc masq_stmt masq_stmt_alloc -%destructor { stmt_free($$); } nat_stmt nat_stmt_alloc masq_stmt masq_stmt_alloc +%type <stmt> nat_stmt nat_stmt_alloc masq_stmt masq_stmt_alloc redir_stmt redir_stmt_alloc +%destructor { stmt_free($$); } nat_stmt nat_stmt_alloc masq_stmt masq_stmt_alloc redir_stmt redir_stmt_alloc %type <val> nf_nat_flags nf_nat_flag %type <stmt> queue_stmt queue_stmt_alloc %destructor { stmt_free($$); } queue_stmt queue_stmt_alloc
@@ -1186,6 +1187,7 @@ stmt : verdict_stmt | queue_stmt | ct_stmt | masq_stmt + | redir_stmt ; verdict_stmt : verdict_expr
@@ -1420,6 +1422,23 @@ masq_stmt : masq_stmt_alloc masq_stmt_alloc : MASQUERADE { $$ = masq_stmt_alloc(&@$); } ; +redir_stmt : redir_stmt_alloc redir_stmt_arg + | redir_stmt_alloc + ; + +redir_stmt_alloc : REDIRECT { $$ = redir_stmt_alloc(&@$); } + ; + +redir_stmt_arg : COLON expr + { + $<stmt>0->redir.proto = $2; + } + | nf_nat_flags + { + $<stmt>0->redir.flags = $1; + } + ; + nf_nat_flags : nf_nat_flag | nf_nat_flags COMMA nf_nat_flag {
src/scanner.l +1 -0
@@ -317,6 +317,7 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr}) "snat" { return SNAT; } "dnat" { return DNAT; } "masquerade" { return MASQUERADE; } +"redirect" { return REDIRECT; } "random" { return RANDOM; } "random-fully" { return RANDOM_FULLY; } "persistent" { return PERSISTENT; }
src/statement.c +29 -0
@@ -348,3 +348,32 @@ struct stmt *masq_stmt_alloc(const struct location *loc) {return stmt_alloc (loc, &masq_stmt_ops); } + +static void redir_stmt_print (const struct stmt *stmt) +{ +printf ("redirect" ); + +if (stmt->redir.proto) { +printf (" :" ); +expr_print (stmt->redir.proto); + } + +print_nf_nat_flags (stmt->redir.flags); +} + +static void redir_stmt_destroy (struct stmt *stmt) +{ +expr_free (stmt->redir.proto); +} + +static const struct stmt_ops redir_stmt_ops = { + .type =STMT_REDIR , + .name ="redir" , + .print = redir_stmt_print, + .destroy = redir_stmt_destroy, +}; + +struct stmt *redir_stmt_alloc (const struct location *loc) +{ +return stmt_alloc (loc, &redir_stmt_ops); +}
Pablo Neira Ayuso
maintainerQuoted 84 lines · Arturo Borrero Gonzalez
This patch adds redirect support for nft.
The syntax is:
% nft add rule nat prerouting redirect [port|nat_flags]
Signed-off-by Arturo Borrero Gonzalez <[email protected]>--- include/statement.h | 10 +++++++++ src/evaluate.c | 42 ++++++++++++++++++++++++++++++++++++ src/netlink_delinearize.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ src/netlink_linearize.c | 49 ++++++++++++++++++++++++++++++++++++++++++ src/parser.y | 23 ++++++++++++++++++-- src/scanner.l | 1 + src/statement.c | 29 +++++++++++++++++++++++++ 7 files changed, 204 insertions(+), 2 deletions(-)include/statement.h +10
-0@@ -79,6 +79,13 @@ struct masq_stmt {extern struct stmt *masq_stmt_alloc (const struct location *loc); +struct redir_stmt { +struct expr *proto; +uint32_t flags; +}; + +extern struct stmt *redir_stmt_alloc (const struct location *loc); +struct queue_stmt {struct expr *queue;uint16_t flags;@@ -110,6 +117,7 @@ extern struct stmt *ct_stmt_alloc(const struct location *loc,* @STMT_REJECT: REJECT statement * @STMT_NAT: NAT statement * @STMT_MASQ: masquerade statement +* @STMT_REDIR: redirect statement * @STMT_QUEUE: QUEUE statement * @STMT_CT: conntrack statement */ @@ -124,6 +132,7 @@ enum stmt_types {STMT_REJECT ,STMT_NAT ,STMT_MASQ , +STMT_REDIR ,STMT_QUEUE , STMT_CT, };@@ -172,6 +181,7 @@ struct stmt {struct reject_stmt reject;struct nat_stmt nat;struct masq_stmt masq; +struct redir_stmt redir;struct queue_stmt queue;struct ct_stmt ct; };src/evaluate.c +17
-0@@ -1375,6 +1375,46 @@ out:return 0 ; } +static int stmt_evaluate_redir (struct eval_ctx *ctx,struct stmt *stmt) +{ +int err; +struct proto_ctx *pctx = &ctx->pctx; + +if (!pctx) + goto out; + +switch (pctx->family) { +case AF_INET : +expr_set_context (&ctx->ectx, &ipaddr_type, +4 *BITS_PER_BYTE ); +break ; +case AF_INET6 : +expr_set_context (&ctx->ectx, &ip6addr_type, +16 *BITS_PER_BYTE ); +break ;
src/evaluate.c out: · line 1404
Quoted 10 lines
src/evaluate.c +10
-0+default : +return stmt_error (ctx, stmt,"ip and ip6 support only" ); + } + +if (stmt->redir.proto !=NULL ) { +if (pctx->protocol[PROTO_BASE_TRANSPORT_HDR ].desc ==NULL ) +return stmt_binary_error (ctx, stmt->redir.proto, stmt, +"transport protocol mapping " +"is only valid after " +"transport protocol match" );
Errors have to fit in one line, preferably.
Quoted 46 lines
src/evaluate.c +15
-0+ +expr_set_context (&ctx->ectx, &inet_service_type, +2 *BITS_PER_BYTE ); + err =expr_evaluate (ctx, &stmt->redir.proto); +if (err <0 ) +return err; + } + +out: + stmt->flags |=STMT_F_TERMINAL ; +return 0 ; +} +static int stmt_evaluate_ct (struct eval_ctx *ctx,struct stmt *stmt) { expr_set_context(&ctx->ectx, stmt->ct.tmpl->dtype,@@ -1437,6 +1477,8 @@ int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt)return stmt_evaluate_nat (ctx, stmt);case STMT_MASQ :return stmt_evaluate_masq (ctx, stmt); +case STMT_REDIR : +return stmt_evaluate_redir (ctx, stmt);case STMT_QUEUE :return stmt_evaluate_queue (ctx, stmt);case STMT_CT :src/netlink_delinearize.c +13
-0@@ -583,6 +583,52 @@ static void netlink_parse_masq(struct netlink_parse_ctx *ctx,list_add_tail (&stmt->list, &ctx->rule->stmts); } +static void netlink_parse_redir (struct netlink_parse_ctx *ctx, +const struct location *loc, +const struct nft_rule_expr *nle) +{ +struct stmt *stmt; +struct expr *proto; +enum nft_registers reg1, reg2; +uint32_t flags; + + stmt =redir_stmt_alloc (loc); + +if (nft_rule_expr_is_set (nle,NFT_EXPR_REDIR_FLAGS )) { + flags =nft_rule_expr_get_u32 (nle,NFT_EXPR_REDIR_FLAGS );
src/netlink_delinearize.c static void netlink_parse_masq(struct netlink_parse_ctx *ctx, · line 608
Quoted 10 lines
src/netlink_delinearize.c +10
-0+ stmt->redir.flags = flags; + } + + reg1 =nft_rule_expr_get_u32 (nle,NFT_EXPR_REDIR_REG_PROTO_MIN ); +if (reg1) { + proto =netlink_get_register (ctx, loc, reg1); +if (proto ==NULL ) +return netlink_error (ctx, loc, +"REDIRECT statement has no proto " +"expression" );
Is this error similar to other errors that we already have in the code? We should try to report them consistently.
Quoted 89 lines · Pablo Neira Ayuso
Quoted 88 lines · Arturo Borrero Gonzalez
This patch adds redirect support for nft.
The syntax is:
% nft add rule nat prerouting redirect [port|nat_flags]
Signed-off-by Arturo Borrero Gonzalez <[email protected]>--- include/statement.h | 10 +++++++++ src/evaluate.c | 42 ++++++++++++++++++++++++++++++++++++ src/netlink_delinearize.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ src/netlink_linearize.c | 49 ++++++++++++++++++++++++++++++++++++++++++ src/parser.y | 23 ++++++++++++++++++-- src/scanner.l | 1 + src/statement.c | 29 +++++++++++++++++++++++++ 7 files changed, 204 insertions(+), 2 deletions(-)include/statement.h +10
-0@@ -79,6 +79,13 @@ struct masq_stmt {extern struct stmt *masq_stmt_alloc (const struct location *loc); +struct redir_stmt { +struct expr *proto; +uint32_t flags; +}; + +extern struct stmt *redir_stmt_alloc (const struct location *loc); +struct queue_stmt {struct expr *queue;uint16_t flags;@@ -110,6 +117,7 @@ extern struct stmt *ct_stmt_alloc(const struct location *loc,* @STMT_REJECT: REJECT statement * @STMT_NAT: NAT statement * @STMT_MASQ: masquerade statement +* @STMT_REDIR: redirect statement * @STMT_QUEUE: QUEUE statement * @STMT_CT: conntrack statement */ @@ -124,6 +132,7 @@ enum stmt_types {STMT_REJECT ,STMT_NAT ,STMT_MASQ , +STMT_REDIR ,STMT_QUEUE , STMT_CT, };@@ -172,6 +181,7 @@ struct stmt {struct reject_stmt reject;struct nat_stmt nat;struct masq_stmt masq; +struct redir_stmt redir;struct queue_stmt queue;struct ct_stmt ct; };src/evaluate.c +21
-0@@ -1375,6 +1375,46 @@ out:return 0 ; } +static int stmt_evaluate_redir (struct eval_ctx *ctx,struct stmt *stmt) +{ +int err; +struct proto_ctx *pctx = &ctx->pctx; + +if (!pctx) + goto out; + +switch (pctx->family) { +case AF_INET : +expr_set_context (&ctx->ectx, &ipaddr_type, +4 *BITS_PER_BYTE ); +break ; +case AF_INET6 : +expr_set_context (&ctx->ectx, &ip6addr_type, +16 *BITS_PER_BYTE ); +break ; +default : +return stmt_error (ctx, stmt,"ip and ip6 support only" ); + } +
Quoted 9 lines
src/evaluate.c out: · line 1404
Quoted 6 lines
src/evaluate.c +6
-0+if (stmt->redir.proto !=NULL ) { +if (pctx->protocol[PROTO_BASE_TRANSPORT_HDR ].desc ==NULL ) +return stmt_binary_error (ctx, stmt->redir.proto, stmt, +"transport protocol mapping " +"is only valid after " +"transport protocol match" );Errors have to fit in one line, preferably.
Could you please give some suggestion?
regards.
Signature · 5 lines
Arturo Borrero González -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Pablo Neira Ayuso
maintainerQuoted 8 lines · Arturo Borrero Gonzalez
Quoted 7 lines · Pablo Neira Ayuso
Quoted 6 lines
src/evaluate.c +6
-0+if (stmt->redir.proto !=NULL ) { +if (pctx->protocol[PROTO_BASE_TRANSPORT_HDR ].desc ==NULL ) +return stmt_binary_error (ctx, stmt->redir.proto, stmt, +"transport protocol mapping " +"is only valid after " +"transport protocol match" );
Quoted 4 lines
Quoted 2 lines
Errors have to fit in one line, preferably.
Could you please give some suggestion?
missing transport protocol match