summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorRicardo Salveti <ricardo.salveti@linaro.org>2016-07-18 15:30:06 -0300
committerRicardo Salveti <ricardo.salveti@linaro.org>2016-07-18 15:30:30 -0300
commita41e6ff15809d40e0f9bbc9576bf8f7f80fbec1d (patch)
treec9e6fc399c2738e84ed2585e6e51e90f9608ca12 /examples
parent8b25d1ad5d2264bdfc2818c7bda74ee2697df6db (diff)
Imported Upstream version 16.07-rc2
Change-Id: Ie9e8ec528a2a0dace085c5e44aa7fa3b489d4ba0 Signed-off-by: Ricardo Salveti <ricardo.salveti@linaro.org>
Diffstat (limited to 'examples')
-rw-r--r--examples/Makefile8
-rw-r--r--examples/bond/main.c24
-rw-r--r--examples/ethtool/lib/rte_ethtool.c19
-rwxr-xr-xexamples/ip_pipeline/config/diagram-generator.py343
-rw-r--r--examples/l2fwd-crypto/main.c14
-rw-r--r--examples/l3fwd/main.c40
-rw-r--r--examples/multi_process/client_server_mp/mp_server/init.c1
-rw-r--r--examples/multi_process/client_server_mp/mp_server/main.c1
-rw-r--r--examples/tep_termination/vxlan_setup.c2
-rw-r--r--examples/vhost/main.c20
-rw-r--r--examples/vm_power_manager/channel_manager.h8
11 files changed, 439 insertions, 41 deletions
diff --git a/examples/Makefile b/examples/Makefile
index f650d3ec..18b41b90 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -54,7 +54,7 @@ endif
ifeq ($(CONFIG_RTE_LIBRTE_ACL)$(CONFIG_RTE_LIBRTE_HASH)$(CONFIG_RTE_LIBRTE_LPM),yyy)
DIRS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += ipsec-secgw
endif
-DIRS-y += ipv4_multicast
+DIRS-$(CONFIG_RTE_LIBRTE_HASH) += ipv4_multicast
DIRS-$(CONFIG_RTE_LIBRTE_KNI) += kni
DIRS-y += l2fwd
ifneq ($(PQOS_INSTALL_PATH),)
@@ -65,9 +65,11 @@ DIRS-$(CONFIG_RTE_LIBRTE_IVSHMEM) += l2fwd-ivshmem
DIRS-$(CONFIG_RTE_LIBRTE_JOBSTATS) += l2fwd-jobstats
DIRS-y += l2fwd-keepalive
DIRS-y += l2fwd-keepalive/ka-agent
+ifeq ($(CONFIG_RTE_LIBRTE_HASH),y)
DIRS-$(CONFIG_RTE_LIBRTE_LPM) += l3fwd
+endif
DIRS-$(CONFIG_RTE_LIBRTE_ACL) += l3fwd-acl
-ifeq ($(CONFIG_RTE_LIBRTE_LPM),y)
+ifeq ($(CONFIG_RTE_LIBRTE_LPM)$(CONFIG_RTE_LIBRTE_HASH),yy)
DIRS-$(CONFIG_RTE_LIBRTE_POWER) += l3fwd-power
DIRS-y += l3fwd-vf
endif
@@ -82,7 +84,9 @@ DIRS-$(CONFIG_RTE_LIBRTE_SCHED) += qos_sched
DIRS-y += quota_watermark
DIRS-$(CONFIG_RTE_ETHDEV_RXTX_CALLBACKS) += rxtx_callbacks
DIRS-y += skeleton
+ifeq ($(CONFIG_RTE_LIBRTE_HASH),y)
DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += tep_termination
+endif
DIRS-$(CONFIG_RTE_LIBRTE_TIMER) += timer
DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += vhost
DIRS-$(CONFIG_RTE_LIBRTE_XEN_DOM0) += vhost_xen
diff --git a/examples/bond/main.c b/examples/bond/main.c
index 53bd0441..776fad0a 100644
--- a/examples/bond/main.c
+++ b/examples/bond/main.c
@@ -590,10 +590,14 @@ static void cmd_stop_parsed(__attribute__((unused)) void *parsed_result,
return;
}
global_flag_stru_p->LcoreMainIsRunning = 0;
- rte_eal_wait_lcore(global_flag_stru_p->LcoreMainCore);
- cmdline_printf(cl,
- "lcore_main stopped on core:%d\n",
- global_flag_stru_p->LcoreMainCore);
+ if (rte_eal_wait_lcore(global_flag_stru_p->LcoreMainCore) < 0)
+ cmdline_printf(cl,
+ "error: lcore_main can not stop on core:%d\n",
+ global_flag_stru_p->LcoreMainCore);
+ else
+ cmdline_printf(cl,
+ "lcore_main stopped on core:%d\n",
+ global_flag_stru_p->LcoreMainCore);
rte_spinlock_unlock(&global_flag_stru_p->lock);
}
@@ -628,10 +632,14 @@ static void cmd_quit_parsed(__attribute__((unused)) void *parsed_result,
return;
}
global_flag_stru_p->LcoreMainIsRunning = 0;
- rte_eal_wait_lcore(global_flag_stru_p->LcoreMainCore);
- cmdline_printf(cl,
- "lcore_main stopped on core:%d\n",
- global_flag_stru_p->LcoreMainCore);
+ if (rte_eal_wait_lcore(global_flag_stru_p->LcoreMainCore) < 0)
+ cmdline_printf(cl,
+ "error: lcore_main can not stop on core:%d\n",
+ global_flag_stru_p->LcoreMainCore);
+ else
+ cmdline_printf(cl,
+ "lcore_main stopped on core:%d\n",
+ global_flag_stru_p->LcoreMainCore);
rte_spinlock_unlock(&global_flag_stru_p->lock);
cmdline_quit(cl);
}
diff --git a/examples/ethtool/lib/rte_ethtool.c b/examples/ethtool/lib/rte_ethtool.c
index 54391f21..a1f91d45 100644
--- a/examples/ethtool/lib/rte_ethtool.c
+++ b/examples/ethtool/lib/rte_ethtool.c
@@ -46,6 +46,7 @@ int
rte_ethtool_get_drvinfo(uint8_t port_id, struct ethtool_drvinfo *drvinfo)
{
struct rte_eth_dev_info dev_info;
+ struct rte_dev_reg_info reg_info;
int n;
if (drvinfo == NULL)
@@ -65,7 +66,9 @@ rte_ethtool_get_drvinfo(uint8_t port_id, struct ethtool_drvinfo *drvinfo)
dev_info.pci_dev->addr.domain, dev_info.pci_dev->addr.bus,
dev_info.pci_dev->addr.devid, dev_info.pci_dev->addr.function);
- n = rte_eth_dev_get_reg_length(port_id);
+ memset(&reg_info, 0, sizeof(reg_info));
+ rte_eth_dev_get_reg_info(port_id, &reg_info);
+ n = reg_info.length;
if (n > 0)
drvinfo->regdump_len = n;
else
@@ -86,12 +89,16 @@ rte_ethtool_get_drvinfo(uint8_t port_id, struct ethtool_drvinfo *drvinfo)
int
rte_ethtool_get_regs_len(uint8_t port_id)
{
- int count_regs;
+ struct rte_dev_reg_info reg_info;
+ int ret;
+
+ memset(&reg_info, 0, sizeof(reg_info));
+
+ ret = rte_eth_dev_get_reg_info(port_id, &reg_info);
+ if (ret)
+ return ret;
- count_regs = rte_eth_dev_get_reg_length(port_id);
- if (count_regs > 0)
- return count_regs * sizeof(uint32_t);
- return count_regs;
+ return reg_info.length * reg_info.width;
}
int
diff --git a/examples/ip_pipeline/config/diagram-generator.py b/examples/ip_pipeline/config/diagram-generator.py
new file mode 100755
index 00000000..f20cbcbb
--- /dev/null
+++ b/examples/ip_pipeline/config/diagram-generator.py
@@ -0,0 +1,343 @@
+#! /usr/bin/python2
+
+# BSD LICENSE
+#
+# Copyright(c) 2016 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Intel Corporation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#
+# This script creates a visual representation for a configuration file used by
+# the DPDK ip_pipeline application.
+#
+# The input configuration file is translated to an output file in DOT syntax,
+# which is then used to create the image file using graphviz (www.graphviz.org).
+#
+
+from __future__ import print_function
+import argparse
+import re
+import os
+
+#
+# Command to generate the image file
+#
+DOT_COMMAND = 'dot -Gsize=20,30 -Tpng %s > %s'
+
+#
+# Layout of generated DOT file
+#
+DOT_INTRO = \
+ '#\n# Command to generate image file:\n# \t%s\n#\n\n'
+DOT_GRAPH_BEGIN = \
+ 'digraph g {\n graph [ splines = true rankdir = "LR" ]\n'
+DOT_NODE_LINK_RX = \
+ ' "%s RX" [ shape = box style = filled fillcolor = yellowgreen ]\n'
+DOT_NODE_LINK_TX = \
+ ' "%s TX" [ shape = box style = filled fillcolor = yellowgreen ]\n'
+DOT_NODE_KNI_RX = \
+ ' "%s RX" [ shape = box style = filled fillcolor = orange ]\n'
+DOT_NODE_KNI_TX = \
+ ' "%s TX" [ shape = box style = filled fillcolor = orange ]\n'
+DOT_NODE_TAP_RX = \
+ ' "%s RX" [ shape = box style = filled fillcolor = gold ]\n'
+DOT_NODE_TAP_TX = \
+ ' "%s TX" [ shape = box style = filled fillcolor = gold ]\n'
+DOT_NODE_SOURCE = \
+ ' "%s" [ shape = box style = filled fillcolor = darkgreen ]\n'
+DOT_NODE_SINK = \
+ ' "%s" [ shape = box style = filled fillcolor = peachpuff ]\n'
+DOT_NODE_PIPELINE = \
+ ' "%s" [ shape = box style = filled fillcolor = royalblue ]\n'
+DOT_EDGE_PKTQ = \
+ ' "%s" -> "%s" [ label = "%s" color = gray ]\n'
+DOT_GRAPH_END = \
+ '}\n'
+
+# Relationships between the graph nodes and the graph edges:
+#
+# Edge ID | Edge Label | Writer Node | Reader Node | Dependencies
+# --------+------------+-------------+---------------+--------------
+# RXQx.y | RXQx.y | LINKx | PIPELINEz | LINKx
+# TXQx.y | TXQx.y | PIPELINEz | LINKx | LINKx
+# SWQx | SWQx | PIPELINEy | PIPELINEz | -
+# TMx | TMx | PIPELINEy | PIPELINEz | LINKx
+# KNIx RX | KNIx | KNIx RX | PIPELINEy | KNIx, LINKx
+# KNIx TX | KNIx | PIPELINEy | KNIx TX | KNIx, LINKx
+# TAPx RX | TAPx | TAPx RX | PIPELINEy | TAPx
+# TAPx TX | TAPx | PIPELINEy | TAPx TX | TAPx
+# SOURCEx | SOURCEx | SOURCEx | PIPELINEy | SOURCEx
+# SINKx | SINKx | PIPELINEy | SINKx | SINKx
+
+#
+# Parse the input configuration file to detect the graph nodes and edges
+#
+def process_config_file(cfgfile):
+ edges = {}
+ links = set()
+ knis = set()
+ taps = set()
+ sources = set()
+ sinks = set()
+ pipelines = set()
+ pipeline = ''
+
+ dotfile = cfgfile + '.txt'
+ imgfile = cfgfile + '.png'
+
+ #
+ # Read configuration file
+ #
+ lines = open(cfgfile, 'r')
+ for line in lines:
+ # Remove any leading and trailing white space characters
+ line = line.strip()
+
+ # Remove any comment at end of line
+ line, sep, tail = line.partition(';')
+
+ # Look for next "PIPELINE" section
+ match = re.search(r'\[(PIPELINE\d+)\]', line)
+ if match:
+ pipeline = match.group(1)
+ continue
+
+ # Look for next "pktq_in" section entry
+ match = re.search(r'pktq_in\s*=\s*(.+)', line)
+ if match:
+ pipelines.add(pipeline)
+ for q in re.findall('\S+', match.group(1)):
+ match_rxq = re.search(r'^RXQ(\d+)\.\d+$', q)
+ match_swq = re.search(r'^SWQ\d+$', q)
+ match_tm = re.search(r'^TM(\d+)$', q)
+ match_kni = re.search(r'^KNI(\d+)$', q)
+ match_tap = re.search(r'^TAP\d+$', q)
+ match_source = re.search(r'^SOURCE\d+$', q)
+
+ # Set ID for the current packet queue (graph edge)
+ q_id = ''
+ if match_rxq or match_swq or match_tm or match_source:
+ q_id = q
+ elif match_kni or match_tap:
+ q_id = q + ' RX'
+ else:
+ print('Error: Unrecognized pktq_in element "%s"' % q)
+ return
+
+ # Add current packet queue to the set of graph edges
+ if q_id not in edges:
+ edges[q_id] = {}
+ if 'label' not in edges[q_id]:
+ edges[q_id]['label'] = q
+ if 'readers' not in edges[q_id]:
+ edges[q_id]['readers'] = []
+ if 'writers' not in edges[q_id]:
+ edges[q_id]['writers'] = []
+
+ # Add reader for the new edge
+ edges[q_id]['readers'].append(pipeline)
+
+ # Check for RXQ
+ if match_rxq:
+ link = 'LINK' + str(match_rxq.group(1))
+ edges[q_id]['writers'].append(link + ' RX')
+ links.add(link)
+ continue
+
+ # Check for SWQ
+ if match_swq:
+ continue
+
+ # Check for TM
+ if match_tm:
+ link = 'LINK' + str(match_tm.group(1))
+ links.add(link)
+ continue
+
+ # Check for KNI
+ if match_kni:
+ link = 'LINK' + str(match_kni.group(1))
+ edges[q_id]['writers'].append(q_id)
+ knis.add(q)
+ links.add(link)
+ continue
+
+ # Check for TAP
+ if match_tap:
+ edges[q_id]['writers'].append(q_id)
+ taps.add(q)
+ continue
+
+ # Check for SOURCE
+ if match_source:
+ edges[q_id]['writers'].append(q)
+ sources.add(q)
+ continue
+
+ continue
+
+ # Look for next "pktq_out" section entry
+ match = re.search(r'pktq_out\s*=\s*(.+)', line)
+ if match:
+ for q in re.findall('\S+', match.group(1)):
+ match_txq = re.search(r'^TXQ(\d+)\.\d+$', q)
+ match_swq = re.search(r'^SWQ\d+$', q)
+ match_tm = re.search(r'^TM(\d+)$', q)
+ match_kni = re.search(r'^KNI(\d+)$', q)
+ match_tap = re.search(r'^TAP(\d+)$', q)
+ match_sink = re.search(r'^SINK(\d+)$', q)
+
+ # Set ID for the current packet queue (graph edge)
+ q_id = ''
+ if match_txq or match_swq or match_tm or match_sink:
+ q_id = q
+ elif match_kni or match_tap:
+ q_id = q + ' TX'
+ else:
+ print('Error: Unrecognized pktq_out element "%s"' % q)
+ return
+
+ # Add current packet queue to the set of graph edges
+ if q_id not in edges:
+ edges[q_id] = {}
+ if 'label' not in edges[q_id]:
+ edges[q_id]['label'] = q
+ if 'readers' not in edges[q_id]:
+ edges[q_id]['readers'] = []
+ if 'writers' not in edges[q_id]:
+ edges[q_id]['writers'] = []
+
+ # Add writer for the new edge
+ edges[q_id]['writers'].append(pipeline)
+
+ # Check for TXQ
+ if match_txq:
+ link = 'LINK' + str(match_txq.group(1))
+ edges[q_id]['readers'].append(link + ' TX')
+ links.add(link)
+ continue
+
+ # Check for SWQ
+ if match_swq:
+ continue
+
+ # Check for TM
+ if match_tm:
+ link = 'LINK' + str(match_tm.group(1))
+ links.add(link)
+ continue
+
+ # Check for KNI
+ if match_kni:
+ link = 'LINK' + str(match_kni.group(1))
+ edges[q_id]['readers'].append(q_id)
+ knis.add(q)
+ links.add(link)
+ continue
+
+ # Check for TAP
+ if match_tap:
+ edges[q_id]['readers'].append(q_id)
+ taps.add(q)
+ continue
+
+ # Check for SINK
+ if match_sink:
+ edges[q_id]['readers'].append(q)
+ sinks.add(q)
+ continue
+
+ continue
+
+ #
+ # Write DOT file
+ #
+ print('Creating DOT file "%s" ...' % dotfile)
+ dot_cmd = DOT_COMMAND % (dotfile, imgfile)
+ file = open(dotfile, 'w')
+ file.write(DOT_INTRO % dot_cmd)
+ file.write(DOT_GRAPH_BEGIN)
+
+ # Write the graph nodes to the DOT file
+ for l in sorted(links):
+ file.write(DOT_NODE_LINK_RX % l)
+ file.write(DOT_NODE_LINK_TX % l)
+ for k in sorted(knis):
+ file.write(DOT_NODE_KNI_RX % k)
+ file.write(DOT_NODE_KNI_TX % k)
+ for t in sorted(taps):
+ file.write(DOT_NODE_TAP_RX % t)
+ file.write(DOT_NODE_TAP_TX % t)
+ for s in sorted(sources):
+ file.write(DOT_NODE_SOURCE % s)
+ for s in sorted(sinks):
+ file.write(DOT_NODE_SINK % s)
+ for p in sorted(pipelines):
+ file.write(DOT_NODE_PIPELINE % p)
+
+ # Write the graph edges to the DOT file
+ for q in sorted(edges.keys()):
+ rw = edges[q]
+ if 'writers' not in rw:
+ print('Error: "%s" has no writer' % q)
+ return
+ if 'readers' not in rw:
+ print('Error: "%s" has no reader' % q)
+ return
+ for w in rw['writers']:
+ for r in rw['readers']:
+ file.write(DOT_EDGE_PKTQ % (w, r, rw['label']))
+
+ file.write(DOT_GRAPH_END)
+ file.close()
+
+ #
+ # Execute the DOT command to create the image file
+ #
+ print('Creating image file "%s" ...' % imgfile)
+ if os.system('which dot > /dev/null'):
+ print('Error: Unable to locate "dot" executable.' \
+ 'Please install the "graphviz" package (www.graphviz.org).')
+ return
+
+ os.system(dot_cmd)
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description=\
+ 'Create diagram for IP pipeline configuration file.')
+
+ parser.add_argument(
+ '-f',
+ '--file',
+ help='input configuration file (e.g. "ip_pipeline.cfg")',
+ required=True)
+
+ args = parser.parse_args()
+
+ process_config_file(args.file)
diff --git a/examples/l2fwd-crypto/main.c b/examples/l2fwd-crypto/main.c
index 8dc616d4..a1ce7127 100644
--- a/examples/l2fwd-crypto/main.c
+++ b/examples/l2fwd-crypto/main.c
@@ -243,7 +243,7 @@ struct l2fwd_crypto_statistics {
} __rte_cache_aligned;
struct l2fwd_port_statistics port_statistics[RTE_MAX_ETHPORTS];
-struct l2fwd_crypto_statistics crypto_statistics[RTE_MAX_ETHPORTS];
+struct l2fwd_crypto_statistics crypto_statistics[RTE_CRYPTO_MAX_DEVS];
/* A tsc-based timer responsible for triggering statistics printout */
#define TIMER_MILLISECOND 2000000ULL /* around 1ms at 2 Ghz */
@@ -628,7 +628,7 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options)
unsigned lcore_id = rte_lcore_id();
uint64_t prev_tsc = 0, diff_tsc, cur_tsc, timer_tsc = 0;
- unsigned i, j, portid, nb_rx;
+ unsigned i, j, portid, nb_rx, len;
struct lcore_queue_conf *qconf = &lcore_queue_conf[lcore_id];
const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) /
US_PER_S * BURST_TX_DRAIN_US;
@@ -727,10 +727,18 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options)
cur_tsc = rte_rdtsc();
/*
- * TX burst queue drain
+ * Crypto device/TX burst queue drain
*/
diff_tsc = cur_tsc - prev_tsc;
if (unlikely(diff_tsc > drain_tsc)) {
+ /* Enqueue all crypto ops remaining in buffers */
+ for (i = 0; i < qconf->nb_crypto_devs; i++) {
+ cparams = &port_cparams[i];
+ len = qconf->op_buf[cparams->dev_id].len;
+ l2fwd_crypto_send_burst(qconf, len, cparams);
+ qconf->op_buf[cparams->dev_id].len = 0;
+ }
+ /* Transmit all packets remaining in buffers */
for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) {
if (qconf->pkt_buf[portid].len == 0)
continue;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 7a79cd2c..acedd20e 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -311,20 +311,32 @@ init_lcore_rx_queues(void)
static void
print_usage(const char *prgname)
{
- printf ("%s [EAL options] -- -p PORTMASK -P"
- " [--config (port,queue,lcore)[,(port,queue,lcore]]"
- " [--enable-jumbo [--max-pkt-len PKTLEN]]\n"
- " -p PORTMASK: hexadecimal bitmask of ports to configure\n"
- " -P : enable promiscuous mode\n"
- " -E : enable exact match\n"
- " -L : enable longest prefix match\n"
- " --config (port,queue,lcore): rx queues configuration\n"
- " --eth-dest=X,MM:MM:MM:MM:MM:MM: optional, ethernet destination for port X\n"
- " --no-numa: optional, disable numa awareness\n"
- " --ipv6: optional, specify it if running ipv6 packets\n"
- " --enable-jumbo: enable jumbo frame"
- " which max packet len is PKTLEN in decimal (64-9600)\n"
- " --hash-entry-num: specify the hash entry number in hexadecimal to be setup\n",
+ printf("%s [EAL options] --"
+ " -p PORTMASK"
+ " [-P]"
+ " [-E]"
+ " [-L]"
+ " --config (port,queue,lcore)[,(port,queue,lcore)]"
+ " [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
+ " [--enable-jumbo [--max-pkt-len PKTLEN]]"
+ " [--no-numa]"
+ " [--hash-entry-num]"
+ " [--ipv6]"
+ " [--parse-ptype]\n\n"
+
+ " -p PORTMASK: Hexadecimal bitmask of ports to configure\n"
+ " -P : Enable promiscuous mode\n"
+ " -E : Enable exact match\n"
+ " -L : Enable longest prefix match (default)\n"
+ " --config (port,queue,lcore): Rx queue configuration\n"
+ " --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
+ " --enable-jumbo: Enable jumbo frames\n"
+ " --max-pkt-len: Under the premise of enabling jumbo,\n"
+ " maximum packet length in decimal (64-9600)\n"
+ " --no-numa: Disable numa awareness\n"
+ " --hash-entry-num: Specify the hash entry number in hexadecimal to be setup\n"
+ " --ipv6: Set if running ipv6 packets\n"
+ " --parse-ptype: Set to use software to analyze packet type\n\n",
prgname);
}
diff --git a/examples/multi_process/client_server_mp/mp_server/init.c b/examples/multi_process/client_server_mp/mp_server/init.c
index ecb61c68..ad941a7a 100644
--- a/examples/multi_process/client_server_mp/mp_server/init.c
+++ b/examples/multi_process/client_server_mp/mp_server/init.c
@@ -60,7 +60,6 @@
#include <rte_ether.h>
#include <rte_ethdev.h>
#include <rte_malloc.h>
-#include <rte_fbk_hash.h>
#include <rte_string_fns.h>
#include <rte_cycles.h>
diff --git a/examples/multi_process/client_server_mp/mp_server/main.c b/examples/multi_process/client_server_mp/mp_server/main.c
index de54c674..a6dc12d5 100644
--- a/examples/multi_process/client_server_mp/mp_server/main.c
+++ b/examples/multi_process/client_server_mp/mp_server/main.c
@@ -65,7 +65,6 @@
#include <rte_ethdev.h>
#include <rte_byteorder.h>
#include <rte_malloc.h>
-#include <rte_fbk_hash.h>
#include <rte_string_fns.h>
#include "common.h"
diff --git a/examples/tep_termination/vxlan_setup.c b/examples/tep_termination/vxlan_setup.c
index 37575c27..8f1f15bb 100644
--- a/examples/tep_termination/vxlan_setup.c
+++ b/examples/tep_termination/vxlan_setup.c
@@ -249,7 +249,7 @@ vxlan_link(struct vhost_dev *vdev, struct rte_mbuf *m)
struct rte_eth_tunnel_filter_conf tunnel_filter_conf;
- if (unlikely(portid > VXLAN_N_PORTS)) {
+ if (unlikely(portid >= VXLAN_N_PORTS)) {
RTE_LOG(INFO, VHOST_DATA,
"(%d) WARNING: Not configuring device,"
"as already have %d ports for VXLAN.",
diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index 3aff2cc8..3b98f429 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -332,8 +332,11 @@ port_init(uint8_t port)
rx_rings = (uint16_t)dev_info.max_rx_queues;
/* Configure ethernet device. */
retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf);
- if (retval != 0)
+ if (retval != 0) {
+ RTE_LOG(ERR, VHOST_PORT, "Failed to configure port %u: %s.\n",
+ port, strerror(-retval));
return retval;
+ }
/* Setup the queues. */
for (q = 0; q < rx_rings; q ++) {
@@ -341,21 +344,30 @@ port_init(uint8_t port)
rte_eth_dev_socket_id(port),
rxconf,
mbuf_pool);
- if (retval < 0)
+ if (retval < 0) {
+ RTE_LOG(ERR, VHOST_PORT,
+ "Failed to setup rx queue %u of port %u: %s.\n",
+ q, port, strerror(-retval));
return retval;
+ }
}
for (q = 0; q < tx_rings; q ++) {
retval = rte_eth_tx_queue_setup(port, q, tx_ring_size,
rte_eth_dev_socket_id(port),
txconf);
- if (retval < 0)
+ if (retval < 0) {
+ RTE_LOG(ERR, VHOST_PORT,
+ "Failed to setup tx queue %u of port %u: %s.\n",
+ q, port, strerror(-retval));
return retval;
+ }
}
/* Start the device. */
retval = rte_eth_dev_start(port);
if (retval < 0) {
- RTE_LOG(ERR, VHOST_DATA, "Failed to start the device.\n");
+ RTE_LOG(ERR, VHOST_PORT, "Failed to start port %u: %s\n",
+ port, strerror(-retval));
return retval;
}
diff --git a/examples/vm_power_manager/channel_manager.h b/examples/vm_power_manager/channel_manager.h
index 67e26ecb..47c3b9cd 100644
--- a/examples/vm_power_manager/channel_manager.h
+++ b/examples/vm_power_manager/channel_manager.h
@@ -41,7 +41,13 @@ extern "C" {
#include <linux/limits.h>
#include <sys/un.h>
#include <rte_atomic.h>
-#include "channel_commands.h"
+
+/* Maximum number of CPUs */
+#define CHANNEL_CMDS_MAX_CPUS 64
+#if CHANNEL_CMDS_MAX_CPUS > 64
+#error Maximum number of cores is 64, overflow is guaranteed to \
+ cause problems with VM Power Management
+#endif
/* Maximum name length including '\0' terminator */
#define CHANNEL_MGR_MAX_NAME_LEN 64