Esempio n. 1
0
static int
i40e_pf_host_process_cmd_config_irq_map(struct i40e_pf_vf *vf,
					uint8_t *msg, uint16_t msglen)
{
	int ret = I40E_SUCCESS;
	struct i40e_virtchnl_irq_map_info *irqmap =
	    (struct i40e_virtchnl_irq_map_info *)msg;

	if (msg == NULL || msglen < sizeof(struct i40e_virtchnl_irq_map_info)) {
		PMD_DRV_LOG(ERR, "buffer too short\n");
		ret = I40E_ERR_PARAM;
		goto send_msg;
	}

	/* Assume VF only have 1 vector to bind all queues */
	if (irqmap->num_vectors != 1) {
		PMD_DRV_LOG(ERR, "DKDK host only support 1 vector\n");
		ret = I40E_ERR_PARAM;
		goto send_msg;
	}

	if (irqmap->vecmap[0].vector_id == 0) {
		PMD_DRV_LOG(ERR, "DPDK host don't support use IRQ0\n");
		ret = I40E_ERR_PARAM;
		goto send_msg;
	}
	/* This MSIX intr store the intr in VF range */
	vf->vsi->msix_intr = irqmap->vecmap[0].vector_id;

	/* Don't care how the TX/RX queue mapping with this vector.
	 * Link all VF RX queues together. Only did mapping work.
	 * VF can disable/enable the intr by itself.
	 */
	i40e_vsi_queues_bind_intr(vf->vsi);
send_msg:
	i40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
							ret, NULL, 0);

	return ret;
}
Esempio n. 2
0
static int
i40e_pf_host_process_cmd_cfg_pvid(struct i40e_pf_vf *vf,
					uint8_t *msg,
					uint16_t msglen)
{
	int ret = I40E_SUCCESS;
	struct i40e_virtchnl_pvid_info  *tpid_info =
			(struct i40e_virtchnl_pvid_info *)msg;

	if (msg == NULL || msglen != sizeof(*tpid_info)) {
		ret = I40E_ERR_PARAM;
		goto send_msg;
	}

	ret = i40e_vsi_vlan_pvid_set(vf->vsi, &tpid_info->info);

send_msg:
	i40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_CFG_VLAN_PVID,
					ret, NULL, 0);

	return ret;
}
static int
i40e_pf_host_process_cmd_add_ether_address(struct i40e_pf_vf *vf,
					   uint8_t *msg,
					   uint16_t msglen)
{
	int ret = I40E_SUCCESS;
	struct i40e_virtchnl_ether_addr_list *addr_list =
			(struct i40e_virtchnl_ether_addr_list *)msg;
	struct i40e_mac_filter_info filter;
	int i;
	struct ether_addr *mac;

	memset(&filter, 0 , sizeof(struct i40e_mac_filter_info));

	if (msg == NULL || msglen <= sizeof(*addr_list)) {
		PMD_DRV_LOG(ERR, "add_ether_address argument too short");
		ret = I40E_ERR_PARAM;
		goto send_msg;
	}

	for (i = 0; i < addr_list->num_elements; i++) {
		mac = (struct ether_addr *)(addr_list->list[i].addr);
		(void)rte_memcpy(&filter.mac_addr, mac, ETHER_ADDR_LEN);
		filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
		if(!is_valid_assigned_ether_addr(mac) ||
			i40e_vsi_add_mac(vf->vsi, &filter)) {
			ret = I40E_ERR_INVALID_MAC_ADDR;
			goto send_msg;
		}
	}

send_msg:
	i40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
							ret, NULL, 0);

	return ret;
}
Esempio n. 4
0
void
i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,
			   uint16_t abs_vf_id, uint32_t opcode,
			   __rte_unused uint32_t retval,
			   uint8_t *msg,
			   uint16_t msglen)
{
	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
	struct i40e_pf_vf *vf;
	/* AdminQ will pass absolute VF id, transfer to internal vf id */
	uint16_t vf_id = abs_vf_id - hw->func_caps.vf_base_id;

	if (!dev || vf_id > pf->vf_num - 1 || !pf->vfs) {
		PMD_DRV_LOG(ERR, "invalid argument\n");
		return;
	}

	vf = &pf->vfs[vf_id];
	if (!vf->vsi) {
		PMD_DRV_LOG(ERR, "NO VSI associated with VF found\n");
		i40e_pf_host_send_msg_to_vf(vf, opcode,
			I40E_ERR_NO_AVAILABLE_VSI, NULL, 0);
		return;
	}

	switch (opcode) {
	case I40E_VIRTCHNL_OP_VERSION :
		PMD_DRV_LOG(INFO, "OP_VERSION received\n");
		i40e_pf_host_process_cmd_version(vf);
		break;
	case I40E_VIRTCHNL_OP_RESET_VF :
		PMD_DRV_LOG(INFO, "OP_RESET_VF received\n");
		i40e_pf_host_process_cmd_reset_vf(vf);
		break;
	case I40E_VIRTCHNL_OP_GET_VF_RESOURCES:
		PMD_DRV_LOG(INFO, "OP_GET_VF_RESOURCES received\n");
		i40e_pf_host_process_cmd_get_vf_resource(vf);
		break;
	case I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES:
		PMD_DRV_LOG(INFO, "OP_CONFIG_VSI_QUEUES received\n");
		i40e_pf_host_process_cmd_config_vsi_queues(vf,
						msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP:
		PMD_DRV_LOG(INFO, "OP_CONFIG_IRQ_MAP received\n");
		i40e_pf_host_process_cmd_config_irq_map(vf, msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_ENABLE_QUEUES:
		PMD_DRV_LOG(INFO, "OP_ENABLE_QUEUES received\n");
		i40e_pf_host_process_cmd_enable_queues(vf,
						msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_DISABLE_QUEUES:
		PMD_DRV_LOG(INFO, "OP_DISABLE_QUEUE received\n");
		i40e_pf_host_process_cmd_disable_queues(vf,
						msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS:
		PMD_DRV_LOG(INFO, "OP_ADD_ETHER_ADDRESS received\n");
		i40e_pf_host_process_cmd_add_ether_address(vf,
						msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS:
		PMD_DRV_LOG(INFO, "OP_DEL_ETHER_ADDRESS received\n");
		i40e_pf_host_process_cmd_del_ether_address(vf,
						msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_ADD_VLAN:
		PMD_DRV_LOG(INFO, "OP_ADD_VLAN received\n");
		i40e_pf_host_process_cmd_add_vlan(vf, msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_DEL_VLAN:
		PMD_DRV_LOG(INFO, "OP_DEL_VLAN received\n");
		i40e_pf_host_process_cmd_del_vlan(vf, msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE:
		PMD_DRV_LOG(INFO, "OP_CONFIG_PROMISCUOUS_MODE received\n");
		i40e_pf_host_process_cmd_config_promisc_mode(vf, msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_GET_STATS:
		PMD_DRV_LOG(INFO, "OP_GET_STATS received\n");
		i40e_pf_host_process_cmd_get_stats(vf);
		break;
	case I40E_VIRTCHNL_OP_GET_LINK_STAT:
		PMD_DRV_LOG(INFO, "OP_GET_LINK_STAT received\n");
		i40e_pf_host_process_cmd_get_link_status(vf);
		break;
	case I40E_VIRTCHNL_OP_CFG_VLAN_OFFLOAD:
		PMD_DRV_LOG(INFO, "OP_CFG_VLAN_OFFLOAD received\n");
		i40e_pf_host_process_cmd_cfg_vlan_offload(vf, msg, msglen);
		break;
	case I40E_VIRTCHNL_OP_CFG_VLAN_PVID:
		PMD_DRV_LOG(INFO, "OP_CFG_VLAN_PVID received\n");
		i40e_pf_host_process_cmd_cfg_pvid(vf, msg, msglen);
		break;
	 /* Don't add command supported below, which will
	 *  return an error code.
	 */
	case I40E_VIRTCHNL_OP_FCOE:
		PMD_DRV_LOG(ERR, "OP_FCOE received, not supported\n");
	default:
		PMD_DRV_LOG(ERR, "%u received, not supported\n",
							opcode);
		i40e_pf_host_send_msg_to_vf(vf, opcode,
				I40E_ERR_PARAM, NULL, 0);
		break;
	}
}