mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 06:49:29 -04:00
octeontx2-af: Code restructure to handle TC outer VLAN offload
Moved the TC outer VLAN offload support to a separate function. This change is done to handle all VLAN related changes cleanly from a dedicated function. Signed-off-by: Suman Ghosh <sumang@marvell.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://lore.kernel.org/r/20230804045935.3010554-2-sumang@marvell.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
6624433751
commit
aa07a0f421
@@ -439,6 +439,55 @@ static int otx2_tc_parse_actions(struct otx2_nic *nic,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int otx2_tc_process_vlan(struct otx2_nic *nic, struct flow_msg *flow_spec,
|
||||
struct flow_msg *flow_mask, struct flow_rule *rule,
|
||||
struct npc_install_flow_req *req, bool is_inner)
|
||||
{
|
||||
struct flow_match_vlan match;
|
||||
u16 vlan_tci, vlan_tci_mask;
|
||||
|
||||
if (is_inner)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
flow_rule_match_vlan(rule, &match);
|
||||
if (ntohs(match.key->vlan_tpid) != ETH_P_8021Q) {
|
||||
netdev_err(nic->netdev, "vlan tpid 0x%x not supported\n",
|
||||
ntohs(match.key->vlan_tpid));
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!match.mask->vlan_id) {
|
||||
struct flow_action_entry *act;
|
||||
int i;
|
||||
|
||||
flow_action_for_each(i, act, &rule->action) {
|
||||
if (act->id == FLOW_ACTION_DROP) {
|
||||
netdev_err(nic->netdev,
|
||||
"vlan tpid 0x%x with vlan_id %d is not supported for DROP rule.\n",
|
||||
ntohs(match.key->vlan_tpid), match.key->vlan_id);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (match.mask->vlan_id ||
|
||||
match.mask->vlan_dei ||
|
||||
match.mask->vlan_priority) {
|
||||
vlan_tci = match.key->vlan_id |
|
||||
match.key->vlan_dei << 12 |
|
||||
match.key->vlan_priority << 13;
|
||||
|
||||
vlan_tci_mask = match.mask->vlan_id |
|
||||
match.mask->vlan_dei << 12 |
|
||||
match.mask->vlan_priority << 13;
|
||||
flow_spec->vlan_tci = htons(vlan_tci);
|
||||
flow_mask->vlan_tci = htons(vlan_tci_mask);
|
||||
req->features |= BIT_ULL(NPC_OUTER_VID);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int otx2_tc_prepare_flow(struct otx2_nic *nic, struct otx2_tc_flow *node,
|
||||
struct flow_cls_offload *f,
|
||||
struct npc_install_flow_req *req)
|
||||
@@ -591,47 +640,11 @@ static int otx2_tc_prepare_flow(struct otx2_nic *nic, struct otx2_tc_flow *node,
|
||||
}
|
||||
|
||||
if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_VLAN)) {
|
||||
struct flow_match_vlan match;
|
||||
u16 vlan_tci, vlan_tci_mask;
|
||||
int ret;
|
||||
|
||||
flow_rule_match_vlan(rule, &match);
|
||||
|
||||
if (ntohs(match.key->vlan_tpid) != ETH_P_8021Q) {
|
||||
netdev_err(nic->netdev, "vlan tpid 0x%x not supported\n",
|
||||
ntohs(match.key->vlan_tpid));
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!match.mask->vlan_id) {
|
||||
struct flow_action_entry *act;
|
||||
int i;
|
||||
|
||||
flow_action_for_each(i, act, &rule->action) {
|
||||
if (act->id == FLOW_ACTION_DROP) {
|
||||
netdev_err(nic->netdev,
|
||||
"vlan tpid 0x%x with vlan_id %d is not supported for DROP rule.\n",
|
||||
ntohs(match.key->vlan_tpid),
|
||||
match.key->vlan_id);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (match.mask->vlan_id ||
|
||||
match.mask->vlan_dei ||
|
||||
match.mask->vlan_priority) {
|
||||
vlan_tci = match.key->vlan_id |
|
||||
match.key->vlan_dei << 12 |
|
||||
match.key->vlan_priority << 13;
|
||||
|
||||
vlan_tci_mask = match.mask->vlan_id |
|
||||
match.mask->vlan_dei << 12 |
|
||||
match.mask->vlan_priority << 13;
|
||||
|
||||
flow_spec->vlan_tci = htons(vlan_tci);
|
||||
flow_mask->vlan_tci = htons(vlan_tci_mask);
|
||||
req->features |= BIT_ULL(NPC_OUTER_VID);
|
||||
}
|
||||
ret = otx2_tc_process_vlan(nic, flow_spec, flow_mask, rule, req, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
|
||||
|
||||
Reference in New Issue
Block a user