#include <nftables.h>
#include <list.h>
+/**
+ * struct handle_spec - handle ID
+ *
+ * @location: location this handle was defined at
+ * @id: handle ID value
+ */
+struct handle_spec {
+ struct location location;
+ uint64_t id;
+};
+
+/**
+ * struct position_spec - position ID
+ *
+ * @location: location this position was defined at
+ * @id: position ID value
+ */
+struct position_spec {
+ struct location location;
+ uint64_t id;
+};
+
/**
* struct handle - handle for tables, chains, rules and sets
*
const char *table;
const char *chain;
const char *set;
- uint64_t handle;
- uint64_t position;
+ struct handle_spec handle;
+ struct position_spec position;
uint32_t set_id;
};
nftnl_chain_set_u32(nlc, NFTNL_CHAIN_FAMILY, h->family);
nftnl_chain_set_str(nlc, NFTNL_CHAIN_TABLE, h->table);
- if (h->handle != 0)
- nftnl_chain_set_u64(nlc, NFTNL_CHAIN_HANDLE, h->handle);
+ if (h->handle.id != 0)
+ nftnl_chain_set_u64(nlc, NFTNL_CHAIN_HANDLE, h->handle.id);
if (h->chain != NULL)
nftnl_chain_set_str(nlc, NFTNL_CHAIN_NAME, h->chain);
nftnl_rule_set_str(nlr, NFTNL_RULE_TABLE, h->table);
if (h->chain != NULL)
nftnl_rule_set_str(nlr, NFTNL_RULE_CHAIN, h->chain);
- if (h->handle)
- nftnl_rule_set_u64(nlr, NFTNL_RULE_HANDLE, h->handle);
- if (h->position)
- nftnl_rule_set_u64(nlr, NFTNL_RULE_POSITION, h->position);
+ if (h->handle.id)
+ nftnl_rule_set_u64(nlr, NFTNL_RULE_HANDLE, h->handle.id);
+ if (h->position.id)
+ nftnl_rule_set_u64(nlr, NFTNL_RULE_POSITION, h->position.id);
return nlr;
}
nftnl_chain_get_u32(nlc, NFTNL_CHAIN_FAMILY);
chain->handle.table =
xstrdup(nftnl_chain_get_str(nlc, NFTNL_CHAIN_TABLE));
- chain->handle.handle =
+ chain->handle.handle.id =
nftnl_chain_get_u64(nlc, NFTNL_CHAIN_HANDLE);
if (nftnl_chain_is_set(nlc, NFTNL_CHAIN_HOOKNUM) &&
h.family = nftnl_rule_get_u32(nlr, NFTNL_RULE_FAMILY);
h.table = xstrdup(nftnl_rule_get_str(nlr, NFTNL_RULE_TABLE));
h.chain = xstrdup(nftnl_rule_get_str(nlr, NFTNL_RULE_CHAIN));
- h.handle = nftnl_rule_get_u64(nlr, NFTNL_RULE_HANDLE);
+ h.handle.id = nftnl_rule_get_u64(nlr, NFTNL_RULE_HANDLE);
if (nftnl_rule_is_set(nlr, NFTNL_RULE_POSITION))
- h.position = nftnl_rule_get_u64(nlr, NFTNL_RULE_POSITION);
+ h.position.id = nftnl_rule_get_u64(nlr, NFTNL_RULE_POSITION);
pctx->rule = rule_alloc(&netlink_location, &h);
pctx->table = table_lookup(&h);
struct expr *expr;
struct set *set;
const struct datatype *datatype;
+ struct handle_spec handle_spec;
+ struct position_spec position_spec;
}
%token TOKEN_EOF 0 "end of file"
%destructor { handle_free(&$$); } table_spec chain_spec chain_identifier ruleid_spec ruleset_spec
%type <handle> set_spec set_identifier
%destructor { handle_free(&$$); } set_spec set_identifier
-%type <val> handle_spec family_spec family_spec_explicit position_spec chain_policy prio_spec
+%type <val> family_spec family_spec_explicit chain_policy prio_spec
+
+%type <handle_spec> handle_spec
+%type <position_spec> position_spec
%type <string> dev_spec
%destructor { xfree($$); } dev_spec
handle_spec : /* empty */
{
- $$ = 0;
+ memset(&$$, 0, sizeof($$));
}
| HANDLE NUM
{
- $$ = $2;
+ memset(&$$, 0, sizeof($$));
+ $$.location = @$;
+ $$.id = $2;
}
;
position_spec : /* empty */
{
- $$ = 0;
+ memset(&$$, 0, sizeof($$));
}
| POSITION NUM
{
- $$ = $2;
+ memset(&$$, 0, sizeof($$));
+ $$.location = @$;
+ $$.id = $2;
}
;
dst->chain = xstrdup(src->chain);
if (dst->set == NULL && src->set != NULL)
dst->set = xstrdup(src->set);
- if (dst->handle == 0)
+ if (dst->handle.id == 0)
dst->handle = src->handle;
- if (dst->position == 0)
+ if (dst->position.id == 0)
dst->position = src->position;
}
printf(" comment \"%s\"", rule->comment);
if (handle_output > 0)
- printf(" # handle %" PRIu64, rule->handle.handle);
+ printf(" # handle %" PRIu64, rule->handle.handle.id);
}
struct scope *scope_init(struct scope *scope, const struct scope *parent)