octeontx2-af: Code restructure to handle TC outer VLAN offload
authorSuman Ghosh <sumang@marvell.com>
Fri, 4 Aug 2023 04:59:34 +0000 (10:29 +0530)
committerJakub Kicinski <kuba@kernel.org>
Tue, 8 Aug 2023 02:15:59 +0000 (19:15 -0700)
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>
drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c

index 4bb511e..c535e81 100644 (file)
@@ -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;
-
-               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;
-                               }
-                       }
-               }
+               int ret;
 
-               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)) {