mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-10-15 04:24:32 +00:00
platform: add support for macsec links
Add support for a new macsec link type and its netlink attributes to the platform code.
This commit is contained in:
parent
00463a6e09
commit
85103656e9
|
@ -129,6 +129,7 @@ typedef enum {
|
||||||
NM_LINK_TYPE_IP6TNL,
|
NM_LINK_TYPE_IP6TNL,
|
||||||
NM_LINK_TYPE_IPIP,
|
NM_LINK_TYPE_IPIP,
|
||||||
NM_LINK_TYPE_LOOPBACK,
|
NM_LINK_TYPE_LOOPBACK,
|
||||||
|
NM_LINK_TYPE_MACSEC,
|
||||||
NM_LINK_TYPE_MACVLAN,
|
NM_LINK_TYPE_MACVLAN,
|
||||||
NM_LINK_TYPE_MACVTAP,
|
NM_LINK_TYPE_MACVTAP,
|
||||||
NM_LINK_TYPE_OPENVSWITCH,
|
NM_LINK_TYPE_OPENVSWITCH,
|
||||||
|
@ -160,6 +161,7 @@ typedef enum {
|
||||||
NMP_OBJECT_TYPE_LNK_INFINIBAND,
|
NMP_OBJECT_TYPE_LNK_INFINIBAND,
|
||||||
NMP_OBJECT_TYPE_LNK_IP6TNL,
|
NMP_OBJECT_TYPE_LNK_IP6TNL,
|
||||||
NMP_OBJECT_TYPE_LNK_IPIP,
|
NMP_OBJECT_TYPE_LNK_IPIP,
|
||||||
|
NMP_OBJECT_TYPE_LNK_MACSEC,
|
||||||
NMP_OBJECT_TYPE_LNK_MACVLAN,
|
NMP_OBJECT_TYPE_LNK_MACVLAN,
|
||||||
NMP_OBJECT_TYPE_LNK_MACVTAP,
|
NMP_OBJECT_TYPE_LNK_MACVTAP,
|
||||||
NMP_OBJECT_TYPE_LNK_SIT,
|
NMP_OBJECT_TYPE_LNK_SIT,
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "nm-linux-platform.h"
|
#include "nm-linux-platform.h"
|
||||||
|
|
||||||
|
#include <endian.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@ -111,6 +112,25 @@
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define IFLA_MACSEC_UNSPEC 0
|
||||||
|
#define IFLA_MACSEC_SCI 1
|
||||||
|
#define IFLA_MACSEC_PORT 2
|
||||||
|
#define IFLA_MACSEC_ICV_LEN 3
|
||||||
|
#define IFLA_MACSEC_CIPHER_SUITE 4
|
||||||
|
#define IFLA_MACSEC_WINDOW 5
|
||||||
|
#define IFLA_MACSEC_ENCODING_SA 6
|
||||||
|
#define IFLA_MACSEC_ENCRYPT 7
|
||||||
|
#define IFLA_MACSEC_PROTECT 8
|
||||||
|
#define IFLA_MACSEC_INC_SCI 9
|
||||||
|
#define IFLA_MACSEC_ES 10
|
||||||
|
#define IFLA_MACSEC_SCB 11
|
||||||
|
#define IFLA_MACSEC_REPLAY_PROTECT 12
|
||||||
|
#define IFLA_MACSEC_VALIDATION 13
|
||||||
|
#define IFLA_MACSEC_PAD 14
|
||||||
|
#define __IFLA_MACSEC_MAX 15
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define _NMLOG_PREFIX_NAME "platform-linux"
|
#define _NMLOG_PREFIX_NAME "platform-linux"
|
||||||
#define _NMLOG_DOMAIN LOGD_PLATFORM
|
#define _NMLOG_DOMAIN LOGD_PLATFORM
|
||||||
#define _NMLOG2_DOMAIN LOGD_PLATFORM
|
#define _NMLOG2_DOMAIN LOGD_PLATFORM
|
||||||
|
@ -365,6 +385,7 @@ static const LinkDesc linktypes[] = {
|
||||||
{ NM_LINK_TYPE_IP6TNL, "ip6tnl", "ip6tnl", NULL },
|
{ NM_LINK_TYPE_IP6TNL, "ip6tnl", "ip6tnl", NULL },
|
||||||
{ NM_LINK_TYPE_IPIP, "ipip", "ipip", NULL },
|
{ NM_LINK_TYPE_IPIP, "ipip", "ipip", NULL },
|
||||||
{ NM_LINK_TYPE_LOOPBACK, "loopback", NULL, NULL },
|
{ NM_LINK_TYPE_LOOPBACK, "loopback", NULL, NULL },
|
||||||
|
{ NM_LINK_TYPE_MACSEC, "macsec", "macsec", NULL },
|
||||||
{ NM_LINK_TYPE_MACVLAN, "macvlan", "macvlan", NULL },
|
{ NM_LINK_TYPE_MACVLAN, "macvlan", "macvlan", NULL },
|
||||||
{ NM_LINK_TYPE_MACVTAP, "macvtap", "macvtap", NULL },
|
{ NM_LINK_TYPE_MACVTAP, "macvtap", "macvtap", NULL },
|
||||||
{ NM_LINK_TYPE_OPENVSWITCH, "openvswitch", "openvswitch", NULL },
|
{ NM_LINK_TYPE_OPENVSWITCH, "openvswitch", "openvswitch", NULL },
|
||||||
|
@ -1109,6 +1130,56 @@ _parse_lnk_macvlan (const char *kind, struct nlattr *info_data)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static NMPObject *
|
||||||
|
_parse_lnk_macsec (const char *kind, struct nlattr *info_data)
|
||||||
|
{
|
||||||
|
static struct nla_policy policy[__IFLA_MACSEC_MAX] = {
|
||||||
|
[IFLA_MACSEC_SCI] = { .type = NLA_U64 },
|
||||||
|
[IFLA_MACSEC_ICV_LEN] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_CIPHER_SUITE] = { .type = NLA_U64 },
|
||||||
|
[IFLA_MACSEC_WINDOW] = { .type = NLA_U32 },
|
||||||
|
[IFLA_MACSEC_ENCODING_SA] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_ENCRYPT] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_PROTECT] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_INC_SCI] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_ES] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_SCB] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_REPLAY_PROTECT] = { .type = NLA_U8 },
|
||||||
|
[IFLA_MACSEC_VALIDATION] = { .type = NLA_U8 },
|
||||||
|
};
|
||||||
|
struct nlattr *tb[__IFLA_MACSEC_MAX];
|
||||||
|
int err;
|
||||||
|
NMPObject *obj;
|
||||||
|
NMPlatformLnkMacsec *props;
|
||||||
|
|
||||||
|
if (!info_data || !nm_streq0 (kind, "macsec"))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
err = nla_parse_nested (tb, __IFLA_MACSEC_MAX - 1, info_data, policy);
|
||||||
|
if (err < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
obj = nmp_object_new (NMP_OBJECT_TYPE_LNK_MACSEC, NULL);
|
||||||
|
props = &obj->lnk_macsec;
|
||||||
|
|
||||||
|
props->sci = tb[IFLA_MACSEC_SCI] ? be64toh (nla_get_u64 (tb[IFLA_MACSEC_SCI])) : 0;
|
||||||
|
props->icv_length = tb[IFLA_MACSEC_ICV_LEN] ? nla_get_u8 (tb[IFLA_MACSEC_ICV_LEN]) : 0;
|
||||||
|
props->cipher_suite = tb [IFLA_MACSEC_CIPHER_SUITE] ? nla_get_u64 (tb[IFLA_MACSEC_CIPHER_SUITE]) : 0;
|
||||||
|
props->window = tb [IFLA_MACSEC_WINDOW] ? nla_get_u32 (tb[IFLA_MACSEC_WINDOW]) : 0;
|
||||||
|
props->encoding_sa = tb[IFLA_MACSEC_ENCODING_SA] ? !!nla_get_u8 (tb[IFLA_MACSEC_ENCODING_SA]) : 0;
|
||||||
|
props->encrypt = tb[IFLA_MACSEC_ENCRYPT] ? !!nla_get_u8 (tb[IFLA_MACSEC_ENCRYPT]) : 0;
|
||||||
|
props->protect = tb[IFLA_MACSEC_PROTECT] ? !!nla_get_u8 (tb[IFLA_MACSEC_PROTECT]) : 0;
|
||||||
|
props->include_sci = tb[IFLA_MACSEC_INC_SCI] ? !!nla_get_u8 (tb[IFLA_MACSEC_INC_SCI]) : 0;
|
||||||
|
props->es = tb[IFLA_MACSEC_ES] ? !!nla_get_u8 (tb[IFLA_MACSEC_ES]) : 0;
|
||||||
|
props->scb = tb[IFLA_MACSEC_SCB] ? !!nla_get_u8 (tb[IFLA_MACSEC_SCB]) : 0;
|
||||||
|
props->replay_protect = tb[IFLA_MACSEC_REPLAY_PROTECT] ? !!nla_get_u8 (tb[IFLA_MACSEC_REPLAY_PROTECT]) : 0;
|
||||||
|
props->validation = tb[IFLA_MACSEC_VALIDATION] ? nla_get_u8 (tb[IFLA_MACSEC_VALIDATION]) : 0;
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
static NMPObject *
|
static NMPObject *
|
||||||
_parse_lnk_sit (const char *kind, struct nlattr *info_data)
|
_parse_lnk_sit (const char *kind, struct nlattr *info_data)
|
||||||
{
|
{
|
||||||
|
@ -1555,6 +1626,9 @@ _new_from_nl_link (NMPlatform *platform, const NMPCache *cache, struct nlmsghdr
|
||||||
case NM_LINK_TYPE_IPIP:
|
case NM_LINK_TYPE_IPIP:
|
||||||
lnk_data = _parse_lnk_ipip (nl_info_kind, nl_info_data);
|
lnk_data = _parse_lnk_ipip (nl_info_kind, nl_info_data);
|
||||||
break;
|
break;
|
||||||
|
case NM_LINK_TYPE_MACSEC:
|
||||||
|
lnk_data = _parse_lnk_macsec (nl_info_kind, nl_info_data);
|
||||||
|
break;
|
||||||
case NM_LINK_TYPE_MACVLAN:
|
case NM_LINK_TYPE_MACVLAN:
|
||||||
case NM_LINK_TYPE_MACVTAP:
|
case NM_LINK_TYPE_MACVTAP:
|
||||||
lnk_data = _parse_lnk_macvlan (nl_info_kind, nl_info_data);
|
lnk_data = _parse_lnk_macvlan (nl_info_kind, nl_info_data);
|
||||||
|
@ -4812,6 +4886,68 @@ nla_put_failure:
|
||||||
g_return_val_if_reached (FALSE);
|
g_return_val_if_reached (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
link_macsec_add (NMPlatform *platform,
|
||||||
|
const char *name,
|
||||||
|
int parent,
|
||||||
|
const NMPlatformLnkMacsec *props,
|
||||||
|
const NMPlatformLink **out_link)
|
||||||
|
{
|
||||||
|
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||||
|
struct nlattr *info;
|
||||||
|
struct nlattr *data;
|
||||||
|
|
||||||
|
_LOGD ("adding macsec '%s' parent %u sci %llx",
|
||||||
|
name,
|
||||||
|
parent,
|
||||||
|
(unsigned long long) props->sci);
|
||||||
|
|
||||||
|
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||||
|
NLM_F_CREATE | NLM_F_EXCL,
|
||||||
|
0,
|
||||||
|
name,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
if (!nlmsg)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
NLA_PUT_U32 (nlmsg, IFLA_LINK, parent);
|
||||||
|
|
||||||
|
if (!(info = nla_nest_start (nlmsg, IFLA_LINKINFO)))
|
||||||
|
goto nla_put_failure;
|
||||||
|
|
||||||
|
NLA_PUT_STRING (nlmsg, IFLA_INFO_KIND, "macsec");
|
||||||
|
|
||||||
|
if (!(data = nla_nest_start (nlmsg, IFLA_INFO_DATA)))
|
||||||
|
goto nla_put_failure;
|
||||||
|
|
||||||
|
if (props->icv_length)
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_ICV_LEN, 16);
|
||||||
|
if (props->cipher_suite)
|
||||||
|
NLA_PUT_U64 (nlmsg, IFLA_MACSEC_CIPHER_SUITE, props->cipher_suite);
|
||||||
|
if (props->replay_protect)
|
||||||
|
NLA_PUT_U32 (nlmsg, IFLA_MACSEC_WINDOW, props->window);
|
||||||
|
|
||||||
|
NLA_PUT_U64 (nlmsg, IFLA_MACSEC_SCI, htobe64 (props->sci));
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_ENCODING_SA, props->encoding_sa);
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_ENCRYPT, props->encrypt);
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_PROTECT, props->protect);
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_INC_SCI, props->include_sci);
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_ES, props->es);
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_SCB, props->scb);
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_REPLAY_PROTECT, props->replay_protect);
|
||||||
|
NLA_PUT_U8 (nlmsg, IFLA_MACSEC_VALIDATION, props->validation);
|
||||||
|
|
||||||
|
nla_nest_end (nlmsg, data);
|
||||||
|
nla_nest_end (nlmsg, info);
|
||||||
|
|
||||||
|
return do_add_link_with_lookup (platform,
|
||||||
|
NM_LINK_TYPE_MACSEC,
|
||||||
|
name, nlmsg, out_link);
|
||||||
|
nla_put_failure:
|
||||||
|
g_return_val_if_reached (FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
link_macvlan_add (NMPlatform *platform,
|
link_macvlan_add (NMPlatform *platform,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
@ -6654,6 +6790,7 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
|
||||||
|
|
||||||
platform_class->link_gre_add = link_gre_add;
|
platform_class->link_gre_add = link_gre_add;
|
||||||
platform_class->link_ip6tnl_add = link_ip6tnl_add;
|
platform_class->link_ip6tnl_add = link_ip6tnl_add;
|
||||||
|
platform_class->link_macsec_add = link_macsec_add;
|
||||||
platform_class->link_macvlan_add = link_macvlan_add;
|
platform_class->link_macvlan_add = link_macvlan_add;
|
||||||
platform_class->link_ipip_add = link_ipip_add;
|
platform_class->link_ipip_add = link_ipip_add;
|
||||||
platform_class->link_sit_add = link_sit_add;
|
platform_class->link_sit_add = link_sit_add;
|
||||||
|
|
|
@ -1527,6 +1527,12 @@ nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLi
|
||||||
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_IPIP, out_link);
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_IPIP, out_link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NMPlatformLnkMacsec *
|
||||||
|
nm_platform_link_get_lnk_macsec (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
||||||
|
{
|
||||||
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_MACSEC, out_link);
|
||||||
|
}
|
||||||
|
|
||||||
const NMPlatformLnkMacvlan *
|
const NMPlatformLnkMacvlan *
|
||||||
nm_platform_link_get_lnk_macvlan (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
nm_platform_link_get_lnk_macvlan (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
||||||
{
|
{
|
||||||
|
@ -2170,6 +2176,43 @@ nm_platform_link_ipip_add (NMPlatform *self,
|
||||||
return NM_PLATFORM_ERROR_SUCCESS;
|
return NM_PLATFORM_ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_platform_macsec_add:
|
||||||
|
* @self: platform instance
|
||||||
|
* @name: name of the new interface
|
||||||
|
* @props: interface properties
|
||||||
|
* @out_link: on success, the link object
|
||||||
|
*
|
||||||
|
* Create a MACsec interface.
|
||||||
|
*/
|
||||||
|
NMPlatformError
|
||||||
|
nm_platform_link_macsec_add (NMPlatform *self,
|
||||||
|
const char *name,
|
||||||
|
int parent,
|
||||||
|
const NMPlatformLnkMacsec *props,
|
||||||
|
const NMPlatformLink **out_link)
|
||||||
|
{
|
||||||
|
NMPlatformError plerr;
|
||||||
|
|
||||||
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
||||||
|
|
||||||
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
||||||
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
||||||
|
|
||||||
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_MACSEC, out_link);
|
||||||
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||||
|
return plerr;
|
||||||
|
|
||||||
|
_LOGD ("adding macsec '%s' parent %u sci %llx",
|
||||||
|
name,
|
||||||
|
parent,
|
||||||
|
(unsigned long long) props->sci);
|
||||||
|
|
||||||
|
if (!klass->link_macsec_add (self, name, parent, props, out_link))
|
||||||
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||||
|
return NM_PLATFORM_ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_platform_macvlan_add:
|
* nm_platform_macvlan_add:
|
||||||
* @self: platform instance
|
* @self: platform instance
|
||||||
|
@ -3483,6 +3526,39 @@ nm_platform_lnk_ipip_to_string (const NMPlatformLnkIpIp *lnk, char *buf, gsize l
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
nm_platform_lnk_macsec_to_string (const NMPlatformLnkMacsec *lnk, char *buf, gsize len)
|
||||||
|
{
|
||||||
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
||||||
|
return buf;
|
||||||
|
|
||||||
|
g_snprintf (buf, len,
|
||||||
|
"macsec "
|
||||||
|
"sci %016llx "
|
||||||
|
"protect %s "
|
||||||
|
"cipher %016llx "
|
||||||
|
"icvlen %u "
|
||||||
|
"encodingsa %u "
|
||||||
|
"validate %u "
|
||||||
|
"encrypt %s "
|
||||||
|
"send_sci %s "
|
||||||
|
"end_station %s "
|
||||||
|
"scb %s "
|
||||||
|
"replay %s",
|
||||||
|
(unsigned long long) lnk->sci,
|
||||||
|
lnk->protect ? "on" : "off",
|
||||||
|
(unsigned long long) lnk->cipher_suite,
|
||||||
|
lnk->icv_length,
|
||||||
|
lnk->encoding_sa,
|
||||||
|
lnk->validation,
|
||||||
|
lnk->encrypt ? "on" : "off",
|
||||||
|
lnk->include_sci ? "on" : "off",
|
||||||
|
lnk->es ? "on" : "off",
|
||||||
|
lnk->scb ? "on" : "off",
|
||||||
|
lnk->replay_protect ? "on" : "off");
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
nm_platform_lnk_macvlan_to_string (const NMPlatformLnkMacvlan *lnk, char *buf, gsize len)
|
nm_platform_lnk_macvlan_to_string (const NMPlatformLnkMacvlan *lnk, char *buf, gsize len)
|
||||||
{
|
{
|
||||||
|
@ -4064,6 +4140,25 @@ nm_platform_lnk_ipip_cmp (const NMPlatformLnkIpIp *a, const NMPlatformLnkIpIp *b
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
nm_platform_lnk_macsec_cmp (const NMPlatformLnkMacsec *a, const NMPlatformLnkMacsec *b)
|
||||||
|
{
|
||||||
|
_CMP_SELF (a, b);
|
||||||
|
_CMP_FIELD (a, b, sci);
|
||||||
|
_CMP_FIELD (a, b, icv_length);
|
||||||
|
_CMP_FIELD (a, b, cipher_suite);
|
||||||
|
_CMP_FIELD (a, b, window);
|
||||||
|
_CMP_FIELD (a, b, encoding_sa);
|
||||||
|
_CMP_FIELD (a, b, validation);
|
||||||
|
_CMP_FIELD (a, b, encrypt);
|
||||||
|
_CMP_FIELD (a, b, protect);
|
||||||
|
_CMP_FIELD (a, b, include_sci);
|
||||||
|
_CMP_FIELD (a, b, es);
|
||||||
|
_CMP_FIELD (a, b, scb);
|
||||||
|
_CMP_FIELD (a, b, replay_protect);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
nm_platform_lnk_macvlan_cmp (const NMPlatformLnkMacvlan *a, const NMPlatformLnkMacvlan *b)
|
nm_platform_lnk_macvlan_cmp (const NMPlatformLnkMacvlan *a, const NMPlatformLnkMacvlan *b)
|
||||||
{
|
{
|
||||||
|
|
|
@ -426,6 +426,22 @@ typedef struct {
|
||||||
bool path_mtu_discovery:1;
|
bool path_mtu_discovery:1;
|
||||||
} NMPlatformLnkIpIp;
|
} NMPlatformLnkIpIp;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int parent_ifindex;
|
||||||
|
guint64 sci; /* host byte order */
|
||||||
|
guint64 cipher_suite;
|
||||||
|
guint32 window;
|
||||||
|
guint8 icv_length;
|
||||||
|
guint8 encoding_sa;
|
||||||
|
guint8 validation;
|
||||||
|
bool encrypt:1;
|
||||||
|
bool protect:1;
|
||||||
|
bool include_sci:1;
|
||||||
|
bool es:1;
|
||||||
|
bool scb:1;
|
||||||
|
bool replay_protect:1;
|
||||||
|
} NMPlatformLnkMacsec;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
guint mode;
|
guint mode;
|
||||||
bool no_promisc:1;
|
bool no_promisc:1;
|
||||||
|
@ -588,6 +604,11 @@ typedef struct {
|
||||||
const char *name,
|
const char *name,
|
||||||
const NMPlatformLnkIpIp *props,
|
const NMPlatformLnkIpIp *props,
|
||||||
const NMPlatformLink **out_link);
|
const NMPlatformLink **out_link);
|
||||||
|
gboolean (*link_macsec_add) (NMPlatform *,
|
||||||
|
const char *name,
|
||||||
|
int parent,
|
||||||
|
const NMPlatformLnkMacsec *props,
|
||||||
|
const NMPlatformLink **out_link);
|
||||||
gboolean (*link_macvlan_add) (NMPlatform *,
|
gboolean (*link_macvlan_add) (NMPlatform *,
|
||||||
const char *name,
|
const char *name,
|
||||||
int parent,
|
int parent,
|
||||||
|
@ -818,6 +839,7 @@ const NMPlatformLnkIp6Tnl *nm_platform_link_get_lnk_ip6tnl (NMPlatform *self, in
|
||||||
const NMPlatformLnkIpIp *nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
const NMPlatformLnkIpIp *nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||||
const NMPlatformLnkInfiniband *nm_platform_link_get_lnk_infiniband (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
const NMPlatformLnkInfiniband *nm_platform_link_get_lnk_infiniband (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||||
const NMPlatformLnkIpIp *nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
const NMPlatformLnkIpIp *nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||||
|
const NMPlatformLnkMacsec *nm_platform_link_get_lnk_macsec (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||||
const NMPlatformLnkMacvlan *nm_platform_link_get_lnk_macvlan (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
const NMPlatformLnkMacvlan *nm_platform_link_get_lnk_macvlan (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||||
const NMPlatformLnkMacvtap *nm_platform_link_get_lnk_macvtap (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
const NMPlatformLnkMacvtap *nm_platform_link_get_lnk_macvtap (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||||
const NMPlatformLnkSit *nm_platform_link_get_lnk_sit (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
const NMPlatformLnkSit *nm_platform_link_get_lnk_sit (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||||
|
@ -902,6 +924,11 @@ NMPlatformError nm_platform_link_ipip_add (NMPlatform *self,
|
||||||
const char *name,
|
const char *name,
|
||||||
const NMPlatformLnkIpIp *props,
|
const NMPlatformLnkIpIp *props,
|
||||||
const NMPlatformLink **out_link);
|
const NMPlatformLink **out_link);
|
||||||
|
NMPlatformError nm_platform_link_macsec_add (NMPlatform *self,
|
||||||
|
const char *name,
|
||||||
|
int parent,
|
||||||
|
const NMPlatformLnkMacsec *props,
|
||||||
|
const NMPlatformLink **out_link);
|
||||||
NMPlatformError nm_platform_link_macvlan_add (NMPlatform *self,
|
NMPlatformError nm_platform_link_macvlan_add (NMPlatform *self,
|
||||||
const char *name,
|
const char *name,
|
||||||
int parent,
|
int parent,
|
||||||
|
@ -956,6 +983,7 @@ const char *nm_platform_lnk_gre_to_string (const NMPlatformLnkGre *lnk, char *bu
|
||||||
const char *nm_platform_lnk_infiniband_to_string (const NMPlatformLnkInfiniband *lnk, char *buf, gsize len);
|
const char *nm_platform_lnk_infiniband_to_string (const NMPlatformLnkInfiniband *lnk, char *buf, gsize len);
|
||||||
const char *nm_platform_lnk_ip6tnl_to_string (const NMPlatformLnkIp6Tnl *lnk, char *buf, gsize len);
|
const char *nm_platform_lnk_ip6tnl_to_string (const NMPlatformLnkIp6Tnl *lnk, char *buf, gsize len);
|
||||||
const char *nm_platform_lnk_ipip_to_string (const NMPlatformLnkIpIp *lnk, char *buf, gsize len);
|
const char *nm_platform_lnk_ipip_to_string (const NMPlatformLnkIpIp *lnk, char *buf, gsize len);
|
||||||
|
const char *nm_platform_lnk_macsec_to_string (const NMPlatformLnkMacsec *lnk, char *buf, gsize len);
|
||||||
const char *nm_platform_lnk_macvlan_to_string (const NMPlatformLnkMacvlan *lnk, char *buf, gsize len);
|
const char *nm_platform_lnk_macvlan_to_string (const NMPlatformLnkMacvlan *lnk, char *buf, gsize len);
|
||||||
const char *nm_platform_lnk_sit_to_string (const NMPlatformLnkSit *lnk, char *buf, gsize len);
|
const char *nm_platform_lnk_sit_to_string (const NMPlatformLnkSit *lnk, char *buf, gsize len);
|
||||||
const char *nm_platform_lnk_vlan_to_string (const NMPlatformLnkVlan *lnk, char *buf, gsize len);
|
const char *nm_platform_lnk_vlan_to_string (const NMPlatformLnkVlan *lnk, char *buf, gsize len);
|
||||||
|
@ -976,6 +1004,7 @@ int nm_platform_lnk_gre_cmp (const NMPlatformLnkGre *a, const NMPlatformLnkGre *
|
||||||
int nm_platform_lnk_infiniband_cmp (const NMPlatformLnkInfiniband *a, const NMPlatformLnkInfiniband *b);
|
int nm_platform_lnk_infiniband_cmp (const NMPlatformLnkInfiniband *a, const NMPlatformLnkInfiniband *b);
|
||||||
int nm_platform_lnk_ip6tnl_cmp (const NMPlatformLnkIp6Tnl *a, const NMPlatformLnkIp6Tnl *b);
|
int nm_platform_lnk_ip6tnl_cmp (const NMPlatformLnkIp6Tnl *a, const NMPlatformLnkIp6Tnl *b);
|
||||||
int nm_platform_lnk_ipip_cmp (const NMPlatformLnkIpIp *a, const NMPlatformLnkIpIp *b);
|
int nm_platform_lnk_ipip_cmp (const NMPlatformLnkIpIp *a, const NMPlatformLnkIpIp *b);
|
||||||
|
int nm_platform_lnk_macsec_cmp (const NMPlatformLnkMacsec *a, const NMPlatformLnkMacsec *b);
|
||||||
int nm_platform_lnk_macvlan_cmp (const NMPlatformLnkMacvlan *a, const NMPlatformLnkMacvlan *b);
|
int nm_platform_lnk_macvlan_cmp (const NMPlatformLnkMacvlan *a, const NMPlatformLnkMacvlan *b);
|
||||||
int nm_platform_lnk_sit_cmp (const NMPlatformLnkSit *a, const NMPlatformLnkSit *b);
|
int nm_platform_lnk_sit_cmp (const NMPlatformLnkSit *a, const NMPlatformLnkSit *b);
|
||||||
int nm_platform_lnk_vlan_cmp (const NMPlatformLnkVlan *a, const NMPlatformLnkVlan *b);
|
int nm_platform_lnk_vlan_cmp (const NMPlatformLnkVlan *a, const NMPlatformLnkVlan *b);
|
||||||
|
|
|
@ -2230,6 +2230,15 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
|
||||||
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ipip_to_string,
|
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ipip_to_string,
|
||||||
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ipip_cmp,
|
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ipip_cmp,
|
||||||
},
|
},
|
||||||
|
[NMP_OBJECT_TYPE_LNK_MACSEC - 1] = {
|
||||||
|
.obj_type = NMP_OBJECT_TYPE_LNK_MACSEC,
|
||||||
|
.sizeof_data = sizeof (NMPObjectLnkMacsec),
|
||||||
|
.sizeof_public = sizeof (NMPlatformLnkMacsec),
|
||||||
|
.obj_type_name = "macsec",
|
||||||
|
.lnk_link_type = NM_LINK_TYPE_MACSEC,
|
||||||
|
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_macsec_to_string,
|
||||||
|
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macsec_cmp,
|
||||||
|
},
|
||||||
[NMP_OBJECT_TYPE_LNK_MACVLAN - 1] = {
|
[NMP_OBJECT_TYPE_LNK_MACVLAN - 1] = {
|
||||||
.obj_type = NMP_OBJECT_TYPE_LNK_MACVLAN,
|
.obj_type = NMP_OBJECT_TYPE_LNK_MACVLAN,
|
||||||
.sizeof_data = sizeof (NMPObjectLnkMacvlan),
|
.sizeof_data = sizeof (NMPObjectLnkMacvlan),
|
||||||
|
|
|
@ -206,6 +206,10 @@ typedef struct {
|
||||||
NMPlatformLnkIpIp _public;
|
NMPlatformLnkIpIp _public;
|
||||||
} NMPObjectLnkIpIp;
|
} NMPObjectLnkIpIp;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
NMPlatformLnkMacsec _public;
|
||||||
|
} NMPObjectLnkMacsec;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
NMPlatformLnkMacvlan _public;
|
NMPlatformLnkMacvlan _public;
|
||||||
} NMPObjectLnkMacvlan;
|
} NMPObjectLnkMacvlan;
|
||||||
|
@ -267,6 +271,9 @@ struct _NMPObject {
|
||||||
NMPlatformLnkIp6Tnl lnk_ip6tnl;
|
NMPlatformLnkIp6Tnl lnk_ip6tnl;
|
||||||
NMPObjectLnkIp6Tnl _lnk_ip6tnl;
|
NMPObjectLnkIp6Tnl _lnk_ip6tnl;
|
||||||
|
|
||||||
|
NMPlatformLnkMacsec lnk_macsec;
|
||||||
|
NMPObjectLnkMacsec _lnk_macsec;
|
||||||
|
|
||||||
NMPlatformLnkMacvlan lnk_macvlan;
|
NMPlatformLnkMacvlan lnk_macvlan;
|
||||||
NMPObjectLnkMacvlan _lnk_macvlan;
|
NMPObjectLnkMacvlan _lnk_macvlan;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue