Added support for xfrm interfaces
This commit is contained in:
@@ -22,6 +22,7 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"")
|
||||
#include "netdev/wireguard.h"
|
||||
#include "netdev/fou-tunnel.h"
|
||||
#include "netdev/l2tp-tunnel.h"
|
||||
#include "netdev/xfrm.h"
|
||||
#include "vlan-util.h"
|
||||
%}
|
||||
struct ConfigPerfItem;
|
||||
@@ -218,3 +219,5 @@ WireGuardPeer.PublicKey, config_parse_wireguard_public_key,
|
||||
WireGuardPeer.PresharedKey, config_parse_wireguard_preshared_key, 0, 0
|
||||
WireGuardPeer.PresharedKeyFile, config_parse_wireguard_preshared_key_file, 0, 0
|
||||
WireGuardPeer.PersistentKeepalive, config_parse_wireguard_keepalive, 0, 0
|
||||
Xfrm.InterfaceId, config_parse_uint32, 0, offsetof(Xfrm, if_id)
|
||||
Xfrm.Independent, config_parse_bool, 0, offsetof(Xfrm, independent)
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "netdev/vxcan.h"
|
||||
#include "netdev/vxlan.h"
|
||||
#include "netdev/wireguard.h"
|
||||
#include "netdev/xfrm.h"
|
||||
#include "netlink-util.h"
|
||||
#include "network-internal.h"
|
||||
#include "networkd-link.h"
|
||||
@@ -72,6 +73,7 @@ const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = {
|
||||
[NETDEV_KIND_L2TP] = &l2tptnl_vtable,
|
||||
[NETDEV_KIND_MACSEC] = &macsec_vtable,
|
||||
[NETDEV_KIND_NLMON] = &nlmon_vtable,
|
||||
[NETDEV_KIND_XFRM] = &xfrm_vtable,
|
||||
};
|
||||
|
||||
static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
|
||||
@@ -107,6 +109,7 @@ static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
|
||||
[NETDEV_KIND_L2TP] = "l2tp",
|
||||
[NETDEV_KIND_MACSEC] = "macsec",
|
||||
[NETDEV_KIND_NLMON] = "nlmon",
|
||||
[NETDEV_KIND_XFRM] = "xfrm",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind);
|
||||
@@ -807,6 +810,9 @@ int netdev_load_one(Manager *manager, const char *filename) {
|
||||
case NETDEV_KIND_ERSPAN:
|
||||
independent = ERSPAN(netdev)->independent;
|
||||
break;
|
||||
case NETDEV_KIND_XFRM:
|
||||
independent = XFRM(netdev)->independent;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ typedef enum NetDevKind {
|
||||
NETDEV_KIND_L2TP,
|
||||
NETDEV_KIND_MACSEC,
|
||||
NETDEV_KIND_NLMON,
|
||||
NETDEV_KIND_XFRM,
|
||||
_NETDEV_KIND_MAX,
|
||||
_NETDEV_KIND_TUNNEL, /* Used by config_parse_stacked_netdev() */
|
||||
_NETDEV_KIND_INVALID = -1
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include "missing_network.h"
|
||||
#include "netdev/xfrm.h"
|
||||
|
||||
static int xfrm_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *message) {
|
||||
int if_idx, r;
|
||||
Xfrm *x;
|
||||
|
||||
assert(netdev);
|
||||
assert(message);
|
||||
|
||||
x = XFRM(netdev);
|
||||
|
||||
if (x->independent)
|
||||
if_idx = LOOPBACK_IFINDEX;
|
||||
else {
|
||||
assert(link);
|
||||
if (link->ifindex == 0)
|
||||
return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(ENODEV), "Could not get interface index: %m");
|
||||
if_idx = link->ifindex;
|
||||
}
|
||||
|
||||
r = sd_netlink_message_append_u32(message, IFLA_XFRM_LINK, if_idx);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not append IFLA_XFRM_LINK: %m");
|
||||
|
||||
r = sd_netlink_message_append_u32(message, IFLA_XFRM_IF_ID, x->if_id);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not append IFLA_XFRM_IF_ID: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const NetDevVTable xfrm_vtable = {
|
||||
.object_size = sizeof(Xfrm),
|
||||
.sections = "Match\0NetDev\0Xfrm\0",
|
||||
.fill_message_create = xfrm_fill_message_create,
|
||||
.create_type = NETDEV_CREATE_STACKED
|
||||
};
|
||||
@@ -0,0 +1,14 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
#include "netdev/netdev.h"
|
||||
|
||||
typedef struct Xfrm {
|
||||
NetDev meta;
|
||||
|
||||
uint32_t if_id;
|
||||
bool independent;
|
||||
} Xfrm;
|
||||
|
||||
DEFINE_NETDEV_CAST(XFRM, Xfrm);
|
||||
extern const NetDevVTable xfrm_vtable;
|
||||
Reference in New Issue
Block a user