This patch enables PF's internal switch by setting ALLOWLOOPBACK
flag when VEB is created. With this patch, traffic from PF can be
switched on the VEB.

Signed-off-by: Jingjing Wu <jingjing.wu at intel.com>
---
 lib/librte_pmd_i40e/i40e_ethdev.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c 
b/lib/librte_pmd_i40e/i40e_ethdev.c
index fe758c2..94fd36c 100644
--- a/lib/librte_pmd_i40e/i40e_ethdev.c
+++ b/lib/librte_pmd_i40e/i40e_ethdev.c
@@ -2854,6 +2854,40 @@ i40e_vsi_dump_bw_config(struct i40e_vsi *vsi)
        return 0;
 }

+/*
+ * i40e_enable_pf_lb
+ * @pf: pointer to the pf structure
+ *
+ * allow loopback on pf
+ */
+static inline void
+i40e_enable_pf_lb(struct i40e_pf *pf)
+{
+       struct i40e_hw *hw = I40E_PF_TO_HW(pf);
+       struct i40e_vsi_context ctxt;
+       int ret;
+
+       memset(&ctxt, 0, sizeof(ctxt));
+       ctxt.seid = pf->main_vsi_seid;
+       ctxt.pf_num = hw->pf_id;
+       ret = i40e_aq_get_vsi_params(hw, &ctxt, NULL);
+       if (ret) {
+               PMD_DRV_LOG(ERR, "couldn't get pf vsi config, err %d, aq_err 
%d",
+                       ret, hw->aq.asq_last_status);
+               return;
+       }
+       ctxt.flags = I40E_AQ_VSI_TYPE_PF;
+       ctxt.info.valid_sections =
+               rte_cpu_to_le_16(I40E_AQ_VSI_PROP_SWITCH_VALID);
+       ctxt.info.switch_id |=
+               rte_cpu_to_le_16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
+
+       ret = i40e_aq_update_vsi_params(hw, &ctxt, NULL);
+       if (ret)
+               PMD_DRV_LOG(ERR, "update vsi switch failed, aq_err=%d\n",
+                       hw->aq.asq_last_status);
+}
+
 /* Setup a VSI */
 struct i40e_vsi *
 i40e_vsi_setup(struct i40e_pf *pf,
@@ -2889,6 +2923,8 @@ i40e_vsi_setup(struct i40e_pf *pf,
                        PMD_DRV_LOG(ERR, "VEB setup failed");
                        return NULL;
                }
+               /* set ALLOWLOOPBACk on pf, when veb is created */
+               i40e_enable_pf_lb(pf);
        }

        vsi = rte_zmalloc("i40e_vsi", sizeof(struct i40e_vsi), 0);
-- 
1.9.3

Reply via email to