Imported Upstream version 16.11.2 65/7065/1
authorChristian Ehrhardt <christian.ehrhardt@canonical.com>
Thu, 8 Jun 2017 15:46:51 +0000 (09:46 -0600)
committerChristian Ehrhardt <christian.ehrhardt@canonical.com>
Thu, 8 Jun 2017 15:50:26 +0000 (09:50 -0600)
Change-Id: Iae65ee14970fb0a80d1cba3ff77c3cf7db28bd60
Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
133 files changed:
app/test-pipeline/init.c
app/test-pmd/parameters.c
app/test-pmd/testpmd.c
app/test/test_cmdline_num.c
app/test/test_kni.c
app/test/test_link_bonding.c
app/test/test_link_bonding_mode4.c
app/test/test_link_bonding_rssconf.c
app/test/test_mempool.c
app/test/test_pmd_perf.c
doc/guides/cryptodevs/qat.rst
doc/guides/nics/bnx2x.rst
doc/guides/nics/thunderx.rst
doc/guides/rel_notes/release_16_11.rst
doc/guides/testpmd_app_ug/run_app.rst
doc/guides/testpmd_app_ug/testpmd_funcs.rst
drivers/crypto/openssl/rte_openssl_pmd_ops.c
drivers/crypto/qat/qat_crypto.c
drivers/net/bnx2x/bnx2x_rxtx.c
drivers/net/bnx2x/bnx2x_rxtx.h
drivers/net/bonding/rte_eth_bond_pmd.c
drivers/net/cxgbe/base/t4_hw.c
drivers/net/e1000/base/e1000_vf.c
drivers/net/e1000/igb_ethdev.c
drivers/net/e1000/igb_pf.c
drivers/net/ena/base/ena_com.c
drivers/net/ena/ena_ethdev.c
drivers/net/fm10k/fm10k_ethdev.c
drivers/net/fm10k/fm10k_rxtx_vec.c
drivers/net/i40e/base/i40e_dcb.c
drivers/net/i40e/i40e_ethdev.c
drivers/net/i40e/i40e_ethdev_vf.c
drivers/net/i40e/i40e_pf.c
drivers/net/i40e/i40e_rxtx.c
drivers/net/i40e/i40e_rxtx.h
drivers/net/i40e/i40e_rxtx_vec_common.h
drivers/net/i40e/i40e_rxtx_vec_neon.c
drivers/net/i40e/i40e_rxtx_vec_sse.c
drivers/net/ixgbe/base/ixgbe_phy.c
drivers/net/ixgbe/ixgbe_ethdev.c
drivers/net/ixgbe/ixgbe_pf.c
drivers/net/ixgbe/ixgbe_rxtx.c
drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
drivers/net/mlx4/mlx4.c
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5_ethdev.c
drivers/net/mlx5/mlx5_rxq.c
drivers/net/mlx5/mlx5_rxtx.c
drivers/net/mlx5/mlx5_txq.c
drivers/net/nfp/nfp_net.c
drivers/net/pcap/rte_eth_pcap.c
drivers/net/qede/base/bcm_osal.c
drivers/net/qede/qede_ethdev.c
drivers/net/qede/qede_main.c
drivers/net/qede/qede_rxtx.c
drivers/net/thunderx/base/nicvf_bsvf.c
drivers/net/thunderx/base/nicvf_bsvf.h
drivers/net/thunderx/nicvf_ethdev.c
drivers/net/thunderx/nicvf_rxtx.c
drivers/net/thunderx/nicvf_struct.h
drivers/net/virtio/virtio_ethdev.c
drivers/net/virtio/virtio_pci.c
drivers/net/virtio/virtio_pci.h
drivers/net/virtio/virtio_user/virtio_user_dev.c
drivers/net/virtio/virtio_user/virtio_user_dev.h
drivers/net/virtio/virtio_user_ethdev.c
drivers/net/virtio/virtqueue.h
drivers/net/vmxnet3/vmxnet3_ethdev.c
drivers/net/vmxnet3/vmxnet3_ring.h
drivers/net/vmxnet3/vmxnet3_rxtx.c
examples/bond/main.c
examples/dpdk_qat/main.c
examples/exception_path/Makefile
examples/exception_path/main.c
examples/ip_fragmentation/main.c
examples/ip_pipeline/config_parse.c
examples/ip_reassembly/main.c
examples/ipsec-secgw/ipsec-secgw.c
examples/ipv4_multicast/main.c
examples/kni/main.c
examples/l2fwd-crypto/main.c
examples/l2fwd-jobstats/main.c
examples/l2fwd-keepalive/main.c
examples/l2fwd/main.c
examples/l3fwd-acl/main.c
examples/l3fwd-power/main.c
examples/l3fwd-vf/main.c
examples/l3fwd/main.c
examples/link_status_interrupt/main.c
examples/load_balancer/init.c
examples/load_balancer/runtime.c
examples/multi_process/l2fwd_fork/main.c
examples/multi_process/symmetric_mp/main.c
examples/netmap_compat/bridge/Makefile
examples/netmap_compat/bridge/bridge.c
examples/performance-thread/common/lthread_timer.h
examples/performance-thread/l3fwd-thread/main.c
examples/performance-thread/pthread_shim/main.c
examples/performance-thread/pthread_shim/pthread_shim.c
examples/performance-thread/pthread_shim/pthread_shim.h
examples/qos_meter/main.c
examples/qos_sched/Makefile
examples/qos_sched/init.c
examples/quota_watermark/qw/init.c
examples/tep_termination/vxlan_setup.c
examples/vhost/main.c
examples/vhost_xen/main.c
lib/librte_cryptodev/rte_crypto_sym.h
lib/librte_cryptodev/rte_cryptodev_pmd.h
lib/librte_eal/bsdapp/eal/eal_pci.c
lib/librte_eal/bsdapp/nic_uio/nic_uio.c
lib/librte_eal/common/include/rte_dev.h
lib/librte_eal/common/include/rte_version.h
lib/librte_eal/linuxapp/eal/eal_interrupts.c
lib/librte_eal/linuxapp/eal/eal_pci_uio.c
lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
lib/librte_eal/linuxapp/kni/compat.h
lib/librte_eal/linuxapp/kni/kni_dev.h
lib/librte_ether/rte_ethdev.c
lib/librte_ether/rte_ethdev.h
lib/librte_kni/rte_kni.c
lib/librte_kni/rte_kni_fifo.h
lib/librte_mbuf/rte_mbuf_ptype.h
lib/librte_net/rte_ether.h
lib/librte_vhost/socket.c
lib/librte_vhost/vhost.c
lib/librte_vhost/vhost.h
lib/librte_vhost/virtio_net.c
mk/machine/armv7a/rte.vars.mk
mk/machine/dpaa2/rte.vars.mk
mk/rte.app.mk
mk/toolchain/clang/rte.toolchain-compat.mk
pkg/dpdk.spec

index aef082f..00dbc27 100644 (file)
@@ -105,7 +105,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /* IP checksum offload enabled */
                .hw_vlan_filter = 0, /* VLAN filtering disabled */
                .jumbo_frame    = 0, /* Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /* CRC stripped by hardware */
+               .hw_strip_crc   = 1, /* CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index 08e5a76..2f96953 100644 (file)
@@ -148,7 +148,7 @@ usage(char* progname)
               "the packet will be enqueued into the rx drop-queue. "
               "If the drop-queue doesn't exist, the packet is dropped. "
               "By default drop-queue=127.\n");
-       printf("  --crc-strip: enable CRC stripping by hardware.\n");
+       printf("  --disable-crc-strip: disable CRC stripping by hardware.\n");
        printf("  --enable-lro: enable large receive offload.\n");
        printf("  --enable-rx-cksum: enable rx hardware checksum offload.\n");
        printf("  --disable-hw-vlan: disable hardware vlan.\n");
@@ -525,7 +525,7 @@ launch_args_parse(int argc, char** argv)
                { "pkt-filter-report-hash",     1, 0, 0 },
                { "pkt-filter-size",            1, 0, 0 },
                { "pkt-filter-drop-queue",      1, 0, 0 },
-               { "crc-strip",                  0, 0, 0 },
+               { "disable-crc-strip",                  0, 0, 0 },
                { "enable-lro",                 0, 0, 0 },
                { "enable-rx-cksum",            0, 0, 0 },
                { "enable-scatter",             0, 0, 0 },
@@ -765,8 +765,8 @@ launch_args_parse(int argc, char** argv)
                                                 "drop queue %d invalid - must"
                                                 "be >= 0 \n", n);
                        }
-                       if (!strcmp(lgopts[opt_idx].name, "crc-strip"))
-                               rx_mode.hw_strip_crc = 1;
+                       if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
+                               rx_mode.hw_strip_crc = 0;
                        if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
                                rx_mode.enable_lro = 1;
                        if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
index a0332c2..ce48ca0 100644 (file)
@@ -283,7 +283,7 @@ struct rte_eth_rxmode rx_mode = {
        .hw_vlan_strip  = 1, /**< VLAN strip enabled. */
        .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
        .jumbo_frame    = 0, /**< Jumbo Frame Support disabled. */
-       .hw_strip_crc   = 0, /**< CRC stripping by hardware disabled. */
+       .hw_strip_crc   = 1, /**< CRC stripping by hardware enabled. */
 };
 
 struct rte_fdir_conf fdir_conf = {
@@ -518,34 +518,6 @@ init_config(void)
                fwd_lcores[lc_id]->cpuid_idx = lc_id;
        }
 
-       /*
-        * Create pools of mbuf.
-        * If NUMA support is disabled, create a single pool of mbuf in
-        * socket 0 memory by default.
-        * Otherwise, create a pool of mbuf in the memory of sockets 0 and 1.
-        *
-        * Use the maximum value of nb_rxd and nb_txd here, then nb_rxd and
-        * nb_txd can be configured at run time.
-        */
-       if (param_total_num_mbufs)
-               nb_mbuf_per_pool = param_total_num_mbufs;
-       else {
-               nb_mbuf_per_pool = RTE_TEST_RX_DESC_MAX + (nb_lcores * mb_mempool_cache)
-                               + RTE_TEST_TX_DESC_MAX + MAX_PKT_BURST;
-
-               if (!numa_support)
-                       nb_mbuf_per_pool =
-                               (nb_mbuf_per_pool * RTE_MAX_ETHPORTS);
-       }
-
-       if (!numa_support) {
-               if (socket_num == UMA_NO_CONFIG)
-                       mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 0);
-               else
-                       mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool,
-                                                socket_num);
-       }
-
        FOREACH_PORT(pid, ports) {
                port = &ports[pid];
                rte_eth_dev_info_get(pid, &port->dev_info);
@@ -568,20 +540,37 @@ init_config(void)
                port->need_reconfig_queues = 1;
        }
 
+       /*
+        * Create pools of mbuf.
+        * If NUMA support is disabled, create a single pool of mbuf in
+        * socket 0 memory by default.
+        * Otherwise, create a pool of mbuf in the memory of sockets 0 and 1.
+        *
+        * Use the maximum value of nb_rxd and nb_txd here, then nb_rxd and
+        * nb_txd can be configured at run time.
+        */
+       if (param_total_num_mbufs)
+               nb_mbuf_per_pool = param_total_num_mbufs;
+       else {
+               nb_mbuf_per_pool = RTE_TEST_RX_DESC_MAX +
+                       (nb_lcores * mb_mempool_cache) +
+                       RTE_TEST_TX_DESC_MAX + MAX_PKT_BURST;
+               nb_mbuf_per_pool *= RTE_MAX_ETHPORTS;
+       }
+
        if (numa_support) {
                uint8_t i;
-               unsigned int nb_mbuf;
 
-               if (param_total_num_mbufs)
-                       nb_mbuf_per_pool = nb_mbuf_per_pool/nb_ports;
-
-               for (i = 0; i < max_socket; i++) {
-                       nb_mbuf = (nb_mbuf_per_pool * RTE_MAX_ETHPORTS);
-                       if (nb_mbuf)
-                               mbuf_pool_create(mbuf_data_size,
-                                               nb_mbuf,i);
-               }
+               for (i = 0; i < max_socket; i++)
+                       mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, i);
+       } else {
+               if (socket_num == UMA_NO_CONFIG)
+                       mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 0);
+               else
+                       mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool,
+                                                socket_num);
        }
+
        init_port_config();
 
        /*
@@ -1829,24 +1818,13 @@ init_port_config(void)
                        port->dev_conf.rx_adv_conf.rss_conf.rss_hf = 0;
                }
 
-               if (port->dcb_flag == 0 && port->dev_info.max_vfs == 0) {
+               if (port->dcb_flag == 0) {
                        if( port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
                                port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
                        else
                                port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
                }
 
-               if (port->dev_info.max_vfs != 0) {
-                       if (port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
-                               port->dev_conf.rxmode.mq_mode =
-                                       ETH_MQ_RX_VMDQ_RSS;
-                       else
-                               port->dev_conf.rxmode.mq_mode =
-                                       ETH_MQ_RX_NONE;
-
-                       port->dev_conf.txmode.mq_mode = ETH_MQ_TX_NONE;
-               }
-
                rxtx_port_config(port);
 
                rte_eth_macaddr_get(pid, &port->eth_addr);
@@ -1938,9 +1916,9 @@ get_eth_dcb_conf(struct rte_eth_conf *eth_conf,
                rx_conf->nb_tcs = num_tcs;
                tx_conf->nb_tcs = num_tcs;
 
-               for (i = 0; i < num_tcs; i++) {
-                       rx_conf->dcb_tc[i] = i;
-                       tx_conf->dcb_tc[i] = i;
+               for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
+                       rx_conf->dcb_tc[i] = i % num_tcs;
+                       tx_conf->dcb_tc[i] = i % num_tcs;
                }
                eth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB_RSS;
                eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_hf;
@@ -2140,6 +2118,7 @@ main(int argc, char** argv)
                        start_packet_forwarding(0);
                }
                prompt();
+               pmd_test_exit();
        } else
 #endif
        {
index 04263d3..e8f60cf 100644 (file)
@@ -315,6 +315,7 @@ can_parse_signed(int64_t expected_result, enum cmdline_numtype type)
        case UINT64:
                if (expected_result < 0)
                        return 0;
+               break;
        case INT8:
                if (expected_result > INT8_MAX || expected_result < INT8_MIN)
                        return 0;
index 309741c..db17fdf 100644 (file)
@@ -92,7 +92,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0,
                .hw_vlan_filter = 0,
                .jumbo_frame = 0,
-               .hw_strip_crc = 0,
+               .hw_strip_crc = 1,
        },
        .txmode = {
                .mq_mode = ETH_DCB_NONE,
index 3229660..52d2d05 100644 (file)
@@ -172,7 +172,7 @@ struct rte_eth_rxmode rx_mode = {
        .hw_vlan_strip  = 1, /**< VLAN strip enabled. */
        .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
        .jumbo_frame    = 0, /**< Jumbo Frame Support disabled. */
-       .hw_strip_crc   = 0, /**< CRC stripping by hardware disabled. */
+       .hw_strip_crc   = 1, /**< CRC stripping by hardware enabled. */
 };
 
 struct rte_fdir_conf fdir_conf = {
@@ -191,7 +191,7 @@ static struct rte_eth_conf default_pmd_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index 53caa3e..dc33973 100644 (file)
@@ -143,7 +143,7 @@ static struct rte_eth_conf default_pmd_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index 34f1c16..e11da9b 100644 (file)
@@ -116,7 +116,7 @@ static struct rte_eth_conf default_pmd_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
@@ -133,7 +133,7 @@ static struct rte_eth_conf rss_pmd_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index b9880b3..715b250 100644 (file)
@@ -509,6 +509,7 @@ walk_cb(struct rte_mempool *mp, void *userdata __rte_unused)
 static int
 test_mempool(void)
 {
+       int ret = -1;
        struct rte_mempool *mp_cache = NULL;
        struct rte_mempool *mp_nocache = NULL;
        struct rte_mempool *mp_stack = NULL;
@@ -607,13 +608,13 @@ test_mempool(void)
 
        rte_mempool_list_dump(stdout);
 
-       return 0;
+       ret = 0;
 
 err:
        rte_mempool_free(mp_nocache);
        rte_mempool_free(mp_cache);
        rte_mempool_free(mp_stack);
-       return -1;
+       return ret;
 }
 
 REGISTER_TEST_COMMAND(mempool_autotest, test_mempool);
index e055aa0..1ffd65a 100644 (file)
@@ -100,7 +100,7 @@ static struct rte_eth_conf port_conf = {
                .hw_vlan_strip  = 0, /**< VLAN strip enabled. */
                .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
                .enable_scatter = 0, /**< scatter rx disabled */
        },
        .txmode = {
index 52a9ae3..a7b28eb 100644 (file)
@@ -80,6 +80,7 @@ Limitations
 * SNOW 3G (UEA2) and KASUMI (F8) supported only if cipher length, cipher offset fields are byte-aligned.
 * SNOW 3G (UIA2) and KASUMI (F9) supported only if hash length, hash offset fields are byte-aligned.
 * No BSD support as BSD QAT kernel driver not available.
+* Maximum additional authenticated data (AAD) for GCM is 240 bytes long.
 
 
 Installation
index 6d1768a..2e34942 100644 (file)
@@ -96,9 +96,11 @@ Config File Options
 The following options can be modified in the ``.config`` file. Please note that
 enabling debugging options may affect system performance.
 
-- ``CONFIG_RTE_LIBRTE_BNX2X_PMD`` (default **y**)
+- ``CONFIG_RTE_LIBRTE_BNX2X_PMD`` (default **n**)
 
-  Toggle compilation of bnx2x driver.
+  Toggle compilation of bnx2x driver. To use bnx2x PMD set this config parameter
+  to 'y'. Also, in order for firmware binary to load user will need zlib devel
+  package installed.
 
 - ``CONFIG_RTE_LIBRTE_BNX2X_DEBUG`` (default **n**)
 
index 187c9a4..b12cc8e 100644 (file)
@@ -156,7 +156,7 @@ managed by ``librte_pmd_thunderx_nicvf`` in the Linux operating system.
    .. code-block:: console
 
       ./arm64-thunderx-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0002:01:00.2 \
-        -- -i --disable-hw-vlan-filter --crc-strip --no-flush-rx \
+        -- -i --disable-hw-vlan-filter --no-flush-rx \
         --port-topology=loop
 
    Example output:
index fbf2e36..85972b1 100644 (file)
@@ -708,3 +708,124 @@ Fixes in 16.11 LTS Release
 * vhost: fix guest/host physical address mapping
 * vhost: fix long stall of negotiation
 * vhost: fix memory leak
+
+16.11.2
+~~~~~~~
+
+* app/testpmd: fix TC mapping in DCB init config
+* app/testpmd: fix crash at mbuf pool creation
+* app/testpmd: fix exit without freeing resources
+* app/testpmd: fix init config for multi-queue mode
+* app/testpmd: fix number of mbufs in pool
+* app: enable HW CRC strip by default
+* crypto/openssl: fix AAD capabilities for AES-GCM
+* crypto/openssl: fix AES-GCM capability
+* crypto/qat: fix AES-GCM authentication length
+* crypto/qat: fix IV zero physical address
+* crypto/qat: fix dequeue statistics
+* cryptodev: fix API digest length comments
+* doc: add limitation of AAD size to QAT guide
+* doc: explain zlib dependency for bnx2x
+* eal/linux: fix build with glibc 2.25
+* eal: fix debug macro redefinition
+* examples/ip_fragmentation: fix check of packet type
+* examples/l2fwd-crypto: fix AEAD tests when AAD is zero
+* examples/l2fwd-crypto: fix packets array index
+* examples/l2fwd-crypto: fix padding calculation
+* examples/l3fwd-power: fix Rx descriptor size
+* examples/l3fwd-power: fix handling no Rx queue
+* examples/load_balancer: fix Tx flush
+* examples/multi_process: fix timer update
+* examples/performance-thread: fix build on FreeBSD
+* examples/performance-thread: fix build on FreeBSD 10.0
+* examples/performance-thread: fix compilation on Suse 11 SP2
+* examples/quota_watermark: fix requirement for 2M pages
+* examples: enable HW CRC strip by default
+* examples: fix build clean on FreeBSD
+* kni: fix build with kernel 4.11
+* kni: fix crash caused by freeing mempool
+* kni: fix possible memory leak
+* mbuf: fix missing includes in exported header
+* mk: fix lib filtering when linking app
+* mk: fix quoting for ARM mtune argument
+* mk: fix shell errors when building with clang
+* net/bnx2x: fix transmit queue free threshold
+* net/bonding: allow configuring jumbo frames without slaves
+* net/bonding: fix updating slave link status
+* net/cxgbe: fix possible null pointer dereference
+* net/e1000/base: fix multicast setting in VF
+* net/ena: cleanup if refilling of Rx descriptors fails
+* net/ena: fix Rx descriptors allocation
+* net/ena: fix delayed cleanup of Rx descriptors
+* net/ena: fix return of hash control flushing
+* net/fm10k: fix memory overflow in 32-bit SSE Rx
+* net/fm10k: fix pointer cast
+* net/i40e/base: fix potential out of bound array access
+* net/i40e: add missing 25G link speed
+* net/i40e: ensure vector mode is not used with QinQ
+* net/i40e: fix TC bitmap of VEB
+* net/i40e: fix VF link speed
+* net/i40e: fix VF link status update
+* net/i40e: fix allocation check
+* net/i40e: fix compile error
+* net/i40e: fix hash input set on X722
+* net/i40e: fix incorrect packet index reference
+* net/i40e: fix mbuf alloc failed counter
+* net/i40e: fix memory overflow in 32-bit SSE Rx
+* net/i40e: fix setup when bulk is disabled
+* net/igb: fix VF MAC address setting
+* net/igb: fix VF MAC address setting
+* net/ixgbe/base: fix build error
+* net/ixgbe: fix Rx queue blocking issue
+* net/ixgbe: fix TC bandwidth setting
+* net/ixgbe: fix VF Rx mode for allmulticast disabled
+* net/ixgbe: fix all queues drop setting of DCB
+* net/ixgbe: fix memory overflow in 32-bit SSE Rx
+* net/ixgbe: fix multi-queue mode check in SRIOV mode
+* net/ixgbe: fix setting MTU on stopped device
+* net/ixgbevf: set xstats id values
+* net/mlx4: fix Rx after mbuf alloc failure
+* net/mlx4: fix returned values upon failed probing
+* net/mlx4: update link status upon probing with LSC
+* net/mlx5: fix Tx when first segment size is too short
+* net/mlx5: fix VLAN stripping indication
+* net/mlx5: fix an uninitialized variable
+* net/mlx5: fix returned values upon failed probing
+* net/mlx5: fix reusing Rx/Tx queues
+* net/mlx5: fix supported packets types
+* net/nfp: fix packet/data length conversion
+* net/pcap: fix using mbuf after freeing it
+* net/qede/base: fix find zero bit macro
+* net/qede: fix FW version string for VF
+* net/qede: fix default MAC address handling
+* net/qede: fix fastpath rings reset phase
+* net/qede: fix missing UDP protocol in RSS offload types
+* net/thunderx: fix 32-bit build
+* net/thunderx: fix build on FreeBSD
+* net/thunderx: fix deadlock in Rx path
+* net/thunderx: fix stats access out of bounds
+* net/virtio-user: fix address on 32-bit system
+* net/virtio-user: fix overflow
+* net/virtio: disable LSC interrupt if MSIX not enabled
+* net/virtio: fix MSI-X for modern devices
+* net/virtio: fix crash when closing twice
+* net/virtio: fix link status always being up
+* net/virtio: fix link status always down
+* net/virtio: fix queue notify
+* net/vmxnet3: fix build with gcc 7
+* net/vmxnet3: fix queue size changes
+* net: fix stripped VLAN flag for offload emulation
+* nic_uio: fix device binding at boot
+* pci: fix device registration on FreeBSD
+* test/cmdline: fix missing break in switch
+* test/mempool: free mempool on exit
+* test: enable HW CRC strip by default
+* vfio: fix disabling INTx
+* vfio: fix secondary process start
+* vhost: change log levels in client mode
+* vhost: fix dequeue zero copy
+* vhost: fix false sharing
+* vhost: fix fd leaks for vhost-user server mode
+* vhost: fix max queues
+* vhost: fix multiple queue not enabled for old kernels
+* vhost: fix use after free
index d7c5120..ac7d458 100644 (file)
@@ -281,9 +281,9 @@ The commandline options are:
     In perfect filter mode, when a rule is added with queue = -1, the packet will be enqueued into the RX drop-queue.
     If the drop-queue does not exist, the packet is dropped. The default value is N=127.
 
-*   ``--crc-strip``
+*   ``--disable-crc-strip``
 
-    Enable hardware CRC stripping.
+    Disable hardware CRC stripping.
 
 *   ``--enable-lro``
 
index f1c269a..70d2e4d 100644 (file)
@@ -1257,9 +1257,9 @@ Set hardware CRC stripping on or off for all ports::
 
    testpmd> port config all crc-strip (on|off)
 
-CRC stripping is off by default.
+CRC stripping is on by default.
 
-The ``on`` option is equivalent to the ``--crc-strip`` command-line option.
+The ``off`` option is equivalent to the ``--disable-crc-strip`` command-line option.
 
 port config - scatter
 ~~~~~~~~~~~~~~~~~~~~~~~
index 875550c..139fed1 100644 (file)
@@ -350,9 +350,9 @@ static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
                                        .increment = 0
                                },
                                .aad_size = {
-                                       .min = 8,
-                                       .max = 12,
-                                       .increment = 4
+                                       .min = 0,
+                                       .max = 65535,
+                                       .increment = 1
                                }
                        }, }
                }, }
@@ -366,8 +366,8 @@ static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
                                .block_size = 16,
                                .key_size = {
                                        .min = 16,
-                                       .max = 16,
-                                       .increment = 0
+                                       .max = 32,
+                                       .increment = 8
                                },
                                .iv_size = {
                                        .min = 12,
index a4119fc..0fe0b23 100644 (file)
@@ -1021,17 +1021,24 @@ qat_write_hw_desc_entry(struct rte_crypto_op *op, uint8_t *out_msg)
                }
 
                /* copy IV into request if it fits */
-               if (op->sym->cipher.iv.length && (op->sym->cipher.iv.length <=
-                               sizeof(cipher_param->u.cipher_IV_array))) {
-                       rte_memcpy(cipher_param->u.cipher_IV_array,
-                                       op->sym->cipher.iv.data,
-                                       op->sym->cipher.iv.length);
-               } else {
-                       ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET(
-                                       qat_req->comn_hdr.serv_specif_flags,
-                                       ICP_QAT_FW_CIPH_IV_64BIT_PTR);
-                       cipher_param->u.s.cipher_IV_ptr =
-                                       op->sym->cipher.iv.phys_addr;
+               /*
+                * If IV length is zero do not copy anything but still
+                * use request descriptor embedded IV
+                *
+                */
+               if (op->sym->cipher.iv.length) {
+                       if (op->sym->cipher.iv.length <=
+                                       sizeof(cipher_param->u.cipher_IV_array)) {
+                               rte_memcpy(cipher_param->u.cipher_IV_array,
+                                               op->sym->cipher.iv.data,
+                                               op->sym->cipher.iv.length);
+                       } else {
+                               ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET(
+                                               qat_req->comn_hdr.serv_specif_flags,
+                                               ICP_QAT_FW_CIPH_IV_64BIT_PTR);
+                               cipher_param->u.s.cipher_IV_ptr =
+                                               op->sym->cipher.iv.phys_addr;
+                       }
                }
                min_ofs = cipher_ofs;
        }
@@ -1062,6 +1069,12 @@ qat_write_hw_desc_entry(struct rte_crypto_op *op, uint8_t *out_msg)
                                }
                        }
 
+               } else if (ctx->qat_hash_alg ==
+                                       ICP_QAT_HW_AUTH_ALGO_GALOIS_128 ||
+                               ctx->qat_hash_alg ==
+                                       ICP_QAT_HW_AUTH_ALGO_GALOIS_64) {
+                       auth_ofs = op->sym->cipher.data.offset;
+                       auth_len = op->sym->cipher.data.length;
                } else {
                        auth_ofs = op->sym->auth.data.offset;
                        auth_len = op->sym->auth.data.length;
@@ -1283,9 +1296,9 @@ void qat_crypto_sym_stats_get(struct rte_cryptodev *dev,
                }
 
                stats->enqueued_count += qp[i]->stats.enqueued_count;
-               stats->dequeued_count += qp[i]->stats.enqueued_count;
+               stats->dequeued_count += qp[i]->stats.dequeued_count;
                stats->enqueue_err_count += qp[i]->stats.enqueue_err_count;
-               stats->dequeue_err_count += qp[i]->stats.enqueue_err_count;
+               stats->dequeue_err_count += qp[i]->stats.dequeue_err_count;
        }
 }
 
index 170e48f..adf0309 100644 (file)
@@ -273,6 +273,8 @@ bnx2x_dev_tx_queue_setup(struct rte_eth_dev *dev,
 
        txq->tx_free_thresh = tx_conf->tx_free_thresh ?
                tx_conf->tx_free_thresh : DEFAULT_TX_FREE_THRESH;
+       txq->tx_free_thresh = min(txq->tx_free_thresh,
+                                 txq->nb_tx_desc - BDS_PER_TX_PKT);
 
        PMD_INIT_LOG(DEBUG, "fp[%02d] req_bd=%u, thresh=%u, usable_bd=%lu, "
                     "total_bd=%lu, tx_pages=%u",
index dd251aa..2e38ec2 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef _BNX2X_RXTX_H_
 #define _BNX2X_RXTX_H_
 
-#define DEFAULT_TX_FREE_THRESH   512
+#define DEFAULT_TX_FREE_THRESH   64
 #define RTE_PMD_BNX2X_TX_MAX_BURST 1
 
 /**
index a80b6fa..aa71e3f 100644 (file)
@@ -1430,9 +1430,11 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
        }
 
        /* If lsc interrupt is set, check initial slave's link status */
-       if (slave_eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
+       if (slave_eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) {
+               slave_eth_dev->dev_ops->link_update(slave_eth_dev, 0);
                bond_ethdev_lsc_event_callback(slave_eth_dev->data->port_id,
                        RTE_ETH_EVENT_INTR_LSC, &bonded_eth_dev->data->port_id);
+       }
 
        return 0;
 }
@@ -1668,8 +1670,9 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
        dev_info->max_mac_addrs = 1;
 
-       dev_info->max_rx_pktlen = internals->candidate_max_rx_pktlen ?
-                                 internals->candidate_max_rx_pktlen : 2048;
+       dev_info->max_rx_pktlen = internals->candidate_max_rx_pktlen
+                                 ? internals->candidate_max_rx_pktlen
+                                 : ETHER_MAX_JUMBO_FRAME_LEN;
 
        dev_info->max_rx_queues = (uint16_t)128;
        dev_info->max_tx_queues = (uint16_t)512;
index c089b06..9dca8da 100644 (file)
@@ -359,6 +359,9 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox,
        struct mbox_entry entry;
        u32 pcie_fw = 0;
 
+       if (!temp)
+               return -ENOMEM;
+
        if ((size & 15) || size > MBOX_LEN) {
                free(temp);
                return -EINVAL;
index 7845b48..44ab018 100644 (file)
@@ -421,12 +421,13 @@ void e1000_update_mc_addr_list_vf(struct e1000_hw *hw,
 
        DEBUGOUT1("MC Addr Count = %d\n", mc_addr_count);
 
+       msgbuf[0] = E1000_VF_SET_MULTICAST;
+
        if (mc_addr_count > 30) {
                msgbuf[0] |= E1000_VF_SET_MULTICAST_OVERFLOW;
                mc_addr_count = 30;
        }
 
-       msgbuf[0] = E1000_VF_SET_MULTICAST;
        msgbuf[0] |= mc_addr_count << E1000_VT_MSGINFO_SHIFT;
 
        for (i = 0; i < mc_addr_count; i++) {
index 2fddf0c..be2600d 100644 (file)
@@ -1012,12 +1012,6 @@ eth_igbvf_dev_init(struct rte_eth_dev *eth_dev)
        /* Generate a random MAC address, if none was assigned by PF. */
        if (is_zero_ether_addr(perm_addr)) {
                eth_random_addr(perm_addr->addr_bytes);
-               diag = e1000_rar_set(hw, perm_addr->addr_bytes, 0);
-               if (diag) {
-                       rte_free(eth_dev->data->mac_addrs);
-                       eth_dev->data->mac_addrs = NULL;
-                       return diag;
-               }
                PMD_INIT_LOG(INFO, "\tVF MAC address not assigned by Host PF");
                PMD_INIT_LOG(INFO, "\tAssign randomly generated MAC address "
                             "%02x:%02x:%02x:%02x:%02x:%02x",
@@ -1029,6 +1023,12 @@ eth_igbvf_dev_init(struct rte_eth_dev *eth_dev)
                             perm_addr->addr_bytes[5]);
        }
 
+       diag = e1000_rar_set(hw, perm_addr->addr_bytes, 0);
+       if (diag) {
+               rte_free(eth_dev->data->mac_addrs);
+               eth_dev->data->mac_addrs = NULL;
+               return diag;
+       }
        /* Copy the permanent MAC address */
        ether_addr_copy((struct ether_addr *) hw->mac.perm_addr,
                        &eth_dev->data->mac_addrs[0]);
index 5845bc2..3f8f152 100644 (file)
@@ -330,12 +330,16 @@ igb_vf_set_mac_addr(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf)
                *(E1000_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
        int rar_entry = hw->mac.rar_entry_count - (vf + 1);
        uint8_t *new_mac = (uint8_t *)(&msgbuf[1]);
+       int rah;
 
        if (is_unicast_ether_addr((struct ether_addr *)new_mac)) {
                if (!is_zero_ether_addr((struct ether_addr *)new_mac))
                        rte_memcpy(vfinfo[vf].vf_mac_addresses, new_mac,
                                sizeof(vfinfo[vf].vf_mac_addresses));
                hw->mac.ops.rar_set(hw, new_mac, rar_entry);
+               rah = E1000_READ_REG(hw, E1000_RAH(rar_entry));
+               rah |= (0x1 << (E1000_RAH_POOLSEL_SHIFT + vf));
+               E1000_WRITE_REG(hw, E1000_RAH(rar_entry), rah);
                return 0;
        }
        return -1;
index bd6f3c6..778bc2e 100644 (file)
@@ -2278,7 +2278,7 @@ int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev)
                                            sizeof(resp));
        if (unlikely(ret)) {
                ena_trc_err("Failed to set hash input. error: %d\n", ret);
-               ret = ENA_COM_INVAL;
+               return ENA_COM_INVAL;
        }
 
        return 0;
index c1fd7bb..1fc3654 100644 (file)
@@ -908,7 +908,7 @@ static int ena_start(struct rte_eth_dev *dev)
 
 static int ena_queue_restart(struct ena_ring *ring)
 {
-       int rc;
+       int rc, bufs_num;
 
        ena_assert_msg(ring->configured == 1,
                       "Trying to restart unconfigured queue\n");
@@ -919,9 +919,10 @@ static int ena_queue_restart(struct ena_ring *ring)
        if (ring->type == ENA_RING_TYPE_TX)
                return 0;
 
-       rc = ena_populate_rx_queue(ring, ring->ring_size);
-       if ((unsigned int)rc != ring->ring_size) {
-               PMD_INIT_LOG(ERR, "Failed to populate rx ring !\n");
+       bufs_num = ring->ring_size - 1;
+       rc = ena_populate_rx_queue(ring, bufs_num);
+       if (rc != bufs_num) {
+               PMD_INIT_LOG(ERR, "Failed to populate rx ring !");
                return (-1);
        }
 
@@ -1132,7 +1133,7 @@ static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int count)
                return 0;
 
        in_use = rxq->next_to_use - rxq->next_to_clean;
-       ena_assert_msg(((in_use + count) <= ring_size), "bad ring state");
+       ena_assert_msg(((in_use + count) < ring_size), "bad ring state");
 
        count = RTE_MIN(count,
                        (uint16_t)(ring_size - (next_to_use & ring_mask)));
@@ -1160,6 +1161,8 @@ static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int count)
                rc = ena_com_add_single_rx_desc(rxq->ena_com_io_sq,
                                                &ebuf, next_to_use_masked);
                if (unlikely(rc)) {
+                       rte_mempool_put_bulk(rxq->mb_pool, (void **)(&mbuf),
+                                            count - i);
                        RTE_LOG(WARNING, PMD, "failed adding rx desc\n");
                        break;
                }
@@ -1556,12 +1559,13 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                recv_idx++;
        }
 
+       rx_ring->next_to_clean = next_to_clean;
+
+       desc_in_use = desc_in_use - completed + 1;
        /* Burst refill to save doorbells, memory barriers, const interval */
        if (ring_size - desc_in_use > ENA_RING_DESCS_RATIO(ring_size))
                ena_populate_rx_queue(rx_ring, ring_size - desc_in_use);
 
-       rx_ring->next_to_clean = next_to_clean;
-
        return recv_idx;
 }
 
index 7c51d3b..32b0ea9 100644 (file)
@@ -1797,7 +1797,8 @@ fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
        const struct rte_eth_rxconf *conf, struct rte_mempool *mp)
 {
        struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct fm10k_dev_info *dev_info = FM10K_DEV_PRIVATE_TO_INFO(dev);
+       struct fm10k_dev_info *dev_info =
+               FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
        struct fm10k_rx_queue *q;
        const struct rte_memzone *mz;
 
@@ -2767,7 +2768,8 @@ fm10k_set_tx_function(struct rte_eth_dev *dev)
 static void __attribute__((cold))
 fm10k_set_rx_function(struct rte_eth_dev *dev)
 {
-       struct fm10k_dev_info *dev_info = FM10K_DEV_PRIVATE_TO_INFO(dev);
+       struct fm10k_dev_info *dev_info =
+               FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
        uint16_t i, rx_using_sse;
        uint16_t rx_ftag_en = 0;
 
@@ -2809,7 +2811,8 @@ static void
 fm10k_params_init(struct rte_eth_dev *dev)
 {
        struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct fm10k_dev_info *info = FM10K_DEV_PRIVATE_TO_INFO(dev);
+       struct fm10k_dev_info *info =
+               FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
 
        /* Inialize bus info. Normally we would call fm10k_get_bus_info(), but
         * there is no way to get link status without reading BAR4.  Until this
index 27f3e43..3d21652 100644 (file)
@@ -470,9 +470,13 @@ fm10k_recv_raw_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
                __m128i descs0[RTE_FM10K_DESCS_PER_LOOP];
                __m128i pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
                __m128i zero, staterr, sterr_tmp1, sterr_tmp2;
-               __m128i mbp1, mbp2; /* two mbuf pointer in one XMM reg. */
+               __m128i mbp1;
+               /* 2 64 bit or 4 32 bit mbuf pointers in one XMM reg. */
+#if defined(RTE_ARCH_X86_64)
+               __m128i mbp2;
+#endif
 
-               /* B.1 load 1 mbuf point */
+               /* B.1 load 2 (64 bit) or 4 (32 bit) mbuf points */
                mbp1 = _mm_loadu_si128((__m128i *)&mbufp[pos]);
 
                /* Read desc statuses backwards to avoid race condition */
@@ -480,11 +484,13 @@ fm10k_recv_raw_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
                descs0[3] = _mm_loadu_si128((__m128i *)(rxdp + 3));
                rte_compiler_barrier();
 
-               /* B.2 copy 2 mbuf point into rx_pkts  */
+               /* B.2 copy 2 64 bit or 4 32 bit mbuf point into rx_pkts */
                _mm_storeu_si128((__m128i *)&rx_pkts[pos], mbp1);
 
-               /* B.1 load 1 mbuf point */
+#if defined(RTE_ARCH_X86_64)
+               /* B.1 load 2 64 bit mbuf poitns */
                mbp2 = _mm_loadu_si128((__m128i *)&mbufp[pos+2]);
+#endif
 
                descs0[2] = _mm_loadu_si128((__m128i *)(rxdp + 2));
                rte_compiler_barrier();
@@ -493,8 +499,10 @@ fm10k_recv_raw_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
                rte_compiler_barrier();
                descs0[0] = _mm_loadu_si128((__m128i *)(rxdp));
 
+#if defined(RTE_ARCH_X86_64)
                /* B.2 copy 2 mbuf point into rx_pkts  */
                _mm_storeu_si128((__m128i *)&rx_pkts[pos+2], mbp2);
+#endif
 
                /* avoid compiler reorder optimization */
                rte_compiler_barrier();
index 26c344f..9b5405d 100644 (file)
@@ -396,6 +396,8 @@ static void i40e_parse_cee_app_tlv(struct i40e_cee_feat_tlv *tlv,
        dcbcfg->numapps = length / sizeof(*app);
        if (!dcbcfg->numapps)
                return;
+       if (dcbcfg->numapps > I40E_DCBX_MAX_APPS)
+               dcbcfg->numapps = I40E_DCBX_MAX_APPS;
 
        for (i = 0; i < dcbcfg->numapps; i++) {
                u8 up, selector;
index bf7e5a0..4e4cd16 100644 (file)
@@ -460,6 +460,7 @@ static void i40e_set_default_mac_addr(struct rte_eth_dev *dev,
                                      struct ether_addr *mac_addr);
 
 static int i40e_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
+static void i40e_notify_all_vfs_link_status(struct rte_eth_dev *dev);
 
 static const struct rte_pci_id pci_id_i40e_map[] = {
        { RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_SFP_XL710) },
@@ -2069,6 +2070,8 @@ out:
        if (link.link_status == old.link_status)
                return -1;
 
+       i40e_notify_all_vfs_link_status(dev);
+
        return 0;
 }
 
@@ -4105,6 +4108,7 @@ i40e_veb_setup(struct i40e_pf *pf, struct i40e_vsi *vsi)
                            hw->aq.asq_last_status);
                goto fail;
        }
+       veb->enabled_tc = I40E_DEFAULT_TCMAP;
 
        /* get statistics index */
        ret = i40e_aq_get_veb_parameters(hw, veb->seid, NULL, NULL,
@@ -5504,11 +5508,9 @@ i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)
                        break;
                case i40e_aqc_opc_get_link_status:
                        ret = i40e_dev_link_update(dev, 0);
-                       if (!ret) {
-                               i40e_notify_all_vfs_link_status(dev);
+                       if (!ret)
                                _rte_eth_dev_callback_process(dev,
                                        RTE_ETH_EVENT_INTR_LSC, NULL);
-                       }
                        break;
                default:
                        PMD_DRV_LOG(ERR, "Request %u is not supported yet",
@@ -7051,7 +7053,44 @@ i40e_set_hash_filter_global_config(struct i40e_hw *hw,
                pctype = i40e_flowtype_to_pctype(i);
                reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
                                I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
-               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype), reg);
+               if (hw->mac.type == I40E_MAC_X722) {
+                       if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP) {
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_IPV4_UDP), reg);
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP),
+                                 reg);
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP),
+                                 reg);
+                       } else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP) {
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_IPV4_TCP), reg);
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK),
+                                 reg);
+                       } else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP) {
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_IPV6_UDP), reg);
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP),
+                                 reg);
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP),
+                                 reg);
+                       } else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP) {
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_IPV6_TCP), reg);
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
+                                 I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK),
+                                 reg);
+                       } else {
+                               i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype),
+                                 reg);
+                       }
+               } else {
+                       i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype), reg);
+               }
        }
 
        reg = i40e_read_rx_ctl(hw, I40E_GLQF_CTL);
index 640d316..efd4fac 100644 (file)
@@ -1997,6 +1997,10 @@ i40evf_add_del_all_mac_addr(struct rte_eth_dev *dev, bool add)
                }
 
                list = rte_zmalloc("i40evf_del_mac_buffer", len, 0);
+               if (!list) {
+                       PMD_DRV_LOG(ERR, "fail to allocate memory");
+                       return;
+               }
 
                for (i = begin; i < next_begin; i++) {
                        addr = &dev->data->mac_addrs[i];
@@ -2142,6 +2146,9 @@ i40evf_dev_link_update(struct rte_eth_dev *dev,
        case I40E_LINK_SPEED_20GB:
                new_link.link_speed = ETH_SPEED_NUM_20G;
                break;
+       case I40E_LINK_SPEED_25GB:
+               new_link.link_speed = ETH_SPEED_NUM_25G;
+               break;
        case I40E_LINK_SPEED_40GB:
                new_link.link_speed = ETH_SPEED_NUM_40G;
                break;
index 97b8ecc..b36d901 100644 (file)
@@ -907,8 +907,33 @@ i40e_notify_vf_link_status(struct rte_eth_dev *dev, struct i40e_pf_vf *vf)
        event.event = I40E_VIRTCHNL_EVENT_LINK_CHANGE;
        event.event_data.link_event.link_status =
                dev->data->dev_link.link_status;
-       event.event_data.link_event.link_speed =
-               (enum i40e_aq_link_speed)dev->data->dev_link.link_speed;
+
+       /* need to convert the ETH_SPEED_xxx into I40E_LINK_SPEED_xxx */
+       switch (dev->data->dev_link.link_speed) {
+       case ETH_SPEED_NUM_100M:
+               event.event_data.link_event.link_speed = I40E_LINK_SPEED_100MB;
+               break;
+       case ETH_SPEED_NUM_1G:
+               event.event_data.link_event.link_speed = I40E_LINK_SPEED_1GB;
+               break;
+       case ETH_SPEED_NUM_10G:
+               event.event_data.link_event.link_speed = I40E_LINK_SPEED_10GB;
+               break;
+       case ETH_SPEED_NUM_20G:
+               event.event_data.link_event.link_speed = I40E_LINK_SPEED_20GB;
+               break;
+       case ETH_SPEED_NUM_25G:
+               event.event_data.link_event.link_speed = I40E_LINK_SPEED_25GB;
+               break;
+       case ETH_SPEED_NUM_40G:
+               event.event_data.link_event.link_speed = I40E_LINK_SPEED_40GB;
+               break;
+       default:
+               event.event_data.link_event.link_speed =
+                       I40E_LINK_SPEED_UNKNOWN;
+               break;
+       }
+
        i40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_EVENT,
                I40E_SUCCESS, (uint8_t *)&event, sizeof(event));
 }
index 1b25b2f..602e40c 100644 (file)
@@ -598,6 +598,7 @@ static inline uint16_t
 rx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 {
        struct i40e_rx_queue *rxq = (struct i40e_rx_queue *)rx_queue;
+       struct rte_eth_dev *dev;
        uint16_t nb_rx = 0;
 
        if (!nb_pkts)
@@ -615,9 +616,10 @@ rx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                if (i40e_rx_alloc_bufs(rxq) != 0) {
                        uint16_t i, j;
 
-                       PMD_RX_LOG(DEBUG, "Rx mbuf alloc failed for "
-                                  "port_id=%u, queue_id=%u",
-                                  rxq->port_id, rxq->queue_id);
+                       dev = I40E_VSI_TO_ETH_DEV(rxq->vsi);
+                       dev->data->rx_mbuf_alloc_failed +=
+                               rxq->rx_free_thresh;
+
                        rxq->rx_nb_avail = 0;
                        rxq->rx_tail = (uint16_t)(rxq->rx_tail - nb_rx);
                        for (i = 0, j = rxq->rx_tail; i < nb_rx; i++, j++)
@@ -679,6 +681,7 @@ i40e_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        union i40e_rx_desc rxd;
        struct i40e_rx_entry *sw_ring;
        struct i40e_rx_entry *rxe;
+       struct rte_eth_dev *dev;
        struct rte_mbuf *rxm;
        struct rte_mbuf *nmb;
        uint16_t nb_rx;
@@ -707,10 +710,13 @@ i40e_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                        break;
 
                nmb = rte_mbuf_raw_alloc(rxq->mp);
-               if (unlikely(!nmb))
+               if (unlikely(!nmb)) {
+                       dev = I40E_VSI_TO_ETH_DEV(rxq->vsi);
+                       dev->data->rx_mbuf_alloc_failed++;
                        break;
-               rxd = *rxdp;
+               }
 
+               rxd = *rxdp;
                nb_hold++;
                rxe = &sw_ring[rx_id];
                rx_id++;
@@ -802,6 +808,7 @@ i40e_recv_scattered_pkts(void *rx_queue,
        struct rte_mbuf *nmb, *rxm;
        uint16_t rx_id = rxq->rx_tail;
        uint16_t nb_rx = 0, nb_hold = 0, rx_packet_len;
+       struct rte_eth_dev *dev;
        uint32_t rx_status;
        uint64_t qword1;
        uint64_t dma_addr;
@@ -818,8 +825,12 @@ i40e_recv_scattered_pkts(void *rx_queue,
                        break;
 
                nmb = rte_mbuf_raw_alloc(rxq->mp);
-               if (unlikely(!nmb))
+               if (unlikely(!nmb)) {
+                       dev = I40E_VSI_TO_ETH_DEV(rxq->vsi);
+                       dev->data->rx_mbuf_alloc_failed++;
                        break;
+               }
+
                rxd = *rxdp;
                nb_hold++;
                rxe = &sw_ring[rx_id];
@@ -1717,11 +1728,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
        rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
        rxq->rx_ring = (union i40e_rx_desc *)rz->addr;
 
-#ifdef RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC
        len = (uint16_t)(nb_desc + RTE_PMD_I40E_RX_MAX_BURST);
-#else
-       len = nb_desc;
-#endif
 
        /* Allocate the software ring. */
        rxq->sw_ring =
@@ -2129,11 +2136,11 @@ i40e_reset_rx_queue(struct i40e_rx_queue *rxq)
        for (i = 0; i < len * sizeof(union i40e_rx_desc); i++)
                ((volatile char *)rxq->rx_ring)[i] = 0;
 
-#ifdef RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC
        memset(&rxq->fake_mbuf, 0x0, sizeof(rxq->fake_mbuf));
        for (i = 0; i < RTE_PMD_I40E_RX_MAX_BURST; ++i)
                rxq->sw_ring[rxq->nb_rx_desc + i].mbuf = &rxq->fake_mbuf;
 
+#ifdef RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC
        rxq->rx_nb_avail = 0;
        rxq->rx_next_avail = 0;
        rxq->rx_free_trigger = (uint16_t)(rxq->rx_free_thresh - 1);
index ecdb13c..635ed48 100644 (file)
@@ -113,11 +113,11 @@ struct i40e_rx_queue {
        uint16_t nb_rx_hold; /**< number of held free RX desc */
        struct rte_mbuf *pkt_first_seg; /**< first segment of current packet */
        struct rte_mbuf *pkt_last_seg; /**< last segment of current packet */
+       struct rte_mbuf fake_mbuf; /**< dummy mbuf */
 #ifdef RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC
        uint16_t rx_nb_avail; /**< number of staged packets ready */
        uint16_t rx_next_avail; /**< index of next staged packets */
        uint16_t rx_free_trigger; /**< triggers rx buffer allocation */
-       struct rte_mbuf fake_mbuf; /**< dummy mbuf */
        struct rte_mbuf *rx_stage[RTE_PMD_I40E_RX_MAX_BURST * 2];
 #endif
 
index 990520f..23b4e35 100644 (file)
@@ -243,6 +243,10 @@ i40e_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev)
        if (rxmode->header_split == 1)
                return -1;
 
+       /* no QinQ support */
+       if (rxmode->hw_vlan_extend == 1)
+               return -1;
+
        return 0;
 #else
        RTE_SET_USED(dev);
index 011c54e..d235daa 100644 (file)
@@ -205,7 +205,7 @@ desc_to_ptype_v(uint64x2_t descs[4], struct rte_mbuf **rx_pkts)
        for (i = 0; i < 4; i++) {
                tmp = vreinterpretq_u8_u64(vshrq_n_u64(descs[i], 30));
                ptype = vgetq_lane_u8(tmp, 8);
-               rx_pkts[0]->packet_type = i40e_rxd_pkt_type_mapping(ptype);
+               rx_pkts[i]->packet_type = i40e_rxd_pkt_type_mapping(ptype);
        }
 
 }
index b95cc8e..9644dd6 100644 (file)
@@ -320,20 +320,26 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                __m128i descs[RTE_I40E_DESCS_PER_LOOP];
                __m128i pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
                __m128i zero, staterr, sterr_tmp1, sterr_tmp2;
-               __m128i mbp1, mbp2; /* two mbuf pointer in one XMM reg. */
+               /* 2 64 bit or 4 32 bit mbuf pointers in one XMM reg. */
+               __m128i mbp1;
+#if defined(RTE_ARCH_X86_64)
+               __m128i mbp2;
+#endif
 
-               /* B.1 load 1 mbuf point */
+               /* B.1 load 2 (64 bit) or 4 (32 bit) mbuf points */
                mbp1 = _mm_loadu_si128((__m128i *)&sw_ring[pos]);
                /* Read desc statuses backwards to avoid race condition */
                /* A.1 load 4 pkts desc */
                descs[3] = _mm_loadu_si128((__m128i *)(rxdp + 3));
                rte_compiler_barrier();
 
-               /* B.2 copy 2 mbuf point into rx_pkts  */
+               /* B.2 copy 2 64 bit or 4 32 bit mbuf point into rx_pkts */
                _mm_storeu_si128((__m128i *)&rx_pkts[pos], mbp1);
 
-               /* B.1 load 1 mbuf point */
+#if defined(RTE_ARCH_X86_64)
+               /* B.1 load 2 64 bit mbuf points */
                mbp2 = _mm_loadu_si128((__m128i *)&sw_ring[pos+2]);
+#endif
 
                descs[2] = _mm_loadu_si128((__m128i *)(rxdp + 2));
                rte_compiler_barrier();
@@ -342,8 +348,10 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                rte_compiler_barrier();
                descs[0] = _mm_loadu_si128((__m128i *)(rxdp));
 
+#if defined(RTE_ARCH_X86_64)
                /* B.2 copy 2 mbuf point into rx_pkts  */
                _mm_storeu_si128((__m128i *)&rx_pkts[pos+2], mbp2);
+#endif
 
                if (split_packet) {
                        rte_mbuf_prefetch_part2(rx_pkts[pos]);
index 43c55d7..cf9d51d 100644 (file)
@@ -1542,16 +1542,10 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
                                status = IXGBE_SUCCESS;
                        } else {
                                if (hw->allow_unsupported_sfp == true) {
-                                       EWARN(hw, "WARNING: Intel (R) Network "
-                                             "Connections are quality tested "
-                                             "using Intel (R) Ethernet Optics."
-                                             " Using untested modules is not "
-                                             "supported and may cause unstable"
-                                             " operation or damage to the "
-                                             "module or the adapter. Intel "
-                                             "Corporation is not responsible "
-                                             "for any harm caused by using "
-                                             "untested modules.\n", status);
+                                       EWARN(hw,
+                                               "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. "
+                                               "Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. "
+                                               "Intel Corporation is not responsible for any harm caused by using untested modules.\n");
                                        status = IXGBE_SUCCESS;
                                } else {
                                        DEBUGOUT("SFP+ module not supported\n");
@@ -1804,16 +1798,10 @@ s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
                                status = IXGBE_SUCCESS;
                        } else {
                                if (hw->allow_unsupported_sfp == true) {
-                                       EWARN(hw, "WARNING: Intel (R) Network "
-                                             "Connections are quality tested "
-                                             "using Intel (R) Ethernet Optics."
-                                             " Using untested modules is not "
-                                             "supported and may cause unstable"
-                                             " operation or damage to the "
-                                             "module or the adapter. Intel "
-                                             "Corporation is not responsible "
-                                             "for any harm caused by using "
-                                             "untested modules.\n", status);
+                                       EWARN(hw,
+                                               "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. "
+                                               "Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. "
+                                               "Intel Corporation is not responsible for any harm caused by using untested modules.\n");
                                        status = IXGBE_SUCCESS;
                                } else {
                                        DEBUGOUT("QSFP module not supported\n");
@@ -1838,7 +1826,6 @@ err_read_i2c_eeprom:
        return IXGBE_ERR_SFP_NOT_PRESENT;
 }
 
-
 /**
  *  ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
  *  @hw: pointer to hardware structure
index bac36e0..d6686f6 100644 (file)
@@ -2991,6 +2991,7 @@ ixgbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
 
        /* Extended stats */
        for (i = 0; i < IXGBEVF_NB_XSTATS; i++) {
+               xstats[i].id = i;
                xstats[i].value = *(uint64_t *)(((char *)hw_stats) +
                        rte_ixgbevf_stats_strings[i].offset);
        }
@@ -4089,6 +4090,7 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        struct ixgbe_hw *hw;
        struct rte_eth_dev_info dev_info;
        uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+       struct rte_eth_rxmode *rx_conf = &dev->data->dev_conf.rxmode;
 
        ixgbe_dev_info_get(dev, &dev_info);
 
@@ -4099,7 +4101,7 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        /* refuse mtu that requires the support of scattered packets when this
         * feature has not been enabled before.
         */
-       if (!dev->data->scattered_rx &&
+       if (!rx_conf->enable_scatter &&
            (frame_size + 2 * IXGBE_VLAN_TAG_SIZE >
             dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM))
                return -EINVAL;
@@ -5722,6 +5724,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
        struct ixgbe_hw *hw;
        uint32_t max_frame = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+       struct rte_eth_rxmode *rx_conf = &dev->data->dev_conf.rxmode;
 
        hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
@@ -5731,7 +5734,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
        /* refuse mtu that requires the support of scattered packets when this
         * feature has not been enabled before.
         */
-       if (!dev->data->scattered_rx &&
+       if (!rx_conf->enable_scatter &&
            (max_frame + 2 * IXGBE_VLAN_TAG_SIZE >
             dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM))
                return -EINVAL;
@@ -7529,7 +7532,7 @@ ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
-       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE);
+       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI);
 }
 
 static void ixgbevf_mbx_process(struct rte_eth_dev *dev)
index 26395e4..09440cc 100644 (file)
@@ -387,15 +387,27 @@ ixgbe_vf_reset_msg(struct rte_eth_dev *dev, uint16_t vf)
        uint32_t reg_offset, vf_shift;
        const uint8_t VFRE_SHIFT = 5;  /* VFRE 32 bits per slot */
        const uint8_t VFRE_MASK = (uint8_t)((1U << VFRE_SHIFT) - 1);
+       uint8_t  nb_q_per_pool;
+       int i;
 
        vf_shift = vf & VFRE_MASK;
        reg_offset = (vf >> VFRE_SHIFT) > 0 ? 1 : 0;
 
-       /* enable transmit and receive for vf */
+       /* enable transmit for vf */
        reg = IXGBE_READ_REG(hw, IXGBE_VFTE(reg_offset));
        reg |= (reg | (1 << vf_shift));
        IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), reg);
 
+       /* enable all queue drop for IOV */
+       nb_q_per_pool = RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool;
+       for (i = vf * nb_q_per_pool; i < (vf + 1) * nb_q_per_pool; i++) {
+               IXGBE_WRITE_FLUSH(hw);
+               reg = IXGBE_QDE_ENABLE | IXGBE_QDE_WRITE;
+               reg |= i << IXGBE_QDE_IDX_SHIFT;
+               IXGBE_WRITE_REG(hw, IXGBE_QDE, reg);
+       }
+
+       /* enable receive for vf */
        reg = IXGBE_READ_REG(hw, IXGBE_VFRE(reg_offset));
        reg |= (reg | (1 << vf_shift));
        IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset), reg);
index c61ce47..d1e300a 100644 (file)
@@ -3323,7 +3323,6 @@ ixgbe_dcb_tx_hw_config(struct rte_eth_dev *dev,
                       struct ixgbe_dcb_config *dcb_config)
 {
        uint32_t reg;
-       uint32_t q;
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
        PMD_INIT_FUNC_TRACE();
@@ -3343,18 +3342,6 @@ ixgbe_dcb_tx_hw_config(struct rte_eth_dev *dev,
                        reg |= IXGBE_MTQC_VT_ENA;
                IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg);
 
-               if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
-                       /* Disable drop for all queues in VMDQ mode*/
-                       for (q = 0; q < 128; q++)
-                               IXGBE_WRITE_REG(hw, IXGBE_QDE,
-                                               (IXGBE_QDE_WRITE | (q << IXGBE_QDE_IDX_SHIFT)));
-               } else {
-                       /* Enable drop for all queues in SRIOV mode */
-                       for (q = 0; q < 128; q++)
-                               IXGBE_WRITE_REG(hw, IXGBE_QDE,
-                                               (IXGBE_QDE_WRITE | (q << IXGBE_QDE_IDX_SHIFT) | IXGBE_QDE_ENABLE));
-               }
-
                /* Enable the Tx desc arbiter */
                reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
                reg &= ~IXGBE_RTTDCS_ARBDIS;
@@ -3488,16 +3475,18 @@ ixgbe_dcb_tx_config(struct rte_eth_dev *dev,
 
 /**
  * ixgbe_dcb_rx_hw_config - Configure general DCB RX HW parameters
- * @hw: pointer to hardware structure
+ * @dev: pointer to eth_dev structure
  * @dcb_config: pointer to ixgbe_dcb_config structure
  */
 static void
-ixgbe_dcb_rx_hw_config(struct ixgbe_hw *hw,
-              struct ixgbe_dcb_config *dcb_config)
+ixgbe_dcb_rx_hw_config(struct rte_eth_dev *dev,
+                      struct ixgbe_dcb_config *dcb_config)
 {
        uint32_t reg;
        uint32_t vlanctrl;
        uint8_t i;
+       uint32_t q;
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
        PMD_INIT_FUNC_TRACE();
        /*
@@ -3535,6 +3524,21 @@ ixgbe_dcb_rx_hw_config(struct ixgbe_hw *hw,
                }
 
                IXGBE_WRITE_REG(hw, IXGBE_MRQC, reg);
+
+               if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
+                       /* Disable drop for all queues in VMDQ mode*/
+                       for (q = 0; q < IXGBE_MAX_RX_QUEUE_NUM; q++)
+                               IXGBE_WRITE_REG(hw, IXGBE_QDE,
+                                               (IXGBE_QDE_WRITE |
+                                                (q << IXGBE_QDE_IDX_SHIFT)));
+               } else {
+                       /* Enable drop for all queues in SRIOV mode */
+                       for (q = 0; q < IXGBE_MAX_RX_QUEUE_NUM; q++)
+                               IXGBE_WRITE_REG(hw, IXGBE_QDE,
+                                               (IXGBE_QDE_WRITE |
+                                                (q << IXGBE_QDE_IDX_SHIFT) |
+                                                IXGBE_QDE_ENABLE));
+               }
        }
 
        /* VLNCTRL: enable vlan filtering and allow all vlan tags through */
@@ -3647,7 +3651,7 @@ ixgbe_dcb_hw_configure(struct rte_eth_dev *dev,
                /* Get dcb TX configuration parameters from rte_eth_conf */
                ixgbe_dcb_rx_config(dev, dcb_config);
                /*Configure general DCB RX parameters*/
-               ixgbe_dcb_rx_hw_config(hw, dcb_config);
+               ixgbe_dcb_rx_hw_config(dev, dcb_config);
                break;
        default:
                PMD_INIT_LOG(ERR, "Incorrect DCB RX mode configuration");
@@ -3706,6 +3710,15 @@ ixgbe_dcb_hw_configure(struct rte_eth_dev *dev,
                        tc->path[IXGBE_DCB_TX_CONFIG].bwg_percent = 0;
                        tc->path[IXGBE_DCB_RX_CONFIG].bwg_percent = 0;
                }
+       } else {
+               /* Re-configure 8 TCs BW */
+               for (i = 0; i < nb_tcs; i++) {
+                       tc = &dcb_config->tc_config[i];
+                       tc->path[IXGBE_DCB_TX_CONFIG].bwg_percent =
+                               (uint8_t)(100 / nb_tcs + (i & 1));
+                       tc->path[IXGBE_DCB_RX_CONFIG].bwg_percent =
+                               (uint8_t)(100 / nb_tcs + (i & 1));
+               }
        }
 
        switch (hw->mac.type) {
@@ -4083,9 +4096,8 @@ ixgbe_dev_mq_rx_configure(struct rte_eth_dev *dev)
                        break;
                }
        } else {
-               /*
-                * SRIOV active scheme
-                * Support RSS together with VMDq & SRIOV
+               /* SRIOV active scheme
+                * Support RSS together with SRIOV.
                 */
                switch (dev->data->dev_conf.rxmode.mq_mode) {
                case ETH_MQ_RX_RSS:
@@ -4093,10 +4105,13 @@ ixgbe_dev_mq_rx_configure(struct rte_eth_dev *dev)
                        ixgbe_config_vf_rss(dev);
                        break;
                case ETH_MQ_RX_VMDQ_DCB:
+               case ETH_MQ_RX_DCB:
+               /* In SRIOV, the configuration is the same as VMDq case */
                        ixgbe_vmdq_dcb_configure(dev);
                        break;
-               /* FIXME if support DCB/RSS together with VMDq & SRIOV */
+               /* DCB/RSS together with SRIOV is not supported */
                case ETH_MQ_RX_VMDQ_DCB_RSS:
+               case ETH_MQ_RX_DCB_RSS:
                        PMD_INIT_LOG(ERR,
                                "Could not support DCB/RSS with VMDq & SRIOV");
                        return -1;
index abbf284..dd7d177 100644 (file)
@@ -335,9 +335,13 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                __m128i descs[RTE_IXGBE_DESCS_PER_LOOP];
                __m128i pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
                __m128i zero, staterr, sterr_tmp1, sterr_tmp2;
-               __m128i mbp1, mbp2; /* two mbuf pointer in one XMM reg. */
+               /* 2 64 bit or 4 32 bit mbuf pointers in one XMM reg. */
+               __m128i mbp1;
+#if defined(RTE_ARCH_X86_64)
+               __m128i mbp2;
+#endif
 
-               /* B.1 load 1 mbuf point */
+               /* B.1 load 2 (64 bit) or 4 (32 bit) mbuf points */
                mbp1 = _mm_loadu_si128((__m128i *)&sw_ring[pos]);
 
                /* Read desc statuses backwards to avoid race condition */
@@ -345,11 +349,13 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                descs[3] = _mm_loadu_si128((__m128i *)(rxdp + 3));
                rte_compiler_barrier();
 
-               /* B.2 copy 2 mbuf point into rx_pkts  */
+               /* B.2 copy 2 64 bit or 4 32 bit mbuf point into rx_pkts */
                _mm_storeu_si128((__m128i *)&rx_pkts[pos], mbp1);
 
-               /* B.1 load 1 mbuf point */
+#if defined(RTE_ARCH_X86_64)
+               /* B.1 load 2 64 bit mbuf points */
                mbp2 = _mm_loadu_si128((__m128i *)&sw_ring[pos+2]);
+#endif
 
                descs[2] = _mm_loadu_si128((__m128i *)(rxdp + 2));
                rte_compiler_barrier();
@@ -358,8 +364,10 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                rte_compiler_barrier();
                descs[0] = _mm_loadu_si128((__m128i *)(rxdp));
 
+#if defined(RTE_ARCH_X86_64)
                /* B.2 copy 2 mbuf point into rx_pkts  */
                _mm_storeu_si128((__m128i *)&rx_pkts[pos+2], mbp2);
+#endif
 
                if (split_packet) {
                        rte_mbuf_prefetch_part2(rx_pkts[pos]);
index 6d43a97..83f9143 100644 (file)
@@ -3340,6 +3340,8 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
                        /* Increase out of memory counters. */
                        ++rxq->stats.rx_nombuf;
                        ++rxq->priv->dev->data->rx_mbuf_alloc_failed;
+                       /* Add SGE to array for repost. */
+                       sges[i] = elt->sge;
                        goto repost;
                }
 
@@ -5571,10 +5573,8 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
        list = ibv_get_device_list(&i);
        if (list == NULL) {
                assert(errno);
-               if (errno == ENOSYS) {
-                       WARN("cannot list devices, is ib_uverbs loaded?");
-                       return 0;
-               }
+               if (errno == ENOSYS)
+                       ERROR("cannot list devices, is ib_uverbs loaded?");
                return -errno;
        }
        assert(i >= 0);
@@ -5606,11 +5606,11 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                ibv_free_device_list(list);
                switch (err) {
                case 0:
-                       WARN("cannot access device, is mlx4_ib loaded?");
-                       return 0;
+                       ERROR("cannot access device, is mlx4_ib loaded?");
+                       return -ENODEV;
                case EINVAL:
-                       WARN("cannot use device, are drivers up to date?");
-                       return 0;
+                       ERROR("cannot use device, are drivers up to date?");
+                       return -EINVAL;
                }
                assert(err > 0);
                return -err;
@@ -5857,6 +5857,9 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                /* Bring Ethernet device up. */
                DEBUG("forcing Ethernet interface up");
                priv_set_flags(priv, ~IFF_UP, IFF_UP);
+               /* Update link status once if waiting for LSC. */
+               if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
+                       mlx4_link_update(eth_dev, 0);
                continue;
 
 port_error:
index cb45fd0..aa9d2dc 100644 (file)
@@ -384,10 +384,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
        list = ibv_get_device_list(&i);
        if (list == NULL) {
                assert(errno);
-               if (errno == ENOSYS) {
-                       WARN("cannot list devices, is ib_uverbs loaded?");
-                       return 0;
-               }
+               if (errno == ENOSYS)
+                       ERROR("cannot list devices, is ib_uverbs loaded?");
                return -errno;
        }
        assert(i >= 0);
@@ -427,11 +425,11 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                ibv_free_device_list(list);
                switch (err) {
                case 0:
-                       WARN("cannot access device, is mlx5_ib loaded?");
-                       return 0;
+                       ERROR("cannot access device, is mlx5_ib loaded?");
+                       return -ENODEV;
                case EINVAL:
-                       WARN("cannot use device, are drivers up to date?");
-                       return 0;
+                       ERROR("cannot use device, are drivers up to date?");
+                       return -EINVAL;
                }
                assert(err > 0);
                return -err;
index 06cfd01..0aa274e 100644 (file)
@@ -665,10 +665,10 @@ mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev)
 {
        static const uint32_t ptypes[] = {
                /* refers to rxq_cq_to_pkt_type() */
-               RTE_PTYPE_L3_IPV4,
-               RTE_PTYPE_L3_IPV6,
-               RTE_PTYPE_INNER_L3_IPV4,
-               RTE_PTYPE_INNER_L3_IPV6,
+               RTE_PTYPE_L3_IPV4_EXT_UNKNOWN,
+               RTE_PTYPE_L3_IPV6_EXT_UNKNOWN,
+               RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN,
+               RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,
                RTE_PTYPE_UNKNOWN
 
        };
index 28e93d3..118f6d6 100644 (file)
@@ -1247,6 +1247,19 @@ mlx5_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
                }
                (*priv->rxqs)[idx] = NULL;
                rxq_cleanup(rxq_ctrl);
+               /* Resize if rxq size is changed. */
+               if (rxq_ctrl->rxq.elts_n != log2above(desc)) {
+                       rxq_ctrl = rte_realloc(rxq_ctrl,
+                                              sizeof(*rxq_ctrl) +
+                                              desc * sizeof(struct rte_mbuf *),
+                                              RTE_CACHE_LINE_SIZE);
+                       if (!rxq_ctrl) {
+                               ERROR("%p: unable to reallocate queue index %u",
+                                       (void *)dev, idx);
+                               priv_unlock(priv);
+                               return -ENOMEM;
+                       }
+               }
        } else {
                rxq_ctrl = rte_calloc_socket("RXQ", 1, sizeof(*rxq_ctrl) +
                                             desc * sizeof(struct rte_mbuf *),
index 3997b27..58926e3 100644 (file)
@@ -431,7 +431,8 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
 #ifdef MLX5_PMD_SOFT_COUNTERS
                total_length = length;
 #endif
-               assert(length >= MLX5_WQE_DWORD_SIZE);
+               if (length < (MLX5_WQE_DWORD_SIZE + 2))
+                       break;
                /* Update element. */
                (*txq->elts)[elts_head] = buf;
                elts_head = (elts_head + 1) & (elts_n - 1);
@@ -1290,7 +1291,7 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
                &(*rxq->cqes)[rxq->cq_ci & cqe_cnt];
        unsigned int i = 0;
        unsigned int rq_ci = rxq->rq_ci << sges_n;
-       int len; /* keep its value across iterations. */
+       int len = 0; /* keep its value across iterations. */
 
        while (pkts_n) {
                unsigned int idx = rq_ci & wqe_cnt;
@@ -1356,7 +1357,7 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
                                        pkt->ol_flags |=
                                                rxq_cq_to_ol_flags(rxq, cqe);
                                }
-                               if (cqe->hdr_type_etc &
+                               if (ntohs(cqe->hdr_type_etc) &
                                    MLX5_CQE_VLAN_STRIPPED) {
                                        pkt->ol_flags |= PKT_RX_VLAN_PKT |
                                                PKT_RX_VLAN_STRIPPED;
index 439908f..c286367 100644 (file)
@@ -496,6 +496,19 @@ mlx5_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
                }
                (*priv->txqs)[idx] = NULL;
                txq_cleanup(txq_ctrl);
+               /* Resize if txq size is changed. */
+               if (txq_ctrl->txq.elts_n != log2above(desc)) {
+                       txq_ctrl = rte_realloc(txq_ctrl,
+                                              sizeof(*txq_ctrl) +
+                                              desc * sizeof(struct rte_mbuf *),
+                                              RTE_CACHE_LINE_SIZE);
+                       if (!txq_ctrl) {
+                               ERROR("%p: unable to reallocate queue index %u",
+                                       (void *)dev, idx);
+                               priv_unlock(priv);
+                               return -ENOMEM;
+                       }
+               }
        } else {
                txq_ctrl =
                        rte_calloc_socket("TXQ", 1,
index 099d82b..49c5293 100644 (file)
@@ -1916,7 +1916,7 @@ nfp_net_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
        struct nfp_net_tx_desc *txds;
        struct rte_mbuf *pkt;
        uint64_t dma_addr;
-       int pkt_size, dma_size;
+       int pkt_size, pkt_len, dma_size;
        uint16_t free_descs, issued_descs;
        struct rte_mbuf **lmbuf;
        int i;
@@ -1964,6 +1964,8 @@ nfp_net_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
                 * Checksum and VLAN flags just in the first descriptor for a
                 * multisegment packet
                 */
+
+               txds->data_len = pkt->pkt_len;
                nfp_net_tx_cksum(txq, txds, pkt);
 
                if ((pkt->ol_flags & PKT_TX_VLAN_PKT) &&
@@ -1981,6 +1983,7 @@ nfp_net_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
                 * then data_len = pkt_len
                 */
                pkt_size = pkt->pkt_len;
+               pkt_len = pkt->pkt_len;
 
                /* Releasing mbuf which was prefetched above */
                if (*lmbuf)
@@ -1999,7 +2002,7 @@ nfp_net_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 
                        /* Filling descriptors fields */
                        txds->dma_len = dma_size;
-                       txds->data_len = pkt->pkt_len;
+                       txds->data_len = pkt_len;
                        txds->dma_addr_hi = (dma_addr >> 32) & 0xff;
                        txds->dma_addr_lo = (dma_addr & 0xffffffff);
                        ASSERT(free_descs > 0);
index 57b0b31..1a208ff 100644 (file)
@@ -294,9 +294,9 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        }
                }
 
-               rte_pktmbuf_free(mbuf);
                num_tx++;
                tx_bytes += mbuf->pkt_len;
+               rte_pktmbuf_free(mbuf);
        }
 
        /*
index 28be958..3f895cd 100644 (file)
@@ -98,9 +98,7 @@ inline u32 qede_find_first_zero_bit(unsigned long *addr, u32 limit)
        u32 nwords = 0;
        OSAL_BUILD_BUG_ON(!limit);
        nwords = (limit - 1) / OSAL_BITS_PER_UL + 1;
-       for (i = 0; i < nwords; i++)
-               if (~(addr[i] != 0))
-                       break;
+       for (i = 0; i < nwords && ~(addr[i]) == 0; i++);
        return (i == nwords) ? limit : i * OSAL_BITS_PER_UL + qede_ffz(addr[i]);
 }
 
index 6d6fb9d..2322147 100644 (file)
@@ -433,8 +433,6 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
-       struct ecore_filter_ucast ucast;
-       int rc;
 
        if (IS_VF(edev) && !ecore_vf_check_mac(ECORE_LEADING_HWFN(edev),
                                               mac_addr->addr_bytes)) {
@@ -444,29 +442,7 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)
                return;
        }
 
-       /* First remove the primary mac */
-       qede_set_ucast_cmn_params(&ucast);
-       ucast.opcode = ECORE_FILTER_REMOVE;
-       ucast.type = ECORE_FILTER_MAC;
-       ether_addr_copy(&qdev->primary_mac,
-                       (struct ether_addr *)&ucast.mac);
-       rc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);
-       if (rc != 0) {
-               DP_ERR(edev, "Unable to remove current macaddr"
-                            " Reverting to previous default mac\n");
-               ether_addr_copy(&qdev->primary_mac,
-                               &eth_dev->data->mac_addrs[0]);
-               return;
-       }
-
-       /* Add new MAC */
-       ucast.opcode = ECORE_FILTER_ADD;
-       ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);
-       rc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);
-       if (rc != 0)
-               DP_ERR(edev, "Unable to add new default mac\n");
-       else
-               ether_addr_copy(mac_addr, &qdev->primary_mac);
+       qede_mac_addr_add(eth_dev, mac_addr, 0, 0);
 }
 
 static void qede_config_accept_any_vlan(struct qede_dev *qdev, bool action)
