extern struct expr *relational_expr_alloc(const struct location *loc, enum ops op,
struct expr *left, struct expr *right);
+extern void relational_expr_pctx_update(struct proto_ctx *ctx,
+ const struct expr *expr);
+
extern struct expr *verdict_expr_alloc(const struct location *loc,
int verdict, const char *chain);
const struct proto_desc *base = NULL, *desc;
uint32_t nhproto;
- assert(expr->op == OP_EQ);
-
nhproto = mpz_get_uint32(right->value);
base = ctx->protocol[left->ct.base].desc;
constant_data_ptr(ct->ct.nfproto, left->len));
dep = relational_expr_alloc(&ct->location, OP_EQ, left, right);
- left->ops->pctx_update(&ctx->pctx, dep);
+ relational_expr_pctx_update(&ctx->pctx, dep);
nstmt = expr_stmt_alloc(&dep->location, dep);
* Update protocol context for payload and meta iiftype
* equality expressions.
*/
- if (left->flags & EXPR_F_PROTOCOL &&
- left->ops->pctx_update)
- left->ops->pctx_update(&ctx->pctx, rel);
+ relational_expr_pctx_update(&ctx->pctx, rel);
if (left->ops->type == EXPR_CONCAT)
return 0;
return expr;
}
+void relational_expr_pctx_update(struct proto_ctx *ctx,
+ const struct expr *expr)
+{
+ const struct expr *left = expr->left;
+
+ assert(expr->ops->type == EXPR_RELATIONAL);
+ assert(expr->op == OP_EQ);
+
+ if (left->ops->pctx_update &&
+ (left->flags & EXPR_F_PROTOCOL))
+ left->ops->pctx_update(ctx, expr);
+}
+
static void range_expr_print(const struct expr *expr, struct output_ctx *octx)
{
octx->numeric += NFT_NUMERIC_ALL + 1;
const struct proto_desc *desc;
uint8_t protonum;
- assert(expr->op == OP_EQ);
-
switch (left->meta.key) {
case NFT_META_IIFTYPE:
if (h->base < PROTO_BASE_NETWORK_HDR &&
list_add_tail(&stmt->list, &unordered);
desc = ctx->protocol[base].desc;
- lhs->ops->pctx_update(ctx, rel);
+ relational_expr_pctx_update(ctx, rel);
}
expr_free(rhs);
nexpr = relational_expr_alloc(&expr->location, expr->op,
left, tmp);
if (expr->op == OP_EQ)
- left->ops->pctx_update(&ctx->pctx, nexpr);
+ relational_expr_pctx_update(&ctx->pctx, nexpr);
nstmt = expr_stmt_alloc(&ctx->stmt->location, nexpr);
list_add_tail(&nstmt->list, &ctx->stmt->list);
if (expr->right->ops->type == EXPR_RANGE)
break;
- expr->left->ops->pctx_update(&ctx->pctx, expr);
+ relational_expr_pctx_update(&ctx->pctx, expr);
if (ctx->pdctx.pbase == PROTO_BASE_INVALID &&
left->flags & EXPR_F_PROTOCOL) {
const struct proto_desc *base, *desc;
unsigned int proto = 0;
- if (!(left->flags & EXPR_F_PROTOCOL))
- return;
-
- assert(expr->op == OP_EQ);
-
/* Export the data in the correct byte order */
assert(right->len / BITS_PER_BYTE <= sizeof(proto));
mpz_export_data(constant_data_ptr(proto, right->len), right->value,
return expr_error(ctx->msgs, expr,
"dependency statement is invalid");
}
- left->ops->pctx_update(&ctx->pctx, dep);
+ relational_expr_pctx_update(&ctx->pctx, dep);
*res = stmt;
return 0;
}