summaryrefslogtreecommitdiff
path: root/lib/route/link/macsec.c
diff options
context:
space:
mode:
authorJohan Alexis Duque Cadena <johan.duque@technica-engineering.de>2021-11-26 19:18:57 +0100
committerThomas Haller <thaller@redhat.com>2022-03-03 12:53:33 +0100
commitb6cc13d76b2927640dc0e41b98fff0f211c643d4 (patch)
treebdad2853c3f0589c575133e5b35e4de0cc2362cd /lib/route/link/macsec.c
parent39944c67dc6f59b3ec1f291c7febad6abbb4e9bd (diff)
downloadlibnl-b6cc13d76b2927640dc0e41b98fff0f211c643d4.tar.gz
Supporting Hardware offload capability for MACsec
[thaller@redhat.com: adjust libnl-route-3.sym file] https://github.com/thom311/libnl/pull/300
Diffstat (limited to 'lib/route/link/macsec.c')
-rw-r--r--lib/route/link/macsec.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/lib/route/link/macsec.c b/lib/route/link/macsec.c
index baa26204..4d26673d 100644
--- a/lib/route/link/macsec.c
+++ b/lib/route/link/macsec.c
@@ -41,6 +41,7 @@
#define MACSEC_ATTR_REPLAY_PROTECT (1 << 10)
#define MACSEC_ATTR_VALIDATION (1 << 11)
#define MACSEC_ATTR_PORT (1 << 12)
+#define MACSEC_ATTR_OFFLOAD (1 << 13)
struct macsec_info {
int ifindex;
@@ -52,7 +53,7 @@ struct macsec_info {
enum macsec_validation_type validate;
uint8_t encoding_sa;
- uint8_t send_sci, end_station, scb, replay_protect, protect, encrypt;
+ uint8_t send_sci, end_station, scb, replay_protect, protect, encrypt, offload;
uint32_t ce_mask;
};
@@ -74,6 +75,7 @@ static struct nla_policy macsec_policy[IFLA_MACSEC_MAX+1] = {
[IFLA_MACSEC_SCB] = { .type = NLA_U8 },
[IFLA_MACSEC_REPLAY_PROTECT] = { .type = NLA_U8 },
[IFLA_MACSEC_VALIDATION] = { .type = NLA_U8 },
+ [IFLA_MACSEC_OFFLOAD] = { .type = NLA_U8 },
};
/**
@@ -158,6 +160,11 @@ static int macsec_parse(struct rtnl_link *link, struct nlattr *data,
info->ce_mask |= MACSEC_ATTR_ENCRYPT;
}
+ if (tb[IFLA_MACSEC_OFFLOAD]) {
+ info->offload = nla_get_u8(tb[IFLA_MACSEC_OFFLOAD]);
+ info->ce_mask |= MACSEC_ATTR_OFFLOAD;
+ }
+
if (tb[IFLA_MACSEC_INC_SCI]) {
info->send_sci = nla_get_u8(tb[IFLA_MACSEC_INC_SCI]);
info->ce_mask |= MACSEC_ATTR_INC_SCI;
@@ -306,6 +313,9 @@ static int macsec_put_attrs(struct nl_msg *msg, struct rtnl_link *link)
if ((info->ce_mask & MACSEC_ATTR_ENCRYPT))
NLA_PUT_U8(msg, IFLA_MACSEC_ENCRYPT, info->encrypt);
+ if ((info->ce_mask & MACSEC_ATTR_OFFLOAD))
+ NLA_PUT_U8(msg, IFLA_MACSEC_OFFLOAD, info->offload);
+
if (info->cipher_suite != MACSEC_DEFAULT_CIPHER_ID || info->icv_len != DEFAULT_ICV_LEN) {
NLA_PUT_U64(msg, IFLA_MACSEC_CIPHER_SUITE, info->cipher_suite);
NLA_PUT_U8(msg, IFLA_MACSEC_ICV_LEN, info->icv_len);
@@ -632,6 +642,36 @@ int rtnl_link_macsec_get_encrypt(struct rtnl_link *link, uint8_t *encrypt)
return 0;
}
+int rtnl_link_macsec_set_offload(struct rtnl_link *link, uint8_t offload)
+{
+ struct macsec_info *info = link->l_info;
+
+ IS_MACSEC_LINK_ASSERT(link);
+
+ if (offload > 1)
+ return -NLE_INVAL;
+
+ info->offload = offload;
+ info->ce_mask |= MACSEC_ATTR_OFFLOAD;
+
+ return 0;
+}
+
+int rtnl_link_macsec_get_offload(struct rtnl_link *link, uint8_t *offload)
+{
+ struct macsec_info *info = link->l_info;
+
+ IS_MACSEC_LINK_ASSERT(link);
+
+ if (!(info->ce_mask & MACSEC_ATTR_OFFLOAD))
+ return -NLE_NOATTR;
+
+ if (offload)
+ *offload = info->offload;
+
+ return 0;
+}
+
int rtnl_link_macsec_set_encoding_sa(struct rtnl_link *link, uint8_t encoding_sa)
{
struct macsec_info *info = link->l_info;