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/netlink.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/netlink.c')
| -rw-r--r-- | src/netlink.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/netlink.c b/src/netlink.c index f0a9c02b..4ef88402 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -1808,6 +1808,41 @@ static int obj_parse_udata_cb(const struct nftnl_udata *attr, void *data) return 0; } +static int tunnel_parse_opt_cb(struct nftnl_tunnel_opt *opt, void *data) { + + struct obj *obj = data; + + switch (nftnl_tunnel_opt_get_type(opt)) { + case NFTNL_TUNNEL_TYPE_ERSPAN: + obj->tunnel.type = TUNNEL_ERSPAN; + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_ERSPAN_VERSION)) { + obj->tunnel.erspan.version = + nftnl_tunnel_opt_get_u32(opt, + NFTNL_TUNNEL_ERSPAN_VERSION); + } + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_ERSPAN_V1_INDEX)) { + obj->tunnel.erspan.v1.index = + nftnl_tunnel_opt_get_u32(opt, + NFTNL_TUNNEL_ERSPAN_V1_INDEX); + } + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_ERSPAN_V2_HWID)) { + obj->tunnel.erspan.v2.hwid = + nftnl_tunnel_opt_get_u8(opt, + NFTNL_TUNNEL_ERSPAN_V2_HWID); + } + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_ERSPAN_V2_DIR)) { + obj->tunnel.erspan.v2.direction = + nftnl_tunnel_opt_get_u8(opt, + NFTNL_TUNNEL_ERSPAN_V2_DIR); + } + break; + default: + break; + } + + return 0; +} + struct obj *netlink_delinearize_obj(struct netlink_ctx *ctx, struct nftnl_obj *nlo) { @@ -1938,6 +1973,9 @@ struct obj *netlink_delinearize_obj(struct netlink_ctx *ctx, obj->tunnel.dst = netlink_obj_tunnel_parse_addr(nlo, NFTNL_OBJ_TUNNEL_IPV6_DST); } + if (nftnl_obj_is_set(nlo, NFTNL_OBJ_TUNNEL_OPTS)) { + nftnl_obj_tunnel_opts_foreach(nlo, tunnel_parse_opt_cb, obj); + } break; default: netlink_io_error(ctx, NULL, "Unknown object type %u", type); |
