net/i40e: fix tunnel filter to VF
authorBeilei Xing <beilei.xing@intel.com>
Thu, 6 Apr 2017 07:12:34 +0000 (15:12 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 6 Apr 2017 18:54:03 +0000 (20:54 +0200)
Failed to destroy tunnel filter rule if the action of
the tunnel filter is VF, root cause is the wrong vsi
used.

Fixes: c50474f31efe ("net/i40e: support tunnel filter to VF")

Signed-off-by: Beilei Xing <beilei.xing@intel.com>
Acked-by: Bernard Iremonger <bernard.iremonger@intel.com>
drivers/net/i40e/i40e_ethdev.c
drivers/net/i40e/i40e_ethdev.h
drivers/net/i40e/i40e_flow.c

index cb8bf2b..b67c743 100644 (file)
@@ -7221,6 +7221,8 @@ i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf,
        /* Check if there is the filter in SW list */
        memset(&check_filter, 0, sizeof(check_filter));
        i40e_tunnel_filter_convert(cld_filter, &check_filter);
        /* Check if there is the filter in SW list */
        memset(&check_filter, 0, sizeof(check_filter));
        i40e_tunnel_filter_convert(cld_filter, &check_filter);
+       check_filter.is_to_vf = tunnel_filter->is_to_vf;
+       check_filter.vf_id = tunnel_filter->vf_id;
        node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input);
        if (add && node) {
                PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!");
        node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input);
        if (add && node) {
                PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!");
@@ -10632,7 +10634,8 @@ static void
 i40e_tunnel_filter_restore(struct i40e_pf *pf)
 {
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
 i40e_tunnel_filter_restore(struct i40e_pf *pf)
 {
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct i40e_vsi *vsi = pf->main_vsi;
+       struct i40e_vsi *vsi;
+       struct i40e_pf_vf *vf;
        struct i40e_tunnel_filter_list
                *tunnel_list = &pf->tunnel.tunnel_list;
        struct i40e_tunnel_filter *f;
        struct i40e_tunnel_filter_list
                *tunnel_list = &pf->tunnel.tunnel_list;
        struct i40e_tunnel_filter *f;
@@ -10640,6 +10643,12 @@ i40e_tunnel_filter_restore(struct i40e_pf *pf)
        bool big_buffer = 0;
 
        TAILQ_FOREACH(f, tunnel_list, rules) {
        bool big_buffer = 0;
 
        TAILQ_FOREACH(f, tunnel_list, rules) {
+               if (!f->is_to_vf)
+                       vsi = pf->main_vsi;
+               else {
+                       vf = &pf->vfs[f->vf_id];
+                       vsi = vf->vsi;
+               }
                memset(&cld_filter, 0, sizeof(cld_filter));
                ether_addr_copy((struct ether_addr *)&f->input.outer_mac,
                        (struct ether_addr *)&cld_filter.element.outer_mac);
                memset(&cld_filter, 0, sizeof(cld_filter));
                ether_addr_copy((struct ether_addr *)&f->input.outer_mac,
                        (struct ether_addr *)&cld_filter.element.outer_mac);
index f537a3a..69c6684 100644 (file)
@@ -524,12 +524,13 @@ struct i40e_tunnel_filter_input {
        uint16_t flags;          /* Filter type flag */
        uint32_t tenant_id;      /* Tenant id to match */
        uint16_t general_fields[32];  /* Big buffer */
        uint16_t flags;          /* Filter type flag */
        uint32_t tenant_id;      /* Tenant id to match */
        uint16_t general_fields[32];  /* Big buffer */
-       uint16_t vf_id;         /* VF id for tunnel filtering. */
 };
 
 struct i40e_tunnel_filter {
        TAILQ_ENTRY(i40e_tunnel_filter) rules;
        struct i40e_tunnel_filter_input input;
 };
 
 struct i40e_tunnel_filter {
        TAILQ_ENTRY(i40e_tunnel_filter) rules;
        struct i40e_tunnel_filter_input input;
+       uint8_t is_to_vf; /* 0 - to PF, 1 - to VF */
+       uint16_t vf_id;   /* VF id, avaiblable when is_to_vf is 1. */
        uint16_t queue; /* Queue assigned to when match */
 };
 
        uint16_t queue; /* Queue assigned to when match */
 };
 
@@ -582,7 +583,7 @@ struct i40e_tunnel_filter_conf {
        uint32_t tenant_id;     /**< Tenant ID to match. VNI, GRE key... */
        uint16_t queue_id;      /**< Queue assigned to if match. */
        uint8_t is_to_vf;       /**< 0 - to PF, 1 - to VF */
        uint32_t tenant_id;     /**< Tenant ID to match. VNI, GRE key... */
        uint16_t queue_id;      /**< Queue assigned to if match. */
        uint8_t is_to_vf;       /**< 0 - to PF, 1 - to VF */
-       uint16_t vf_id;         /**< VF id for tunnel filter insertion. */
+       uint16_t vf_id;         /**< VF id, avaiblable when is_to_vf is 1. */
 };
 
 #define I40E_MIRROR_MAX_ENTRIES_PER_RULE   64
 };
 
 #define I40E_MIRROR_MAX_ENTRIES_PER_RULE   64
index 9f541ea..fa76285 100644 (file)
@@ -2072,7 +2072,8 @@ i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf,
                                struct i40e_tunnel_filter *filter)
 {
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
                                struct i40e_tunnel_filter *filter)
 {
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct i40e_vsi *vsi = pf->main_vsi;
+       struct i40e_vsi *vsi;
+       struct i40e_pf_vf *vf;
        struct i40e_aqc_add_rm_cloud_filt_elem_ext cld_filter;
        struct i40e_tunnel_rule *tunnel_rule = &pf->tunnel;
        struct i40e_tunnel_filter *node;
        struct i40e_aqc_add_rm_cloud_filt_elem_ext cld_filter;
        struct i40e_tunnel_rule *tunnel_rule = &pf->tunnel;
        struct i40e_tunnel_filter *node;
@@ -2092,6 +2093,13 @@ i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf,
                   filter->input.general_fields,
                   sizeof(cld_filter.general_fields));
 
                   filter->input.general_fields,
                   sizeof(cld_filter.general_fields));
 
+       if (!filter->is_to_vf)
+               vsi = pf->main_vsi;
+       else {
+               vf = &pf->vfs[filter->vf_id];
+               vsi = vf->vsi;
+       }
+
        if (((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoUDP) ==
            I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoUDP) ||
            ((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoGRE) ==
        if (((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoUDP) ==
            I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoUDP) ||
            ((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoGRE) ==