diff options
| author | Pablo Neira Ayuso <pablo@netfilter.org> | 2025-08-21 11:13:00 +0200 |
|---|---|---|
| committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2025-08-27 23:51:10 +0200 |
| commit | 59f03bf14835fe5764b016491ce50715df5711c2 (patch) | |
| tree | f8a090bd62f3bcb5176b45b2d97645ee78b457bb /src/parser_bison.y | |
| parent | d933d551f8db99f2e5f8b6ddcb3a8d9a7a68eeb0 (diff) | |
tunnel: add geneve support
This patch extends the tunnel metadata object to define geneve tunnel
specific configurations:
table netdev x {
tunnel y {
id 10
ip saddr 192.168.2.10
ip daddr 192.168.2.11
sport 10
dport 20
ttl 10
geneve {
class 0x1010 opt-type 0x1 data "0x12345678"
class 0x1020 opt-type 0x2 data "0x87654321"
class 0x2020 opt-type 0x3 data "0x87654321abcdeffe"
}
}
}
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/parser_bison.y')
| -rw-r--r-- | src/parser_bison.y | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/parser_bison.y b/src/parser_bison.y index ca93a658..13eb6027 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -613,6 +613,8 @@ int nft_lex(void *, void *, void *); %token EGRESS "egress" %token INGRESS "ingress" %token GBP "gbp" +%token CLASS "class" +%token OPTTYPE "opt-type" %token COUNTERS "counters" %token QUOTAS "quotas" @@ -771,7 +773,7 @@ int nft_lex(void *, void *, void *); %type <flowtable> flowtable_block_alloc flowtable_block %destructor { flowtable_free($$); } flowtable_block_alloc -%type <obj> obj_block_alloc counter_block quota_block ct_helper_block ct_timeout_block ct_expect_block limit_block secmark_block synproxy_block tunnel_block erspan_block erspan_block_alloc vxlan_block vxlan_block_alloc +%type <obj> obj_block_alloc counter_block quota_block ct_helper_block ct_timeout_block ct_expect_block limit_block secmark_block synproxy_block tunnel_block erspan_block erspan_block_alloc vxlan_block vxlan_block_alloc geneve_block geneve_block_alloc %destructor { obj_free($$); } obj_block_alloc %type <list> stmt_list stateful_stmt_list set_elem_stmt_list @@ -5012,6 +5014,44 @@ erspan_config : HDRVERSION NUM } ; +geneve_block : /* empty */ { $$ = $<obj>-1; } + | geneve_block common_block + | geneve_block stmt_separator + | geneve_block geneve_config stmt_separator + { + $$ = $1; + } + ; + +geneve_block_alloc : /* empty */ + { + $$ = $<obj>-1; + } + ; + +geneve_config : CLASS NUM OPTTYPE NUM DATA string + { + struct tunnel_geneve *geneve; + + geneve = xmalloc(sizeof(struct tunnel_geneve)); + geneve->geneve_class = $2; + geneve->type = $4; + if (tunnel_geneve_data_str2array($6, geneve->data, &geneve->data_len)) { + erec_queue(error(&@6, "Invalid data array %s\n", $6), state->msgs); + free_const($6); + free(geneve); + YYERROR; + } + + if (!$<obj>0->tunnel.type) { + $<obj>0->tunnel.type = TUNNEL_GENEVE; + init_list_head(&$<obj>0->tunnel.geneve_opts); + } + list_add_tail(&geneve->list, &$<obj>0->tunnel.geneve_opts); + free_const($6); + } + ; + vxlan_block : /* empty */ { $$ = $<obj>-1; } | vxlan_block common_block | vxlan_block stmt_separator @@ -5081,6 +5121,7 @@ tunnel_config : ID NUM { $<obj>0->tunnel.type = TUNNEL_VXLAN; } + | GENEVE geneve_block_alloc '{' geneve_block '}' ; tunnel_block : /* empty */ { $$ = $<obj>-1; } |
