]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bnxt_en: Do not allow ethtool -m on an untrusted VF
authorMichael Chan <michael.chan@broadcom.com>
Tue, 17 Dec 2024 18:26:16 +0000 (10:26 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 20 Dec 2024 01:30:00 +0000 (17:30 -0800)
Block all ethtool module operations on an untrusted VF.  The firmware
won't allow it and will return error.

Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20241217182620.2454075-3-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 469352ac1f7e7e0b6db99dd0851848617adf89e9..c0728d5ff8bc157825c1db596dad3d2cfa924ec3 100644 (file)
@@ -8279,16 +8279,20 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
        if (rc)
                goto func_qcfg_exit;
 
+       flags = le16_to_cpu(resp->flags);
 #ifdef CONFIG_BNXT_SRIOV
        if (BNXT_VF(bp)) {
                struct bnxt_vf_info *vf = &bp->vf;
 
                vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK;
+               if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF)
+                       vf->flags |= BNXT_VF_TRUST;
+               else
+                       vf->flags &= ~BNXT_VF_TRUST;
        } else {
                bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs);
        }
 #endif
-       flags = le16_to_cpu(resp->flags);
        if (flags & (FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED |
                     FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED)) {
                bp->fw_cap |= BNXT_FW_CAP_LLDP_AGENT;
index 3e20d200da6203c6b1a6c36b63970fba623fb073..d5e81e008ab5bc6ec50670e966ed6dff4dc4a5bb 100644 (file)
@@ -2270,6 +2270,11 @@ struct bnxt {
 
 #define BNXT_PF(bp)            (!((bp)->flags & BNXT_FLAG_VF))
 #define BNXT_VF(bp)            ((bp)->flags & BNXT_FLAG_VF)
+#ifdef CONFIG_BNXT_SRIOV
+#define        BNXT_VF_IS_TRUSTED(bp)  ((bp)->vf.flags & BNXT_VF_TRUST)
+#else
+#define        BNXT_VF_IS_TRUSTED(bp)  0
+#endif
 #define BNXT_NPAR(bp)          ((bp)->port_partition_type)
 #define BNXT_MH(bp)            ((bp)->flags & BNXT_FLAG_MULTI_HOST)
 #define BNXT_SINGLE_PF(bp)     (BNXT_PF(bp) && !BNXT_NPAR(bp) && !BNXT_MH(bp))
index d87681d711067c73ef42b77033f7aa15bec51f7e..28f2c471652c4b10e2cdfdfee114fbc61dfa5274 100644 (file)
@@ -4375,6 +4375,9 @@ static int bnxt_get_module_info(struct net_device *dev,
        struct bnxt *bp = netdev_priv(dev);
        int rc;
 
+       if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
+               return -EPERM;
+
        /* No point in going further if phy status indicates
         * module is not inserted or if it is powered down or
         * if it is of type 10GBase-T
@@ -4426,6 +4429,9 @@ static int bnxt_get_module_eeprom(struct net_device *dev,
        u16  start = eeprom->offset, length = eeprom->len;
        int rc = 0;
 
+       if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
+               return -EPERM;
+
        memset(data, 0, eeprom->len);
 
        /* Read A0 portion of the EEPROM */
@@ -4480,6 +4486,12 @@ static int bnxt_get_module_eeprom_by_page(struct net_device *dev,
        struct bnxt *bp = netdev_priv(dev);
        int rc;
 
+       if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Module read not permitted on untrusted VF");
+               return -EPERM;
+       }
+
        rc = bnxt_get_module_status(bp, extack);
        if (rc)
                return rc;