mirror of https://gitee.com/openkylin/linux.git
i40e: Add support to program FDir SB rules for VF from PF through ethtool
With this patch we can now add Flow director Sideband rules for a VF from it's PF. Here is an example on how it can be done when VF id = 5 and queue = 2: "ethtool -N ethx flow-type udp4 src-ip x.x.x.x dst-ip y.y.y.y src-port p1 dst-port p2 action 2 user-def 5" User-def specifies VF id and action specifies queue. Change-ID: Ib37d6dff3823a4d85caffde638473891c38c2b89 Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com> Tested-by: Jim Young <james.m.young@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
2619ef475f
commit
e7c8c60bc5
|
@ -1914,6 +1914,16 @@ static int i40e_get_ethtool_fdir_entry(struct i40e_pf *pf,
|
||||||
else
|
else
|
||||||
fsp->ring_cookie = rule->q_index;
|
fsp->ring_cookie = rule->q_index;
|
||||||
|
|
||||||
|
if (rule->dest_vsi != pf->vsi[pf->lan_vsi]->id) {
|
||||||
|
struct i40e_vsi *vsi;
|
||||||
|
|
||||||
|
vsi = i40e_find_vsi_from_id(pf, rule->dest_vsi);
|
||||||
|
if (vsi && vsi->type == I40E_VSI_SRIOV) {
|
||||||
|
fsp->h_ext.data[1] = htonl(vsi->vf_id);
|
||||||
|
fsp->m_ext.data[1] = htonl(0x1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2207,6 +2217,7 @@ static int i40e_add_fdir_ethtool(struct i40e_vsi *vsi,
|
||||||
struct i40e_fdir_filter *input;
|
struct i40e_fdir_filter *input;
|
||||||
struct i40e_pf *pf;
|
struct i40e_pf *pf;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
|
u16 vf_id;
|
||||||
|
|
||||||
if (!vsi)
|
if (!vsi)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -2267,7 +2278,22 @@ static int i40e_add_fdir_ethtool(struct i40e_vsi *vsi,
|
||||||
input->dst_ip[0] = fsp->h_u.tcp_ip4_spec.ip4src;
|
input->dst_ip[0] = fsp->h_u.tcp_ip4_spec.ip4src;
|
||||||
input->src_ip[0] = fsp->h_u.tcp_ip4_spec.ip4dst;
|
input->src_ip[0] = fsp->h_u.tcp_ip4_spec.ip4dst;
|
||||||
|
|
||||||
|
if (ntohl(fsp->m_ext.data[1])) {
|
||||||
|
if (ntohl(fsp->h_ext.data[1]) >= pf->num_alloc_vfs) {
|
||||||
|
netif_info(pf, drv, vsi->netdev, "Invalid VF id\n");
|
||||||
|
goto free_input;
|
||||||
|
}
|
||||||
|
vf_id = ntohl(fsp->h_ext.data[1]);
|
||||||
|
/* Find vsi id from vf id and override dest vsi */
|
||||||
|
input->dest_vsi = pf->vf[vf_id].lan_vsi_id;
|
||||||
|
if (input->q_index >= pf->vf[vf_id].num_queue_pairs) {
|
||||||
|
netif_info(pf, drv, vsi->netdev, "Invalid queue id\n");
|
||||||
|
goto free_input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = i40e_add_del_fdir(vsi, input, true);
|
ret = i40e_add_del_fdir(vsi, input, true);
|
||||||
|
free_input:
|
||||||
if (ret)
|
if (ret)
|
||||||
kfree(input);
|
kfree(input);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue