diff options
| author | Pablo Neira Ayuso <pablo@netfilter.org> | 2025-08-21 11:12:57 +0200 |
|---|---|---|
| committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2025-08-27 23:50:58 +0200 |
| commit | ffc40b38d58d3f754d20c0e586981b2f442a247e (patch) | |
| tree | 9935ca117fa1c3253c4d4e6384191be4a54a45eb /src/mnl.c | |
| parent | 35d9c77c5745219ad6bf1c5fc7512c1c92c70457 (diff) | |
tunnel: add erspan support
This patch extends the tunnel metadata object to define erspan 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
erspan {
version 1
index 2
}
}
}
Joint work with Fernando.
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/mnl.c')
| -rw-r--r-- | src/mnl.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -1479,6 +1479,48 @@ err: return NULL; } +static void obj_tunnel_add_opts(struct nftnl_obj *nlo, struct tunnel *tunnel) +{ + struct nftnl_tunnel_opts *opts; + struct nftnl_tunnel_opt *opt; + + switch (tunnel->type) { + case TUNNEL_ERSPAN: + opts = nftnl_tunnel_opts_alloc(NFTNL_TUNNEL_TYPE_ERSPAN); + if (!opts) + memory_allocation_error(); + + opt = nftnl_tunnel_opt_alloc(NFTNL_TUNNEL_TYPE_ERSPAN); + if (!opt) + memory_allocation_error(); + + nftnl_tunnel_opt_set(opt, NFTNL_TUNNEL_ERSPAN_VERSION, + &tunnel->erspan.version, + sizeof(tunnel->erspan.version)); + switch (tunnel->erspan.version) { + case 1: + nftnl_tunnel_opt_set(opt, NFTNL_TUNNEL_ERSPAN_V1_INDEX, + &tunnel->erspan.v1.index, + sizeof(tunnel->erspan.v1.index)); + break; + case 2: + nftnl_tunnel_opt_set(opt, NFTNL_TUNNEL_ERSPAN_V2_DIR, + &tunnel->erspan.v2.direction, + sizeof(tunnel->erspan.v2.direction)); + nftnl_tunnel_opt_set(opt, NFTNL_TUNNEL_ERSPAN_V2_HWID, + &tunnel->erspan.v2.hwid, + sizeof(tunnel->erspan.v2.hwid)); + break; + } + + 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; + } +} + int mnl_nft_obj_add(struct netlink_ctx *ctx, struct cmd *cmd, unsigned int flags) { @@ -1610,6 +1652,7 @@ int mnl_nft_obj_add(struct netlink_ctx *ctx, struct cmd *cmd, nld.value, nld.len); } } + obj_tunnel_add_opts(nlo, &obj->tunnel); break; default: BUG("Unknown type %d\n", obj->type); |
