net: macsec: add support for offloading to the MAC
authorAntoine Tenart <antoine.tenart@bootlin.com>
Wed, 25 Mar 2020 12:52:33 +0000 (15:52 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Mar 2020 03:17:36 +0000 (20:17 -0700)
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
include/uapi/linux/if_link.h
tools/include/uapi/linux/if_link.h

index 35abebe95b79da50cbf1dcfadedaa43ea7b18b65..d29c072e19af62f1c50f7cb87364735f19bed8ed 100644 (file)
@@ -339,7 +339,8 @@ static void macsec_set_shortlen(struct macsec_eth_header *h, size_t data_len)
 /* 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 macsec_offload offload,
        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_get_ops(enum macsec_offload offload,
 
                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
index 61e0801c82dfa20fca018254c95dd9abeb9a75fb..d6ccd0105c050707613a3f9355cca762bc013fe3 100644 (file)
@@ -489,6 +489,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,
 };
index 024af2d1d0af4059cba0c40211b1095ecd55387e..771371d5b99600d2cf715c6eb7ab53926cce2bc7 100644 (file)
@@ -489,6 +489,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,
 };