@@ -741,10 +717,6 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
        SLIST_INIT(&qdev->vlan_list_head);
 
-       /* Add primary mac for PF */
-       if (IS_PF(edev))
-               qede_mac_addr_set(eth_dev, &qdev->primary_mac);
-
        /* Enable VLAN offloads by default */
        qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |
                                       ETH_VLAN_FILTER_MASK |
@@ -1286,6 +1258,8 @@ void qede_init_rss_caps(uint8_t *rss_caps, uint64_t hf)
        *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV4_TCP)  ? ECORE_RSS_IPV4_TCP : 0;
        *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_TCP)  ? ECORE_RSS_IPV6_TCP : 0;
        *rss_caps |= (hf & ETH_RSS_IPV6_TCP_EX)       ? ECORE_RSS_IPV6_TCP : 0;
+       *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV4_UDP)  ? ECORE_RSS_IPV4_UDP : 0;
+       *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_UDP)  ? ECORE_RSS_IPV6_UDP : 0;
 }
 
 static int qede_rss_hash_update(struct rte_eth_dev *eth_dev,
index b666e1c..a6d8ef4 100644 (file)
@@ -345,11 +345,12 @@ qed_fill_dev_info(struct ecore_dev *edev, struct qed_dev_info *dev_info)
        rte_memcpy(&dev_info->hw_mac, &edev->hwfns[0].hw_info.hw_mac_addr,
               ETHER_ADDR_LEN);
 
+       dev_info->fw_major = FW_MAJOR_VERSION;
+       dev_info->fw_minor = FW_MINOR_VERSION;
+       dev_info->fw_rev = FW_REVISION_VERSION;
+       dev_info->fw_eng = FW_ENGINEERING_VERSION;
+
        if (IS_PF(edev)) {
-               dev_info->fw_major = FW_MAJOR_VERSION;
-               dev_info->fw_minor = FW_MINOR_VERSION;
-               dev_info->fw_rev = FW_REVISION_VERSION;
-               dev_info->fw_eng = FW_ENGINEERING_VERSION;
                dev_info->mf_mode = edev->mf_mode;
                dev_info->tx_switching = false;
        } else {
index a34b665..9cce13d 100644 (file)
@@ -1318,10 +1318,6 @@ int qede_dev_start(struct rte_eth_dev *eth_dev)
        /* Bring-up the link */
        qede_dev_set_link_state(eth_dev, true);
 
-       /* Reset ring */
-       if (qede_reset_fp_rings(qdev))
-               return -ENOMEM;
-
        /* Start/resume traffic */
        qdev->ops->fastpath_start(edev);
 
@@ -1490,6 +1486,7 @@ int qede_reset_fp_rings(struct qede_dev *qdev)
                        }
                }
        }
+       qede_reset_fp_rings(qdev);
 
        return 0;
 }
index 9e028a3..49a2646 100644 (file)
@@ -37,7 +37,7 @@
 #include "nicvf_bsvf.h"
 #include "nicvf_plat.h"
 
-static SIMPLEQ_HEAD(, svf_entry) head = SIMPLEQ_HEAD_INITIALIZER(head);
+static STAILQ_HEAD(, svf_entry) head = STAILQ_HEAD_INITIALIZER(head);
 
 void
 nicvf_bsvf_push(struct svf_entry *entry)
@@ -45,7 +45,7 @@ nicvf_bsvf_push(struct svf_entry *entry)
        assert(entry != NULL);
        assert(entry->vf != NULL);
 
-       SIMPLEQ_INSERT_TAIL(&head, entry, next);
+       STAILQ_INSERT_TAIL(&head, entry, next);
 }
 
 struct svf_entry *
@@ -53,14 +53,14 @@ nicvf_bsvf_pop(void)
 {
        struct svf_entry *entry;
 
-       assert(!SIMPLEQ_EMPTY(&head));
+       assert(!STAILQ_EMPTY(&head));
 
-       entry = SIMPLEQ_FIRST(&head);
+       entry = STAILQ_FIRST(&head);
 
        assert(entry != NULL);
        assert(entry->vf != NULL);
 
-       SIMPLEQ_REMOVE_HEAD(&head, next);
+       STAILQ_REMOVE_HEAD(&head, next);
 
        return entry;
 }
@@ -68,5 +68,5 @@ nicvf_bsvf_pop(void)
 int
 nicvf_bsvf_empty(void)
 {
-       return SIMPLEQ_EMPTY(&head);
+       return STAILQ_EMPTY(&head);
 }
index 5d5a25e..fb9b248 100644 (file)
@@ -41,7 +41,7 @@ struct nicvf;
  * The base queue structure to hold secondary qsets.
  */
 struct svf_entry {
-       SIMPLEQ_ENTRY(svf_entry) next; /**< Next element's pointer */
+       STAILQ_ENTRY(svf_entry) next; /**< Next element's pointer */
        struct nicvf *vf;              /**< Holder of a secondary qset */
 };
 
index 466e49c..2da5af0 100644 (file)
@@ -41,7 +41,6 @@
 #include <inttypes.h>
 #include <netinet/in.h>
 #include <sys/queue.h>
-#include <sys/timerfd.h>
 
 #include <rte_alarm.h>
 #include <rte_atomic.h>
