| From 21114b7feec29e4425a3ac48a037569c016a46c8 Mon Sep 17 00:00:00 2001 |
| From: Antoine Tenart <antoine.tenart@bootlin.com> |
| Date: Wed, 25 Mar 2020 15:52:33 +0300 |
| Subject: net: macsec: add support for offloading to the MAC |
| |
| This patch adds a new MACsec offloading option, MACSEC_OFFLOAD_MAC, |
| allowing a user to select a MAC as a provider for MACsec offloading |
| operations. |
| |
| Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com> |
| Signed-off-by: Mark Starovoytov <mstarovoitov@marvell.com> |
| Signed-off-by: Igor Russkikh <irusskikh@marvell.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| --- |
| drivers/net/macsec.c | 13 +++++++++++-- |
| include/uapi/linux/if_link.h | 1 + |
| tools/include/uapi/linux/if_link.h | 1 + |
| 3 files changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/macsec.c |
| +++ b/drivers/net/macsec.c |
| @@ -339,7 +339,8 @@ static void macsec_set_shortlen(struct m |
| /* Checks if a MACsec interface is being offloaded to an hardware engine */ |
| static bool macsec_is_offloaded(struct macsec_dev *macsec) |
| { |
| - if (macsec->offload == MACSEC_OFFLOAD_PHY) |
| + if (macsec->offload == MACSEC_OFFLOAD_MAC || |
| + macsec->offload == MACSEC_OFFLOAD_PHY) |
| return true; |
| |
| return false; |
| @@ -355,6 +356,9 @@ static bool macsec_check_offload(enum ma |
| if (offload == MACSEC_OFFLOAD_PHY) |
| return macsec->real_dev->phydev && |
| macsec->real_dev->phydev->macsec_ops; |
| + else if (offload == MACSEC_OFFLOAD_MAC) |
| + return macsec->real_dev->features & NETIF_F_HW_MACSEC && |
| + macsec->real_dev->macsec_ops; |
| |
| return false; |
| } |
| @@ -369,9 +373,14 @@ static const struct macsec_ops *__macsec |
| |
| if (offload == MACSEC_OFFLOAD_PHY) |
| ctx->phydev = macsec->real_dev->phydev; |
| + else if (offload == MACSEC_OFFLOAD_MAC) |
| + ctx->netdev = macsec->real_dev; |
| } |
| |
| - return macsec->real_dev->phydev->macsec_ops; |
| + if (offload == MACSEC_OFFLOAD_PHY) |
| + return macsec->real_dev->phydev->macsec_ops; |
| + else |
| + return macsec->real_dev->macsec_ops; |
| } |
| |
| /* Returns a pointer to the MACsec ops struct if any and updates the MACsec |
| --- a/include/uapi/linux/if_link.h |
| +++ b/include/uapi/linux/if_link.h |
| @@ -486,6 +486,7 @@ enum macsec_validation_type { |
| enum macsec_offload { |
| MACSEC_OFFLOAD_OFF = 0, |
| MACSEC_OFFLOAD_PHY = 1, |
| + MACSEC_OFFLOAD_MAC = 2, |
| __MACSEC_OFFLOAD_END, |
| MACSEC_OFFLOAD_MAX = __MACSEC_OFFLOAD_END - 1, |
| }; |
| --- a/tools/include/uapi/linux/if_link.h |
| +++ b/tools/include/uapi/linux/if_link.h |
| @@ -486,6 +486,7 @@ enum macsec_validation_type { |
| enum macsec_offload { |
| MACSEC_OFFLOAD_OFF = 0, |
| MACSEC_OFFLOAD_PHY = 1, |
| + MACSEC_OFFLOAD_MAC = 2, |
| __MACSEC_OFFLOAD_END, |
| MACSEC_OFFLOAD_MAX = __MACSEC_OFFLOAD_END - 1, |
| }; |