diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mnl.c | 16 | ||||
| -rw-r--r-- | src/netlink.c | 7 | ||||
| -rw-r--r-- | src/parser_bison.y | 28 | ||||
| -rw-r--r-- | src/rule.c | 10 | ||||
| -rw-r--r-- | src/scanner.l | 1 |
5 files changed, 61 insertions, 1 deletions
@@ -1516,6 +1516,22 @@ static void obj_tunnel_add_opts(struct nftnl_obj *nlo, struct tunnel *tunnel) nftnl_tunnel_opts_add(opts, opt); nftnl_obj_set_data(nlo, NFTNL_OBJ_TUNNEL_OPTS, &opts, sizeof(struct nftnl_tunnel_opts *)); break; + case TUNNEL_VXLAN: + opts = nftnl_tunnel_opts_alloc(NFTNL_TUNNEL_TYPE_VXLAN); + if (!opts) + memory_allocation_error(); + + opt = nftnl_tunnel_opt_alloc(NFTNL_TUNNEL_TYPE_VXLAN); + if (!opt) + memory_allocation_error(); + + nftnl_tunnel_opt_set(opt, NFTNL_TUNNEL_VXLAN_GBP, + &tunnel->vxlan.gbp, + sizeof(tunnel->vxlan.gbp)); + + nftnl_tunnel_opts_add(opts, opt); + nftnl_obj_set_data(nlo, NFTNL_OBJ_TUNNEL_OPTS, &opts, sizeof(struct nftnl_tunnel_opts *)); + break; case TUNNEL_UNSPEC: break; } diff --git a/src/netlink.c b/src/netlink.c index 4ef88402..e132362b 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -1836,6 +1836,13 @@ static int tunnel_parse_opt_cb(struct nftnl_tunnel_opt *opt, void *data) { NFTNL_TUNNEL_ERSPAN_V2_DIR); } break; + case NFTNL_TUNNEL_TYPE_VXLAN: + obj->tunnel.type = TUNNEL_VXLAN; + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_VXLAN_GBP)) { + obj->tunnel.type = TUNNEL_VXLAN; + obj->tunnel.vxlan.gbp = nftnl_tunnel_opt_get_u32(opt, NFTNL_TUNNEL_VXLAN_GBP); + } + break; default: break; } diff --git a/src/parser_bison.y b/src/parser_bison.y index 08d75dbb..ca93a658 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -612,6 +612,7 @@ int nft_lex(void *, void *, void *); %token ERSPAN "erspan" %token EGRESS "egress" %token INGRESS "ingress" +%token GBP "gbp" %token COUNTERS "counters" %token QUOTAS "quotas" @@ -770,7 +771,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 +%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 %destructor { obj_free($$); } obj_block_alloc %type <list> stmt_list stateful_stmt_list set_elem_stmt_list @@ -5011,6 +5012,27 @@ erspan_config : HDRVERSION NUM } ; +vxlan_block : /* empty */ { $$ = $<obj>-1; } + | vxlan_block common_block + | vxlan_block stmt_separator + | vxlan_block vxlan_config stmt_separator + { + $$ = $1; + } + ; + +vxlan_block_alloc : /* empty */ + { + $$ = $<obj>-1; + } + ; + +vxlan_config : GBP NUM + { + $<obj>0->tunnel.vxlan.gbp = $2; + } + ; + tunnel_config : ID NUM { $<obj>0->tunnel.id = $2; @@ -5055,6 +5077,10 @@ tunnel_config : ID NUM { $<obj>0->tunnel.type = TUNNEL_ERSPAN; } + | VXLAN vxlan_block_alloc '{' vxlan_block '}' + { + $<obj>0->tunnel.type = TUNNEL_VXLAN; + } ; tunnel_block : /* empty */ { $$ = $<obj>-1; } @@ -2043,6 +2043,16 @@ static void obj_print_data(const struct obj *obj, } nft_print(octx, "%s%s%s}", opts->nl, opts->tab, opts->tab); + break; + case TUNNEL_VXLAN: + nft_print(octx, "%s%s%svxlan {", + opts->nl, opts->tab, opts->tab); + nft_print(octx, "%s%s%s%sgbp %u", + opts->nl, opts->tab, opts->tab, opts->tab, + obj->tunnel.vxlan.gbp); + nft_print(octx, "%s%s%s}", + opts->nl, opts->tab, opts->tab); + break; default: break; } diff --git a/src/scanner.l b/src/scanner.l index 9695d710..74ebca3b 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -827,6 +827,7 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr}) "egress" { return EGRESS; } "ingress" { return INGRESS; } "path" { return PATH; } + "gbp" { return GBP; } } "notrack" { return NOTRACK; } |
