Store location object in handle to improve error reporting.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
const char *name;
};
+struct set_spec {
+ struct location location;
+ const char *name;
+};
+
/**
* struct handle - handle for tables, chains, rules and sets
*
uint32_t family;
struct table_spec table;
struct chain_spec chain;
- const char *set;
+ struct set_spec set;
const char *obj;
const char *flowtable;
struct handle_spec handle;
set = set_alloc(&expr->location);
set->flags = NFT_SET_ANONYMOUS | expr->set_flags;
- set->handle.set = xstrdup(name);
+ set->handle.set.name = xstrdup(name);
set->key = key;
set->init = expr;
set->automerge = set->flags & NFT_SET_INTERVAL;
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
ctx->cmd->handle.table.name);
- set = set_lookup(table, ctx->cmd->handle.set);
+ set = set_lookup(table, ctx->cmd->handle.set.name);
if (set == NULL)
return cmd_error(ctx, "Could not process rule: Set '%s' does not exist",
- ctx->cmd->handle.set);
+ ctx->cmd->handle.set.name);
ctx->set = set;
expr_set_context(&ctx->ectx, set->key->dtype, set->key->len);
}
ctx->set = NULL;
- if (set_lookup(table, set->handle.set) == NULL)
+ if (set_lookup(table, set->handle.set.name) == NULL)
set_add_hash(set_get(set), table);
/* Default timeout value implies timeout support */
if (table == NULL)
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
cmd->handle.table.name);
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL || set->flags & (NFT_SET_MAP | NFT_SET_EVAL))
return cmd_error(ctx, "Could not process rule: Set '%s' does not exist",
- cmd->handle.set);
+ cmd->handle.set.name);
return setelem_evaluate(ctx, &cmd->expr);
default:
if (table == NULL)
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
cmd->handle.table.name);
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL || set->flags & (NFT_SET_MAP | NFT_SET_EVAL))
return cmd_error(ctx, "Could not process rule: Set '%s' does not exist",
- cmd->handle.set);
+ cmd->handle.set.name);
return 0;
case CMD_OBJ_METER:
table = table_lookup(&cmd->handle, ctx->cache);
if (table == NULL)
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
cmd->handle.table.name);
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL || !(set->flags & NFT_SET_EVAL))
return cmd_error(ctx, "Could not process rule: Meter '%s' does not exist",
- cmd->handle.set);
+ cmd->handle.set.name);
return 0;
case CMD_OBJ_MAP:
table = table_lookup(&cmd->handle, ctx->cache);
if (table == NULL)
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
cmd->handle.table.name);
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL || !(set->flags & NFT_SET_MAP))
return cmd_error(ctx, "Could not process rule: Map '%s' does not exist",
- cmd->handle.set);
+ cmd->handle.set.name);
return 0;
case CMD_OBJ_CHAIN:
table = table_lookup(&cmd->handle, ctx->cache);
if (table == NULL)
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
cmd->handle.table.name);
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL || set->flags & (NFT_SET_MAP | NFT_SET_EVAL))
return cmd_error(ctx, "Could not process rule: Set '%s' does not exist",
- cmd->handle.set);
+ cmd->handle.set.name);
return 0;
case CMD_OBJ_MAP:
ret = cache_update(ctx->nf_sock, ctx->cache, cmd->op, ctx->msgs,
if (table == NULL)
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
cmd->handle.table.name);
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL || !(set->flags & NFT_SET_MAP))
return cmd_error(ctx, "Could not process rule: Map '%s' does not exist",
- cmd->handle.set);
+ cmd->handle.set.name);
return 0;
case CMD_OBJ_METER:
ret = cache_update(ctx->nf_sock, ctx->cache, cmd->op, ctx->msgs,
if (table == NULL)
return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
cmd->handle.table.name);
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL || !(set->flags & NFT_SET_EVAL))
return cmd_error(ctx, "Could not process rule: Meter '%s' does not exist",
- cmd->handle.set);
+ cmd->handle.set.name);
return 0;
default:
BUG("invalid command object type %u\n", cmd->obj);
{
if (expr->set->flags & NFT_SET_ANONYMOUS) {
if (expr->set->flags & NFT_SET_EVAL)
- nft_print(octx, "%s", expr->set->handle.set);
+ nft_print(octx, "%s", expr->set->handle.set.name);
else
expr_print(expr->set->init, octx);
} else {
- nft_print(octx, "@%s", expr->set->handle.set);
+ nft_print(octx, "@%s", expr->set->handle.set.name);
}
}
nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
- if (h->set != NULL)
- nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set);
+ if (h->set.name != NULL)
+ nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
if (h->set_id)
nftnl_set_set_u32(nls, NFTNL_SET_ID, h->set_id);
if (h->handle.id)
set = set_alloc(&netlink_location);
set->handle.family = nftnl_set_get_u32(nls, NFTNL_SET_FAMILY);
set->handle.table.name = xstrdup(nftnl_set_get_str(nls, NFTNL_SET_TABLE));
- set->handle.set = xstrdup(nftnl_set_get_str(nls, NFTNL_SET_NAME));
+ set->handle.set.name = xstrdup(nftnl_set_get_str(nls, NFTNL_SET_NAME));
set->automerge = automerge;
set->key = constant_expr_alloc(&netlink_location,
netlink_put_register(nle, NFTNL_EXPR_LOOKUP_SREG, sreg);
netlink_put_register(nle, NFTNL_EXPR_LOOKUP_DREG, dreg);
nftnl_expr_set_str(nle, NFTNL_EXPR_LOOKUP_SET,
- expr->mappings->set->handle.set);
+ expr->mappings->set->handle.set.name);
nftnl_expr_set_u32(nle, NFTNL_EXPR_LOOKUP_SET_ID,
expr->mappings->set->handle.set_id);
nle = alloc_nft_expr("lookup");
netlink_put_register(nle, NFTNL_EXPR_LOOKUP_SREG, sreg);
nftnl_expr_set_str(nle, NFTNL_EXPR_LOOKUP_SET,
- expr->right->set->handle.set);
+ expr->right->set->handle.set.name);
nftnl_expr_set_u32(nle, NFTNL_EXPR_LOOKUP_SET_ID,
expr->right->set->handle.set_id);
if (expr->op == OP_NEQ)
nftnl_expr_set_u32(nle, NFTNL_EXPR_OBJREF_SET_SREG, sreg_key);
nftnl_expr_set_str(nle, NFTNL_EXPR_OBJREF_SET_NAME,
- expr->mappings->set->handle.set);
+ expr->mappings->set->handle.set.name);
nftnl_expr_set_u32(nle, NFTNL_EXPR_OBJREF_SET_ID,
expr->mappings->set->handle.set_id);
break;
nftnl_expr_set_u64(nle, NFTNL_EXPR_DYNSET_TIMEOUT,
stmt->set.key->timeout);
nftnl_expr_set_u32(nle, NFTNL_EXPR_DYNSET_OP, stmt->set.op);
- nftnl_expr_set_str(nle, NFTNL_EXPR_DYNSET_SET_NAME, set->handle.set);
+ nftnl_expr_set_str(nle, NFTNL_EXPR_DYNSET_SET_NAME, set->handle.set.name);
nftnl_expr_set_u32(nle, NFTNL_EXPR_DYNSET_SET_ID, set->handle.set_id);
nftnl_rule_add_expr(ctx->nlr, nle);
}
nftnl_expr_set_u64(nle, NFTNL_EXPR_DYNSET_TIMEOUT,
stmt->meter.key->timeout);
nftnl_expr_set_u32(nle, NFTNL_EXPR_DYNSET_OP, op);
- nftnl_expr_set_str(nle, NFTNL_EXPR_DYNSET_SET_NAME, set->handle.set);
+ nftnl_expr_set_str(nle, NFTNL_EXPR_DYNSET_SET_NAME, set->handle.set.name);
nftnl_expr_set_u32(nle, NFTNL_EXPR_DYNSET_SET_ID, set->handle.set_id);
nftnl_expr_set(nle, NFTNL_EXPR_DYNSET_EXPR,
netlink_gen_stmt_stateful(ctx, stmt->meter.stmt), 0);
set_spec : table_spec identifier
{
$$ = $1;
- $$.set = $2;
+ $$.set.name = $2;
+ $$.set.location = @2;
}
;
set_identifier : identifier
{
memset(&$$, 0, sizeof($$));
- $$.set = $1;
+ $$.set.name = $1;
+ $$.set.location = @1;
}
;
{
xfree(h->table.name);
xfree(h->chain.name);
- xfree(h->set);
+ xfree(h->set.name);
xfree(h->flowtable);
}
dst->table.name = xstrdup(src->table.name);
if (dst->chain.name == NULL && src->chain.name != NULL)
dst->chain.name = xstrdup(src->chain.name);
- if (dst->set == NULL && src->set != NULL)
- dst->set = xstrdup(src->set);
+ if (dst->set.name == NULL && src->set.name != NULL)
+ dst->set.name = xstrdup(src->set.name);
if (dst->flowtable == NULL && src->flowtable != NULL)
dst->flowtable = xstrdup(src->flowtable);
if (dst->obj == NULL && src->obj != NULL)
struct set *set;
list_for_each_entry(set, &table->sets, list) {
- if (!strcmp(set->handle.set, name))
+ if (!strcmp(set->handle.set.name, name))
return set;
}
return NULL;
if (opts->table != NULL)
nft_print(octx, " %s", opts->table);
- nft_print(octx, " %s {", set->handle.set);
+ nft_print(octx, " %s {", set->handle.set.name);
if (octx->handle > 0)
nft_print(octx, " # handle %" PRIu64, set->handle.handle.id);
struct set *set;
table = table_lookup(h, ctx->cache);
- set = set_lookup(table, h->set);
+ set = set_lookup(table, h->set.name);
if (set->flags & NFT_SET_INTERVAL &&
set_to_intervals(ctx->msgs, set, init, true,
struct set *set;
table = table_lookup(h, ctx->cache);
- set = set_lookup(table, h->set);
+ set = set_lookup(table, h->set.name);
if (set->flags & NFT_SET_INTERVAL &&
set_to_intervals(ctx->msgs, set, expr, false,
{
struct set *set;
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
if (set == NULL)
return -1;
struct expr *init;
int err;
- set = set_lookup(table, cmd->handle.set);
+ set = set_lookup(table, cmd->handle.set.name);
/* Create a list of elements based of what we got from command line. */
if (set->flags & NFT_SET_INTERVAL)
} else {
if (left) {
left = get_set_interval_end(table,
- set->handle.set,
+ set->handle.set.name,
left);
compound_expr_add(new_init, left);
}
}
}
if (left) {
- left = get_set_interval_end(table, set->handle.set, left);
+ left = get_set_interval_end(table, set->handle.set.name, left);
compound_expr_add(new_init, left);
}