summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/netlink.c14
-rw-r--r--src/netlink_delinearize.c4
-rw-r--r--src/parser_bison.y19
-rw-r--r--src/rule.c6
4 files changed, 26 insertions, 17 deletions
diff --git a/src/netlink.c b/src/netlink.c
index ba0c20a0..e3ba2ed3 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -143,8 +143,8 @@ struct nftnl_chain *alloc_nftnl_chain(const struct handle *h)
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);
@@ -163,10 +163,10 @@ struct nftnl_rule *alloc_nftnl_rule(const struct handle *h)
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;
}
@@ -700,7 +700,7 @@ static struct chain *netlink_delinearize_chain(struct netlink_ctx *ctx,
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) &&
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
index d431588f..848acd66 100644
--- a/src/netlink_delinearize.c
+++ b/src/netlink_delinearize.c
@@ -1759,10 +1759,10 @@ struct rule *netlink_delinearize_rule(struct netlink_ctx *ctx,
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);
diff --git a/src/parser_bison.y b/src/parser_bison.y
index 9e86f265..4b7c1f5a 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -133,6 +133,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
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"
@@ -423,7 +425,10 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%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
@@ -1218,21 +1223,25 @@ set_identifier : identifier
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;
}
;
diff --git a/src/rule.c b/src/rule.c
index 0ed77941..b7f4a07f 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -44,9 +44,9 @@ void handle_merge(struct handle *dst, const struct handle *src)
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;
}
@@ -393,7 +393,7 @@ void rule_print(const struct rule *rule)
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)