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/netlink.c | |
| 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/netlink.c')
| -rw-r--r-- | src/netlink.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/netlink.c b/src/netlink.c index e132362b..5bae3b82 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -1843,6 +1843,35 @@ static int tunnel_parse_opt_cb(struct nftnl_tunnel_opt *opt, void *data) { obj->tunnel.vxlan.gbp = nftnl_tunnel_opt_get_u32(opt, NFTNL_TUNNEL_VXLAN_GBP); } break; + case NFTNL_TUNNEL_TYPE_GENEVE: + struct tunnel_geneve *geneve; + const void *data; + + if (!obj->tunnel.type) { + init_list_head(&obj->tunnel.geneve_opts); + obj->tunnel.type = TUNNEL_GENEVE; + } + + geneve = xmalloc(sizeof(struct tunnel_geneve)); + if (!geneve) + memory_allocation_error(); + + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_GENEVE_TYPE)) + geneve->type = nftnl_tunnel_opt_get_u8(opt, NFTNL_TUNNEL_GENEVE_TYPE); + + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_GENEVE_CLASS)) + geneve->geneve_class = nftnl_tunnel_opt_get_u16(opt, NFTNL_TUNNEL_GENEVE_CLASS); + + if (nftnl_tunnel_opt_get_flags(opt) & (1 << NFTNL_TUNNEL_GENEVE_DATA)) { + data = nftnl_tunnel_opt_get_data(opt, NFTNL_TUNNEL_GENEVE_DATA, + &geneve->data_len); + if (!data) + return -1; + memcpy(&geneve->data, data, geneve->data_len); + } + + list_add_tail(&geneve->list, &obj->tunnel.geneve_opts); + break; default: break; } |
