net: lan966x: Add support for apptrust
Make use of set/getapptrust() to implement per-selector trust and trust order. Reviewed-by: Daniel Machon <daniel.machon@microchip.com> Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
a83e463036
commit
10c71a97ee
@ -2,7 +2,49 @@
|
||||
|
||||
#include "lan966x_main.h"
|
||||
|
||||
static void lan966x_dcb_app_update(struct net_device *dev, bool enable)
|
||||
enum lan966x_dcb_apptrust_values {
|
||||
LAN966X_DCB_APPTRUST_EMPTY,
|
||||
LAN966X_DCB_APPTRUST_DSCP,
|
||||
LAN966X_DCB_APPTRUST_PCP,
|
||||
LAN966X_DCB_APPTRUST_DSCP_PCP,
|
||||
__LAN966X_DCB_APPTRUST_MAX
|
||||
};
|
||||
|
||||
static const struct lan966x_dcb_apptrust {
|
||||
u8 selectors[IEEE_8021QAZ_APP_SEL_MAX + 1];
|
||||
int nselectors;
|
||||
} *lan966x_port_apptrust[NUM_PHYS_PORTS];
|
||||
|
||||
static const char *lan966x_dcb_apptrust_names[__LAN966X_DCB_APPTRUST_MAX] = {
|
||||
[LAN966X_DCB_APPTRUST_EMPTY] = "empty",
|
||||
[LAN966X_DCB_APPTRUST_DSCP] = "dscp",
|
||||
[LAN966X_DCB_APPTRUST_PCP] = "pcp",
|
||||
[LAN966X_DCB_APPTRUST_DSCP_PCP] = "dscp pcp"
|
||||
};
|
||||
|
||||
/* Lan966x supported apptrust policies */
|
||||
static const struct lan966x_dcb_apptrust
|
||||
lan966x_dcb_apptrust_policies[__LAN966X_DCB_APPTRUST_MAX] = {
|
||||
/* Empty *must* be first */
|
||||
[LAN966X_DCB_APPTRUST_EMPTY] = { { 0 }, 0 },
|
||||
[LAN966X_DCB_APPTRUST_DSCP] = { { IEEE_8021QAZ_APP_SEL_DSCP }, 1 },
|
||||
[LAN966X_DCB_APPTRUST_PCP] = { { DCB_APP_SEL_PCP }, 1 },
|
||||
[LAN966X_DCB_APPTRUST_DSCP_PCP] = { { IEEE_8021QAZ_APP_SEL_DSCP,
|
||||
DCB_APP_SEL_PCP }, 2 },
|
||||
};
|
||||
|
||||
static bool lan966x_dcb_apptrust_contains(int portno, u8 selector)
|
||||
{
|
||||
const struct lan966x_dcb_apptrust *conf = lan966x_port_apptrust[portno];
|
||||
|
||||
for (int i = 0; i < conf->nselectors; i++)
|
||||
if (conf->selectors[i] == selector)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void lan966x_dcb_app_update(struct net_device *dev)
|
||||
{
|
||||
struct lan966x_port *port = netdev_priv(dev);
|
||||
struct lan966x_port_qos qos = {0};
|
||||
@ -15,7 +57,10 @@ static void lan966x_dcb_app_update(struct net_device *dev, bool enable)
|
||||
qos.pcp.map[i] = dcb_getapp(dev, &app_itr);
|
||||
}
|
||||
|
||||
qos.pcp.enable = enable;
|
||||
/* Enable use of pcp for queue classification */
|
||||
if (lan966x_dcb_apptrust_contains(port->chip_port, DCB_APP_SEL_PCP))
|
||||
qos.pcp.enable = true;
|
||||
|
||||
lan966x_port_qos_set(port, &qos);
|
||||
}
|
||||
|
||||
@ -52,7 +97,7 @@ static int lan966x_dcb_ieee_delapp(struct net_device *dev, struct dcb_app *app)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
lan966x_dcb_app_update(dev, false);
|
||||
lan966x_dcb_app_update(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -79,7 +124,67 @@ static int lan966x_dcb_ieee_setapp(struct net_device *dev, struct dcb_app *app)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
lan966x_dcb_app_update(dev, true);
|
||||
lan966x_dcb_app_update(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lan966x_dcb_apptrust_validate(struct net_device *dev,
|
||||
u8 *selectors,
|
||||
int nselectors)
|
||||
{
|
||||
for (int i = 0; i < ARRAY_SIZE(lan966x_dcb_apptrust_policies); i++) {
|
||||
bool match;
|
||||
|
||||
if (lan966x_dcb_apptrust_policies[i].nselectors != nselectors)
|
||||
continue;
|
||||
|
||||
match = true;
|
||||
for (int j = 0; j < nselectors; j++) {
|
||||
if (lan966x_dcb_apptrust_policies[i].selectors[j] !=
|
||||
*(selectors + j)) {
|
||||
match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (match)
|
||||
return i;
|
||||
}
|
||||
|
||||
netdev_err(dev, "Valid apptrust configurations are:\n");
|
||||
for (int i = 0; i < ARRAY_SIZE(lan966x_dcb_apptrust_names); i++)
|
||||
pr_info("order: %s\n", lan966x_dcb_apptrust_names[i]);
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int lan966x_dcb_setapptrust(struct net_device *dev,
|
||||
u8 *selectors,
|
||||
int nselectors)
|
||||
{
|
||||
struct lan966x_port *port = netdev_priv(dev);
|
||||
int idx;
|
||||
|
||||
idx = lan966x_dcb_apptrust_validate(dev, selectors, nselectors);
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
lan966x_port_apptrust[port->chip_port] = &lan966x_dcb_apptrust_policies[idx];
|
||||
lan966x_dcb_app_update(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lan966x_dcb_getapptrust(struct net_device *dev, u8 *selectors,
|
||||
int *nselectors)
|
||||
{
|
||||
struct lan966x_port *port = netdev_priv(dev);
|
||||
const struct lan966x_dcb_apptrust *trust;
|
||||
|
||||
trust = lan966x_port_apptrust[port->chip_port];
|
||||
|
||||
memcpy(selectors, trust->selectors, trust->nselectors);
|
||||
*nselectors = trust->nselectors;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -87,6 +192,8 @@ static int lan966x_dcb_ieee_setapp(struct net_device *dev, struct dcb_app *app)
|
||||
static const struct dcbnl_rtnl_ops lan966x_dcbnl_ops = {
|
||||
.ieee_setapp = lan966x_dcb_ieee_setapp,
|
||||
.ieee_delapp = lan966x_dcb_ieee_delapp,
|
||||
.dcbnl_setapptrust = lan966x_dcb_setapptrust,
|
||||
.dcbnl_getapptrust = lan966x_dcb_getapptrust,
|
||||
};
|
||||
|
||||
void lan966x_dcb_init(struct lan966x *lan966x)
|
||||
@ -99,5 +206,8 @@ void lan966x_dcb_init(struct lan966x *lan966x)
|
||||
continue;
|
||||
|
||||
port->dev->dcbnl_ops = &lan966x_dcbnl_ops;
|
||||
|
||||
lan966x_port_apptrust[port->chip_port] =
|
||||
&lan966x_dcb_apptrust_policies[LAN966X_DCB_APPTRUST_DSCP_PCP];
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user