@@ -245,7 +244,7 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 
        /* Reading per RX ring stats */
        for (qidx = rx_start; qidx <= rx_end; qidx++) {
-               if (qidx == RTE_ETHDEV_QUEUE_STAT_CNTRS)
+               if (qidx >= RTE_ETHDEV_QUEUE_STAT_CNTRS)
                        break;
 
                nicvf_hw_get_rx_qstats(nic, &rx_qstats, qidx);
@@ -258,7 +257,7 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 
        /* Reading per TX ring stats */
        for (qidx = tx_start; qidx <= tx_end; qidx++) {
-               if (qidx == RTE_ETHDEV_QUEUE_STAT_CNTRS)
+               if (qidx >= RTE_ETHDEV_QUEUE_STAT_CNTRS)
                        break;
 
                nicvf_hw_get_tx_qstats(nic, &tx_qstats, qidx);
@@ -277,7 +276,7 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 
                /* Reading per RX ring stats */
                for (qidx = rx_start; qidx <= rx_end; qidx++) {
-                       if (qidx == RTE_ETHDEV_QUEUE_STAT_CNTRS)
+                       if (qidx >= RTE_ETHDEV_QUEUE_STAT_CNTRS)
                                break;
 
                        nicvf_hw_get_rx_qstats(snic, &rx_qstats,
@@ -290,7 +289,7 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
                nicvf_tx_range(dev, snic, &tx_start, &tx_end);
                /* Reading per TX ring stats */
                for (qidx = tx_start; qidx <= tx_end; qidx++) {
-                       if (qidx == RTE_ETHDEV_QUEUE_STAT_CNTRS)
+                       if (qidx >= RTE_ETHDEV_QUEUE_STAT_CNTRS)
                                break;
 
                        nicvf_hw_get_tx_qstats(snic, &tx_qstats,
index fc43b74..87e9de1 100644 (file)
@@ -469,11 +469,10 @@ nicvf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                rxq->head = cqe_head;
                nicvf_addr_write(rxq->cq_door, to_process);
                rxq->recv_buffers += to_process;
-               if (rxq->recv_buffers > rxq->rx_free_thresh) {
-                       rxq->recv_buffers -= nicvf_fill_rbdr(rxq,
-                                               rxq->rx_free_thresh);
-                       NICVF_RX_ASSERT(rxq->recv_buffers >= 0);
-               }
+       }
+       if (rxq->recv_buffers > rxq->rx_free_thresh) {
+               rxq->recv_buffers -= nicvf_fill_rbdr(rxq, rxq->rx_free_thresh);
+               NICVF_RX_ASSERT(rxq->recv_buffers >= 0);
        }
 
        return to_process;
@@ -563,11 +562,10 @@ nicvf_recv_pkts_multiseg(void *rx_queue, struct rte_mbuf **rx_pkts,
                rxq->head = cqe_head;
                nicvf_addr_write(rxq->cq_door, to_process);
                rxq->recv_buffers += buffers_consumed;
-               if (rxq->recv_buffers > rxq->rx_free_thresh) {
-                       rxq->recv_buffers -=
-                               nicvf_fill_rbdr(rxq, rxq->rx_free_thresh);
-                       NICVF_RX_ASSERT(rxq->recv_buffers >= 0);
-               }
+       }
+       if (rxq->recv_buffers > rxq->rx_free_thresh) {
+               rxq->recv_buffers -= nicvf_fill_rbdr(rxq, rxq->rx_free_thresh);
+               NICVF_RX_ASSERT(rxq->recv_buffers >= 0);
        }
 
        return to_process;
index c900e12..5bc6d57 100644 (file)
@@ -43,8 +43,8 @@
 #include <rte_memory.h>
 
 struct nicvf_rbdr {
-       uint64_t rbdr_status;
-       uint64_t rbdr_door;
+       uintptr_t rbdr_status;
+       uintptr_t rbdr_door;
        struct rbdr_entry_t *desc;
        nicvf_phys_addr_t phys;
        uint32_t buffsz;
@@ -58,8 +58,8 @@ struct nicvf_txq {
        union sq_entry_t *desc;
        nicvf_phys_addr_t phys;
        struct rte_mbuf **txbuffs;
-       uint64_t sq_head;
-       uint64_t sq_door;
+       uintptr_t sq_head;
+       uintptr_t sq_door;
        struct rte_mempool *pool;
        struct nicvf *nic;
        void (*pool_free)(struct nicvf_txq *sq);
@@ -74,8 +74,8 @@ struct nicvf_txq {
 
 struct nicvf_rxq {
        uint64_t mbuf_phys_off;
-       uint64_t cq_status;
-       uint64_t cq_door;
+       uintptr_t cq_status;
+       uintptr_t cq_door;
        nicvf_phys_addr_t phys;
        union cq_entry_t *desc;
        struct nicvf_rbdr *shared_rbdr;
index f5961ab..452ad2a 100644 (file)
@@ -545,6 +545,9 @@ virtio_free_queues(struct virtio_hw *hw)
        int queue_type;
        uint16_t i;
 
+       if (hw->vqs == NULL)
+               return;
+
        for (i = 0; i < nr_vq; i++) {
                vq = hw->vqs[i];
                if (!vq)
@@ -563,9 +566,11 @@ virtio_free_queues(struct virtio_hw *hw)
                }
 
                rte_free(vq);
+               hw->vqs[i] = NULL;
        }
 
        rte_free(hw->vqs);
+       hw->vqs = NULL;
 }
 
 static int
@@ -1210,11 +1215,11 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
 
        rte_eth_copy_pci_info(eth_dev, pci_dev);
 
-       /* If host does not support status then disable LSC */
-       if (!vtpci_with_feature(hw, VIRTIO_NET_F_STATUS))
-               eth_dev->data->dev_flags &= ~RTE_ETH_DEV_INTR_LSC;
-       else
+       /* If host does not support both status and MSI-X then disable LSC */
+       if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS) && hw->use_msix)
                eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
+       else
+               eth_dev->data->dev_flags &= ~RTE_ETH_DEV_INTR_LSC;
 
        rx_func_get(eth_dev);
 
@@ -1550,9 +1555,6 @@ virtio_dev_start(struct rte_eth_dev *dev)
                }
        }
 
-       /* Initialize Link state */
-       virtio_dev_link_update(dev, 0);
-
        /*Notify the backend
         *Otherwise the tap backend might already stop its queue due to fullness.
         *vhost backend will have no chance to be waked up
@@ -1582,6 +1584,11 @@ virtio_dev_start(struct rte_eth_dev *dev)
                VIRTQUEUE_DUMP(txvq->vq);
        }
 
+       hw->started = 1;
+
+       /* Initialize Link state */
+       virtio_dev_link_update(dev, 0);
+
        return 0;
 }
 
@@ -1636,6 +1643,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
 static void
 virtio_dev_stop(struct rte_eth_dev *dev)
 {
+       struct virtio_hw *hw = dev->data->dev_private;
        struct rte_eth_link link;
 
        PMD_INIT_LOG(DEBUG, "stop");
@@ -1643,6 +1651,7 @@ virtio_dev_stop(struct rte_eth_dev *dev)
        if (dev->data->dev_conf.intr_conf.lsc)
                rte_intr_disable(&dev->pci_dev->intr_handle);
 
+       hw->started = 0;
        memset(&link, 0, sizeof(link));
        virtio_dev_atomic_write_link_status(dev, &link);
 }
@@ -1659,7 +1668,9 @@ virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complet
        link.link_duplex = ETH_LINK_FULL_DUPLEX;
        link.link_speed  = SPEED_10G;
 
-       if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) {
+       if (hw->started == 0) {
+               link.link_status = ETH_LINK_DOWN;
+       } else if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) {
                PMD_INIT_LOG(DEBUG, "Get link status from hw");
                vtpci_read_dev_config(hw,
                                offsetof(struct virtio_net_config, status),
index 8d5355c..f6d697f 100644 (file)
@@ -48,6 +48,7 @@
  */
 #define PCI_CAPABILITY_LIST    0x34
 #define PCI_CAP_ID_VNDR                0x09
+#define PCI_CAP_ID_MSIX                0x11
 
 /*
  * The remaining space is defined by each driver as the per-driver
@@ -517,7 +518,7 @@ modern_del_queue(struct virtio_hw *hw, struct virtqueue *vq)
 static void
 modern_notify_queue(struct virtio_hw *hw __rte_unused, struct virtqueue *vq)
 {
-       io_write16(1, vq->notify_addr);
+       io_write16(vq->vq_queue_index, vq->notify_addr);
 }
 
 const struct virtio_pci_ops modern_ops = {
@@ -670,6 +671,9 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw)
                        break;
                }
 
+               if (cap.cap_vndr == PCI_CAP_ID_MSIX)
+                       hw->use_msix = 1;
+
                if (cap.cap_vndr != PCI_CAP_ID_VNDR) {
                        PMD_INIT_LOG(DEBUG,
                                "[%2x] skipping non VNDR cap id: %02x",
index 511a1c8..40f7e42 100644 (file)
@@ -160,7 +160,8 @@ struct virtnet_ctl;
 /*
  * Maximum number of virtqueues per device.
  */
-#define VIRTIO_MAX_VIRTQUEUES 8
+#define VIRTIO_MAX_VIRTQUEUE_PAIRS 8
+#define VIRTIO_MAX_VIRTQUEUES (VIRTIO_MAX_VIRTQUEUE_PAIRS * 2 + 1)
 
 /* Common configuration */
 #define VIRTIO_PCI_CAP_COMMON_CFG      1
@@ -248,6 +249,7 @@ struct virtio_hw {
        uint64_t    req_guest_features;
        uint64_t    guest_features;
        uint32_t    max_queue_pairs;
+       uint16_t    started;
        uint16_t    vtnet_hdr_size;
        uint8_t     vlan_strip;
        uint8_t     use_msix;
index a38398b..91f6a59 100644 (file)
@@ -230,7 +230,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
        parse_mac(dev, mac);
        dev->vhostfd = -1;
 
-       for (i = 0; i < VIRTIO_MAX_VIRTQUEUES * 2 + 1; ++i) {
+       for (i = 0; i < VIRTIO_MAX_VIRTQUEUES; ++i) {
                dev->kickfds[i] = -1;
                dev->callfds[i] = -1;
        }
index 28fc788..1326b91 100644 (file)
@@ -40,8 +40,8 @@
 
 struct virtio_user_dev {
        int             vhostfd;
-       int             callfds[VIRTIO_MAX_VIRTQUEUES * 2 + 1];
-       int             kickfds[VIRTIO_MAX_VIRTQUEUES * 2 + 1];
+       int             callfds[VIRTIO_MAX_VIRTQUEUES];
+       int             kickfds[VIRTIO_MAX_VIRTQUEUES];
        int             mac_specified;
        uint32_t        max_queue_pairs;
        uint32_t        queue_pairs;
@@ -53,7 +53,7 @@ struct virtio_user_dev {
        uint8_t         status;
        uint8_t         mac_addr[ETHER_ADDR_LEN];
        char            path[PATH_MAX];
-       struct vring    vrings[VIRTIO_MAX_VIRTQUEUES * 2 + 1];
+       struct vring    vrings[VIRTIO_MAX_VIRTQUEUES];
 };
 
 int virtio_user_start_device(struct virtio_user_dev *dev);
index 013600e..f018724 100644 (file)
@@ -416,6 +416,13 @@ virtio_user_pmd_probe(const char *name, const char *params)
                goto end;
        }
 
+       if (queues > VIRTIO_MAX_VIRTQUEUE_PAIRS) {
+               PMD_INIT_LOG(ERR, "arg %s %" PRIu64 " exceeds the limit %u",
+                       VIRTIO_USER_ARG_QUEUES_NUM, queues,
+                       VIRTIO_MAX_VIRTQUEUE_PAIRS);
+               goto end;
+       }
+
        eth_dev = virtio_user_eth_dev_alloc(name);
        if (!eth_dev) {
                PMD_INIT_LOG(ERR, "virtio_user fails to alloc device");
index b1070e0..569c251 100644 (file)
@@ -71,8 +71,14 @@ struct rte_mbuf;
 /**
  * Return the physical address (or virtual address in case of
  * virtio-user) of mbuf data buffer.
+ *
+ * The address is firstly casted to the word size (sizeof(uintptr_t))
+ * before casting it to uint64_t. This is to make it work with different
+ * combination of word size (64 bit and 32 bit) and virtio device
+ * (virtio-pci and virtio-user).
  */
-#define VIRTIO_MBUF_ADDR(mb, vq) (*(uint64_t *)((uintptr_t)(mb) + (vq)->offset))
+#define VIRTIO_MBUF_ADDR(mb, vq) \
+       ((uint64_t)(*(uintptr_t *)((uintptr_t)(mb) + (vq)->offset)))
 #else
 #define VIRTIO_MBUF_ADDR(mb, vq) ((mb)->buf_physaddr)
 #endif
index 8bb13e5..f123df9 100644 (file)
@@ -771,7 +771,7 @@ vmxnet3_dev_link_update(struct rte_eth_dev *dev,
                        __rte_unused int wait_to_complete)
 {
        struct vmxnet3_hw *hw = dev->data->dev_private;
-       struct rte_eth_link old, link;
+       struct rte_eth_link old = { 0 }, link;
        uint32_t ret;
 
        /* Link status doesn't change for stopped dev */
index b50d2b0..a3d330c 100644 (file)
@@ -138,6 +138,7 @@ typedef struct vmxnet3_tx_queue {
        uint32_t                     qid;
        struct Vmxnet3_TxQueueDesc   *shared;
        struct vmxnet3_txq_stats     stats;
+       const struct rte_memzone     *mz;
        bool                         stopped;
        uint16_t                     queue_id;      /**< Device TX queue index. */
        uint8_t                      port_id;       /**< Device port identifier. */
@@ -161,6 +162,7 @@ typedef struct vmxnet3_rx_queue {
        struct rte_mbuf             *start_seg;
        struct rte_mbuf             *last_seg;
        struct vmxnet3_rxq_stats    stats;
+       const struct rte_memzone    *mz;
        bool                        stopped;
        uint16_t                    queue_id;      /**< Device RX queue index. */
        uint8_t                     port_id;       /**< Device port identifier. */
index 93db10f..3ded18e 100644 (file)
@@ -192,6 +192,8 @@ vmxnet3_dev_tx_queue_release(void *txq)
                vmxnet3_tx_cmd_ring_release_mbufs(&tq->cmd_ring);
                /* Release the cmd_ring */
                vmxnet3_cmd_ring_release(&tq->cmd_ring);
+               /* Release the memzone */
+               rte_memzone_free(tq->mz);
        }
 }
 
@@ -209,6 +211,9 @@ vmxnet3_dev_rx_queue_release(void *rxq)
                /* Release both the cmd_rings */
                for (i = 0; i < VMXNET3_RX_CMDRING_SIZE; i++)
                        vmxnet3_cmd_ring_release(&rq->cmd_ring[i]);
+
+               /* Release the memzone */
+               rte_memzone_free(rq->mz);
        }
 }
 
@@ -816,30 +821,6 @@ rcd_done:
        return nb_rx;
 }
 
-/*
- * Create memzone for device rings. malloc can't be used as the physical address is
- * needed. If the memzone is already created, then this function returns a ptr
- * to the old one.
- */
-static const struct rte_memzone *
-ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
-                     uint16_t queue_id, uint32_t ring_size, int socket_id)
-{
-       char z_name[RTE_MEMZONE_NAMESIZE];
-       const struct rte_memzone *mz;
-
-       snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
-                dev->driver->pci_drv.driver.name, ring_name,
-                dev->data->port_id, queue_id);
-
-       mz = rte_memzone_lookup(z_name);
-       if (mz)
-               return mz;
-
-       return rte_memzone_reserve_aligned(z_name, ring_size,
-                                          socket_id, 0, VMXNET3_RING_BA_ALIGN);
-}
-
 int
 vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,
                           uint16_t queue_idx,
@@ -907,11 +888,13 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,
        size += sizeof(struct Vmxnet3_TxCompDesc) * comp_ring->size;
        size += sizeof(struct Vmxnet3_TxDataDesc) * data_ring->size;
 
-       mz = ring_dma_zone_reserve(dev, "txdesc", queue_idx, size, socket_id);
+       mz = rte_eth_dma_zone_reserve(dev, "txdesc", queue_idx, size,
+                                     VMXNET3_RING_BA_ALIGN, socket_id);
        if (mz == NULL) {
                PMD_INIT_LOG(ERR, "ERROR: Creating queue descriptors zone");
                return -ENOMEM;
        }
+       txq->mz = mz;
        memset(mz->addr, 0, mz->len);
 
        /* cmd_ring initialization */
@@ -1009,11 +992,13 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
        size = sizeof(struct Vmxnet3_RxDesc) * (ring0->size + ring1->size);
        size += sizeof(struct Vmxnet3_RxCompDesc) * comp_ring->size;
 
-       mz = ring_dma_zone_reserve(dev, "rxdesc", queue_idx, size, socket_id);
+       mz = rte_eth_dma_zone_reserve(dev, "rxdesc", queue_idx, size,
+                                     VMXNET3_RING_BA_ALIGN, socket_id);
        if (mz == NULL) {
                PMD_INIT_LOG(ERR, "ERROR: Creating queue descriptors zone");
                return -ENOMEM;
        }
+       rxq->mz = mz;
        memset(mz->addr, 0, mz->len);
 
        /* cmd_ring0 initialization */
index 6402c6b..9a4ec80 100644 (file)
@@ -160,7 +160,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index aa9b1d5..d3f7bf0 100644 (file)
@@ -142,7 +142,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index 959914a..4b6e071 100644 (file)
@@ -42,6 +42,7 @@ ifneq ($(CONFIG_RTE_EXEC_ENV),"linuxapp")
 $(info This application can only operate in a linuxapp environment, \
 please change the definition of the RTE_TARGET environment variable)
 all:
+clean:
 else
 
 # binary name
index 73d50b6..89bf1cc 100644 (file)
@@ -114,7 +114,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0,    /* IP checksum offload disabled */
                .hw_vlan_filter = 0,    /* VLAN filtering disabled */
                .jumbo_frame = 0,       /* Jumbo Frame Support disabled */
-               .hw_strip_crc = 0,      /* CRC stripped by hardware */
+               .hw_strip_crc = 1,      /* CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index e1e32c6..f4e3dc3 100644 (file)
@@ -176,7 +176,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 1, /**< Jumbo Frame Support enabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
@@ -653,6 +653,74 @@ check_all_ports_link_status(uint8_t port_num, uint32_t port_mask)
        }
 }
 
+/* Check L3 packet type detection capablity of the NIC port */
+static int
+check_ptype(int portid)
+{
+       int i, ret;
+       int ptype_l3_ipv4 = 0, ptype_l3_ipv6 = 0;
+       uint32_t ptype_mask = RTE_PTYPE_L3_MASK;
+
+       ret = rte_eth_dev_get_supported_ptypes(portid, ptype_mask, NULL, 0);
+       if (ret <= 0)
+               return 0;
+
+       uint32_t ptypes[ret];
+
+       ret = rte_eth_dev_get_supported_ptypes(portid, ptype_mask, ptypes, ret);
+       for (i = 0; i < ret; ++i) {
+               if (ptypes[i] & RTE_PTYPE_L3_IPV4)
+                       ptype_l3_ipv4 = 1;
+               if (ptypes[i] & RTE_PTYPE_L3_IPV6)
+                       ptype_l3_ipv6 = 1;
+       }
+
+       if (ptype_l3_ipv4 == 0)
+               printf("port %d cannot parse RTE_PTYPE_L3_IPV4\n", portid);
+
+       if (ptype_l3_ipv6 == 0)
+               printf("port %d cannot parse RTE_PTYPE_L3_IPV6\n", portid);
+
+       if (ptype_l3_ipv4 && ptype_l3_ipv6)
+               return 1;
+
+       return 0;
+
+}
+
+/* Parse packet type of a packet by SW */
+static inline void
+parse_ptype(struct rte_mbuf *m)
+{
+       struct ether_hdr *eth_hdr;
+       uint32_t packet_type = RTE_PTYPE_UNKNOWN;
+       uint16_t ether_type;
+
+       eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
+       ether_type = eth_hdr->ether_type;
+       if (ether_type == rte_cpu_to_be_16(ETHER_TYPE_IPv4))
+               packet_type |= RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
+       else if (ether_type == rte_cpu_to_be_16(ETHER_TYPE_IPv6))
+               packet_type |= RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+
+       m->packet_type = packet_type;
+}
+
+/* callback function to detect packet type for a queue of a port */
+static uint16_t
+cb_parse_ptype(uint8_t port __rte_unused, uint16_t queue __rte_unused,
+                  struct rte_mbuf *pkts[], uint16_t nb_pkts,
+                  uint16_t max_pkts __rte_unused,
+                  void *user_param __rte_unused)
+{
+       uint16_t i;
+
+       for (i = 0; i < nb_pkts; ++i)
+               parse_ptype(pkts[i]);
+
+       return nb_pkts;
+}
+
 static int
 init_routing_table(void)
 {
@@ -944,6 +1012,12 @@ main(int argc, char **argv)
                                ret, portid);
 
                rte_eth_promiscuous_enable(portid);
+
+               if (check_ptype(portid) == 0) {
+                       rte_eth_add_rx_callback(portid, 0, cb_parse_ptype, NULL);
+                       printf("Add Rx callback funciton to detect L3 packet type by SW :"
+                               " port = %d\n", portid);
+               }
        }
 
        if (init_routing_table() < 0)
index 8b372e9..d1671a2 100644 (file)
@@ -103,7 +103,7 @@ static const struct app_link_params link_params_default = {
                        .hw_vlan_strip  = 0, /* VLAN strip */
                        .hw_vlan_extend = 0, /* Extended VLAN */
                        .jumbo_frame    = 0, /* Jumbo frame support */
-                       .hw_strip_crc   = 0, /* CRC strip by HW */
+                       .hw_strip_crc   = 1, /* CRC strip by HW */
                        .enable_scatter = 0, /* Scattered packets RX handler */
 
                        .max_rx_pkt_len = 9000, /* Jumbo frame max packet len */
index 50fe422..e096b91 100644 (file)
@@ -200,7 +200,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 1, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                        .rss_conf = {
index 5a4c9b7..9cccd8a 100644 (file)
@@ -208,7 +208,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index 708d76e..b908b31 100644 (file)
@@ -145,7 +145,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 1, /**< Jumbo Frame Support enabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index 57313d1..0be57d8 100644 (file)
@@ -130,7 +130,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0,    /* IP checksum offload disabled */
                .hw_vlan_filter = 0,    /* VLAN filtering disabled */
                .jumbo_frame = 0,       /* Jumbo Frame Support disabled */
-               .hw_strip_crc = 0,      /* CRC stripped by hardware */
+               .hw_strip_crc = 1,      /* CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index bc88be5..0728231 100644 (file)
@@ -215,7 +215,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
@@ -499,6 +499,10 @@ l2fwd_simple_crypto_enqueue(struct rte_mbuf *m,
                        op->sym->auth.aad.data = cparams->aad.data;
                        op->sym->auth.aad.phys_addr = cparams->aad.phys_addr;
                        op->sym->auth.aad.length = cparams->aad.length;
+               } else {
+                       op->sym->auth.aad.data = NULL;
+                       op->sym->auth.aad.phys_addr = 0;
+                       op->sym->auth.aad.length = 0;
                }
        }
 
@@ -699,7 +703,8 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options)
                                        generate_random_key(port_cparams[i].aad.data,
                                                port_cparams[i].aad.length);
 
-                       }
+                       } else
+                               port_cparams[i].aad.length = 0;
 
                        if (options->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY)
                                port_cparams[i].hash_verify = 1;
@@ -810,7 +815,7 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options)
                                                ops_burst, nb_rx) !=
                                                                nb_rx) {
                                        for (j = 0; j < nb_rx; j++)
-                                               rte_pktmbuf_free(pkts_burst[i]);
+                                               rte_pktmbuf_free(pkts_burst[j]);
 
                                        nb_rx = 0;
                                }
@@ -1693,7 +1698,6 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports,
                                continue;
                        }
 
-                       options->block_size = cap->sym.auth.block_size;
                        /*
                         * Check if length of provided AAD is supported
                         * by the algorithm chosen.
index dd9201b..7cc16e5 100644 (file)
@@ -126,7 +126,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index 60cccdb..8b43e63 100644 (file)
@@ -116,7 +116,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index b2f5851..94287df 100644 (file)
@@ -120,7 +120,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index 3cfbb40..9307d48 100644 (file)
@@ -163,7 +163,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index b65d683..eb5adb6 100644 (file)
 /*
  * Configurable number of RX/TX ring descriptors
  */
-#define RTE_TEST_RX_DESC_DEFAULT 128
+#define RTE_TEST_RX_DESC_DEFAULT 512
 #define RTE_TEST_TX_DESC_DEFAULT 512
 static uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
 static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
@@ -221,7 +221,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
@@ -1545,6 +1545,7 @@ main(int argc, char **argv)
        uint32_t n_tx_queue, nb_lcores;
        uint32_t dev_rxq_num, dev_txq_num;
        uint8_t portid, nb_rx_queue, queue, socketid;
+       uint16_t org_rxq_intr = port_conf.intr_conf.rxq;
 
        /* catch SIGINT and restore cpufreq governor to ondemand */
        signal(SIGINT, signal_exit_now);
@@ -1605,8 +1606,13 @@ main(int argc, char **argv)
                        n_tx_queue = dev_txq_num;
                printf("Creating queues: nb_rxq=%d nb_txq=%u... ",
                        nb_rx_queue, (unsigned)n_tx_queue );
+               /* If number of Rx queue is 0, no need to enable Rx interrupt */
+               if (nb_rx_queue == 0)
+                       port_conf.intr_conf.rxq = 0;
                ret = rte_eth_dev_configure(portid, nb_rx_queue,
                                        (uint16_t)n_tx_queue, &port_conf);
+               /* Revert to original value */
+               port_conf.intr_conf.rxq = org_rxq_intr;
                if (ret < 0)
                        rte_exit(EXIT_FAILURE, "Cannot configure device: "
                                        "err=%d, port=%d\n", ret, portid);
index f56e8db..d1aa7f6 100644 (file)
@@ -197,7 +197,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index 7223e77..a01cabc 100644 (file)
@@ -156,7 +156,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index 14a038b..8110f25 100644 (file)
@@ -116,7 +116,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index e07850b..abd05a3 100644 (file)
@@ -81,7 +81,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index 6944325..ed63fc9 100644 (file)
@@ -418,10 +418,12 @@ static inline void
 app_lcore_io_tx_flush(struct app_lcore_params_io *lp)
 {
        uint8_t port;
+       uint32_t i;
 
-       for (port = 0; port < lp->tx.n_nic_ports; port ++) {
+       for (i = 0; i < lp->tx.n_nic_ports; i++) {
                uint32_t n_pkts;
 
+               port = lp->tx.nic_ports[i];
                if (likely((lp->tx.mbuf_out_flush[port] == 0) ||
                           (lp->tx.mbuf_out[port].n_mbufs == 0))) {
                        lp->tx.mbuf_out_flush[port] = 1;
index 2d951d9..820448b 100644 (file)
@@ -163,7 +163,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
@@ -672,6 +672,8 @@ l2fwd_main_loop(void)
                                        port_statistics[portid].tx += sent;
 
                        }
+
+                       prev_tsc = cur_tsc;
                }
 
                /*
index d30ff4a..de66528 100644 (file)
@@ -213,7 +213,7 @@ smp_port_init(uint8_t port, struct rte_mempool *mbuf_pool, uint16_t num_queues)
                                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-                               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+                               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
                        },
                        .rx_adv_conf = {
                                .rss_conf = {
index 50d96e8..1d4ddff 100644 (file)
@@ -42,6 +42,7 @@ ifneq ($(CONFIG_RTE_EXEC_ENV),"linuxapp")
 $(info This application can only operate in a linuxapp environment, \
 please change the definition of the RTE_TARGET environment variable)
 all:
+clean:
 else
 
 # binary name
index 53f5fdb..2f2b6ba 100644 (file)
@@ -59,7 +59,7 @@ struct rte_eth_conf eth_conf = {
                .hw_ip_checksum = 0,
                .hw_vlan_filter = 0,
                .jumbo_frame    = 0,
-               .hw_strip_crc   = 0,
+               .hw_strip_crc   = 1,
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index b5e6fb0..2d14757 100644 (file)
 static inline uint64_t
 _ns_to_clks(uint64_t ns)
 {
-       unsigned __int128 clkns = rte_get_tsc_hz();
+       /*
+        * clkns needs to be divided by 1E9 to get ns clocks. However,
+        * dividing by this first would lose a lot of accuracy.
+        * Dividing after a multiply by ns, could cause overflow of
+        * uint64_t if ns is about 5 seconds [if we assume a max tsc
+        * rate of 4GHz]. Therefore we first divide by 1E4, then
+        * multiply and finally divide by 1E5. This allows ns to be
+        * values many hours long, without overflow, while still keeping
+        * reasonable accuracy.
+        */
+       uint64_t clkns = rte_get_tsc_hz() / 1e4;
 
        clkns *= ns;
-       clkns /= 1000000000;
-       return (uint64_t) clkns;
+       clkns /= 1e5;
+
+       return clkns;
 }
 
 
index fdc90b2..dd403ca 100644 (file)
 #define APP_LOOKUP_METHOD             APP_LOOKUP_LPM
 #endif
 
+#ifndef __GLIBC__ /* sched_getcpu() is glibc specific */
+#define sched_getcpu() rte_lcore_id()
+#endif
+
 /*
  *  When set to zero, simple forwaring path is eanbled.
  *  When set to one, optimized forwarding path is enabled.
@@ -282,7 +286,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
index f035721..850b009 100644 (file)
 #define DEBUG_APP 0
 #define HELLOW_WORLD_MAX_LTHREADS 10
 
+#ifndef __GLIBC__ /* sched_getcpu() is glibc-specific */
+#define sched_getcpu() rte_lcore_id()
+#endif
+
 __thread int print_count;
 __thread pthread_mutex_t print_lock;
 
@@ -175,12 +179,12 @@ static void initial_lthread(void *args __attribute__((unused)))
                 * use an attribute to pass the desired lcore
                 */
                pthread_attr_t attr;
-               cpu_set_t cpuset;
+               rte_cpuset_t cpuset;
 
                CPU_ZERO(&cpuset);
                CPU_SET(lcore, &cpuset);
                pthread_attr_init(&attr);
-               pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
+               pthread_attr_setaffinity_np(&attr, sizeof(rte_cpuset_t), &cpuset);
 
                /* create the thread */
                pthread_create(&tid[i], &attr, helloworld_pthread, (void *) i);
index 0d6100c..113bafa 100644 (file)
 
 #define POSIX_ERRNO(x)  (x)
 
+/* some releases of FreeBSD 10, e.g. 10.0, don't have CPU_COUNT macro */
+#ifndef CPU_COUNT
+#define CPU_COUNT(x) __cpu_count(x)
+
+static inline unsigned int
+__cpu_count(const rte_cpuset_t *cpuset)
+{
+       unsigned int i, count = 0;
+       for (i = 0; i < RTE_MAX_LCORE; i++)
+               if (CPU_ISSET(i, cpuset))
+                       count++;
+       return count;
+}
+#endif
+
 /*
  * this flag determines at run time if we override pthread
  * calls and map then to equivalent lthread calls
@@ -159,7 +174,7 @@ int (*f_pthread_setschedparam)
 int (*f_pthread_yield)
        (void);
 int (*f_pthread_setaffinity_np)
-       (pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
+       (pthread_t thread, size_t cpusetsize, const rte_cpuset_t *cpuset);
 int (*f_nanosleep)
        (const struct timespec *req, struct timespec *rem);
 } _sys_pthread_funcs = {
@@ -390,11 +405,11 @@ pthread_create(pthread_t *__restrict tid,
 
                if (attr != NULL) {
                        /* determine CPU being requested */
-                       cpu_set_t cpuset;
+                       rte_cpuset_t cpuset;
 
                        CPU_ZERO(&cpuset);
                        pthread_attr_getaffinity_np(attr,
-                                               sizeof(cpu_set_t),
+                                               sizeof(rte_cpuset_t),
                                                &cpuset);
 
                        if (CPU_COUNT(&cpuset) != 1)
@@ -576,15 +591,26 @@ int pthread_rwlock_wrlock(pthread_rwlock_t *a)
        return _sys_pthread_funcs.f_pthread_rwlock_wrlock(a);
 }
 
-int pthread_yield(void)
+#ifdef RTE_EXEC_ENV_LINUXAPP
+int
+pthread_yield(void)
 {
        if (override) {
                lthread_yield();
                return 0;
        }
        return _sys_pthread_funcs.f_pthread_yield();
-
 }
+#else
+void
+pthread_yield(void)
+{
+       if (override)
+               lthread_yield();
+       else
+               _sys_pthread_funcs.f_pthread_yield();
+}
+#endif
 
 pthread_t pthread_self(void)
 {
@@ -686,7 +712,7 @@ int nanosleep(const struct timespec *req, struct timespec *rem)
 
 int
 pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
-                      const cpu_set_t *cpuset)
+                      const rte_cpuset_t *cpuset)
 {
        if (override) {
                /* we only allow affinity with a single CPU */
index 78bbb5a..10f8789 100644 (file)
@@ -33,7 +33,8 @@
 
 #ifndef _PTHREAD_SHIM_H_
 #define _PTHREAD_SHIM_H_
-#include <pthread.h>
+
+#include <rte_lcore.h>
 
 /*
  * This pthread shim is an example that demonstrates how legacy code
index 1565615..9ef5590 100644 (file)
@@ -89,7 +89,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1,
                .hw_vlan_filter = 0,
                .jumbo_frame    = 0,
-               .hw_strip_crc   = 0,
+               .hw_strip_crc   = 1,
        },
        .rx_adv_conf = {
                .rss_conf = {
index f59645f..e41ac50 100644 (file)
@@ -42,6 +42,7 @@ ifneq ($(CONFIG_RTE_EXEC_ENV),"linuxapp")
 $(info This application can only operate in a linuxapp environment, \
 please change the definition of the RTE_TARGET environment variable)
 all:
+clean:
 else
 
 # binary name
index 70e12bb..fe0221c 100644 (file)
@@ -92,7 +92,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_DCB_NONE,
index c208721..e1dc9b2 100644 (file)
@@ -57,7 +57,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_DCB_NONE,
@@ -165,7 +165,7 @@ setup_shared_variables(void)
     const struct rte_memzone *qw_memzone;
 
     qw_memzone = rte_memzone_reserve(QUOTA_WATERMARK_MEMZONE_NAME, 2 * sizeof(int),
-                                     rte_socket_id(), RTE_MEMZONE_2MB);
+                                     rte_socket_id(), 0);
     if (qw_memzone == NULL)
         rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));
 
index 8f1f15b..7de3302 100644 (file)
@@ -102,7 +102,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0, /**< IP checksum offload disabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
index eddaf92..1e9059b 100644 (file)
@@ -153,7 +153,7 @@ static struct rte_eth_conf vmdq_conf_default = {
                 */
                .hw_vlan_strip  = 1, /**< VLAN strip enabled. */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
 
        .txmode = {
index f4dbaa4..6102b48 100644 (file)
@@ -149,7 +149,7 @@ static const struct rte_eth_conf vmdq_conf_default = {
                 */
                .hw_vlan_strip  = 1, /**< VLAN strip enabled. */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
 
        .txmode = {
index d3d38e4..8f81d25 100644 (file)
@@ -276,11 +276,10 @@ struct rte_crypto_auth_xform {
         * this specifies the length of the digest to be compared for the
         * session.
         *
+        * It is the caller's responsibility to ensure that the
+        * digest length is compliant with the hash algorithm being used.
         * If the value is less than the maximum length allowed by the hash,
-        * the result shall be truncated.  If the value is greater than the
-        * maximum length allowed by the hash then an error will be generated
-        * by *rte_cryptodev_sym_session_create* or by the
-        * *rte_cryptodev_sym_enqueue_burst* if using session-less APIs.
+        * the result shall be truncated.
         */
 
        uint32_t add_auth_data_length;
@@ -571,7 +570,9 @@ struct rte_crypto_sym_op {
                        phys_addr_t phys_addr;
                        /**< Physical address of digest */
                        uint16_t length;
-                       /**< Length of digest */
+                       /**< Length of digest. This must be the same value as
+                        * @ref rte_crypto_auth_xform.digest_length.
+                        */
                } digest; /**< Digest parameters */
 
                struct {
index c6a5794..e82dcf0 100644 (file)
@@ -57,14 +57,6 @@ extern "C" {
 #include "rte_crypto.h"
 #include "rte_cryptodev.h"
 
-
-#ifdef RTE_LIBRTE_CRYPTODEV_DEBUG
-#define RTE_PMD_DEBUG_TRACE(...) \
-       rte_pmd_debug_trace(__func__, __VA_ARGS__)
-#else
-#define RTE_PMD_DEBUG_TRACE(...)
-#endif
-
 struct rte_cryptodev_session {
        RTE_STD_C11
        struct {
index 8b3ed88..f1de16e 100644 (file)
@@ -323,6 +323,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
 
        /* device is valid, add in list (sorted) */
        if (TAILQ_EMPTY(&pci_device_list)) {
+               rte_eal_device_insert(&dev->device);
                TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
        }
        else {
@@ -335,7 +336,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
                                continue;
                        else if (ret < 0) {
                                TAILQ_INSERT_BEFORE(dev2, dev, next);
-                               return 0;
+                               rte_eal_device_insert(&dev->device);
                        } else { /* already registered */
                                dev2->kdrv = dev->kdrv;
                                dev2->max_vfs = dev->max_vfs;
@@ -343,9 +344,10 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
                                        dev->mem_resource,
                                        sizeof(dev->mem_resource));
                                free(dev);
-                               return 0;
                        }
+                       return 0;
                }
+               rte_eal_device_insert(&dev->device);
                TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
        }
 
index 99a4975..4bd7545 100644 (file)
@@ -180,6 +180,10 @@ nic_uio_probe (device_t dev)
        unsigned int device = pci_get_slot(dev);
        unsigned int function = pci_get_function(dev);
 
+       char bdf_str[256];
+       char *token, *remaining;
+
+       /* First check if we found this on load */
        for (i = 0; i < num_detached; i++)
                if (bus == pci_get_bus(detached_devices[i]) &&
                    device == pci_get_slot(detached_devices[i]) &&
@@ -188,6 +192,45 @@ nic_uio_probe (device_t dev)
                        return BUS_PROBE_SPECIFIC;
                }
 
+       /* otherwise check if it's a new device and if it matches the BDF */
+       memset(bdf_str, 0, sizeof(bdf_str));
+       TUNABLE_STR_FETCH("hw.nic_uio.bdfs", bdf_str, sizeof(bdf_str));
+       remaining = bdf_str;
+       while (1) {
+               if (remaining == NULL || remaining[0] == '\0')
+                       break;
+               token = strsep(&remaining, ",:");
+               if (token == NULL)
+                       break;
+               bus = strtol(token, NULL, 10);
+               token = strsep(&remaining, ",:");
+               if (token == NULL)
+                       break;
+               device = strtol(token, NULL, 10);
+               token = strsep(&remaining, ",:");
+               if (token == NULL)
+                       break;
+               function = strtol(token, NULL, 10);
+
+               if (bus == pci_get_bus(dev) &&
+                               device == pci_get_slot(dev) &&
+                               function == pci_get_function(dev)) {
+
+                       if (num_detached < MAX_DETACHED_DEVICES) {
+                               printf("%s: probed dev=%p\n",
+                                              __func__, dev);
+                               detached_devices[num_detached++] = dev;
+                               device_set_desc(dev, "DPDK PCI Device");
+                               return BUS_PROBE_SPECIFIC;
+                       } else {
+                               printf("%s: reached MAX_DETACHED_DEVICES=%d. dev=%p won't be reattached\n",
+                                               __func__, MAX_DETACHED_DEVICES,
+                                               dev);
+                               break;
+                       }
+               }
+       }
+
        return ENXIO;
 }
 
@@ -248,6 +291,7 @@ nic_uio_load(void)
        memset(bdf_str, 0, sizeof(bdf_str));
        TUNABLE_STR_FETCH("hw.nic_uio.bdfs", bdf_str, sizeof(bdf_str));
        remaining = bdf_str;
+       printf("nic_uio: hw.nic_uio.bdfs = '%s'\n", bdf_str);
        /*
         * Users should specify PCI BDFs in the format "b:d:f,b:d:f,b:d:f".
         *  But the code below does not try differentiate between : and ,
index 8840380..dcf33d0 100644 (file)
@@ -49,6 +49,7 @@ extern "C" {
 #include <stdio.h>
 #include <sys/queue.h>
 
+#include <rte_config.h>
 #include <rte_log.h>
 
 __attribute__((format(printf, 2, 0)))
@@ -70,6 +71,19 @@ rte_pmd_debug_trace(const char *func_name, const char *fmt, ...)
        rte_log(RTE_LOG_ERR, RTE_LOGTYPE_PMD, "%s: %s", func_name, buffer);
 }
 
+/*
+ * Enable RTE_PMD_DEBUG_TRACE() when at least one component relying on the
+ * RTE_*_RET() macros defined below is compiled in debug mode.
+ */
+#if defined(RTE_LIBRTE_ETHDEV_DEBUG) || \
+       defined(RTE_LIBRTE_CRYPTODEV_DEBUG) || \
+       defined(RTE_LIBRTE_EVENTDEV_DEBUG)
+#define RTE_PMD_DEBUG_TRACE(...) \
+       rte_pmd_debug_trace(__func__, __VA_ARGS__)
+#else
+#define RTE_PMD_DEBUG_TRACE(...) (void)0
+#endif
+
 /* Macros for checking for restricting functions to primary instance only */
 #define RTE_PROC_PRIMARY_OR_ERR_RET(retval) do { \
        if (rte_eal_process_type() != RTE_PROC_PRIMARY) { \
index 0de35fb..5bbe906 100644 (file)
@@ -66,7 +66,7 @@ extern "C" {
 /**
  * Patch level number i.e. the z in yy.mm.z
  */
-#define RTE_VER_MINOR 1
+#define RTE_VER_MINOR 2
 
 /**
  * Extra string to be appended to version number
index 47a3b20..368863f 100644 (file)
@@ -194,14 +194,14 @@ vfio_disable_intx(struct rte_intr_handle *intr_handle) {
        irq_set = (struct vfio_irq_set *) irq_set_buf;
        irq_set->argsz = len;
        irq_set->count = 1;
-       irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_UNMASK;
+       irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_MASK;
        irq_set->index = VFIO_PCI_INTX_IRQ_INDEX;
        irq_set->start = 0;
 
        ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
 
        if (ret) {
-               RTE_LOG(ERR, EAL, "Error unmasking INTx interrupts for fd %d\n",
+               RTE_LOG(ERR, EAL, "Error masking INTx interrupts for fd %d\n",
                                                intr_handle->fd);
                return -1;
        }
index 3e4ffb5..aac05d7 100644 (file)
@@ -38,6 +38,7 @@
 #include <inttypes.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
+#include <sys/sysmacros.h>
 #include <linux/pci_regs.h>
 
 #if defined(RTE_ARCH_X86)
index 5f478c5..7d8b9fb 100644 (file)
@@ -355,7 +355,8 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
        } else {
                /* if we're in a secondary process, just find our tailq entry */
                TAILQ_FOREACH(vfio_res, vfio_res_list, next) {
-                       if (memcmp(&vfio_res->pci_addr, &dev->addr, sizeof(dev->addr)))
+                       if (rte_eal_compare_pci_addr(&vfio_res->pci_addr,
+                                                    &dev->addr))
                                continue;
                        break;
                }
index 78da08e..d96275a 100644 (file)
@@ -2,6 +2,8 @@
  * Minimal wrappers to allow compiling kni on older kernels.
  */
 
+#include <linux/version.h>
+
 #ifndef RHEL_RELEASE_VERSION
 #define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b))
 #endif
@@ -67,3 +69,7 @@
        (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34)))
 #undef NET_NAME_UNKNOWN
 #endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
+#endif
index 58cbadd..f0f6e61 100644 (file)
 #endif
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include "compat.h"
+
 #include <linux/if.h>
 #include <linux/wait.h>
+#ifdef HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
+#include <linux/sched/signal.h>
+#else
 #include <linux/sched.h>
+#endif
 #include <linux/netdevice.h>
 #include <linux/spinlock.h>
 #include <linux/list.h>
index 5a31759..ea54525 100644 (file)
@@ -1051,8 +1051,10 @@ rte_eth_dev_close(uint8_t port_id)
        dev->data->dev_started = 0;
        (*dev->dev_ops->dev_close)(dev);
 
+       dev->data->nb_rx_queues = 0;
        rte_free(dev->data->rx_queues);
        dev->data->rx_queues = NULL;
+       dev->data->nb_tx_queues = 0;
        rte_free(dev->data->tx_queues);
        dev->data->tx_queues = NULL;
 }
index 9678179..11ec1fa 100644 (file)
@@ -1001,15 +1001,6 @@ struct rte_eth_dev_callback;
 /** @internal Structure to keep track of registered callbacks */
 TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback);
 
-
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
-#define RTE_PMD_DEBUG_TRACE(...) \
-       rte_pmd_debug_trace(__func__, __VA_ARGS__)
-#else
-#define RTE_PMD_DEBUG_TRACE(...)
-#endif
-
-
 /* Macros to check for valid port */
 #define RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, retval) do { \
        if (!rte_eth_dev_is_valid_port(port_id)) { \
index a80cefd..c3f9208 100644 (file)
@@ -451,17 +451,35 @@ kni_free_fifo(struct rte_kni_fifo *fifo)
        } while (ret);
 }
 
+static void *
+va2pa(struct rte_mbuf *m)
+{
+       return (void *)((unsigned long)m -
+                       ((unsigned long)m->buf_addr -
+                        (unsigned long)m->buf_physaddr));
+}
+
+static void
+obj_free(struct rte_mempool *mp __rte_unused, void *opaque, void *obj,
+               unsigned obj_idx __rte_unused)
+{
+       struct rte_mbuf *m = obj;
+       void *mbuf_phys = opaque;
+
+       if (va2pa(m) == mbuf_phys)
+               rte_pktmbuf_free(m);
+}
+
 static void
-kni_free_fifo_phy(struct rte_kni_fifo *fifo)
+kni_free_fifo_phy(struct rte_mempool *mp, struct rte_kni_fifo *fifo)
 {
        void *mbuf_phys;
        int ret;
 
        do {
                ret = kni_fifo_get(fifo, &mbuf_phys, 1);
-               /*
-                * TODO: free mbufs
-                */
+               if (ret)
+                       rte_mempool_obj_iter(mp, obj_free, mbuf_phys);
        } while (ret);
 }
 
@@ -470,6 +488,7 @@ rte_kni_release(struct rte_kni *kni)
 {
        struct rte_kni_device_info dev_info;
        uint32_t slot_id;
+       uint32_t retry = 5;
 
        if (!kni || !kni->in_use)
                return -1;
@@ -481,9 +500,16 @@ rte_kni_release(struct rte_kni *kni)
        }
 
        /* mbufs in all fifo should be released, except request/response */
+
+       /* wait until all rxq packets processed by kernel */
+       while (kni_fifo_count(kni->rx_q) && retry--)
+               usleep(1000);
+
+       if (kni_fifo_count(kni->rx_q))
+               RTE_LOG(ERR, KNI, "Fail to free all Rx-q items\n");
+
+       kni_free_fifo_phy(kni->pktmbuf_pool, kni->alloc_q);
        kni_free_fifo(kni->tx_q);
-       kni_free_fifo_phy(kni->rx_q);
-       kni_free_fifo_phy(kni->alloc_q);
        kni_free_fifo(kni->free_q);
 
        slot_id = kni->slot_id;
@@ -549,14 +575,6 @@ rte_kni_handle_request(struct rte_kni *kni)
        return 0;
 }
 
-static void *
-va2pa(struct rte_mbuf *m)
-{
-       return (void *)((unsigned long)m -
-                       ((unsigned long)m->buf_addr -
-                        (unsigned long)m->buf_physaddr));
-}
-
 unsigned
 rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned num)
 {
index 8cb8587..c7cd5c2 100644 (file)
@@ -91,3 +91,12 @@ kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num)
        fifo->read = new_read;
        return i;
 }
+
+/**
+ * Get the num of elements in the fifo
+ */
+static inline uint32_t
+kni_fifo_count(struct rte_kni_fifo *fifo)
+{
+       return (fifo->len + fifo->write - fifo->read) & (fifo->len - 1);
+}
index ff6de9d..a3269c4 100644 (file)
@@ -91,6 +91,9 @@
  * RTE_PTYPE_INNER_L4_UDP.
  */
 
+#include <stddef.h>
+#include <stdint.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
index ff3d065..5edf66c 100644 (file)
@@ -357,7 +357,7 @@ static inline int rte_vlan_strip(struct rte_mbuf *m)
                return -1;
 
        struct vlan_hdr *vh = (struct vlan_hdr *)(eh + 1);
-       m->ol_flags |= PKT_RX_VLAN_PKT;
+       m->ol_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
        m->vlan_tci = rte_be_to_cpu_16(vh->vlan_tci);
 
        /* Copy ether header over rather than moving whole packet */
@@ -407,6 +407,8 @@ static inline int rte_vlan_insert(struct rte_mbuf **m)
        vh = (struct vlan_hdr *) (nh + 1);
        vh->vlan_tci = rte_cpu_to_be_16((*m)->vlan_tci);
 
+       (*m)->ol_flags &= ~PKT_RX_VLAN_STRIPPED;
+
        return 0;
 }
 
index aaa9c27..84e0595 100644 (file)
 #include "vhost.h"
 #include "vhost_user.h"
 
+
+TAILQ_HEAD(vhost_user_connection_list, vhost_user_connection);
+
 /*
  * Every time rte_vhost_driver_register() is invoked, an associated
  * vhost_user_socket struct will be created.
  */
 struct vhost_user_socket {
+       struct vhost_user_connection_list conn_list;
+       pthread_mutex_t conn_mutex;
        char *path;
        int listenfd;
-       int connfd;
        bool is_server;
        bool reconnect;
        bool dequeue_zero_copy;
@@ -67,7 +71,10 @@ struct vhost_user_socket {
 
 struct vhost_user_connection {
        struct vhost_user_socket *vsocket;
+       int connfd;
        int vid;
+
+       TAILQ_ENTRY(vhost_user_connection) next;
 };
 
 #define MAX_VHOST_SOCKET 1024
@@ -209,19 +216,24 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket)
 
        RTE_LOG(INFO, VHOST_CONFIG, "new device, handle is %d\n", vid);
 
-       vsocket->connfd = fd;
+       conn->connfd = fd;
        conn->vsocket = vsocket;
        conn->vid = vid;
        ret = fdset_add(&vhost_user.fdset, fd, vhost_user_read_cb,
                        NULL, conn);
        if (ret < 0) {
-               vsocket->connfd = -1;
+               conn->connfd = -1;
                free(conn);
                close(fd);
                RTE_LOG(ERR, VHOST_CONFIG,
                        "failed to add fd %d into vhost server fdset\n",
                        fd);
+               return;
        }
+
+       pthread_mutex_lock(&vsocket->conn_mutex);
+       TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next);
+       pthread_mutex_unlock(&vsocket->conn_mutex);
 }
 
 /* call back when there is new vhost-user connection from client  */
@@ -247,10 +259,14 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
 
        ret = vhost_user_msg_handler(conn->vid, connfd);
        if (ret < 0) {
-               vsocket->connfd = -1;
                close(connfd);
                *remove = 1;
                vhost_destroy_device(conn->vid);
+
+               pthread_mutex_lock(&vsocket->conn_mutex);
+               TAILQ_REMOVE(&vsocket->conn_list, conn, next);
+               pthread_mutex_unlock(&vsocket->conn_mutex);
+
                free(conn);
 
                if (vsocket->reconnect)
@@ -448,7 +464,7 @@ vhost_user_create_client(struct vhost_user_socket *vsocket)
                return 0;
        }
 
-       RTE_LOG(ERR, VHOST_CONFIG,
+       RTE_LOG(WARNING, VHOST_CONFIG,
                "failed to connect to %s: %s\n",
                path, strerror(errno));
 
@@ -457,7 +473,7 @@ vhost_user_create_client(struct vhost_user_socket *vsocket)
                return -1;
        }
 
-       RTE_LOG(ERR, VHOST_CONFIG, "%s: reconnecting...\n", path);
+       RTE_LOG(INFO, VHOST_CONFIG, "%s: reconnecting...\n", path);
        reconn = malloc(sizeof(*reconn));
        if (reconn == NULL) {
                RTE_LOG(ERR, VHOST_CONFIG,
@@ -502,7 +518,8 @@ rte_vhost_driver_register(const char *path, uint64_t flags)
                goto out;
        memset(vsocket, 0, sizeof(struct vhost_user_socket));
        vsocket->path = strdup(path);
-       vsocket->connfd = -1;
+       TAILQ_INIT(&vsocket->conn_list);
+       pthread_mutex_init(&vsocket->conn_mutex, NULL);
        vsocket->dequeue_zero_copy = flags & RTE_VHOST_USER_DEQUEUE_ZERO_COPY;
 
        if ((flags & RTE_VHOST_USER_CLIENT) != 0) {
@@ -565,7 +582,7 @@ rte_vhost_driver_unregister(const char *path)
 {
        int i;
        int count;
-       struct vhost_user_connection *conn;
+       struct vhost_user_connection *conn, *next;
 
        pthread_mutex_lock(&vhost_user.mutex);
 
@@ -581,15 +598,22 @@ rte_vhost_driver_unregister(const char *path)
                                vhost_user_remove_reconnect(vsocket);
                        }
 
-                       conn = fdset_del(&vhost_user.fdset, vsocket->connfd);
-                       if (conn) {
+                       pthread_mutex_lock(&vsocket->conn_mutex);
+                       for (conn = TAILQ_FIRST(&vsocket->conn_list);
+                            conn != NULL;
+                            conn = next) {
+                               next = TAILQ_NEXT(conn, next);
+
+                               fdset_del(&vhost_user.fdset, conn->connfd);
                                RTE_LOG(INFO, VHOST_CONFIG,
                                        "free connfd = %d for device '%s'\n",
-                                       vsocket->connfd, path);
-                               close(vsocket->connfd);
+                                       conn->connfd, path);
+                               close(conn->connfd);
                                vhost_destroy_device(conn->vid);
+                               TAILQ_REMOVE(&vsocket->conn_list, conn, next);
                                free(conn);
                        }
+                       pthread_mutex_unlock(&vsocket->conn_mutex);
 
                        free(vsocket->path);
                        free(vsocket);
index e415093..3c3f6a4 100644 (file)
@@ -56,7 +56,7 @@
                                (1ULL << VIRTIO_NET_F_CTRL_VQ) | \
                                (1ULL << VIRTIO_NET_F_CTRL_RX) | \
                                (1ULL << VIRTIO_NET_F_GUEST_ANNOUNCE) | \
-                               (VHOST_SUPPORTS_MQ)            | \
+                               (1ULL << VIRTIO_NET_F_MQ)      | \
                                (1ULL << VIRTIO_F_VERSION_1)   | \
                                (1ULL << VHOST_F_LOG_ALL)      | \
                                (1ULL << VHOST_USER_F_PROTOCOL_FEATURES) | \
index 22564f1..d97df1d 100644 (file)
@@ -110,25 +110,15 @@ struct vhost_virtqueue {
        uint16_t                shadow_used_idx;
 } __rte_cache_aligned;
 
-/* Old kernels have no such macro defined */
+/* Old kernels have no such macros defined */
 #ifndef VIRTIO_NET_F_GUEST_ANNOUNCE
  #define VIRTIO_NET_F_GUEST_ANNOUNCE 21
 #endif
 
-
-/*
- * Make an extra wrapper for VIRTIO_NET_F_MQ and
- * VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX as they are
- * introduced since kernel v3.8. This makes our
- * code buildable for older kernel.
- */
-#ifdef VIRTIO_NET_F_MQ
- #define VHOST_MAX_QUEUE_PAIRS VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX
- #define VHOST_SUPPORTS_MQ     (1ULL << VIRTIO_NET_F_MQ)
-#else
- #define VHOST_MAX_QUEUE_PAIRS 1
- #define VHOST_SUPPORTS_MQ     0
+#ifndef VIRTIO_NET_F_MQ
+ #define VIRTIO_NET_F_MQ               22
 #endif
+#define VHOST_MAX_QUEUE_PAIRS          0x80
 
 /*
  * Define virtio 1.0 for older kernels
index 337470d..ea027f1 100644 (file)
@@ -905,6 +905,8 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vring_desc *descs,
                                        "allocate memory for mbuf.\n");
                                return -1;
                        }
+                       if (unlikely(dev->dequeue_zero_copy))
+                               rte_mbuf_refcnt_update(cur, 1);
 
                        prev->next = cur;
                        prev->data_len = mbuf_offset;
@@ -1056,9 +1058,21 @@ rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
         * array, to looks like that guest actually send such packet.
         *
         * Check user_send_rarp() for more information.
+        *
+        * broadcast_rarp shares a cacheline in the virtio_net structure
+        * with some fields that are accessed during enqueue and
+        * rte_atomic16_cmpset() causes a write if using cmpxchg. This could
+        * result in false sharing between enqueue and dequeue.
+        *
+        * Prevent unnecessary false sharing by reading broadcast_rarp first
+        * and only performing cmpset if the read indicates it is likely to
+        * be set.
         */
-       if (unlikely(rte_atomic16_cmpset((volatile uint16_t *)
-                                        &dev->broadcast_rarp.cnt, 1, 0))) {
+
+       if (unlikely(rte_atomic16_read(&dev->broadcast_rarp) &&
+                       rte_atomic16_cmpset((volatile uint16_t *)
+                               &dev->broadcast_rarp.cnt, 1, 0))) {
+
                rarp_mbuf = rte_pktmbuf_alloc(mbuf_pool);
                if (rarp_mbuf == NULL) {
                        RTE_LOG(ERR, VHOST_DATA,
index 36fa3de..41c4c40 100644 (file)
@@ -57,7 +57,7 @@
 MACHINE_CFLAGS += -march=armv7-a
 
 ifdef CONFIG_RTE_ARCH_ARM_TUNE
-MACHINE_CFLAGS += -mtune=$(CONFIG_RTE_ARCH_ARM_TUNE)
+MACHINE_CFLAGS += -mtune=$(CONFIG_RTE_ARCH_ARM_TUNE:"%"=%)
 endif
 
 MACHINE_CFLAGS += -mfpu=neon
index 8541633..61ada89 100644 (file)
@@ -56,5 +56,5 @@
 MACHINE_CFLAGS += -march=armv8-a
 
 ifdef CONFIG_RTE_ARCH_ARM_TUNE
-MACHINE_CFLAGS += -mcpu=$(CONFIG_RTE_ARCH_ARM_TUNE)
+MACHINE_CFLAGS += -mcpu=$(CONFIG_RTE_ARCH_ARM_TUNE:"%"=%)
 endif
index f75f0e2..725e01d 100644 (file)
@@ -168,10 +168,21 @@ _LDLIBS-y += $(EXECENV_LDLIBS)
 
 LDLIBS += $(_LDLIBS-y) $(CPU_LDLIBS) $(EXTRA_LDLIBS)
 
-# Eliminate duplicates without sorting
-LDLIBS := $(shell echo $(LDLIBS) | \
-       awk '{for (i = 1; i <= NF; i++) { \
-               if ($$i !~ /^-l.*/ || !seen[$$i]++) print $$i }}')
+# all the words except the first one
+allbutfirst = $(wordlist 2,$(words $(1)),$(1))
+
+# Eliminate duplicates without sorting, only keep the last occurrence
+filter-libs = \
+       $(if $(1),$(strip\
+               $(if \
+                       $(and \
+                               $(filter $(firstword $(1)),$(call allbutfirst,$(1))),\
+                               $(filter -l%,$(firstword $(1)))),\
+                       ,\
+                       $(firstword $(1))) \
+               $(call filter-libs,$(call allbutfirst,$(1)))))
+
+LDLIBS := $(call filter-libs,$(LDLIBS))
 
 ifeq ($(RTE_DEVEL_BUILD)$(CONFIG_RTE_BUILD_SHARED_LIB),yy)
 LDFLAGS += -rpath=$(RTE_SDK_BIN)/lib
index b734413..9e095d3 100644 (file)
@@ -38,7 +38,8 @@
 
 # find out CLANG version
 
-CLANG_VERSION := $(shell $(CC) -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/")
+CLANG_VERSION := $(shell $(CC) -v 2>&1 | \
+       sed -n "s/.*version \([0-9]*\.[0-9]*\).*/\1/p")
 
 CLANG_MAJOR_VERSION := $(shell echo $(CLANG_VERSION) | cut -f1 -d.)
 
index 134c2b4..017d959 100644 (file)
@@ -30,7 +30,7 @@
 # OF THE POSSIBILITY OF SUCH DAMAGE.
 
 Name: dpdk
-Version: 16.11.1
+Version: 16.11.2
 Release: 1
 Packager: packaging@6wind.com
 URL: http://dpdk.org