ethdev: add vlan offload support

Signed-off-by: Intel
This commit is contained in:
Intel 2012-12-20 00:00:00 +01:00 committed by Thomas Monjalon
parent 782a303ddc
commit 81f9db8ecc
2 changed files with 215 additions and 2 deletions

View File

@ -993,6 +993,118 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
return (0); return (0);
} }
int
rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int on)
{
struct rte_eth_dev *dev;
if (port_id >= nb_ports) {
PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
return (-ENODEV);
}
dev = &rte_eth_devices[port_id];
if (rx_queue_id >= dev->data->nb_rx_queues) {
PMD_DEBUG_TRACE("Invalid rx_queue_id=%d\n", port_id);
return (-EINVAL);
}
FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_strip_queue_set, -ENOTSUP);
(*dev->dev_ops->vlan_strip_queue_set)(dev, rx_queue_id, on);
return (0);
}
int
rte_eth_dev_set_vlan_ether_type(uint8_t port_id, uint16_t tpid)
{
struct rte_eth_dev *dev;
if (port_id >= nb_ports) {
PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
return (-ENODEV);
}
dev = &rte_eth_devices[port_id];
FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_tpid_set, -ENOTSUP);
(*dev->dev_ops->vlan_tpid_set)(dev, tpid);
return (0);
}
int
rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
{
struct rte_eth_dev *dev;
int ret = 0;
int mask = 0;
int cur, org = 0;
if (port_id >= nb_ports) {
PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
return (-ENODEV);
}
dev = &rte_eth_devices[port_id];
/*check which option changed by application*/
cur = !!(offload_mask & ETH_VLAN_STRIP_OFFLOAD);
org = !!(dev->data->dev_conf.rxmode.hw_vlan_strip);
if (cur != org){
dev->data->dev_conf.rxmode.hw_vlan_strip = (uint8_t)cur;
mask |= ETH_VLAN_STRIP_MASK;
}
cur = !!(offload_mask & ETH_VLAN_FILTER_OFFLOAD);
org = !!(dev->data->dev_conf.rxmode.hw_vlan_filter);
if (cur != org){
dev->data->dev_conf.rxmode.hw_vlan_filter = (uint8_t)cur;
mask |= ETH_VLAN_FILTER_MASK;
}
cur = !!(offload_mask & ETH_VLAN_EXTEND_OFFLOAD);
org = !!(dev->data->dev_conf.rxmode.hw_vlan_extend);
if (cur != org){
dev->data->dev_conf.rxmode.hw_vlan_extend = (uint8_t)cur;
mask |= ETH_VLAN_EXTEND_MASK;
}
/*no change*/
if(mask == 0)
return ret;
FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_offload_set, -ENOTSUP);
(*dev->dev_ops->vlan_offload_set)(dev, mask);
return ret;
}
int
rte_eth_dev_get_vlan_offload(uint8_t port_id)
{
struct rte_eth_dev *dev;
int ret = 0;
if (port_id >= nb_ports) {
PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
return (-ENODEV);
}
dev = &rte_eth_devices[port_id];
if (dev->data->dev_conf.rxmode.hw_vlan_strip)
ret |= ETH_VLAN_STRIP_OFFLOAD ;
if (dev->data->dev_conf.rxmode.hw_vlan_filter)
ret |= ETH_VLAN_FILTER_OFFLOAD ;
if (dev->data->dev_conf.rxmode.hw_vlan_extend)
ret |= ETH_VLAN_EXTEND_OFFLOAD ;
return ret;
}
int int
rte_eth_dev_fdir_add_signature_filter(uint8_t port_id, rte_eth_dev_fdir_add_signature_filter(uint8_t port_id,
struct rte_fdir_filter *fdir_filter, struct rte_fdir_filter *fdir_filter,

View File

@ -265,6 +265,8 @@ struct rte_eth_rxmode {
uint8_t header_split : 1, /**< Header Split enable. */ uint8_t header_split : 1, /**< Header Split enable. */
hw_ip_checksum : 1, /**< IP/UDP/TCP checksum offload enable. */ hw_ip_checksum : 1, /**< IP/UDP/TCP checksum offload enable. */
hw_vlan_filter : 1, /**< VLAN filter enable. */ hw_vlan_filter : 1, /**< VLAN filter enable. */
hw_vlan_strip : 1, /**< VLAN strip enable. */
hw_vlan_extend : 1, /**< Extended VLAN enable. */
jumbo_frame : 1, /**< Jumbo Frame Receipt enable. */ jumbo_frame : 1, /**< Jumbo Frame Receipt enable. */
hw_strip_crc : 1; /**< Enable CRC stripping by hardware. */ hw_strip_crc : 1; /**< Enable CRC stripping by hardware. */
}; };
@ -307,6 +309,16 @@ struct rte_eth_rss_conf {
#define ETH_DCB_PG_SUPPORT 0x00000001 /**< Priority Group(ETS) support. */ #define ETH_DCB_PG_SUPPORT 0x00000001 /**< Priority Group(ETS) support. */
#define ETH_DCB_PFC_SUPPORT 0x00000002 /**< Priority Flow Control support. */ #define ETH_DCB_PFC_SUPPORT 0x00000002 /**< Priority Flow Control support. */
/* Definitions used for VLAN Offload functionality */
#define ETH_VLAN_STRIP_OFFLOAD 0x0001 /**< VLAN Strip On/Off */
#define ETH_VLAN_FILTER_OFFLOAD 0x0002 /**< VLAN Filter On/Off */
#define ETH_VLAN_EXTEND_OFFLOAD 0x0004 /**< VLAN Extend On/Off */
/* Definitions used for mask VLAN setting */
#define ETH_VLAN_STRIP_MASK 0x0001 /**< VLAN Strip setting mask */
#define ETH_VLAN_FILTER_MASK 0x0002 /**< VLAN Filter setting mask*/
#define ETH_VLAN_EXTEND_MASK 0x0004 /**< VLAN Extend setting mask*/
/** /**
* This enum indicates the possible number of traffic classes * This enum indicates the possible number of traffic classes
* in DCB configratioins * in DCB configratioins
@ -700,11 +712,23 @@ typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
typedef void (*eth_queue_release_t)(void *queue); typedef void (*eth_queue_release_t)(void *queue);
/**< @internal Release memory resources allocated by given RX/TX queue. */ /**< @internal Release memory resources allocated by given RX/TX queue. */
typedef void (*vlan_filter_set_t)(struct rte_eth_dev *dev, typedef int (*vlan_filter_set_t)(struct rte_eth_dev *dev,
uint16_t vlan_id, uint16_t vlan_id,
int on); int on);
/**< @internal filtering of a VLAN Tag Identifier by an Ethernet device. */ /**< @internal filtering of a VLAN Tag Identifier by an Ethernet device. */
typedef void (*vlan_tpid_set_t)(struct rte_eth_dev *dev,
uint16_t tpid);
/**< @internal set the outer VLAN-TPID by an Ethernet device. */
typedef void (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);
/**< @internal set VLAN offload function by an Ethernet device. */
typedef void (*vlan_strip_queue_set_t)(struct rte_eth_dev *dev,
uint16_t rx_queue_id,
int on);
/**< @internal VLAN stripping enable/disable by an queue of Ethernet device. */
typedef uint16_t (*eth_rx_burst_t)(void *rxq, typedef uint16_t (*eth_rx_burst_t)(void *rxq,
struct rte_mbuf **rx_pkts, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts); uint16_t nb_pkts);
@ -792,6 +816,9 @@ struct eth_dev_ops {
/**< Configure per queue stat counter mapping. */ /**< Configure per queue stat counter mapping. */
eth_dev_infos_get_t dev_infos_get; /**< Get device info. */ eth_dev_infos_get_t dev_infos_get; /**< Get device info. */
vlan_filter_set_t vlan_filter_set; /**< Filter VLAN Setup. */ vlan_filter_set_t vlan_filter_set; /**< Filter VLAN Setup. */
vlan_tpid_set_t vlan_tpid_set; /**< Outer VLAN TPID Setup. */
vlan_strip_queue_set_t vlan_strip_queue_set; /**< VLAN Stripping on queue. */
vlan_offload_set_t vlan_offload_set; /**< Set VLAN Offload. */
eth_rx_queue_setup_t rx_queue_setup;/**< Set up device RX queue.*/ eth_rx_queue_setup_t rx_queue_setup;/**< Set up device RX queue.*/
eth_queue_release_t rx_queue_release;/**< Release RX queue.*/ eth_queue_release_t rx_queue_release;/**< Release RX queue.*/
eth_tx_queue_setup_t tx_queue_setup;/**< Set up device TX queue.*/ eth_tx_queue_setup_t tx_queue_setup;/**< Set up device TX queue.*/
@ -1400,7 +1427,81 @@ extern void rte_eth_dev_info_get(uint8_t port_id,
* - (-ENOSYS) if VLAN filtering on *port_id* disabled. * - (-ENOSYS) if VLAN filtering on *port_id* disabled.
* - (-EINVAL) if *vlan_id* > 4095. * - (-EINVAL) if *vlan_id* > 4095.
*/ */
extern int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on); extern int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id , int on);
/**
* Enable/Disable hardware VLAN Strip by a rx queue of an Ethernet device.
* 82599/X540 can support VLAN stripping at the rx queue level
*
* @param port_id
* The port identifier of the Ethernet device.
* @param rx_queue_id
* The index of the receive queue for which a queue stats mapping is required.
* The value must be in the range [0, nb_rx_queue - 1] previously supplied
* to rte_eth_dev_configure().
* @param on
* If 1, Enable VLAN Stripping of the receive queue of the Ethernet port.
* If 0, Disable VLAN Stripping of the receive queue of the Ethernet port.
* @return
* - (0) if successful.
* - (-ENOSUP) if hardware-assisted VLAN stripping not configured.
* - (-ENODEV) if *port_id* invalid.
* - (-EINVAL) if *rx_queue_id* invalid.
*/
extern int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id,
uint16_t rx_queue_id, int on);
/**
* Set the Outer VLAN Ether Type by an Ethernet device, it can be inserted to
* the VLAN Header. This is a register setup available on some Intel NIC, not
* but all, please check the data sheet for availability.
*
* @param port_id
* The port identifier of the Ethernet device.
* @param tag_type
* The Tag Protocol ID
* @return
* - (0) if successful.
* - (-ENOSUP) if hardware-assisted VLAN TPID setup is not supported.
* - (-ENODEV) if *port_id* invalid.
*/
extern int rte_eth_dev_set_vlan_ether_type(uint8_t port_id, uint16_t tag_type);
/**
* Set VLAN offload configuration on an Ethernet device
* Enable/Disable Extended VLAN by an Ethernet device, This is a register setup
* available on some Intel NIC, not but all, please check the data sheet for
* availability.
* Enable/Disable VLAN Strip can be done on rx queue for certain NIC, but here
* the configuration is applied on the port level.
*
* @param port_id
* The port identifier of the Ethernet device.
* @param offload_mask
* The VLAN Offload bit mask can be mixed use with "OR"
* ETH_VLAN_STRIP_OFFLOAD
* ETH_VLAN_FILTER_OFFLOAD
* ETH_VLAN_EXTEND_OFFLOAD
* @return
* - (0) if successful.
* - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
* - (-ENODEV) if *port_id* invalid.
*/
extern int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask);
/**
* Read VLAN Offload configuration from an Ethernet device
*
* @param port_id
* The port identifier of the Ethernet device.
* @return
* - (>0) if successful. Bit mask to indicate
* ETH_VLAN_STRIP_OFFLOAD
* ETH_VLAN_FILTER_OFFLOAD
* ETH_VLAN_EXTEND_OFFLOAD
* - (-ENODEV) if *port_id* invalid.
*/
extern int rte_eth_dev_get_vlan_offload(uint8_t port_id);
/** /**
* *