[dpdk-dev] [PATCH] doc: add pdump library to API doxygen
Add pdump library to API doxygen. Signed-off-by: Reshma Pattan --- doc/api/doxy-api-index.md | 3 ++- doc/api/doxy-api.conf | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md index 6675f96..492a0af 100644 --- a/doc/api/doxy-api-index.md +++ b/doc/api/doxy-api-index.md @@ -140,7 +140,8 @@ There are many libraries, so their headers may be grouped by topics: [debug] (@ref rte_debug.h), [log](@ref rte_log.h), [warnings] (@ref rte_warnings.h), - [errno] (@ref rte_errno.h) + [errno] (@ref rte_errno.h), + [pdump] (@ref rte_pdump.h) - **misc**: [EAL config] (@ref rte_eal.h), diff --git a/doc/api/doxy-api.conf b/doc/api/doxy-api.conf index 9dc7ae5..b340fcf 100644 --- a/doc/api/doxy-api.conf +++ b/doc/api/doxy-api.conf @@ -51,6 +51,7 @@ INPUT = doc/api/doxy-api-index.md \ lib/librte_mempool \ lib/librte_meter \ lib/librte_net \ + lib/librte_pdump \ lib/librte_pipeline \ lib/librte_port \ lib/librte_power \ -- 2.7.4
[dpdk-dev] [PATCH v5] latencystats: added new library for latency stats
Add a library designed to calculate latency statistics and report them to the application when queried. The library measures minimum, average and maximum latencies, and jitter in nano seconds. The current implementation supports global latency stats, i.e. per application stats. Added new field to mbuf struct to mark the packet arrival time on Rx. Modify testpmd code to initialize/uninitialize latency statistics calulation. Modify the dpdk-procinfo process to display the newly added metrics. Added new command line option "--metrics" to display metrics. This pacth is dependent on http://dpdk.org/dev/patchwork/patch/16927/ APIs: * Added APIs to initialize and un initialize latency stats calculation. * Added API to retrieve latency stats names and values. Functionality: * The library will register ethdev Rx/Tx callbacks for each active port, queue combinations. * The library will register latency stats names with new metrics library. * Rx packets will be marked with time stamp on each sampling interval. * On Tx side, packets with time stamp will be considered for calculating the minimum, maximum, average latencies and also jitter. * Average latency is calculated using exponential weighted moving average method. * Minimum and maximum latencies will be low and high latency values observed so far. * Jitter calculation is done based on inter packet delay variation. * Measured stats are reported to the metrics library in a separate pthread. * Measured stats can be retrieved via get API of the libray (or) by calling generic get API of the new metrics library. Signed-off-by: Reshma Pattan --- v5: * References to 16.11 changed to 17.02 * Updated comments and doxygen * rte_stat_value changed to rte_metric_value in library and proc_info * Updated doc for doxygen * Updated release notes --- MAINTAINERS| 4 + app/proc_info/main.c | 70 app/test-pmd/testpmd.c | 10 + config/common_base | 5 + doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf | 1 + doc/guides/rel_notes/release_17_02.rst | 5 + lib/Makefile | 1 + lib/librte_latencystats/Makefile | 57 +++ lib/librte_latencystats/rte_latencystats.c | 389 + lib/librte_latencystats/rte_latencystats.h | 146 .../rte_latencystats_version.map | 10 + lib/librte_mbuf/rte_mbuf.h | 3 + mk/rte.app.mk | 2 + 14 files changed, 704 insertions(+) create mode 100644 lib/librte_latencystats/Makefile create mode 100644 lib/librte_latencystats/rte_latencystats.c create mode 100644 lib/librte_latencystats/rte_latencystats.h create mode 100644 lib/librte_latencystats/rte_latencystats_version.map diff --git a/MAINTAINERS b/MAINTAINERS index d6bb8f8..6e5e26b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -704,3 +704,7 @@ F: examples/tep_termination/ F: examples/vmdq/ F: examples/vmdq_dcb/ F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst + +Latency Stats +M: Reshma Pattan +F: lib/librte_latencystats/ diff --git a/app/proc_info/main.c b/app/proc_info/main.c index 2c56d10..33a4b39 100644 --- a/app/proc_info/main.c +++ b/app/proc_info/main.c @@ -57,6 +57,7 @@ #include #include #include +#include /* Maximum long option length for option parsing. */ #define MAX_LONG_OPT_SZ 64 @@ -68,6 +69,8 @@ static uint32_t enabled_port_mask; static uint32_t enable_stats; /**< Enable xstats. */ static uint32_t enable_xstats; +/**< Enable metrics. */ +static uint32_t enable_metrics; /**< Enable stats reset. */ static uint32_t reset_stats; /**< Enable xstats reset. */ @@ -85,6 +88,8 @@ proc_info_usage(const char *prgname) " --stats: to display port statistics, enabled by default\n" " --xstats: to display extended port statistics, disabled by " "default\n" + " --metrics: to display derived metrics of the ports, disabled by " + "default\n" " --stats-reset: to reset port statistics\n" " --xstats-reset: to reset port extended statistics\n", prgname); @@ -127,6 +132,7 @@ proc_info_parse_args(int argc, char **argv) {"stats", 0, NULL, 0}, {"stats-reset", 0, NULL, 0}, {"xstats", 0, NULL, 0}, + {"metrics", 0, NULL, 0}, {"xstats-reset", 0, NULL, 0}, {NULL, 0, 0, 0} }; @@ -159,6 +165,10 @@ proc_info_parse_args(int argc, char **argv) else if (!strncmp(long_opt
[dpdk-dev] [PATCH] doc: fix l3fwd mode selection from compile to run time
The l3fwd application route lookup mode can be selected at run time but not at compile time. This patch corrects the statement in the doc. Fixes: d0dff9ba ("doc: sample application user guide") Signed-off-by: Reshma Pattan --- doc/guides/sample_app_ug/l3_forward.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/guides/sample_app_ug/l3_forward.rst b/doc/guides/sample_app_ug/l3_forward.rst index e2e6223..ab916b9 100644 --- a/doc/guides/sample_app_ug/l3_forward.rst +++ b/doc/guides/sample_app_ug/l3_forward.rst @@ -42,7 +42,7 @@ The initialization and run-time paths are very similar to those of the :doc:`l2_ The main difference from the L2 Forwarding sample application is that the forwarding decision is made based on information read from the input packet. -The lookup method is either hash-based or LPM-based and is selected at compile time. When the selected lookup method is hash-based, +The lookup method is either hash-based or LPM-based and is selected at run time. When the selected lookup method is hash-based, a hash object is used to emulate the flow classification stage. The hash object is used in correlation with a flow table to map each input packet to its flow at runtime. -- 2.7.4
[dpdk-dev] [PATCH] pdump: fix log message to display correct error number
The ethdev Rx/Tx remove callback apis doesn't set rte_errno during failures, instead they just return negative error number, so using that number in logs instead of rte_errno upon Rx and Tx callback removal failures. Fixes: 278f9454 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 504a1ce..5968683 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -269,7 +269,7 @@ pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, if (ret < 0) { RTE_LOG(ERR, PDUMP, "failed to remove rx callback, errno=%d\n", - rte_errno); + -ret); return ret; } cbs->cb = NULL; @@ -324,7 +324,7 @@ pdump_regitser_tx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, if (ret < 0) { RTE_LOG(ERR, PDUMP, "failed to remove tx callback, errno=%d\n", - rte_errno); + -ret); return ret; } cbs->cb = NULL; -- 2.7.4
[dpdk-dev] [PATCH v4] latencystats: added new library for latency stats
Library is designed to calculate latency stats and report them to the application when queried. Library measures minimum, average, maximum latencies and jitter in nano seconds. Current implementation supports global latency stats, i.e. per application stats. Added new field to mbuf struct to mark the packet arrival time on Rx and use the timestamp to measure the latency on Tx. Modified testpmd code to initialize/uninitialize latency stats calulation. Modified dpdk-procinfo process to display the newly added metrics info. This pacth is dependent on http://dpdk.org/dev/patchwork/patch/16927/ . APIs: Added APIs to initialize and un initialize latency stats calculation. Added API to retrieve latency stats names and values. Functionality: *Library will register ethdev Rx/Tx callbacks for each active port, queue combinations. *Library will register latency stats names with new metrics library. http://dpdk.org/dev/patchwork/patch/16927/ *Rx packets will be marked with time stamp on each sampling interval. *On Tx side, packets with time stamp will be considered for calculating the minimum, maximum, average latencies and jitter. *Average latency is calculated using exponential weighted moving average method. *Minimum and maximum latencies will be low and high latency values observed so far. *Jitter calculation is done based on inter packet delay variation. *Measured stats are reported to the metrics library in a separate pthread. *Measured stats can be retrieved via get API of the libray (or) by calling generic get API of the new metrics library. documents yet to be updated. Signed-off-by: Reshma Pattan --- MAINTAINERS| 4 + app/proc_info/main.c | 70 app/test-pmd/testpmd.c | 10 + config/common_base | 5 + lib/Makefile | 1 + lib/librte_latencystats/Makefile | 57 lib/librte_latencystats/rte_latencystats.c | 380 + lib/librte_latencystats/rte_latencystats.h | 141 .../rte_latencystats_version.map | 10 + lib/librte_mbuf/rte_mbuf.h | 3 + mk/rte.app.mk | 2 + 11 files changed, 683 insertions(+) create mode 100644 lib/librte_latencystats/Makefile create mode 100644 lib/librte_latencystats/rte_latencystats.c create mode 100644 lib/librte_latencystats/rte_latencystats.h create mode 100644 lib/librte_latencystats/rte_latencystats_version.map diff --git a/MAINTAINERS b/MAINTAINERS index ba12d1b..2567448 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -702,3 +702,7 @@ F: examples/tep_termination/ F: examples/vmdq/ F: examples/vmdq_dcb/ F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst + +Latency Stats +M: Reshma Pattan +F: lib/librte_latencystats/ diff --git a/app/proc_info/main.c b/app/proc_info/main.c index 2c56d10..37d5ae4 100644 --- a/app/proc_info/main.c +++ b/app/proc_info/main.c @@ -57,6 +57,7 @@ #include #include #include +#include /* Maximum long option length for option parsing. */ #define MAX_LONG_OPT_SZ 64 @@ -68,6 +69,8 @@ static uint32_t enabled_port_mask; static uint32_t enable_stats; /**< Enable xstats. */ static uint32_t enable_xstats; +/**< Enable metrics. */ +static uint32_t enable_metrics; /**< Enable stats reset. */ static uint32_t reset_stats; /**< Enable xstats reset. */ @@ -85,6 +88,8 @@ proc_info_usage(const char *prgname) " --stats: to display port statistics, enabled by default\n" " --xstats: to display extended port statistics, disabled by " "default\n" + " --metrics: to display derived metrics of the ports, disabled by " + "default\n" " --stats-reset: to reset port statistics\n" " --xstats-reset: to reset port extended statistics\n", prgname); @@ -127,6 +132,7 @@ proc_info_parse_args(int argc, char **argv) {"stats", 0, NULL, 0}, {"stats-reset", 0, NULL, 0}, {"xstats", 0, NULL, 0}, + {"metrics", 0, NULL, 0}, {"xstats-reset", 0, NULL, 0}, {NULL, 0, 0, 0} }; @@ -159,6 +165,10 @@ proc_info_parse_args(int argc, char **argv) else if (!strncmp(long_option[option_index].name, "xstats", MAX_LONG_OPT_SZ)) enable_xstats = 1; + else if (!strncmp(long_option[option_index].name, + "metrics", + MAX_LONG_OPT_SZ)) +
[dpdk-dev] [PATCH] pdump: revert PCI device name conversion
Earlier ethdev library created the device names in the "bus:device.func" format hence pdump library implemented its own conversion method for changing the user passed device name format "domain:bus:device.func" to "bus:device.func" for finding the port id using device name using ethdev library calls. Now after ethdev and eal rework http://dpdk.org/dev/patchwork/patch/15855/, the device names are created in the format "domain:bus:device.func", so pdump library conversion is not needed any more, hence removed the corresponding code. Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 37 ++--- 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index ea5ccd9..504a1ce 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -226,29 +226,6 @@ pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused, } static int -pdump_get_dombdf(char *device_id, char *domBDF, size_t len) -{ - int ret; - struct rte_pci_addr dev_addr = {0}; - - /* identify if device_id is pci address or name */ - ret = eal_parse_pci_DomBDF(device_id, _addr); - if (ret < 0) - return -1; - - if (dev_addr.domain) - ret = snprintf(domBDF, len, "%u:%u:%u.%u", dev_addr.domain, - dev_addr.bus, dev_addr.devid, - dev_addr.function); - else - ret = snprintf(domBDF, len, "%u:%u.%u", dev_addr.bus, - dev_addr.devid, - dev_addr.function); - - return ret; -} - -static int pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, struct rte_ring *ring, struct rte_mempool *mp, uint16_t operation) @@ -885,7 +862,6 @@ rte_pdump_enable_by_deviceid(char *device_id, uint16_t queue, void *filter) { int ret = 0; - char domBDF[DEVICE_ID_SIZE]; ret = pdump_validate_ring_mp(ring, mp); if (ret < 0) @@ -894,11 +870,7 @@ rte_pdump_enable_by_deviceid(char *device_id, uint16_t queue, if (ret < 0) return ret; - if (pdump_get_dombdf(device_id, domBDF, sizeof(domBDF)) > 0) - ret = pdump_prepare_client_request(domBDF, queue, flags, - ENABLE, ring, mp, filter); - else - ret = pdump_prepare_client_request(device_id, queue, flags, + ret = pdump_prepare_client_request(device_id, queue, flags, ENABLE, ring, mp, filter); return ret; @@ -928,17 +900,12 @@ rte_pdump_disable_by_deviceid(char *device_id, uint16_t queue, uint32_t flags) { int ret = 0; - char domBDF[DEVICE_ID_SIZE]; ret = pdump_validate_flags(flags); if (ret < 0) return ret; - if (pdump_get_dombdf(device_id, domBDF, sizeof(domBDF)) > 0) - ret = pdump_prepare_client_request(domBDF, queue, flags, - DISABLE, NULL, NULL, NULL); - else - ret = pdump_prepare_client_request(device_id, queue, flags, + ret = pdump_prepare_client_request(device_id, queue, flags, DISABLE, NULL, NULL, NULL); return ret; -- 2.7.4
[dpdk-dev] [RFC v3] latencystats: added new library for latency stats
Library is designed to calculate latency stats and report them to the application when queried. Library measures minimum, average, maximum latencies and jitter in nano seconds. Current implementation supports global latency stats, i.e. per application stats. Added new field to mbuf struct to mark the packet arrival time on Rx and use the times tamp to measure the latency on Tx. Modified dpdk-procinfo process to display the new stats. APIs: Added APIs to initialize and un initialize latency stats calculation. Added API to retrieve latency stats names and values. Functionality: *Library will register ethdev Rx/Tx callbacks for each active port, queue combinations. *Library will register latency stats names with new stats library, which is under design for now. *Rx packets will be marked with time stamp on each sampling interval. *On Tx side, packets with time stamp will be considered for calculating the minimum, maximum, average latencies and jitter. *Average latency is calculated by summing all the latencies measured for each time stamped packet and dividing that by total time stamped packets. *Minimum and maximum latencies will be low and high latency values observed so far. *Jitter calculation is done based on inter packet delay variation. *Measured stats can be retrieved via get API of the libray (or) by calling generic get API of the new stats library, in this case callback is provided to update the stats into new stats library. Signed-off-by: Reshma Pattan --- MAINTAINERS| 4 + app/proc_info/main.c | 60 app/test-pmd/testpmd.c | 9 + config/common_base | 10 + lib/Makefile | 1 + lib/librte_latencystats/Makefile | 57 lib/librte_latencystats/rte_latencystats.c | 378 + lib/librte_latencystats/rte_latencystats.h | 141 .../rte_latencystats_version.map | 10 + lib/librte_mbuf/rte_mbuf.h | 3 + mk/rte.app.mk | 1 + 11 files changed, 674 insertions(+) create mode 100644 lib/librte_latencystats/Makefile create mode 100644 lib/librte_latencystats/rte_latencystats.c create mode 100644 lib/librte_latencystats/rte_latencystats.h create mode 100644 lib/librte_latencystats/rte_latencystats_version.map diff --git a/MAINTAINERS b/MAINTAINERS index 8f5fa82..2db3365 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -698,3 +698,7 @@ F: examples/tep_termination/ F: examples/vmdq/ F: examples/vmdq_dcb/ F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst + +Latency Stats +M: Reshma Pattan +F: lib/librte_latencystats/ diff --git a/app/proc_info/main.c b/app/proc_info/main.c index 2c56d10..56c9509 100644 --- a/app/proc_info/main.c +++ b/app/proc_info/main.c @@ -57,6 +57,7 @@ #include #include #include +#include /* Maximum long option length for option parsing. */ #define MAX_LONG_OPT_SZ 64 @@ -75,6 +76,8 @@ static uint32_t reset_xstats; /**< Enable memory info. */ static uint32_t mem_info; +static uint32_t enable_latnbit_stats = 1; + /**< display usage */ static void proc_info_usage(const char *prgname) @@ -301,6 +304,60 @@ nic_xstats_clear(uint8_t port_id) printf("\n NIC extended statistics for port %d cleared\n", port_id); } +static void +latnbit_stats_display(void) +{ + struct rte_stat_value *lat_stats; + struct rte_stat_name *names; + int len, ret; + static const char *nic_stats_border = ""; + + memset(_stats, 0, sizeof(struct rte_stat_value)); + len = rte_stats_get_names(NULL, 0); + if (len < 0) { + printf("Cannot get latency and bitrate stats count\n"); + return; + } + + lat_stats = malloc(sizeof(struct rte_stat_value) * len); + if (lat_stats == NULL) { + printf("Cannot allocate memory for latency and bitrate stats\n"); + return; + } + + names = malloc(sizeof(struct rte_stat_name) * len); + if (names == NULL) { + printf("Cannot allocate memory for latency and bitrate stats names\n"); + free(lat_stats); + return; + } + + if (len != rte_stats_get_names(names, len)) { + printf("Cannot get latency and bitrate stats names\n"); + free(lat_stats); + free(names); + return; + } + + printf("## Latency and bitrate statistics #\n"); + printf("%s\n", nic_stats_border); + ret = rte_stats_get_values(RTE_STATS_NONPORT, lat_stats, len); + if (ret < 0 || ret > len) { + printf("Cannot get latency and bit
[dpdk-dev] [PATCH] doc: add note on primary process dependency
The note i.e. "The dpdk-pdump tool can only be used in conjunction with a primary process which has the packet capture framework initialized already" is added to doc/guides/sample_app_ug/pdump.rst to facilitate easy understanding on the usage of the tool. Suggested-by: Jianfeng Tan Signed-off-by: Reshma Pattan --- doc/guides/sample_app_ug/pdump.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/guides/sample_app_ug/pdump.rst b/doc/guides/sample_app_ug/pdump.rst index ac0e7c9..4098e50 100644 --- a/doc/guides/sample_app_ug/pdump.rst +++ b/doc/guides/sample_app_ug/pdump.rst @@ -37,6 +37,8 @@ The ``dpdk-pdump`` tool is a Data Plane Development Kit (DPDK) tool that runs as a DPDK secondary process and is capable of enabling packet capture on dpdk ports. .. Note:: + * The ``dpdk-pdump`` tool can only be used in conjunction with a primary +application which has the packet capture framework initialized already. * The ``dpdk-pdump`` tool depends on libpcap based PMD which is disabled by default in the build configuration files, -- 2.7.4
[dpdk-dev] [PATCH v3] mk: gcc -march support for intel processors code names
The GCC 4.9 -march option supports the intel code names for processors, for example -march=silvermont, -march=broadwell. The RTE_MACHINE config flag can be used to pass code name to the compiler as -march flag. Release notes is updated. Linux and FreeBSD getting started guides are updated with recommended gcc version as 4.9 and above. Some of the gmake command examples in sample application guide and driver guides are updated with gcc version as 4.9. Signed-off-by: Reshma Pattan --- doc/guides/freebsd_gsg/build_dpdk.rst| 4 ++-- doc/guides/freebsd_gsg/build_sample_apps.rst | 6 +++--- doc/guides/linux_gsg/sys_reqs.rst| 6 +++--- doc/guides/nics/bnx2x.rst| 4 ++-- doc/guides/nics/qede.rst | 2 +- doc/guides/rel_notes/release_16_11.rst | 5 + mk/target/generic/rte.vars.mk| 4 7 files changed, 20 insertions(+), 11 deletions(-) v3: Reverted changes of mk/toolchain/gcc/rte.toolchain-compat.mk. v2: Updated Linux and FreeBSD gsg guides, sample application guide and other driver doc with recommended gcc version as 4.9 and above. diff --git a/doc/guides/freebsd_gsg/build_dpdk.rst b/doc/guides/freebsd_gsg/build_dpdk.rst index 27f21de..24a9f87 100644 --- a/doc/guides/freebsd_gsg/build_dpdk.rst +++ b/doc/guides/freebsd_gsg/build_dpdk.rst @@ -88,7 +88,7 @@ The ports required and their locations are as follows: For compiling and using the DPDK with gcc, the compiler must be installed from the ports collection: -* gcc: version 4.8 is recommended ``/usr/ports/lang/gcc48``. +* gcc: version 4.9 is recommended ``/usr/ports/lang/gcc49``. Ensure that ``CPU_OPTS`` is selected (default is OFF). When running the make config-recursive command, a dialog may be presented to the @@ -164,7 +164,7 @@ For example to compile for FreeBSD use: If the compiler binary to be used does not correspond to that given in the TOOLCHAIN part of the target, the compiler command may need to be explicitly specified. For example, if compiling for gcc, where the gcc binary is called - gcc4.8, the command would need to be ``gmake install T= CC=gcc4.8``. + gcc4.9, the command would need to be ``gmake install T= CC=gcc4.9``. Browsing the Installed DPDK Environment Target -- diff --git a/doc/guides/freebsd_gsg/build_sample_apps.rst b/doc/guides/freebsd_gsg/build_sample_apps.rst index 2662303..fffc4c0 100644 --- a/doc/guides/freebsd_gsg/build_sample_apps.rst +++ b/doc/guides/freebsd_gsg/build_sample_apps.rst @@ -54,7 +54,7 @@ the following variables must be exported: The following is an example of creating the ``helloworld`` application, which runs in the DPDK FreeBSD environment. While the example demonstrates compiling -using gcc version 4.8, compiling with clang will be similar, except that the ``CC=`` +using gcc version 4.9, compiling with clang will be similar, except that the ``CC=`` parameter can probably be omitted. The ``helloworld`` example may be found in the ``${RTE_SDK}/examples`` directory. @@ -72,7 +72,7 @@ in the build directory. setenv RTE_SDK $HOME/DPDK setenv RTE_TARGET x86_64-native-bsdapp-gcc -gmake CC=gcc48 +gmake CC=gcc49 CC main.o LD helloworld INSTALL-APP helloworld @@ -96,7 +96,7 @@ in the build directory. cd my_rte_app/ setenv RTE_TARGET x86_64-native-bsdapp-gcc -gmake CC=gcc48 +gmake CC=gcc49 CC main.o LD helloworld INSTALL-APP helloworld diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst index b321544..3d74342 100644 --- a/doc/guides/linux_gsg/sys_reqs.rst +++ b/doc/guides/linux_gsg/sys_reqs.rst @@ -61,8 +61,8 @@ Compilation of the DPDK * coreutils: ``cmp``, ``sed``, ``grep``, ``arch``, etc. -* gcc: versions 4.5.x or later is recommended for ``i686/x86_64``. Versions 4.8.x or later is recommended -for ``ppc_64`` and ``x86_x32`` ABI. On some distributions, some specific compiler flags and linker flags are enabled by +* gcc: versions 4.9 or later is recommended for all platforms. +On some distributions, some specific compiler flags and linker flags are enabled by default and affect performance (``-fstack-protector``, for example). Please refer to the documentation of your distribution and to ``gcc -dumpspecs``. @@ -82,7 +82,7 @@ Compilation of the DPDK .. note:: x86_x32 ABI is currently supported with distribution packages only on Ubuntu -higher than 13.10 or recent Debian distribution. The only supported compiler is gcc 4.8+. +higher than 13.10 or recent Debian distribution. The only supported compiler is gcc 4.9+. .. note:: diff --git a/doc/guides/nics/bnx2x.rst b/doc/guides/nics/bnx2x.rst index 6453168..6d1768a 100644 --- a/doc/guides/nics/bnx2x.rst +++ b/doc/guides/nics/bnx2x.rst @@ -162,7 +162,7 @@ To compile BNX2X PMD for FreeBSD x86_64 gcc target, run the following "
[dpdk-dev] [PATCH] pdump: fix dir permissions value in mkdir call
From: Reshma Pattan <reshma.pat...@intel.com> Inside the function pdump_get_socket_path(), pdump socket directories are created using mkdir() call with permissions 700, which was assigning wrong permissions to the directories i.e. "d-w-r-xr-T" instead of drwx---. The reason is mkdir() call doesn't consider 700 as an octal value until unless 0 is explicitly added before the value. Because of this, socket creation failure is observed when DPDK application was ran in non root user mode. DPDK application running in root user mode never reported the issue. So 0 is prefixed to the value to create directories with the correct permissions. Fixes: e4ffa2d3 ("pdump: fix error handlings") Fixes: bdd8dcc6 ("pdump: fix default socket path") Reported-by: Jianfeng Tan Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 9b921ce..ea5ccd9 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -471,12 +471,12 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) snprintf(dpdk_dir, sizeof(dpdk_dir), "%s%s", SOCKET_PATH_VAR_RUN, DPDK_DIR); - mkdir(dpdk_dir, 700); + mkdir(dpdk_dir, 0700); snprintf(dir, sizeof(dir), "%s%s", dpdk_dir, SOCKET_DIR); } - ret = mkdir(dir, 700); + ret = mkdir(dir, 0700); /* if user passed socket path is invalid, return immediately */ if (ret < 0 && errno != EEXIST) { RTE_LOG(ERR, PDUMP, -- 2.7.4
[dpdk-dev] [RFC v2] latencystats: added new library for latency stats
Library is designed to calculate latency stats and report them to the application when queried. Library measures minimum, average, maximum latencies and jitter in nano seconds. Current implementation supports global latency stats, i.e. per application stats. Added new field to mbuf struct to mark the packet arrival time on Rx and use the times tamp to measure the latency on Tx. APIs: Added APIs to initialize and un initialize latency stats calculation. Added API to retrieve latency stats names and values. Functionality: *Library will register ethdev Rx/Tx callbacks for each active port, queue combinations. *Library will register latency stats names with new stats library, which is under design for now. *Rx packets will be marked with time stamp on each sampling interval. *On Tx side, packets with time stamp will be considered for calculating the minimum, maximum, average latencies and jitter. *Average latency is calculated by summing all the latencies measured for each time stamped packet and dividing that by total time stamped packets. *Minimum and maximum latencies will be low and high latency values observed so far. *Jitter calculation is done based on inter packet delay variation. *Measured stats can be retrieved via get API of the libray (or) by calling generic get API of the new stats library, in this case callback is provided to update the stats into new stats library. Signed-off-by: Reshma Pattan --- MAINTAINERS| 4 + app/proc_info/main.c | 60 app/test-pmd/testpmd.c | 9 + config/common_base | 10 + lib/Makefile | 1 + lib/librte_latencystats/Makefile | 56 lib/librte_latencystats/rte_latencystats.c | 316 + lib/librte_latencystats/rte_latencystats.h | 133 + .../rte_latencystats_version.map | 10 + lib/librte_mbuf/rte_mbuf.h | 3 + mk/rte.app.mk | 1 + 11 files changed, 603 insertions(+) create mode 100644 lib/librte_latencystats/Makefile create mode 100644 lib/librte_latencystats/rte_latencystats.c create mode 100644 lib/librte_latencystats/rte_latencystats.h create mode 100644 lib/librte_latencystats/rte_latencystats_version.map diff --git a/MAINTAINERS b/MAINTAINERS index 6a2527c..4f5227f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -687,3 +687,7 @@ F: examples/tep_termination/ F: examples/vmdq/ F: examples/vmdq_dcb/ F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst + +Latency Stats +M: Reshma Pattan +F: lib/librte_latencystats/ diff --git a/app/proc_info/main.c b/app/proc_info/main.c index 8246fb2..b80fe4e 100644 --- a/app/proc_info/main.c +++ b/app/proc_info/main.c @@ -57,6 +57,7 @@ #include #include #include +#include /* Maximum long option length for option parsing. */ #define MAX_LONG_OPT_SZ 64 @@ -75,6 +76,8 @@ static uint32_t reset_xstats; /**< Enable memory info. */ static uint32_t mem_info; +static uint32_t enable_latency_stats = 1; + /**< display usage */ static void proc_info_usage(const char *prgname) @@ -301,6 +304,60 @@ nic_xstats_clear(uint8_t port_id) printf("\n NIC extended statistics for port %d cleared\n", port_id); } +static void +latency_stats_display(void) +{ + struct rte_stat_value *lat_stats; + struct rte_stat_name *names; + int len, ret; + static const char *nic_stats_border = ""; + + memset(_stats, 0, sizeof(struct rte_stat_value)); + len = rte_latencystats_get_names(NULL, 0); + if (len < 0) { + printf("Cannot get latency stats count\n"); + return; + } + + lat_stats = malloc(sizeof(struct rte_stat_value) * len); + if (lat_stats == NULL) { + printf("Cannot allocate memory for latency stats\n"); + return; + } + + names = malloc(sizeof(struct rte_stat_name) * len); + if (names == NULL) { + printf("Cannot allocate memory for latency stats names\n"); + free(lat_stats); + return; + } + + if (len != rte_latencystats_get_names(names, len)) { + printf("Cannot get latency stats names\n"); + free(lat_stats); + free(names); + return; + } + + printf("## Latency statistics #\n"); + printf("%s\n", nic_stats_border); + ret = rte_latencystats_get(lat_stats, len); + if (ret < 0 || ret > len) { + printf("Cannot get latency stats\n"); + free(lat_stats); + free(names); + return; + } + + int i; +
[dpdk-dev] [PATCH] dpdk-procinfo: free allocated xstats memory upon failure
Some of the failures cases inside the nic_xstats_display() function doesn't free the allocated memory for the xstats and their names, memory is freed now. Fixes: e2aae1c1 ("ethdev: remove name from extended statistic fetch") Fixes: 22561383 ("app: replace dump_cfg by proc_info") Signed-off-by: Reshma Pattan --- app/proc_info/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/proc_info/main.c b/app/proc_info/main.c index 8246fb2..2c56d10 100644 --- a/app/proc_info/main.c +++ b/app/proc_info/main.c @@ -268,7 +268,7 @@ nic_xstats_display(uint8_t port_id) if (len != rte_eth_xstats_get_names( port_id, xstats_names, len)) { printf("Cannot get xstat names\n"); - return; + goto err; } printf("## NIC extended statistics for port %-2d #\n", @@ -278,8 +278,7 @@ nic_xstats_display(uint8_t port_id) ret = rte_eth_xstats_get(port_id, xstats, len); if (ret < 0 || ret > len) { printf("Cannot get xstats\n"); - free(xstats); - return; + goto err; } for (i = 0; i < len; i++) @@ -289,6 +288,7 @@ nic_xstats_display(uint8_t port_id) printf("%s\n", nic_stats_border); +err: free(xstats); free(xstats_names); } -- 2.7.4
[dpdk-dev] [PATCH v2] mk: gcc -march support for intel processors code names
The GCC 4.9 -march option supports the intel code names for processors, for example -march=silvermont, -march=broadwell. The RTE_MACHINE config flag can be used to pass code name to the compiler as -march flag. Also old gcc versions compatibility code for the intel platform is removed from mk/toolchain/gcc/rte.toolchain-compat.mk Release notes is updated. Linux and FreeBSD getting started guides are updated with recommended gcc version as 4.9 and above. Some of the gmake command examples in sample application guide and driver guides are updated with gcc version as 4.9. Signed-off-by: Reshma Pattan --- doc/guides/freebsd_gsg/build_dpdk.rst| 4 +-- doc/guides/freebsd_gsg/build_sample_apps.rst | 6 ++-- doc/guides/linux_gsg/sys_reqs.rst| 6 ++-- doc/guides/nics/bnx2x.rst| 4 +-- doc/guides/nics/qede.rst | 2 +- doc/guides/rel_notes/release_16_11.rst | 5 +++ mk/target/generic/rte.vars.mk| 4 +++ mk/toolchain/gcc/rte.toolchain-compat.mk | 47 ++-- 8 files changed, 22 insertions(+), 56 deletions(-) v2: Updated Linux and FreeBSD gsg guides, sample application guide and other driver doc with recommended gcc version as 4.9 and above. diff --git a/doc/guides/freebsd_gsg/build_dpdk.rst b/doc/guides/freebsd_gsg/build_dpdk.rst index 93c4366..7d5e9dc 100644 --- a/doc/guides/freebsd_gsg/build_dpdk.rst +++ b/doc/guides/freebsd_gsg/build_dpdk.rst @@ -88,7 +88,7 @@ The ports required and their locations are as follows: For compiling and using the DPDK with gcc, the compiler must be installed from the ports collection: -* gcc: version 4.8 is recommended ``/usr/ports/lang/gcc48``. +* gcc: version 4.9 is recommended ``/usr/ports/lang/gcc49``. Ensure that ``CPU_OPTS`` is selected (default is OFF). When running the make config-recursive command, a dialog may be presented to the @@ -168,7 +168,7 @@ For example to compile for FreeBSD use: If the compiler binary to be used does not correspond to that given in the TOOLCHAIN part of the target, the compiler command may need to be explicitly specified. For example, if compiling for gcc, where the gcc binary is called - gcc4.8, the command would need to be ``gmake install T= CC=gcc4.8``. + gcc4.9, the command would need to be ``gmake install T= CC=gcc4.9``. Browsing the Installed DPDK Environment Target -- diff --git a/doc/guides/freebsd_gsg/build_sample_apps.rst b/doc/guides/freebsd_gsg/build_sample_apps.rst index 2662303..fffc4c0 100644 --- a/doc/guides/freebsd_gsg/build_sample_apps.rst +++ b/doc/guides/freebsd_gsg/build_sample_apps.rst @@ -54,7 +54,7 @@ the following variables must be exported: The following is an example of creating the ``helloworld`` application, which runs in the DPDK FreeBSD environment. While the example demonstrates compiling -using gcc version 4.8, compiling with clang will be similar, except that the ``CC=`` +using gcc version 4.9, compiling with clang will be similar, except that the ``CC=`` parameter can probably be omitted. The ``helloworld`` example may be found in the ``${RTE_SDK}/examples`` directory. @@ -72,7 +72,7 @@ in the build directory. setenv RTE_SDK $HOME/DPDK setenv RTE_TARGET x86_64-native-bsdapp-gcc -gmake CC=gcc48 +gmake CC=gcc49 CC main.o LD helloworld INSTALL-APP helloworld @@ -96,7 +96,7 @@ in the build directory. cd my_rte_app/ setenv RTE_TARGET x86_64-native-bsdapp-gcc -gmake CC=gcc48 +gmake CC=gcc49 CC main.o LD helloworld INSTALL-APP helloworld diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst index b321544..3d74342 100644 --- a/doc/guides/linux_gsg/sys_reqs.rst +++ b/doc/guides/linux_gsg/sys_reqs.rst @@ -61,8 +61,8 @@ Compilation of the DPDK * coreutils: ``cmp``, ``sed``, ``grep``, ``arch``, etc. -* gcc: versions 4.5.x or later is recommended for ``i686/x86_64``. Versions 4.8.x or later is recommended -for ``ppc_64`` and ``x86_x32`` ABI. On some distributions, some specific compiler flags and linker flags are enabled by +* gcc: versions 4.9 or later is recommended for all platforms. +On some distributions, some specific compiler flags and linker flags are enabled by default and affect performance (``-fstack-protector``, for example). Please refer to the documentation of your distribution and to ``gcc -dumpspecs``. @@ -82,7 +82,7 @@ Compilation of the DPDK .. note:: x86_x32 ABI is currently supported with distribution packages only on Ubuntu -higher than 13.10 or recent Debian distribution. The only supported compiler is gcc 4.8+. +higher than 13.10 or recent Debian distribution. The only supported compiler is gcc 4.9+. .. note:: diff --git a/doc/guides/nics/bnx2x.rst b/doc/guides/nics/bnx2x.rst index 6453168..6d1768a 100644 --- a/doc/guides/nics/bnx2x.rst
[dpdk-dev] [PATCH] mk: gcc -march support for intel processors code names
The GCC 4.9 -march option supports the intel code names for processors, for example -march=silvermont, -march=broadwell. The RTE_MACHINE config flag can be used to pass code name to the compiler as -march flag. Also old gcc versions compatibility code for the intel platform is removed from mk/toolchain/gcc/rte.toolchain-compat.mk Release notes is updated. Signed-off-by: Reshma Pattan --- doc/guides/rel_notes/release_16_11.rst | 5 mk/target/generic/rte.vars.mk| 4 +++ mk/toolchain/gcc/rte.toolchain-compat.mk | 47 ++-- 3 files changed, 11 insertions(+), 45 deletions(-) diff --git a/doc/guides/rel_notes/release_16_11.rst b/doc/guides/rel_notes/release_16_11.rst index 0b9022d..9f58133 100644 --- a/doc/guides/rel_notes/release_16_11.rst +++ b/doc/guides/rel_notes/release_16_11.rst @@ -36,6 +36,11 @@ New Features This section is a comment. Make sure to start the actual text at the margin. +* **Added support for new gcc -march option.** + + The GCC 4.9 ``-march`` option supports the Intel processor code names. + The config option ``RTE_MACHINE`` can be used to pass code names to the compiler as ``-march`` flag. + Resolved Issues --- diff --git a/mk/target/generic/rte.vars.mk b/mk/target/generic/rte.vars.mk index 75a616a..b31e426 100644 --- a/mk/target/generic/rte.vars.mk +++ b/mk/target/generic/rte.vars.mk @@ -50,7 +50,11 @@ # - can define CPU_ASFLAGS variable (overriden by cmdline value) that # overrides the one defined in arch. # +ifneq ($(wildcard $(RTE_SDK)/mk/machine/$(RTE_MACHINE)/rte.vars.mk),) include $(RTE_SDK)/mk/machine/$(RTE_MACHINE)/rte.vars.mk +else +MACHINE_CFLAGS := -march=$(RTE_MACHINE) +endif # # arch: diff --git a/mk/toolchain/gcc/rte.toolchain-compat.mk b/mk/toolchain/gcc/rte.toolchain-compat.mk index 6eed20c..7f23721 100644 --- a/mk/toolchain/gcc/rte.toolchain-compat.mk +++ b/mk/toolchain/gcc/rte.toolchain-compat.mk @@ -42,51 +42,8 @@ GCC_MAJOR = $(shell echo __GNUC__ | $(CC) -E -x c - | tail -n 1) GCC_MINOR = $(shell echo __GNUC_MINOR__ | $(CC) -E -x c - | tail -n 1) GCC_VERSION = $(GCC_MAJOR)$(GCC_MINOR) -# if GCC is older than 4.x -ifeq ($(shell test $(GCC_VERSION) -lt 40 && echo 1), 1) - MACHINE_CFLAGS = -$(warning You are using GCC < 4.x. This is neither supported, nor tested.) - - -else -# GCC graceful degradation -# GCC 4.2.x - added support for generic target -# GCC 4.3.x - added support for core2, ssse3, sse4.1, sse4.2 -# GCC 4.4.x - added support for avx, aes, pclmul -# GCC 4.5.x - added support for atom -# GCC 4.6.x - added support for corei7, corei7-avx -# GCC 4.7.x - added support for fsgsbase, rdrnd, f16c, core-avx-i, core-avx2 # GCC 4.9.x - added support for armv8-a+crc # - ifeq ($(shell test $(GCC_VERSION) -le 49 && echo 1), 1) - MACHINE_CFLAGS := $(patsubst -march=armv8-a+crc,-march=armv8-a+crc -D__ARM_FEATURE_CRC32=1,$(MACHINE_CFLAGS)) - endif - ifeq ($(shell test $(GCC_VERSION) -le 47 && echo 1), 1) - MACHINE_CFLAGS := $(patsubst -march=core-avx-i,-march=corei7-avx,$(MACHINE_CFLAGS)) - MACHINE_CFLAGS := $(patsubst -march=core-avx2,-march=core-avx2,$(MACHINE_CFLAGS)) - endif - ifeq ($(shell test $(GCC_VERSION) -lt 46 && echo 1), 1) - MACHINE_CFLAGS := $(patsubst -march=corei7-avx,-march=core2 -maes -mpclmul -mavx,$(MACHINE_CFLAGS)) - MACHINE_CFLAGS := $(patsubst -march=corei7,-march=core2 -maes -mpclmul,$(MACHINE_CFLAGS)) - endif - ifeq ($(shell test $(GCC_VERSION) -lt 45 && echo 1), 1) - MACHINE_CFLAGS := $(patsubst -march=atom,-march=core2 -mssse3,$(MACHINE_CFLAGS)) - endif - ifeq ($(shell test $(GCC_VERSION) -lt 44 && echo 1), 1) - MACHINE_CFLAGS := $(filter-out -mavx -mpclmul -maes,$(MACHINE_CFLAGS)) - ifneq ($(findstring SSE4_2, $(CPUFLAGS)),) - MACHINE_CFLAGS += -msse4.2 - endif - ifneq ($(findstring SSE4_1, $(CPUFLAGS)),) - MACHINE_CFLAGS += -msse4.1 - endif - endif - ifeq ($(shell test $(GCC_VERSION) -lt 43 && echo 1), 1) - MACHINE_CFLAGS := $(filter-out -msse% -mssse%,$(MACHINE_CFLAGS)) - MACHINE_CFLAGS := $(patsubst -march=core2,-march=generic,$(MACHINE_CFLAGS)) - MACHINE_CFLAGS += -msse3 - endif - ifeq ($(shell test $(GCC_VERSION) -lt 42 && echo 1), 1) - MACHINE_CFLAGS := $(filter-out -march% -mtune% -msse%,$(MACHINE_CFLAGS)) - endif +ifeq ($(shell test $(GCC_VERSION) -le 49 && echo 1), 1) +MACHINE_CFLAGS := $(patsubst -march=armv8-a+crc,-march=armv8-a+crc -D__ARM_FEATURE_CRC32=1,$(MACHINE_CFLAGS)) endif -- 2.7.4
[dpdk-dev] [PATCH] app/pdump: cleanup rte rings upon failures
Function create_mp_ring_vdev() for failure cases exits without freeing the created rte rings, because of this pdump tool cannot be rerun successfully. Added rte ring cleanup logic upon failures. Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 67 +--- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index e0ff8be..b76cfd0 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -525,6 +525,26 @@ free_ring_data(struct rte_ring *ring, uint8_t vdev_id, } static void +cleanup_rings(void) +{ + int i; + struct pdump_tuples *pt; + + for (i = 0; i < num_tuples; i++) { + pt = _t[i]; + + if (pt->device_id) + free(pt->device_id); + + /* free the rings */ + if (pt->rx_ring) + rte_ring_free(pt->rx_ring); + if (pt->tx_ring) + rte_ring_free(pt->tx_ring); + } +} + +static void cleanup_pdump_resources(void) { int i; @@ -545,16 +565,8 @@ cleanup_pdump_resources(void) free_ring_data(pt->rx_ring, pt->rx_vdev_id, >stats); if (pt->dir & RTE_PDUMP_FLAG_TX) free_ring_data(pt->tx_ring, pt->tx_vdev_id, >stats); - - if (pt->device_id) - free(pt->device_id); - - /* free the rings */ - if (pt->rx_ring) - rte_ring_free(pt->rx_ring); - if (pt->tx_ring) - rte_ring_free(pt->tx_ring); } + cleanup_rings(); } static void @@ -630,10 +642,12 @@ create_mp_ring_vdev(void) MBUF_POOL_CACHE_SIZE, 0, pt->mbuf_data_size, rte_socket_id()); - if (mbuf_pool == NULL) + if (mbuf_pool == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "Mempool creation failed: %s\n", rte_strerror(rte_errno)); + } } pt->mp = mbuf_pool; @@ -643,19 +657,23 @@ create_mp_ring_vdev(void) snprintf(ring_name, SIZE, RX_RING, i); pt->rx_ring = rte_ring_create(ring_name, pt->ring_size, rte_socket_id(), 0); - if (pt->rx_ring == NULL) + if (pt->rx_ring == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "%s:%s:%d\n", rte_strerror(rte_errno), __func__, __LINE__); + } /* create tx_ring */ snprintf(ring_name, SIZE, TX_RING, i); pt->tx_ring = rte_ring_create(ring_name, pt->ring_size, rte_socket_id(), 0); - if (pt->tx_ring == NULL) + if (pt->tx_ring == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "%s:%s:%d\n", rte_strerror(rte_errno), __func__, __LINE__); + } /* create vdevs */ (pt->rx_vdev_stream_type == IFACE) ? @@ -663,10 +681,12 @@ create_mp_ring_vdev(void) pt->rx_dev) : snprintf(vdev_args, SIZE, VDEV_PCAP, RX_STR, i, pt->rx_dev); - if (rte_eth_dev_attach(vdev_args, ) < 0) + if (rte_eth_dev_attach(vdev_args, ) < 0) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "vdev creation failed:%s:%d\n", __func__, __LINE__); + } pt->rx_vdev_id = portid; /* configure vdev */ @@ -680,10 +700,13 @@ create_mp_ring_vdev(void) pt->tx_dev) : snprintf(vdev_args, SIZE, VDEV_PCAP, TX_STR, i, pt->tx_dev); - if (rte_eth_dev_attach(vdev_args, ) < 0) +
[dpdk-dev] [PATCH] app/testpmd: fix redundant time update
Inside flush_fwd_rx_queues removed redundant prev_tsc update with cur_tsc, as prev_tsc value is always updated with rte_rdtsc() in for loop. Coverity issue: 127797 Fixes: f487715f36f5 ("app/testpmd: add timeout in Rx queue flushing") Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index b7f28e9..1428974 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -907,7 +907,6 @@ flush_fwd_rx_queues(void) timer_tsc += diff_tsc; } while ((nb_rx > 0) && (timer_tsc < timer_period)); - prev_tsc = cur_tsc; timer_tsc = 0; } } -- 2.5.0
[dpdk-dev] [PATCH] examples/distributor: fix Rx thread logic for zero packets
From: Reshma Pattan <reshma.pat...@intel.com> Zero packets can be returned by rte_eth_rx_burst() and rte_distributor_returned_pkts() inside lcore_rx(), so for zero packet scenario instead of proceeding to next operations we should continue to the next iteration of the loop to avoid unnecessary processing overhead which is causing rx packets to be dropped and hence distributor failing to forward the packets. Fixes: 07db4a97 ("examples/distributor: new sample app") Signed-off-by: Reshma Pattan --- examples/distributor/main.c | 10 +- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/distributor/main.c b/examples/distributor/main.c index 24857f2..537cee1 100644 --- a/examples/distributor/main.c +++ b/examples/distributor/main.c @@ -221,14 +221,22 @@ lcore_rx(struct lcore_params *p) struct rte_mbuf *bufs[BURST_SIZE*2]; const uint16_t nb_rx = rte_eth_rx_burst(port, 0, bufs, BURST_SIZE); + if (unlikely(nb_rx == 0)) { + if (++port == nb_ports) + port = 0; + continue; + } app_stats.rx.rx_pkts += nb_rx; rte_distributor_process(d, bufs, nb_rx); const uint16_t nb_ret = rte_distributor_returned_pkts(d, bufs, BURST_SIZE*2); app_stats.rx.returned_pkts += nb_ret; - if (unlikely(nb_ret == 0)) + if (unlikely(nb_ret == 0)) { + if (++port == nb_ports) + port = 0; continue; + } uint16_t sent = rte_ring_enqueue_burst(r, (void *)bufs, nb_ret); app_stats.rx.enqueued_pkts += sent; -- 2.5.0
[dpdk-dev] [PATCH 3/3] doc: fix default socket path names
Fixed default socket path name "/var/run" to "/var/run/.dpdk" and "$HOME" to "~/.dpdk". Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- doc/guides/prog_guide/pdump_lib.rst | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/guides/prog_guide/pdump_lib.rst b/doc/guides/prog_guide/pdump_lib.rst index 580ffcb..0136781 100644 --- a/doc/guides/prog_guide/pdump_lib.rst +++ b/doc/guides/prog_guide/pdump_lib.rst @@ -75,13 +75,13 @@ the packet capture. The packet capture framework, as part of its initialization, creates the pthread and the server socket in the pthread. The application that calls the framework initialization will have the server socket created, -either under the path that the application has passed or under the default path i.e. either ``/var/run`` for -root user or ``$HOME`` for non root user. +either under the path that the application has passed or under the default path i.e. either ``/var/run/.dpdk`` for +root user or ``~/.dpdk`` for non root user. Applications that request enabling or disabling of the packet capture will have the client socket created either under -the path that the application has passed or under the default path i.e. either ``/var/run/`` for root user or ``$HOME`` -for not root user to send the requests to the server. -The server socket will listen for client requests for enabling or disabling the packet capture. +the path that the application has passed or under the default path i.e. either ``/var/run/.dpdk`` for root user or +``~/.dpdk`` for not root user to send the requests to the server. The server socket will listen for client requests for +enabling or disabling the packet capture. Implementation Details @@ -111,7 +111,7 @@ server socket. The library API ``rte_pdump_set_socket_dir()``, sets the given path as either server socket path or client socket path based on the ``type`` argument of the API. -If the given path is ``NULL``, default path will be selected, i.e. either ``/var/run/`` for root user or ``$HOME`` +If the given path is ``NULL``, default path will be selected, i.e. either ``/var/run/.dpdk`` for root user or ``~/.dpdk`` for non root user. Clients also need to call this API to set their server socket path if the server socket path is different from default path. -- 2.5.0
[dpdk-dev] [PATCH 2/3] app/pdump: add new command line options for socket paths
Since users of the pdump library and tool can chose to have their own server and client paths, it is must for the pdump tool to use the same server socket path that was used by primary application while initializing packet capture framework by rte_pdump_init() or rte_pdump_set_socket_dir() APIs. To pass the socket path info to pdump tool a new optional command line options "server-socket-path" and "client-socket-path" are added. "client-socket-path" is also added, if the users want to have client sockets in their own defined paths. Updated pdump tool guide with the new changes. Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 57 -- doc/guides/sample_app_ug/pdump.rst | 31 +++-- 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index 2087c15..e0ff8be 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -55,6 +55,7 @@ #include #include +#define CMD_LINE_OPT_PDUMP "pdump" #define PDUMP_PORT_ARG "port" #define PDUMP_PCI_ARG "device_id" #define PDUMP_QUEUE_ARG "queue" @@ -64,6 +65,8 @@ #define PDUMP_RING_SIZE_ARG "ring-size" #define PDUMP_MSIZE_ARG "mbuf-size" #define PDUMP_NUM_MBUFS_ARG "total-num-mbufs" +#define CMD_LINE_OPT_SER_SOCK_PATH "server-socket-path" +#define CMD_LINE_OPT_CLI_SOCK_PATH "client-socket-path" #define VDEV_PCAP "eth_pcap_%s_%d,tx_pcap=%s" #define VDEV_IFACE "eth_pcap_%s_%d,tx_iface=%s" @@ -166,6 +169,8 @@ struct parse_val { int num_tuples; static struct rte_eth_conf port_conf_default; volatile uint8_t quit_signal; +static char server_socket_path[PATH_MAX]; +static char client_socket_path[PATH_MAX]; /**< display usage */ static void @@ -178,8 +183,11 @@ pdump_usage(const char *prgname) " tx-dev=," "[ring-size=default:16384]," "[mbuf-size=default:2176]," - "[total-num-mbufs=default:65535]" - "'\n", + "[total-num-mbufs=default:65535]'\n" + "[--server-socket-path=" + "default:/var/run/.dpdk/ (or) ~/.dpdk/]\n" + "[--client-socket-path=" + "default:/var/run/.dpdk/ (or) ~/.dpdk/]\n", prgname); } @@ -226,9 +234,6 @@ parse_rxtxdev(const char *key, const char *value, void *extra_args) /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->tx_dev)) pt->tx_vdev_stream_type = IFACE; - } else { - printf("invalid dev type %s, must be rx or tx\n", value); - return -1; } return 0; @@ -407,6 +412,8 @@ launch_args_parse(int argc, char **argv, char *prgname) int option_index; static struct option long_option[] = { {"pdump", 1, 0, 0}, + {"server-socket-path", 1, 0, 0}, + {"client-socket-path", 1, 0, 0}, {NULL, 0, 0, 0} }; @@ -418,14 +425,32 @@ launch_args_parse(int argc, char **argv, char *prgname) long_option, _index)) != EOF) { switch (opt) { case 0: - if (!strncmp(long_option[option_index].name, "pdump", - MAX_LONG_OPT_SZ)) { + if (!strncmp(long_option[option_index].name, + CMD_LINE_OPT_PDUMP, + sizeof(CMD_LINE_OPT_PDUMP))) { ret = parse_pdump(optarg); if (ret) { pdump_usage(prgname); return -1; } } + + if (!strncmp(long_option[option_index].name, + CMD_LINE_OPT_SER_SOCK_PATH, + sizeof(CMD_LINE_OPT_SER_SOCK_PATH))) { + snprintf(server_socket_path, + sizeof(server_socket_path), "%s", + optarg); + } + + if (!strncmp(long_option[option_index].name, + CMD_LINE_OPT_CLI_SOCK_PATH, + sizeof(CMD_LINE_OPT_CLI_SOCK_PATH))) { + snprintf(client_socket_path, +
[dpdk-dev] [PATCH 1/3] pdump: fix error handlings
The changes include 1)If mkdir fails for user passed socket paths log error and return. 2)At some places return value was set to errno and that non-negative number was returned, but the intention was to return negative value. So now rte_errno was set to errno and returning the actual negative value that the APIs has returned. Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 26 -- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 22ed476..9b921ce 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -449,6 +449,7 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) char dpdk_dir[PATH_MAX] = {0}; char dir[PATH_MAX] = {0}; char *dir_home = NULL; + int ret = 0; if (type == RTE_PDUMP_SOCKET_SERVER && server_socket_dir[0] != 0) snprintf(dir, sizeof(dir), "%s", server_socket_dir); @@ -475,7 +476,16 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) dpdk_dir, SOCKET_DIR); } - mkdir(dir, 700); + ret = mkdir(dir, 700); + /* if user passed socket path is invalid, return immediately */ + if (ret < 0 && errno != EEXIST) { + RTE_LOG(ERR, PDUMP, + "Failed to create dir:%s:%s\n", dir, + strerror(errno)); + rte_errno = errno; + return -1; + } + if (type == RTE_PDUMP_SOCKET_SERVER) snprintf(buffer, bufsz, SERVER_SOCKET, dir); else @@ -667,8 +677,8 @@ pdump_create_client_socket(struct pdump_request *p) "client socket(): %s:pid(%d):tid(%u), %s:%d\n", strerror(errno), pid, rte_sys_gettid(), __func__, __LINE__); - ret = errno; - return ret; + rte_errno = errno; + return -1; } ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), @@ -677,6 +687,7 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "Failed to get client socket path: %s:%d\n", __func__, __LINE__); + rte_errno = errno; goto exit; } addr.sun_family = AF_UNIX; @@ -688,7 +699,7 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "client bind(): %s, %s:%d\n", strerror(errno), __func__, __LINE__); - ret = errno; + rte_errno = errno; break; } @@ -701,6 +712,7 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "Failed to get server socket path: %s:%d\n", __func__, __LINE__); + rte_errno = errno; break; } serv_addr.sun_family = AF_UNIX; @@ -711,7 +723,8 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "failed to send to server:%s, %s:%d\n", strerror(errno), __func__, __LINE__); - ret = errno; + rte_errno = errno; + ret = -1; break; } @@ -722,7 +735,8 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "failed to recv from server:%s, %s:%d\n", strerror(errno), __func__, __LINE__); - ret = errno; + rte_errno = errno; + ret = -1; break; } ret = server_resp.err_value; -- 2.5.0
[dpdk-dev] [PATCH 0/3] add new command line options and error handling in pdump
This patch set contains 1)Error handling fixes in pdump library. 2)Support of server and client socket path command line options in pdump tool. 3)Default socket path name fixes in pdump library doc. Reshma Pattan (3): pdump: fix error handlings app/pdump: add new command line options for socket paths doc: fix default socket path names app/pdump/main.c| 57 +++-- doc/guides/prog_guide/pdump_lib.rst | 12 doc/guides/sample_app_ug/pdump.rst | 31 ++-- lib/librte_pdump/rte_pdump.c| 26 + 4 files changed, 97 insertions(+), 29 deletions(-) -- 2.5.0
[dpdk-dev] [PATCH 2/2] doc: add pdump shared library version to release notes
Added missing librte_pdump shared library version to release notes. Signed-off-by: Reshma Pattan --- doc/guides/rel_notes/release_16_07.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/guides/rel_notes/release_16_07.rst b/doc/guides/rel_notes/release_16_07.rst index 569f562..d758cd5 100644 --- a/doc/guides/rel_notes/release_16_07.rst +++ b/doc/guides/rel_notes/release_16_07.rst @@ -318,6 +318,7 @@ The libraries prepended with a plus sign were incremented in this version. librte_mbuf.so.2 + librte_mempool.so.2 librte_meter.so.1 + librte_pdump.so.1 librte_pipeline.so.3 librte_pmd_bond.so.1 librte_pmd_ring.so.2 -- 2.5.0
[dpdk-dev] [PATCH 1/2] doc: add pcap dependency note to pdump tool guide
Added a missing note about dependencies on libpcap and CONFIG_RTE_LIBRTE_PMD_PCAP flag that pdump tool has. Signed-off-by: Reshma Pattan --- doc/guides/sample_app_ug/pdump.rst | 11 +-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/guides/sample_app_ug/pdump.rst b/doc/guides/sample_app_ug/pdump.rst index 96c8709..32d4fbc 100644 --- a/doc/guides/sample_app_ug/pdump.rst +++ b/doc/guides/sample_app_ug/pdump.rst @@ -33,14 +33,21 @@ dpdk_pdump Application == -The ``dpdk_pdump`` application is a Data Plane Development Kit (DPDK) application that runs as a DPDK secondary process and +The ``dpdk_pdump`` tool is a Data Plane Development Kit (DPDK) tool that runs as a DPDK secondary process and is capable of enabling packet capture on dpdk ports. + .. Note:: + + * The ``dpdk_pdump`` tool depends on libpcap based PMD which is disabled by default in the build configuration +files, owing to an external dependency on the libpcap development files which must be installed on the board. +Once the libpcap development files are installed, the libpcap based PMD can be enabled by setting +CONFIG_RTE_LIBRTE_PMD_PCAP=y and recompiling the DPDK. + Running the Application --- -The application has a ``--pdump`` command line option with various sub arguments: +The tool has a ``--pdump`` command line option with various sub arguments: .. code-block:: console -- 2.5.0
[dpdk-dev] [PATCH 0/2] update packet capture framework doc
This patch set contains 1) Release notes update for adding pdump library version to shared library section. 2) Added missing note about pdump tool dependency on libpcap and CONFIG_RTE_LIBRTE_PMD_PCAP. Reshma Pattan (2): doc: add pcap dependency note to pdump tool guide doc: add pdump shared library version to release notes doc/guides/rel_notes/release_16_07.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 11 +-- 2 files changed, 10 insertions(+), 2 deletions(-) -- 2.5.0
[dpdk-dev] [PATCH] pdump: close client socket
Close the client socket before returning on error. Coverity issue: 127555 Fixes: f3c1829130ac ("pdump: check missing home environment variable") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index ee566cb..22ed476 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -677,7 +677,7 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "Failed to get client socket path: %s:%d\n", __func__, __LINE__); - return -1; + goto exit; } addr.sun_family = AF_UNIX; addr_len = sizeof(struct sockaddr_un); @@ -728,6 +728,7 @@ pdump_create_client_socket(struct pdump_request *p) ret = server_resp.err_value; } while (0); +exit: close(socket_fd); unlink(addr.sun_path); return ret; -- 2.5.0
[dpdk-dev] [PATCH] app/testpmd: add timer based fwd Rx queue flushing
Testpmd can stuck inside do while loop of the flush_fwd_rx_queues() function. As non-zero packets are returned always by rte_eth_rx_burst() function when compiled with no optimizations and if input line rate is high. "do while" loop must exit at one stage to proceed further to enable packet forwarding and forward the packets. So timer is set to exit the do while loop after 1 second. Fixes: af75078f ("first public release") Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 23 ++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 06885ce..b7f28e9 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -272,6 +272,9 @@ uint32_t bypass_timeout = RTE_BYPASS_TMT_OFF; #endif +/* default period is 1 second */ +static uint64_t timer_period = 1; + /* * Ethernet device configuration. */ @@ -877,17 +880,35 @@ flush_fwd_rx_queues(void) uint16_t nb_rx; uint16_t i; uint8_t j; + uint64_t prev_tsc = 0, diff_tsc, cur_tsc, timer_tsc = 0; + + /* convert to number of cycles */ + timer_period *= rte_get_timer_hz(); for (j = 0; j < 2; j++) { for (rxp = 0; rxp < cur_fwd_config.nb_fwd_ports; rxp++) { for (rxq = 0; rxq < nb_rxq; rxq++) { port_id = fwd_ports_ids[rxp]; + /** + * testpmd can stuck in the below do while loop + * if rte_eth_rx_burst() always returns nonzero + * packets. So timer is added to exit this loop + * after 1sec timer expiry. + */ + prev_tsc = rte_rdtsc(); do { nb_rx = rte_eth_rx_burst(port_id, rxq, pkts_burst, MAX_PKT_BURST); for (i = 0; i < nb_rx; i++) rte_pktmbuf_free(pkts_burst[i]); - } while (nb_rx > 0); + + cur_tsc = rte_rdtsc(); + diff_tsc = cur_tsc - prev_tsc; + timer_tsc += diff_tsc; + } while ((nb_rx > 0) && + (timer_tsc < timer_period)); + prev_tsc = cur_tsc; + timer_tsc = 0; } } rte_delay_ms(10); /* wait 10 milli-seconds before retrying */ -- 2.5.0
[dpdk-dev] [PATCH v5 5/5] app/pdump: fix type casting of ring size
ring_size value is wrongly type casted to uint16_t. It should be type casted to uint32_t, as maximum ring size is 28bit long. Wrong type cast wrapping around the ring size values bigger than 65535. Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index fe4d38a..2087c15 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -362,7 +362,7 @@ parse_pdump(const char *optarg) _uint_value, ); if (ret < 0) goto free_kvlist; - pt->ring_size = (uint16_t) v.val; + pt->ring_size = (uint32_t) v.val; } else pt->ring_size = RING_SIZE; -- 2.5.0
[dpdk-dev] [PATCH v5 4/5] app/pdump: fix string overflow
replaced strncpy with snprintf for safely copying the strings. Coverity issue 127351: string overflow Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index f8923b9..fe4d38a 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -217,12 +217,12 @@ parse_rxtxdev(const char *key, const char *value, void *extra_args) struct pdump_tuples *pt = extra_args; if (!strcmp(key, PDUMP_RX_DEV_ARG)) { - strncpy(pt->rx_dev, value, strlen(value)); + snprintf(pt->rx_dev, sizeof(pt->rx_dev), "%s", value); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->rx_dev)) pt->rx_vdev_stream_type = IFACE; } else if (!strcmp(key, PDUMP_TX_DEV_ARG)) { - strncpy(pt->tx_dev, value, strlen(value)); + snprintf(pt->tx_dev, sizeof(pt->tx_dev), "%s", value); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->tx_dev)) pt->tx_vdev_stream_type = IFACE; -- 2.5.0
[dpdk-dev] [PATCH v5 3/5] pdump: fix string overflow
replaced strncpy with snprintf for safely copying the strings. Cverity issue 127350: string overflow Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index e3b03a6..ee566cb 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -810,13 +810,15 @@ pdump_prepare_client_request(char *device, uint16_t queue, req.flags = flags; req.op = operation; if ((operation & ENABLE) != 0) { - strncpy(req.data.en_v1.device, device, strlen(device)); + snprintf(req.data.en_v1.device, sizeof(req.data.en_v1.device), + "%s", device); req.data.en_v1.queue = queue; req.data.en_v1.ring = ring; req.data.en_v1.mp = mp; req.data.en_v1.filter = filter; } else { - strncpy(req.data.dis_v1.device, device, strlen(device)); + snprintf(req.data.dis_v1.device, sizeof(req.data.dis_v1.device), + "%s", device); req.data.dis_v1.queue = queue; req.data.dis_v1.ring = NULL; req.data.dis_v1.mp = NULL; -- 2.5.0
[dpdk-dev] [PATCH v5 2/5] pdump: check getenv return value
inside pdump_get_socket_path(), getenv can return a NULL pointer if the match for SOCKET_PATH_HOME is not found in the environment. NULL check is added to return -1 immediately. Since pdump_get_socket_path() returns -1 now, wherever this function is called there the return value is checked and error message is logged. Coverity issue 127344: return value check Coverity issue 127347: null pointer dereference Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 43 ++- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 70efd96..e3b03a6 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -443,7 +443,7 @@ set_pdump_rxtx_cbs(struct pdump_request *p) } /* get socket path (/var/run if root, $HOME otherwise) */ -static void +static int pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { char dpdk_dir[PATH_MAX] = {0}; @@ -457,6 +457,13 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else { if (getuid() != 0) { dir_home = getenv(SOCKET_PATH_HOME); + if (!dir_home) { + RTE_LOG(ERR, PDUMP, + "Failed to get environment variable" + " value for %s, %s:%d\n", + SOCKET_PATH_HOME, __func__, __LINE__); + return -1; + } snprintf(dpdk_dir, sizeof(dpdk_dir), "%s%s", dir_home, DPDK_DIR); } else @@ -474,6 +481,8 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else snprintf(buffer, bufsz, CLIENT_SOCKET, dir, getpid(), rte_sys_gettid()); + + return 0; } static int @@ -483,8 +492,14 @@ pdump_create_server_socket(void) struct sockaddr_un addr; socklen_t addr_len; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; /* remove if file already exists */ @@ -615,8 +630,14 @@ rte_pdump_uninit(void) struct sockaddr_un addr; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } ret = unlink(addr.sun_path); if (ret != 0) { RTE_LOG(ERR, PDUMP, @@ -650,8 +671,14 @@ pdump_create_client_socket(struct pdump_request *p) return ret; } - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_CLIENT); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get client socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; addr_len = sizeof(struct sockaddr_un); @@ -667,9 +694,15 @@ pdump_create_client_socket(struct pdump_request *p) serv_len = sizeof(struct sockaddr_un); memset(_addr, 0, sizeof(serv_addr)); - pdump_get_socket_path(serv_addr.sun_path, + ret = pdump_get_socket_path(serv_addr.sun_path, sizeof(serv_addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + break; + } serv_addr.sun_family = AF_UNIX; n = sendto(socket_fd, p, sizeof(struct pdump_request), 0, -- 2.5.0
[dpdk-dev] [PATCH v5 1/5] pdump: fix default socket path
SOCKET_PATH_HOME is to specify environment variable "HOME", so it should not contain "/pdump_sockets" in the macro. So removed "/pdump_sockets" from SOCKET_PATH_HOME and SOCKET_PATH_VAR_RUN. New changes will create pdump sockets under /var/run/.dpdk/pdump_sockets for root users and under HOME/.dpdk/pdump_sockets for non root users. Changes are done in pdump_get_socket_path() to accommodate new socket path changes. Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 29 - 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index c921f51..70efd96 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -50,8 +50,10 @@ #include "rte_pdump.h" -#define SOCKET_PATH_VAR_RUN "/var/run/pdump_sockets" -#define SOCKET_PATH_HOME "HOME/pdump_sockets" +#define SOCKET_PATH_VAR_RUN "/var/run" +#define SOCKET_PATH_HOME "HOME" +#define DPDK_DIR "/.dpdk" +#define SOCKET_DIR "/pdump_sockets" #define SERVER_SOCKET "%s/pdump_server_socket" #define CLIENT_SOCKET "%s/pdump_client_socket_%d_%u" #define DEVICE_ID_SIZE 64 @@ -444,17 +446,26 @@ set_pdump_rxtx_cbs(struct pdump_request *p) static void pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { - const char *dir = NULL; + char dpdk_dir[PATH_MAX] = {0}; + char dir[PATH_MAX] = {0}; + char *dir_home = NULL; if (type == RTE_PDUMP_SOCKET_SERVER && server_socket_dir[0] != 0) - dir = server_socket_dir; + snprintf(dir, sizeof(dir), "%s", server_socket_dir); else if (type == RTE_PDUMP_SOCKET_CLIENT && client_socket_dir[0] != 0) - dir = client_socket_dir; + snprintf(dir, sizeof(dir), "%s", client_socket_dir); else { - if (getuid() != 0) - dir = getenv(SOCKET_PATH_HOME); - else - dir = SOCKET_PATH_VAR_RUN; + if (getuid() != 0) { + dir_home = getenv(SOCKET_PATH_HOME); + snprintf(dpdk_dir, sizeof(dpdk_dir), "%s%s", + dir_home, DPDK_DIR); + } else + snprintf(dpdk_dir, sizeof(dpdk_dir), "%s%s", + SOCKET_PATH_VAR_RUN, DPDK_DIR); + + mkdir(dpdk_dir, 700); + snprintf(dir, sizeof(dir), "%s%s", + dpdk_dir, SOCKET_DIR); } mkdir(dir, 700); -- 2.5.0
[dpdk-dev] [PATCH v5 0/5] fix issues in packet capture framework
This patchset includes listed fixes 1)fix default socket path in pdump library. 2)fix coverity issues in pdump library. 3)fix coverity issues in pdump tool. 4)fix wrong typecast of ring size in pdump tool. v5: changes are done to default socket paths now default socket path will be /var/run/.dpdk/pdump_sockets for root users and HOME/.dpdk/pdump_sockets for nonroot users. v4: added new patch for fixing wrong typecast of ring size in pdump tool. v3: added new patch for fixing default socket paths "HOME" and "/var/run". reworked coverity fixes on top of the above change. v2: fixed code review comment to use snprintf instead of strncpy. Reshma Pattan (5): pdump: fix default socket path pdump: check getenv return value pdump: fix string overflow app/pdump: fix string overflow app/pdump: fix type casting of ring size app/pdump/main.c | 6 ++-- lib/librte_pdump/rte_pdump.c | 78 +++- 2 files changed, 65 insertions(+), 19 deletions(-) -- 2.5.0
[dpdk-dev] [PATCH v4 5/5] app/pdump: fix type casting of ring size
ring_size value is wrongly type casted to uint16_t. It should be type casted to uint32_t, as maximum ring size is 28bit long. Wrong type cast wrapping around the ring size values bigger than 65535. Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index fe4d38a..2087c15 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -362,7 +362,7 @@ parse_pdump(const char *optarg) _uint_value, ); if (ret < 0) goto free_kvlist; - pt->ring_size = (uint16_t) v.val; + pt->ring_size = (uint32_t) v.val; } else pt->ring_size = RING_SIZE; -- 2.5.0
[dpdk-dev] [PATCH v4 4/5] app/pdump: fix string overflow
replaced strncpy with snprintf for safely copying the strings. Coverity issue 127351: string overflow Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index f8923b9..fe4d38a 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -217,12 +217,12 @@ parse_rxtxdev(const char *key, const char *value, void *extra_args) struct pdump_tuples *pt = extra_args; if (!strcmp(key, PDUMP_RX_DEV_ARG)) { - strncpy(pt->rx_dev, value, strlen(value)); + snprintf(pt->rx_dev, sizeof(pt->rx_dev), "%s", value); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->rx_dev)) pt->rx_vdev_stream_type = IFACE; } else if (!strcmp(key, PDUMP_TX_DEV_ARG)) { - strncpy(pt->tx_dev, value, strlen(value)); + snprintf(pt->tx_dev, sizeof(pt->tx_dev), "%s", value); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->tx_dev)) pt->tx_vdev_stream_type = IFACE; -- 2.5.0
[dpdk-dev] [PATCH v4 3/5] pdump: fix string overflow
replaced strncpy with snprintf for safely copying the strings. Cverity issue 127350: string overflow Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 8240387..53a5bf2 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -804,13 +804,15 @@ pdump_prepare_client_request(char *device, uint16_t queue, req.flags = flags; req.op = operation; if ((operation & ENABLE) != 0) { - strncpy(req.data.en_v1.device, device, strlen(device)); + snprintf(req.data.en_v1.device, sizeof(req.data.en_v1.device), + "%s", device); req.data.en_v1.queue = queue; req.data.en_v1.ring = ring; req.data.en_v1.mp = mp; req.data.en_v1.filter = filter; } else { - strncpy(req.data.dis_v1.device, device, strlen(device)); + snprintf(req.data.dis_v1.device, sizeof(req.data.dis_v1.device), + "%s", device); req.data.dis_v1.queue = queue; req.data.dis_v1.ring = NULL; req.data.dis_v1.mp = NULL; -- 2.5.0
[dpdk-dev] [PATCH v4 2/5] pdump: check getenv return value
inside pdump_get_socket_path(), getenv can return a NULL pointer if the match for SOCKET_PATH_HOME is not found in the environment. NULL check is added to return -1 immediately. Since pdump_get_socket_path() returns -1 now, wherever this function is called there the return value is checked and error message is logged. Coverity issue 127344: return value check Coverity issue 127347: null pointer dereference Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 44 +++- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 5c335ba..8240387 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -442,7 +442,7 @@ set_pdump_rxtx_cbs(struct pdump_request *p) } /* get socket path (/var/run if root, $HOME otherwise) */ -static void +static int pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { char dir[PATH_MAX] = {0}; @@ -455,9 +455,17 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else { if (getuid() != 0) { dir_home = getenv(SOCKET_PATH_HOME); + if (!dir_home) { + RTE_LOG(ERR, PDUMP, + "Failed to get environment variable" + " value for %s, %s:%d\n", + SOCKET_PATH_HOME, __func__, __LINE__); + return -1; + } strcat(dir, dir_home); } else strcat(dir, SOCKET_PATH_VAR_RUN); + strcat(dir, SOCKET_DIR); } @@ -467,6 +475,8 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else snprintf(buffer, bufsz, CLIENT_SOCKET, dir, getpid(), rte_sys_gettid()); + + return 0; } static int @@ -476,8 +486,14 @@ pdump_create_server_socket(void) struct sockaddr_un addr; socklen_t addr_len; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; /* remove if file already exists */ @@ -608,8 +624,14 @@ rte_pdump_uninit(void) struct sockaddr_un addr; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } ret = unlink(addr.sun_path); if (ret != 0) { RTE_LOG(ERR, PDUMP, @@ -643,8 +665,14 @@ pdump_create_client_socket(struct pdump_request *p) return ret; } - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_CLIENT); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get client socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; addr_len = sizeof(struct sockaddr_un); @@ -660,9 +688,15 @@ pdump_create_client_socket(struct pdump_request *p) serv_len = sizeof(struct sockaddr_un); memset(_addr, 0, sizeof(serv_addr)); - pdump_get_socket_path(serv_addr.sun_path, + ret = pdump_get_socket_path(serv_addr.sun_path, sizeof(serv_addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + break; + } serv_addr.sun_family = AF_UNIX; n = sendto(socket_fd, p, sizeof(struct pdump_request), 0, -- 2.5.0
[dpdk-dev] [PATCH v4 1/5] pdump: fix default socket path
SOCKET_PATH_HOME is to specify environment variable "HOME", so it should not contain "/pdump_sockets" in the macro. So remove "/pdump_sockets" from SOCKET_PATH_HOME and create new macro for "/pdump_sockets". Similary removed "/pdump_sockets" from SOCKET_PATH_VAR_RUN. Changes are done in pdump_get_socket_path() to accommodate new socket path changes. Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 22 +- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index c921f51..5c335ba 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -50,8 +50,9 @@ #include "rte_pdump.h" -#define SOCKET_PATH_VAR_RUN "/var/run/pdump_sockets" -#define SOCKET_PATH_HOME "HOME/pdump_sockets" +#define SOCKET_PATH_VAR_RUN "/var/run" +#define SOCKET_PATH_HOME "HOME" +#define SOCKET_DIR "/pdump_sockets" #define SERVER_SOCKET "%s/pdump_server_socket" #define CLIENT_SOCKET "%s/pdump_client_socket_%d_%u" #define DEVICE_ID_SIZE 64 @@ -444,17 +445,20 @@ set_pdump_rxtx_cbs(struct pdump_request *p) static void pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { - const char *dir = NULL; + char dir[PATH_MAX] = {0}; + char *dir_home = NULL; if (type == RTE_PDUMP_SOCKET_SERVER && server_socket_dir[0] != 0) - dir = server_socket_dir; + snprintf(dir, sizeof(dir), "%s", server_socket_dir); else if (type == RTE_PDUMP_SOCKET_CLIENT && client_socket_dir[0] != 0) - dir = client_socket_dir; + snprintf(dir, sizeof(dir), "%s", client_socket_dir); else { - if (getuid() != 0) - dir = getenv(SOCKET_PATH_HOME); - else - dir = SOCKET_PATH_VAR_RUN; + if (getuid() != 0) { + dir_home = getenv(SOCKET_PATH_HOME); + strcat(dir, dir_home); + } else + strcat(dir, SOCKET_PATH_VAR_RUN); + strcat(dir, SOCKET_DIR); } mkdir(dir, 700); -- 2.5.0
[dpdk-dev] [PATCH v4 0/5] fix issues in packet capture framework
This patchset includes listed fixes 1)fix default socket path in pdump library. 2)fix coverity issues in pdump library. 3)fix coverity issues in pdump tool. 4)fix wrong typecast of ring size in pdump tool. v4: added new patch for fixing wrong typecast of ring size in pdump tool. v3: added new patch for fixing default socket paths "HOME" and "/var/run". reworked coverity fixes on top of the above change. v2: fixed code review comment to use snprintf instead of strncpy. Reshma Pattan (5): pdump: fix default socket path pdump: check getenv return value pdump: fix string overflow app/pdump: fix string overflow app/pdump: fix type casting of ring size app/pdump/main.c | 6 ++-- lib/librte_pdump/rte_pdump.c | 72 ++-- 2 files changed, 59 insertions(+), 19 deletions(-) -- 2.5.0
[dpdk-dev] [PATCH v3 4/4] app/pdump: fix string overflow
replaced strncpy with snprintf for safely copying the strings. Coverity issue 127351: string overflow Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index f8923b9..fe4d38a 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -217,12 +217,12 @@ parse_rxtxdev(const char *key, const char *value, void *extra_args) struct pdump_tuples *pt = extra_args; if (!strcmp(key, PDUMP_RX_DEV_ARG)) { - strncpy(pt->rx_dev, value, strlen(value)); + snprintf(pt->rx_dev, sizeof(pt->rx_dev), "%s", value); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->rx_dev)) pt->rx_vdev_stream_type = IFACE; } else if (!strcmp(key, PDUMP_TX_DEV_ARG)) { - strncpy(pt->tx_dev, value, strlen(value)); + snprintf(pt->tx_dev, sizeof(pt->tx_dev), "%s", value); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->tx_dev)) pt->tx_vdev_stream_type = IFACE; -- 2.5.0
[dpdk-dev] [PATCH v3 3/4] pdump: fix string overflow
replaced strncpy with snprintf for safely copying the strings. Cverity issue 127350: string overflow Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 8240387..53a5bf2 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -804,13 +804,15 @@ pdump_prepare_client_request(char *device, uint16_t queue, req.flags = flags; req.op = operation; if ((operation & ENABLE) != 0) { - strncpy(req.data.en_v1.device, device, strlen(device)); + snprintf(req.data.en_v1.device, sizeof(req.data.en_v1.device), + "%s", device); req.data.en_v1.queue = queue; req.data.en_v1.ring = ring; req.data.en_v1.mp = mp; req.data.en_v1.filter = filter; } else { - strncpy(req.data.dis_v1.device, device, strlen(device)); + snprintf(req.data.dis_v1.device, sizeof(req.data.dis_v1.device), + "%s", device); req.data.dis_v1.queue = queue; req.data.dis_v1.ring = NULL; req.data.dis_v1.mp = NULL; -- 2.5.0
[dpdk-dev] [PATCH v3 1/4] pdump: fix default socket path
SOCKET_PATH_HOME is to specify environment variable "HOME", so it should not contain "/pdump_sockets" in the macro. So remove "/pdump_sockets" from SOCKET_PATH_HOME and create new macro for "/pdump_sockets". Similary removed "/pdump_sockets" from SOCKET_PATH_VAR_RUN. Changes are done in pdump_get_socket_path() to accommodate new socket path changes. Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 22 +- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index c921f51..5c335ba 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -50,8 +50,9 @@ #include "rte_pdump.h" -#define SOCKET_PATH_VAR_RUN "/var/run/pdump_sockets" -#define SOCKET_PATH_HOME "HOME/pdump_sockets" +#define SOCKET_PATH_VAR_RUN "/var/run" +#define SOCKET_PATH_HOME "HOME" +#define SOCKET_DIR "/pdump_sockets" #define SERVER_SOCKET "%s/pdump_server_socket" #define CLIENT_SOCKET "%s/pdump_client_socket_%d_%u" #define DEVICE_ID_SIZE 64 @@ -444,17 +445,20 @@ set_pdump_rxtx_cbs(struct pdump_request *p) static void pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { - const char *dir = NULL; + char dir[PATH_MAX] = {0}; + char *dir_home = NULL; if (type == RTE_PDUMP_SOCKET_SERVER && server_socket_dir[0] != 0) - dir = server_socket_dir; + snprintf(dir, sizeof(dir), "%s", server_socket_dir); else if (type == RTE_PDUMP_SOCKET_CLIENT && client_socket_dir[0] != 0) - dir = client_socket_dir; + snprintf(dir, sizeof(dir), "%s", client_socket_dir); else { - if (getuid() != 0) - dir = getenv(SOCKET_PATH_HOME); - else - dir = SOCKET_PATH_VAR_RUN; + if (getuid() != 0) { + dir_home = getenv(SOCKET_PATH_HOME); + strcat(dir, dir_home); + } else + strcat(dir, SOCKET_PATH_VAR_RUN); + strcat(dir, SOCKET_DIR); } mkdir(dir, 700); -- 2.5.0
[dpdk-dev] [PATCH v3 0/4] fix issues in packet capture framework
This patchset includes listed fixes 1)fix default socket path in pdump library. 2)fix coverity issues in pdump library. 3)fix coverity issues in pdump tool. v3: added new patch for fixing default socket paths "HOME" and "/var/run". reworked coverity fixes on top of the above change. v2: fixed code review comment to use snprintf instead of strncpy. Reshma Pattan (4): pdump: fix default socket path pdump: check getenv return value pdump: fix string overflow app/pdump: fix string overflow app/pdump/main.c | 4 +-- lib/librte_pdump/rte_pdump.c | 72 ++-- 2 files changed, 58 insertions(+), 18 deletions(-) -- 2.5.0
[dpdk-dev] [PATCH v2 2/3] pdump: fix string overflow
replaced strncpy with snprintf for safely copying the strings. Cverity issue 127350: string overflow Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index de20b9e..b499d09 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -799,13 +799,15 @@ pdump_prepare_client_request(char *device, uint16_t queue, req.flags = flags; req.op = operation; if ((operation & ENABLE) != 0) { - strncpy(req.data.en_v1.device, device, strlen(device)); + snprintf(req.data.en_v1.device, sizeof(req.data.en_v1.device), + "%s", device); req.data.en_v1.queue = queue; req.data.en_v1.ring = ring; req.data.en_v1.mp = mp; req.data.en_v1.filter = filter; } else { - strncpy(req.data.dis_v1.device, device, strlen(device)); + snprintf(req.data.dis_v1.device, sizeof(req.data.dis_v1.device), + "%s", device); req.data.dis_v1.queue = queue; req.data.dis_v1.ring = NULL; req.data.dis_v1.mp = NULL; -- 2.5.0
[dpdk-dev] [PATCH v2 1/3] pdump: check getenv return value
inside pdump_get_socket_path(), getenv can return a NULL pointer if the match for SOCKET_PATH_HOME is not found in the environment. NULL check is added to return -1 immediately without calling mkdir. Since pdump_get_socket_path() returns -1 now, wherever this function is called there the return value is checked and error message is logged. Coverity issue 127344: return value check Coverity issue 127347: null pointer dereference Fixes: 278f945402c5 ("pdump: add new library for packet capture") Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 47 +--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index c921f51..de20b9e 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -441,7 +441,7 @@ set_pdump_rxtx_cbs(struct pdump_request *p) } /* get socket path (/var/run if root, $HOME otherwise) */ -static void +static int pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { const char *dir = NULL; @@ -451,9 +451,16 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else if (type == RTE_PDUMP_SOCKET_CLIENT && client_socket_dir[0] != 0) dir = client_socket_dir; else { - if (getuid() != 0) + if (getuid() != 0) { dir = getenv(SOCKET_PATH_HOME); - else + if (!dir) { + RTE_LOG(ERR, PDUMP, + "Failed to get environment variable" + " value for %s, %s:%d\n", + SOCKET_PATH_HOME, __func__, __LINE__); + return -1; + } + } else dir = SOCKET_PATH_VAR_RUN; } @@ -463,6 +470,8 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else snprintf(buffer, bufsz, CLIENT_SOCKET, dir, getpid(), rte_sys_gettid()); + + return 0; } static int @@ -472,8 +481,14 @@ pdump_create_server_socket(void) struct sockaddr_un addr; socklen_t addr_len; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; /* remove if file already exists */ @@ -604,8 +619,14 @@ rte_pdump_uninit(void) struct sockaddr_un addr; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } ret = unlink(addr.sun_path); if (ret != 0) { RTE_LOG(ERR, PDUMP, @@ -639,8 +660,14 @@ pdump_create_client_socket(struct pdump_request *p) return ret; } - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_CLIENT); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get client socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; addr_len = sizeof(struct sockaddr_un); @@ -656,9 +683,15 @@ pdump_create_client_socket(struct pdump_request *p) serv_len = sizeof(struct sockaddr_un); memset(_addr, 0, sizeof(serv_addr)); - pdump_get_socket_path(serv_addr.sun_path, + ret = pdump_get_socket_path(serv_addr.sun_path, sizeof(serv_addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + break; + } serv_addr.sun_family = AF_UNIX; n = sendto(socket_fd, p, sizeof(struct pdump_request), 0, -- 2.5.0
[dpdk-dev] [PATCH v2 0/3] fix coverity issues in packet capture framework
This patchset fixes coverity issues in pdump library and pdump tool. v2: fixed code review comment to use snprintf instead of strncpy. Reshma Pattan (3): pdump: check getenv return value pdump: fix string overflow app/pdump: fix string overflow app/pdump/main.c | 4 ++-- lib/librte_pdump/rte_pdump.c | 53 2 files changed, 46 insertions(+), 11 deletions(-) -- 2.5.0
[dpdk-dev] [PATCH 3/3] app/pdump: fix string overflow
using source length in strncpy can cause destination overflow if destination length is not big enough to handle the source string. Changes are made to use destination size instead of source length in strncpy. Coverity issue 127351: string overflow Fixes: caa7028276b8 ("app/pdump: add tool for packet capturing") Signed-off-by: Reshma Pattan --- app/pdump/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/pdump/main.c b/app/pdump/main.c index f8923b9..af92ef3 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -217,12 +217,12 @@ parse_rxtxdev(const char *key, const char *value, void *extra_args) struct pdump_tuples *pt = extra_args; if (!strcmp(key, PDUMP_RX_DEV_ARG)) { - strncpy(pt->rx_dev, value, strlen(value)); + strncpy(pt->rx_dev, value, sizeof(pt->rx_dev)-1); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->rx_dev)) pt->rx_vdev_stream_type = IFACE; } else if (!strcmp(key, PDUMP_TX_DEV_ARG)) { - strncpy(pt->tx_dev, value, strlen(value)); + strncpy(pt->tx_dev, value, sizeof(pt->tx_dev)-1); /* identify the tx stream type for pcap vdev */ if (if_nametoindex(pt->tx_dev)) pt->tx_vdev_stream_type = IFACE; -- 2.5.0
[dpdk-dev] [PATCH 2/3] pdump: fix string overflow
using source length in strncpy can cause destination overflow if destination length is not big enough to handle the source string. Changes are made to use destination size instead of source length in strncpy. Cverity issue 127350: string overflow Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 9 + 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index dbc6816..05513d6 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -460,8 +460,7 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) SOCKET_PATH_HOME, __func__, __LINE__); return -1; } - } - else + } else dir = SOCKET_PATH_VAR_RUN; } @@ -800,13 +799,15 @@ pdump_prepare_client_request(char *device, uint16_t queue, req.flags = flags; req.op = operation; if ((operation & ENABLE) != 0) { - strncpy(req.data.en_v1.device, device, strlen(device)); + strncpy(req.data.en_v1.device, device, + sizeof(req.data.en_v1.device)-1); req.data.en_v1.queue = queue; req.data.en_v1.ring = ring; req.data.en_v1.mp = mp; req.data.en_v1.filter = filter; } else { - strncpy(req.data.dis_v1.device, device, strlen(device)); + strncpy(req.data.dis_v1.device, device, + sizeof(req.data.dis_v1.device)-1); req.data.dis_v1.queue = queue; req.data.dis_v1.ring = NULL; req.data.dis_v1.mp = NULL; -- 2.5.0
[dpdk-dev] [PATCH 1/3] pdump: check getenv return value
getenv can return a NULL pointer if the match for SOCKET_PATH_HOME is not found in the environment. NULL check is added to return immediately without calling mkdir. Coverity issue 127344: return value check Coverity issue 127347: null pointer dereference Fixes: 278f945402c5 ("pdump: add new library for packet capture") Fixes: 278f945402c5 ("pdump: add new library for packet capture") Signed-off-by: Reshma Pattan --- lib/librte_pdump/rte_pdump.c | 46 ++-- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index c921f51..dbc6816 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -441,7 +441,7 @@ set_pdump_rxtx_cbs(struct pdump_request *p) } /* get socket path (/var/run if root, $HOME otherwise) */ -static void +static int pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { const char *dir = NULL; @@ -451,8 +451,16 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else if (type == RTE_PDUMP_SOCKET_CLIENT && client_socket_dir[0] != 0) dir = client_socket_dir; else { - if (getuid() != 0) + if (getuid() != 0) { dir = getenv(SOCKET_PATH_HOME); + if (!dir) { + RTE_LOG(ERR, PDUMP, + "Failed to get environment variable" + "value for %s, %s:%d\n", + SOCKET_PATH_HOME, __func__, __LINE__); + return -1; + } + } else dir = SOCKET_PATH_VAR_RUN; } @@ -463,6 +471,8 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) else snprintf(buffer, bufsz, CLIENT_SOCKET, dir, getpid(), rte_sys_gettid()); + + return 0; } static int @@ -472,8 +482,14 @@ pdump_create_server_socket(void) struct sockaddr_un addr; socklen_t addr_len; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; /* remove if file already exists */ @@ -604,8 +620,14 @@ rte_pdump_uninit(void) struct sockaddr_un addr; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } ret = unlink(addr.sun_path); if (ret != 0) { RTE_LOG(ERR, PDUMP, @@ -639,8 +661,14 @@ pdump_create_client_socket(struct pdump_request *p) return ret; } - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_CLIENT); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get client socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; addr_len = sizeof(struct sockaddr_un); @@ -656,9 +684,15 @@ pdump_create_client_socket(struct pdump_request *p) serv_len = sizeof(struct sockaddr_un); memset(_addr, 0, sizeof(serv_addr)); - pdump_get_socket_path(serv_addr.sun_path, + ret = pdump_get_socket_path(serv_addr.sun_path, sizeof(serv_addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + break; + } serv_addr.sun_family = AF_UNIX; n = sendto(socket_fd, p, sizeof(struct pdump_request), 0, -- 2.5.0
[dpdk-dev] [PATCH 0/3] fix coverity issues in packet capture framework
This patchset fixes coverity issues in pdump library and pdump tool. Reshma Pattan (3): pdump: check getenv return value pdump: fix string overflow app/pdump: fix string overflow app/pdump/main.c | 4 ++-- lib/librte_pdump/rte_pdump.c | 53 2 files changed, 46 insertions(+), 11 deletions(-) -- 2.5.0
[dpdk-dev] [PATCH v10 7/7] app/testpmd: add pdump initialization uninitialization
Call rte_pdump_init and rte_pdump_uninit for packet capturing initialization and uninitialization. Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 12 1 file changed, 12 insertions(+) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index dd6b046..b26f5be 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -76,6 +76,9 @@ #ifdef RTE_LIBRTE_PMD_XENVIRT #include #endif +#ifdef RTE_LIBRTE_PDUMP +#include +#endif #include "testpmd.h" @@ -2029,6 +2032,10 @@ signal_handler(int signum) if (signum == SIGINT || signum == SIGTERM) { printf("\nSignal %d received, preparing to exit...\n", signum); +#ifdef RTE_LIBRTE_PDUMP + /* uninitialize packet capture framework */ + rte_pdump_uninit(); +#endif force_quit(); /* exit with the expected status */ signal(signum, SIG_DFL); @@ -2049,6 +2056,11 @@ main(int argc, char** argv) if (diag < 0) rte_panic("Cannot init EAL\n"); +#ifdef RTE_LIBRTE_PDUMP + /* initialize packet capture framework */ + rte_pdump_init(NULL); +#endif + nb_ports = (portid_t) rte_eth_dev_count(); if (nb_ports == 0) RTE_LOG(WARNING, EAL, "No probed ethernet devices\n"); -- 2.5.0
[dpdk-dev] [PATCH v10 6/7] app/pdump: add pdump tool for packet capturing
The new pdump tool is added for packet capturing on dpdk. This tool runs as secondary process by default. Tool facilitates the command line options like port, device_id, queue which user should pass on to the tool to request the packet capture on those devices. Tool creates the rte ring, mempool and pcap vdev and calls the enable API of the pdump library with port/device_id, queue, ring and mempool as arguments to enable the packet capture on specific devices and gets the packets from the primary process over the ring. Once the packets are received, those packets will be send to the pcap vdev. Tool can be terminated by using ctrl+c(SIGINT) upon which tool calls the disable API of the pdump library to disable the packet capture and dequeues the rest of the packets from the ring and sends them on to the pcap vdev, then after releases all allocated resources. Updates the release notes. Updated the MAINTAINERS. Added sample application guide for app/pdump application. Signed-off-by: Reshma Pattan --- MAINTAINERS| 2 + app/Makefile | 1 + app/pdump/Makefile | 49 ++ app/pdump/main.c | 844 + doc/guides/rel_notes/release_16_07.rst | 1 + doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 + 7 files changed, 1020 insertions(+) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c create mode 100644 doc/guides/sample_app_ug/pdump.rst diff --git a/MAINTAINERS b/MAINTAINERS index afb2d0c..630f2c8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -437,6 +437,8 @@ Pdump M: Reshma Pattan F: lib/librte_pdump/ F: doc/guides/prog_guide/pdump_library.rst +F: app/pdump/ +F: doc/guides/sample_app_ug/pdump.rst Hierarchical scheduler M: Cristian Dumitrescu diff --git a/app/Makefile b/app/Makefile index 1151e09..30ec292 100644 --- a/app/Makefile +++ b/app/Makefile @@ -37,5 +37,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += test-pipeline DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_test DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += proc_info +DIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += pdump include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/app/pdump/Makefile b/app/pdump/Makefile new file mode 100644 index 000..d85bb08 --- /dev/null +++ b/app/pdump/Makefile @@ -0,0 +1,49 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +ifeq ($(CONFIG_RTE_LIBRTE_PDUMP),y) + +APP = dpdk_pdump + +CFLAGS += $(WERROR_FLAGS) + +# all source are stored in SRCS-y + +SRCS-y := main.c + +# this application needs libraries first +DEPDIRS-y += lib + +include $(RTE_SDK)/mk/rte.app.mk + +endif diff --git a/app/pdump/main.c b/app/pdump/main.c new file mode 100644 index 000..f8923b9 --- /dev/null +++ b/app/pdump/main.c @@ -0,0 +1,844 @@ +/* + * 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
[dpdk-dev] [PATCH v10 5/7] pdump: add new library for packet capturing support
The librte_pdump library provides a framework for packet capturing in dpdk. The library provides set of APIs to initialize the packet capture framework, to enable or disable the packet capture, and to uninitialize it. The librte_pdump library works on a client/server model. The server is responsible for enabling or disabling the packet capture and the clients are responsible for requesting the enabling or disabling of the packet capture. Enabling APIs are supported with port, queue, ring and mempool parameters. Applications should pass on this information to get the packets from the dpdk ports. For enabling requests from applications, library creates the client request containing the mempool, ring, port and queue information and sends the request to the server. After receiving the request, server registers the Rx and Tx callbacks for all the port and queues. After the callbacks registration, registered callbacks will get the Rx and Tx packets. Packets then will be copied to the new mbufs that are allocated from the user passed mempool. These new mbufs then will be enqueued to the application passed ring. Applications need to dequeue the mbufs from the rings and direct them to the devices like pcap vdev for viewing the packets outside of the dpdk using the packet capture tools. For disabling requests, library creates the client request containing the port and queue information and sends the request to the server. After receiving the request, server removes the Rx and Tx callback for all the port and queues. Update the release notes. Added programmers guide for librte_pdump. Updated the MAINTAINERS file. Signed-off-by: Reshma Pattan --- MAINTAINERS | 5 + config/common_base | 5 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 123 + doc/guides/rel_notes/release_16_07.rst | 4 + lib/Makefile| 1 + lib/librte_pdump/Makefile | 55 ++ lib/librte_pdump/rte_pdump.c| 913 lib/librte_pdump/rte_pdump.h| 216 lib/librte_pdump/rte_pdump_version.map | 13 + mk/rte.app.mk | 1 + 11 files changed, 1337 insertions(+) create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map diff --git a/MAINTAINERS b/MAINTAINERS index 3e6b70c..afb2d0c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -433,6 +433,11 @@ F: app/test/test_reorder* F: examples/packet_ordering/ F: doc/guides/sample_app_ug/packet_ordering.rst +Pdump +M: Reshma Pattan +F: lib/librte_pdump/ +F: doc/guides/prog_guide/pdump_library.rst + Hierarchical scheduler M: Cristian Dumitrescu F: lib/librte_sched/ diff --git a/config/common_base b/config/common_base index b9ba405..943730b 100644 --- a/config/common_base +++ b/config/common_base @@ -484,6 +484,11 @@ CONFIG_RTE_LIBRTE_DISTRIBUTOR=y CONFIG_RTE_LIBRTE_REORDER=y # +# Compile the pdump library +# +CONFIG_RTE_LIBRTE_PDUMP=y + +# # Compile librte_port # CONFIG_RTE_LIBRTE_PORT=y diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index b862d0c..47030c2 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -52,6 +52,7 @@ Programmer's Guide packet_distrib_lib reorder_lib ip_fragment_reassembly_lib +pdump_library multi_proc_support kernel_nic_interface thread_safety_dpdk_functions diff --git a/doc/guides/prog_guide/pdump_library.rst b/doc/guides/prog_guide/pdump_library.rst new file mode 100644 index 000..580ffcb --- /dev/null +++ b/doc/guides/prog_guide/pdump_library.rst @@ -0,0 +1,123 @@ +.. 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
[dpdk-dev] [PATCH v10 1/7] ethdev: use locks to protect Rx/Tx callback lists
Added spinlocks around add/remove logic of Rx and Tx callbacks to avoid corruption of callback lists in multithreaded context. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 82 +-- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index e148028..ce70d58 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -77,6 +77,12 @@ static uint8_t nb_ports; /* spinlock for eth device callbacks */ static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER; +/* spinlock for add/remove rx callbacks */ +static rte_spinlock_t rte_eth_rx_cb_lock = RTE_SPINLOCK_INITIALIZER; + +/* spinlock for add/remove tx callbacks */ +static rte_spinlock_t rte_eth_tx_cb_lock = RTE_SPINLOCK_INITIALIZER; + /* store statistics names and its offset in stats structure */ struct rte_eth_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; @@ -1634,7 +1640,6 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, STAT_QMAP_RX); } - void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) { @@ -2905,7 +2910,6 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_errno = EINVAL; return NULL; } - struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); if (cb == NULL) { @@ -2916,6 +2920,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.rx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_rx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; @@ -2928,6 +2933,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_rx_cb_lock); return cb; } @@ -2957,6 +2963,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.tx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_tx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id]; @@ -2969,6 +2976,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_tx_cb_lock); return cb; } @@ -2987,29 +2995,24 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->post_rx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + int ret = -EINVAL; + + rte_spinlock_lock(_eth_rx_cb_lock); + prev_cb = >post_rx_burst_cbs[queue_id]; + for (; *prev_cb != NULL; prev_cb = >next) { + cb = *prev_cb; if (cb == user_cb) { - prev_cb->next = user_cb->next; - return 0; + /* Remove the user cb from the callback list. */ + *prev_cb = cb->next; + ret = 0; + break; } + } + rte_spinlock_unlock(_eth_rx_cb_lock); - } while (cb != NULL); - - /* Callback wasn't found. */ - return -EINVAL; + return ret; } int @@ -3026,29 +3029,24 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->pre_tx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + int ret = -EINVAL; + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + + rte_spinlock_lock(_eth_tx_cb_lock); + prev_cb
[dpdk-dev] [PATCH v10 0/7] add packet capture framework
process. *Pdump tool will dequeue the packets from ring and writes them to PCAPMD vdev, so ultimately packets will be seen on the device that is passed in rx-dev|tx-dev. *Once the pdump tool is terminated with SIGINT it will disable the packet capturing. *Library receives the disable packet capture request, communicate the info to server, server will remove the Ethernet rxtx call-backs. *Packet capture can be seen using tcpdump command "tcpdump -ni " (or) "tcpdump ?nr " 5)Example command line == ./build/app/dpdk_pdump -- --pdump 'device_id=:02:0.0,queue=*,tx-dev=/tmp/dt-file.pcap,rx-dev=/tmp/dr-file.pcap,ring-size=8192,mbuf-size=2176,total-num-mbufs=32768' --pdump 'device_id=:01:00.0,queue=*,rx-dev=/tmp/d-file.pcap,tx-dev=/tmp/d-file.pcap,ring-size=16384,mbuf-size=2176,total-num-mbufs=32768' v10: fixed commit messages description. fixed compilation issue when CONFIG_RTE_LIBRTE_PDUMP is disabled. removed wrong config option CONFIG_RTE_EXEC_ENV_LINUXAPP inside app/Makefile for pdump tool. moved document changes to appropriate patches. v9: added a support in rte_pdump_set_socket_dir() to set server and client socket paths ==> http://dpdk.org/dev/patchwork/patch/13450/ updated the documentation for the new changes. updated the commit messages. v8: added server socket argument to rte_pdump_init() API ==> http://dpdk.org/dev/patchwork/patch/13402/ added rte_pdump_set_socket_dir() API. updated documentation for new changes. v7: fixed lines over 90 characters. v6: removed below deprecation notice patch from patch set. http://dpdk.org/dev/patchwork/patch/13372/ v5: addressed code review comments for below patches http://dpdk.org/dev/patchwork/patch/12955/ http://dpdk.org/dev/patchwork/patch/12951/ v4: added missing deprecation notice for ABI changes of rte_eth_dev_info structure. made doc changes as per doc guidelines. replaced rte_eal_vdev_init with rte_eth_dev_attach in pdump tool. removed rxtx-dev parameter from pdump tool command line. v3: app/pdump: Moved cleanup code from signal handler to main. divided librte_ether changes into multiple patches. example command changed in app/pdump application guide v2: fix compilation issues for 4.8.3 fix unnecessary #includes Reshma Pattan (7): ethdev: use locks to protect Rx/Tx callback lists ethdev: add new api to add Rx callback as head of the list ethdev: add new fields to ethdev info struct ethdev: make get port by name and get name by port public pdump: add new library for packet capturing support app/pdump: add pdump tool for packet capturing app/testpmd: add pdump initialization uninitialization MAINTAINERS | 7 + app/Makefile| 1 + app/pdump/Makefile | 49 ++ app/pdump/main.c| 844 + app/test-pmd/testpmd.c | 12 + config/common_base | 5 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 123 + doc/guides/rel_notes/release_16_07.rst | 14 + doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 + lib/Makefile| 1 + lib/librte_ether/rte_ethdev.c | 123 +++-- lib/librte_ether/rte_ethdev.h | 60 +++ lib/librte_ether/rte_ether_version.map | 9 + lib/librte_pdump/Makefile | 55 ++ lib/librte_pdump/rte_pdump.c| 913 lib/librte_pdump/rte_pdump.h| 216 lib/librte_pdump/rte_pdump_version.map | 13 + mk/rte.app.mk | 1 + 20 files changed, 2526 insertions(+), 44 deletions(-) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map Acked-by: Konstantin Ananyev -- 2.5.0
[dpdk-dev] [PATCH v9 8/8] doc: update doc for packet capture framework
Added programmers guide for librte_pdump. Added sample application guide for app/pdump application. Updated release note for packet capture framework changes. Signed-off-by: Reshma Pattan Acked-by: John McNamara --- MAINTAINERS | 3 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 119 +++ doc/guides/rel_notes/release_16_07.rst | 13 doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 6 files changed, 259 insertions(+) create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst diff --git a/MAINTAINERS b/MAINTAINERS index c46cf86..9a84f59 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -437,6 +437,9 @@ Pdump M: Reshma Pattan F: lib/librte_pdump/ F: app/pdump/ +F: doc/guides/prog_guide/pdump_library.rst +F: doc/guides/sample_app_ug/pdump.rst + Hierarchical scheduler M: Cristian Dumitrescu diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index b862d0c..4caf969 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -71,6 +71,7 @@ Programmer's Guide writing_efficient_code profile_app glossary +pdump_library **Figures** diff --git a/doc/guides/prog_guide/pdump_library.rst b/doc/guides/prog_guide/pdump_library.rst new file mode 100644 index 000..8781ffb --- /dev/null +++ b/doc/guides/prog_guide/pdump_library.rst @@ -0,0 +1,119 @@ +.. 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. + +.. _pdump_library: + +The librte_pdump Library + + +The ``librte_pdump`` library provides a framework for packet capturing in DPDK. +The library provides the following APIs to initialize the packet capture framework, to enable +or disable the packet capture, and to uninitialize it: + +* ``rte_pdump_init()``: + This API initializes the packet capture framework. + +* ``rte_pdump_enable()``: + This API enables the packet capture on a given port and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_enable_by_deviceid()``: + This API enables the packet capture on a given device id (``vdev name or pci address``) and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_disable()``: + This API disables the packet capture on a given port and queue. + +* ``rte_pdump_disable_by_deviceid()``: + This API disables the packet capture on a given device id (``vdev name or pci address``) and queue. + +* ``rte_pdump_uninit()``: + This API uninitializes the packet capture framework. + +* ``rte_pdump_set_socket_dir()``: + This API sets the server and client socket paths. + Note: This API is not thread-safe. + + +Operation +- + +The ``librte_pdump`` library works on a client/server model. The server is responsible for enabling or +disabling the packet capture and the clients are responsible for requesting the enabling or disabling of +the packet capture. + +The packet capture framework, as part of its initialization, creates the pthread and the server socket in +the pthread. The application that calls the framework initialization will have the server socket created, +either unde
[dpdk-dev] [PATCH v9 7/8] app/testpmd: add pdump initialization uninitialization
Call rte_pdump_init and rte_pdump_uninit for packet capturing initialization and uninitialization. Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index dd6b046..9707cfc 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -76,6 +76,7 @@ #ifdef RTE_LIBRTE_PMD_XENVIRT #include #endif +#include #include "testpmd.h" @@ -2029,6 +2030,8 @@ signal_handler(int signum) if (signum == SIGINT || signum == SIGTERM) { printf("\nSignal %d received, preparing to exit...\n", signum); + /* uninitialize packet capture framework */ + rte_pdump_uninit(); force_quit(); /* exit with the expected status */ signal(signum, SIG_DFL); @@ -2049,6 +2052,9 @@ main(int argc, char** argv) if (diag < 0) rte_panic("Cannot init EAL\n"); + /* initialize packet capture framework */ + rte_pdump_init(NULL); + nb_ports = (portid_t) rte_eth_dev_count(); if (nb_ports == 0) RTE_LOG(WARNING, EAL, "No probed ethernet devices\n"); -- 2.5.0
[dpdk-dev] [PATCH v9 6/8] app/pdump: add pdump tool for packet capturing
New tool added for packet capturing on dpdk. This tool supports command line options. This tool runs as secondary process by default. Command line supports various parameters to capture the packets. User should pass on a)port and queue (or) b)pci address and queue (or) c)device name and queue to capture the packets. Users also need to pass on either pcap file name or any linux iface, on to which packets captured from dpdk ports will be sent on for the users to view using tcpdump. Users have option to capture packets either a) in Rx direction, b)(or) in Tx direction c)(or) from both the directions. User can pass on ring_size and mempool parameters using command line, but these are optional parameters. These are used to create ring and mempool objects for packet mirroring from primary application to tool. If user doesn't provide any values, default values will be used internally for the creation of the ring and mempool. Signed-off-by: Reshma Pattan --- MAINTAINERS| 1 + app/Makefile | 1 + app/pdump/Makefile | 45 +++ app/pdump/main.c | 844 + 4 files changed, 891 insertions(+) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c diff --git a/MAINTAINERS b/MAINTAINERS index a500cf4..c46cf86 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -436,6 +436,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst Pdump M: Reshma Pattan F: lib/librte_pdump/ +F: app/pdump/ Hierarchical scheduler M: Cristian Dumitrescu diff --git a/app/Makefile b/app/Makefile index 1151e09..c593efa 100644 --- a/app/Makefile +++ b/app/Makefile @@ -37,5 +37,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += test-pipeline DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_test DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += proc_info +DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += pdump include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/app/pdump/Makefile b/app/pdump/Makefile new file mode 100644 index 000..96bb4af --- /dev/null +++ b/app/pdump/Makefile @@ -0,0 +1,45 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +APP = dpdk_pdump + +CFLAGS += $(WERROR_FLAGS) + +# all source are stored in SRCS-y + +SRCS-y := main.c + +# this application needs libraries first +DEPDIRS-y += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/pdump/main.c b/app/pdump/main.c new file mode 100644 index 000..f8923b9 --- /dev/null +++ b/app/pdump/main.c @@ -0,0 +1,844 @@ +/* + * 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 + *
[dpdk-dev] [PATCH v9 5/8] pdump: add new library for packet capturing support
The new librte_pdump library is added for packet capturing support. Added public api rte_pdump_init, applications should call this as part of their application setup to have packet capturing framework ready. Added public api rte_pdump_uninit to uninitialize the packet capturing framework. Added public apis rte_pdump_enable and rte_pdump_disable to enable and disable packet capturing on specific port and queue. Added public apis rte_pdump_enable_by_deviceid and rte_pdump_disable_by_deviceid to enable and disable packet capturing on a specific device (pci address or name) and queue. Added public api rte_pdump_set_socket_dir to set the server and client socket paths. Signed-off-by: Reshma Pattan --- MAINTAINERS| 4 + config/common_base | 5 + lib/Makefile | 1 + lib/librte_pdump/Makefile | 55 ++ lib/librte_pdump/rte_pdump.c | 913 + lib/librte_pdump/rte_pdump.h | 216 lib/librte_pdump/rte_pdump_version.map | 13 + mk/rte.app.mk | 1 + 8 files changed, 1208 insertions(+) create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map diff --git a/MAINTAINERS b/MAINTAINERS index 3e6b70c..a500cf4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -433,6 +433,10 @@ F: app/test/test_reorder* F: examples/packet_ordering/ F: doc/guides/sample_app_ug/packet_ordering.rst +Pdump +M: Reshma Pattan +F: lib/librte_pdump/ + Hierarchical scheduler M: Cristian Dumitrescu F: lib/librte_sched/ diff --git a/config/common_base b/config/common_base index 47c26f6..a2d5d72 100644 --- a/config/common_base +++ b/config/common_base @@ -484,6 +484,11 @@ CONFIG_RTE_LIBRTE_DISTRIBUTOR=y CONFIG_RTE_LIBRTE_REORDER=y # +# Compile the pdump library +# +CONFIG_RTE_LIBRTE_PDUMP=y + +# # Compile librte_port # CONFIG_RTE_LIBRTE_PORT=y diff --git a/lib/Makefile b/lib/Makefile index f254dba..ca7c02f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -57,6 +57,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PORT) += librte_port DIRS-$(CONFIG_RTE_LIBRTE_TABLE) += librte_table DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += librte_pipeline DIRS-$(CONFIG_RTE_LIBRTE_REORDER) += librte_reorder +DIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += librte_pdump ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y) DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile new file mode 100644 index 000..af81a28 --- /dev/null +++ b/lib/librte_pdump/Makefile @@ -0,0 +1,55 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +# library name +LIB = librte_pdump.a + +CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 +CFLAGS += -D_GNU_SOURCE + +EXPORT_MAP := rte_pdump_version.map + +LIBABIVER := 1 + +# all source are stored in SRCS-y +SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c + +# install this header file +SYMLINK-$(CONFIG_RTE_LIBRTE_PDUMP)-include := rte_pdump.h + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_eal +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_ether + +include $(RTE_SDK)/mk/rte.l
[dpdk-dev] [PATCH v9 4/8] ethdev: make get port by name and get name by port public
Converted rte_eth_dev_get_port_by_name to a public API. Converted rte_eth_dev_get_name_by_port to a public API. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 4 ++-- lib/librte_ether/rte_ethdev.h | 29 + lib/librte_ether/rte_ether_version.map | 2 ++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 1f634c9..0b19569 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -406,7 +406,7 @@ rte_eth_dev_get_addr_by_port(uint8_t port_id, struct rte_pci_addr *addr) return 0; } -static int +int rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) { char *tmp; @@ -425,7 +425,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) return 0; } -static int +int rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id) { int i; diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 8ad7c01..fab281e 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -4284,6 +4284,35 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id, uint32_t mask, uint8_t en); +/** +* Get the port id from pci adrress or device name +* Ex: :2:00.0 or vdev name eth_pcap0 +* +* @param name +* pci address or name of the device +* @param port_id +* pointer to port identifier of the device +* @return +* - (0) if successful. +* - (-ENODEV or -EINVAL) on failure. +*/ +int +rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id); + +/** +* Get the device name from port id +* +* @param port_id +* pointer to port identifier of the device +* @param name +* pci address or name of the device +* @return +* - (0) if successful. +* - (-EINVAL) on failure. +*/ +int +rte_eth_dev_get_name_by_port(uint8_t port_id, char *name); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index d06d648..73e730d 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,5 +137,7 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_get_name_by_port; + rte_eth_dev_get_port_by_name; rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v9 3/8] ethdev: add new fields to ethdev info struct
New fields nb_rx_queues and nb_tx_queues are added to rte_eth_dev_info structure. Changes to API rte_eth_dev_info_get() are done to update these new fields to rte_eth_dev_info object. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 2 ++ lib/librte_ether/rte_ethdev.h | 3 +++ lib/librte_ether/rte_ether_version.map | 1 + 3 files changed, 6 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 97d167e..1f634c9 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1661,6 +1661,8 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) (*dev->dev_ops->dev_infos_get)(dev, dev_info); dev_info->pci_dev = dev->pci_dev; dev_info->driver_name = dev->data->drv_name; + dev_info->nb_rx_queues = dev->data->nb_rx_queues; + dev_info->nb_tx_queues = dev->data->nb_tx_queues; } int diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 237e6ef..8ad7c01 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -882,6 +882,9 @@ struct rte_eth_dev_info { struct rte_eth_desc_lim rx_desc_lim; /**< RX descriptors limits */ struct rte_eth_desc_lim tx_desc_lim; /**< TX descriptors limits */ uint32_t speed_capa; /**< Supported speeds bitmap (ETH_LINK_SPEED_). */ + /** Configured number of rx/tx queues */ + uint16_t nb_rx_queues; /**< Number of RX queues. */ + uint16_t nb_tx_queues; /**< Number of TX queues. */ }; /** diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index c990b04..d06d648 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,4 +137,5 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v9 2/8] ethdev: add new api to add Rx callback as head of the list
Added new public api rte_eth_add_first_rx_callback to add given callback as head of the list. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 35 ++ lib/librte_ether/rte_ethdev.h | 28 +++ lib/librte_ether/rte_ether_version.map | 6 ++ 3 files changed, 69 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index ce70d58..97d167e 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -2939,6 +2939,41 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, } void * +rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param) +{ +#ifndef RTE_ETHDEV_RXTX_CALLBACKS + rte_errno = ENOTSUP; + return NULL; +#endif + /* check input parameters */ + if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL || + queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) { + rte_errno = EINVAL; + return NULL; + } + + struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); + + if (cb == NULL) { + rte_errno = ENOMEM; + return NULL; + } + + cb->fn.rx = fn; + cb->param = user_param; + + rte_spinlock_lock(_eth_rx_cb_lock); + /* Add the callbacks at fisrt position*/ + cb->next = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; + rte_smp_wmb(); + rte_eth_devices[port_id].post_rx_burst_cbs[queue_id] = cb; + rte_spinlock_unlock(_eth_rx_cb_lock); + + return cb; +} + +void * rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, rte_tx_callback_fn fn, void *user_param) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 2757510..237e6ef 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -3825,6 +3825,34 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id, void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_rx_callback_fn fn, void *user_param); +/* +* Add a callback that must be called first on packet RX on a given port +* and queue. +* +* This API configures a first function to be called for each burst of +* packets received on a given NIC port queue. The return value is a pointer +* that can be used to later remove the callback using +* rte_eth_remove_rx_callback(). +* +* Multiple functions are called in the order that they are added. +* +* @param port_id +* The port identifier of the Ethernet device. +* @param queue_id +* The queue on the Ethernet device on which the callback is to be added. +* @param fn +* The callback function +* @param user_param +* A generic pointer parameter which will be passed to each invocation of the +* callback function on this port and queue. +* +* @return +* NULL on error. +* On success, a pointer value which can later be used to remove the callback. +*/ +void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param); + /** * Add a callback to be called on packet TX on a given port and queue. * diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index 214ecc7..c990b04 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -132,3 +132,9 @@ DPDK_16.04 { rte_eth_tx_buffer_set_err_callback; } DPDK_2.2; + +DPDK_16.07 { + global: + + rte_eth_add_first_rx_callback; +} DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v9 1/8] ethdev: use locks to protect Rx/Tx callback lists
Added spinlocks around add/remove logic of Rx and Tx callbacks to avoid corruption of callback lists in multithreaded context. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 82 +-- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index e148028..ce70d58 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -77,6 +77,12 @@ static uint8_t nb_ports; /* spinlock for eth device callbacks */ static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER; +/* spinlock for add/remove rx callbacks */ +static rte_spinlock_t rte_eth_rx_cb_lock = RTE_SPINLOCK_INITIALIZER; + +/* spinlock for add/remove tx callbacks */ +static rte_spinlock_t rte_eth_tx_cb_lock = RTE_SPINLOCK_INITIALIZER; + /* store statistics names and its offset in stats structure */ struct rte_eth_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; @@ -1634,7 +1640,6 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, STAT_QMAP_RX); } - void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) { @@ -2905,7 +2910,6 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_errno = EINVAL; return NULL; } - struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); if (cb == NULL) { @@ -2916,6 +2920,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.rx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_rx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; @@ -2928,6 +2933,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_rx_cb_lock); return cb; } @@ -2957,6 +2963,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.tx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_tx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id]; @@ -2969,6 +2976,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_tx_cb_lock); return cb; } @@ -2987,29 +2995,24 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->post_rx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + int ret = -EINVAL; + + rte_spinlock_lock(_eth_rx_cb_lock); + prev_cb = >post_rx_burst_cbs[queue_id]; + for (; *prev_cb != NULL; prev_cb = >next) { + cb = *prev_cb; if (cb == user_cb) { - prev_cb->next = user_cb->next; - return 0; + /* Remove the user cb from the callback list. */ + *prev_cb = cb->next; + ret = 0; + break; } + } + rte_spinlock_unlock(_eth_rx_cb_lock); - } while (cb != NULL); - - /* Callback wasn't found. */ - return -EINVAL; + return ret; } int @@ -3026,29 +3029,24 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->pre_tx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + int ret = -EINVAL; + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + + rte_spinlock_lock(_eth_tx_cb_lock); + prev_cb
[dpdk-dev] [PATCH v9 0/8] add packet capture framework
process. *Pdump tool will dequeue the packets from ring and writes them to PCAPMD vdev, so ultimately packets will be seen on the device that is passed in rx-dev|tx-dev. *Once the pdump tool is terminated with SIGINT it will disable the packet capturing. *Library receives the disable packet capture request, communicate the info to server, server will remove the Ethernet rxtx call-backs. *Packet capture can be seen using tcpdump command "tcpdump -ni " (or) "tcpdump ?nr " 5)Example command line == ./build/app/dpdk_pdump -- --pdump 'device_id=:02:0.0,queue=*,tx-dev=/tmp/dt-file.pcap,rx-dev=/tmp/dr-file.pcap,ring-size=8192,mbuf-size=2176,total-num-mbufs=32768' --pdump 'device_id=:01:00.0,queue=*,rx-dev=/tmp/d-file.pcap,tx-dev=/tmp/d-file.pcap,ring-size=16384,mbuf-size=2176,total-num-mbufs=32768' v9: added a support in rte_pdump_set_socket_dir() to set server and client socket paths ==> http://dpdk.org/dev/patchwork/patch/13450/ updated the documentation for the new changes. updated the commit messages. v8: added server socket argument to rte_pdump_init() API ==> http://dpdk.org/dev/patchwork/patch/13402/ added rte_pdump_set_socket_dir() API. updated documentation for new changes. v7: fixed lines over 90 characters. v6: removed below deprecation notice patch from patch set. http://dpdk.org/dev/patchwork/patch/13372/ v5: addressed code review comments for below patches http://dpdk.org/dev/patchwork/patch/12955/ http://dpdk.org/dev/patchwork/patch/12951/ v4: added missing deprecation notice for ABI changes of rte_eth_dev_info structure. made doc changes as per doc guidelines. replaced rte_eal_vdev_init with rte_eth_dev_attach in pdump tool. removed rxtx-dev parameter from pdump tool command line. v3: app/pdump: Moved cleanup code from signal handler to main. divided librte_ether changes into multiple patches. example command changed in app/pdump application guide v2: fix compilation issues for 4.8.3 fix unnecessary #includes Reshma Pattan (8): ethdev: use locks to protect Rx/Tx callback lists ethdev: add new api to add Rx callback as head of the list ethdev: add new fields to ethdev info struct ethdev: make get port by name and get name by port public pdump: add new library for packet capturing support app/pdump: add pdump tool for packet capturing app/testpmd: add pdump initialization uninitialization doc: update doc for packet capture framework MAINTAINERS | 8 + app/Makefile| 1 + app/pdump/Makefile | 45 ++ app/pdump/main.c| 844 + app/test-pmd/testpmd.c | 6 + config/common_base | 5 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 119 + doc/guides/rel_notes/release_16_07.rst | 13 + doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 + lib/Makefile| 1 + lib/librte_ether/rte_ethdev.c | 123 +++-- lib/librte_ether/rte_ethdev.h | 60 +++ lib/librte_ether/rte_ether_version.map | 9 + lib/librte_pdump/Makefile | 55 ++ lib/librte_pdump/rte_pdump.c| 913 lib/librte_pdump/rte_pdump.h| 216 lib/librte_pdump/rte_pdump_version.map | 13 + mk/rte.app.mk | 1 + 20 files changed, 2512 insertions(+), 44 deletions(-) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map Acked-by: Konstantin Ananyev -- 2.5.0
[dpdk-dev] [PATCH v8 8/8] doc: update doc for packet capture framework
Added programmers guide for librte_pdump. Added sample application guide for app/pdump application. Updated release note for packet capture framework changes. Signed-off-by: Reshma Pattan Acked-by: John McNamara --- MAINTAINERS | 3 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 117 ++ doc/guides/rel_notes/release_16_07.rst | 13 doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 6 files changed, 257 insertions(+) create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst diff --git a/MAINTAINERS b/MAINTAINERS index a48c8de..ce7c941 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -436,6 +436,9 @@ Pdump M: Reshma Pattan F: lib/librte_pdump/ F: app/pdump/ +F: doc/guides/prog_guide/pdump_library.rst +F: doc/guides/sample_app_ug/pdump.rst + Hierarchical scheduler M: Cristian Dumitrescu diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index b862d0c..4caf969 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -71,6 +71,7 @@ Programmer's Guide writing_efficient_code profile_app glossary +pdump_library **Figures** diff --git a/doc/guides/prog_guide/pdump_library.rst b/doc/guides/prog_guide/pdump_library.rst new file mode 100644 index 000..3088063 --- /dev/null +++ b/doc/guides/prog_guide/pdump_library.rst @@ -0,0 +1,117 @@ +.. 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. + +.. _pdump_library: + +The librte_pdump Library + + +The ``librte_pdump`` library provides a framework for packet capturing in DPDK. +The library provides the following APIs to initialize the packet capture framework, to enable +or disable the packet capture, and to uninitialize it: + +* ``rte_pdump_init()``: + This API initializes the packet capture framework. + +* ``rte_pdump_enable()``: + This API enables the packet capture on a given port and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_enable_by_deviceid()``: + This API enables the packet capture on a given device id (``vdev name or pci address``) and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_disable()``: + This API disables the packet capture on a given port and queue. + +* ``rte_pdump_disable_by_deviceid()``: + This API disables the packet capture on a given device id (``vdev name or pci address``) and queue. + +* ``rte_pdump_uninit()``: + This API uninitializes the packet capture framework. + +* ``rte_pdump_set_socket_dir()``: + This API sets the server socket path. + Note: This API is not thread-safe. + + +Operation +- + +The ``librte_pdump`` library works on a client/server model. The server is responsible for enabling or +disabling the packet capture and the clients are responsible for requesting the enabling or disabling of +the packet capture. + +The packet capture framework, as part of its initialization, creates the pthread and the server socket in +the pthread. The application that calls the framework initialization will have the server socket created, +either under the path that the application
[dpdk-dev] [PATCH v8 7/8] app/test-pmd: add pdump initialization uninitialization
Call rte_pdump_init and rte_pdump_uninit for packet capturing initialization and uninitialization. Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index dd6b046..9707cfc 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -76,6 +76,7 @@ #ifdef RTE_LIBRTE_PMD_XENVIRT #include #endif +#include #include "testpmd.h" @@ -2029,6 +2030,8 @@ signal_handler(int signum) if (signum == SIGINT || signum == SIGTERM) { printf("\nSignal %d received, preparing to exit...\n", signum); + /* uninitialize packet capture framework */ + rte_pdump_uninit(); force_quit(); /* exit with the expected status */ signal(signum, SIG_DFL); @@ -2049,6 +2052,9 @@ main(int argc, char** argv) if (diag < 0) rte_panic("Cannot init EAL\n"); + /* initialize packet capture framework */ + rte_pdump_init(NULL); + nb_ports = (portid_t) rte_eth_dev_count(); if (nb_ports == 0) RTE_LOG(WARNING, EAL, "No probed ethernet devices\n"); -- 2.5.0
[dpdk-dev] [PATCH v8 6/8] app/pdump: add pdump tool for packet capturing
New tool added for packet capturing on dpdk. This tool supports command line options. This tool runs as secondary process by default. Command line supports various parameters to capture the packets. User should pass on a)port and queue (or) b)pci address and queue (or) c)device name and queue to capture the packets. Users also need to pass on either pcap file name or any linux iface, on to which packets captured from dpdk ports will be sent on for the users to view using tcpdump. Users have option to capture packets either a) in RX direction, b)(or) in TX direction c)(or) from both the directions. User can pass on ring_size and mempool parameters using command line, but these are optional parameters. These are used to create ring and mempool objects for packet mirroring from primary application to tool. If user doesn't provide any values, default values will be used internally for the creation of the ring and mempool. Signed-off-by: Reshma Pattan --- MAINTAINERS| 1 + app/Makefile | 1 + app/pdump/Makefile | 45 +++ app/pdump/main.c | 844 + 4 files changed, 891 insertions(+) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c diff --git a/MAINTAINERS b/MAINTAINERS index cc3ffdb..a48c8de 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -435,6 +435,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst Pdump M: Reshma Pattan F: lib/librte_pdump/ +F: app/pdump/ Hierarchical scheduler M: Cristian Dumitrescu diff --git a/app/Makefile b/app/Makefile index 1151e09..c593efa 100644 --- a/app/Makefile +++ b/app/Makefile @@ -37,5 +37,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += test-pipeline DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_test DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += proc_info +DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += pdump include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/app/pdump/Makefile b/app/pdump/Makefile new file mode 100644 index 000..96bb4af --- /dev/null +++ b/app/pdump/Makefile @@ -0,0 +1,45 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +APP = dpdk_pdump + +CFLAGS += $(WERROR_FLAGS) + +# all source are stored in SRCS-y + +SRCS-y := main.c + +# this application needs libraries first +DEPDIRS-y += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/pdump/main.c b/app/pdump/main.c new file mode 100644 index 000..f8923b9 --- /dev/null +++ b/app/pdump/main.c @@ -0,0 +1,844 @@ +/* + * 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 + *
[dpdk-dev] [PATCH v8 5/8] lib/librte_pdump: add new library for packet capturing support
Added new library for packet capturing support. Added public api rte_pdump_init, applications should call this as part of their application setup to have packet capturing framework ready. Added public api rte_pdump_uninit to uninitialize the packet capturing framework. Added public apis rte_pdump_enable and rte_pdump_disable to enable and disable packet capturing on specific port and queue. Added public apis rte_pdump_enable_by_deviceid and rte_pdump_disable_by_deviceid to enable and disable packet capturing on a specific device (pci address or name) and queue. Added public api rte_pdump_set_socket_dir to set the server socket path. Signed-off-by: Reshma Pattan --- MAINTAINERS| 4 + config/common_base | 5 + lib/Makefile | 1 + lib/librte_pdump/Makefile | 55 ++ lib/librte_pdump/rte_pdump.c | 904 + lib/librte_pdump/rte_pdump.h | 208 lib/librte_pdump/rte_pdump_version.map | 13 + mk/rte.app.mk | 1 + 8 files changed, 1191 insertions(+) create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map diff --git a/MAINTAINERS b/MAINTAINERS index 3e8558f..cc3ffdb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -432,6 +432,10 @@ F: app/test/test_reorder* F: examples/packet_ordering/ F: doc/guides/sample_app_ug/packet_ordering.rst +Pdump +M: Reshma Pattan +F: lib/librte_pdump/ + Hierarchical scheduler M: Cristian Dumitrescu F: lib/librte_sched/ diff --git a/config/common_base b/config/common_base index 47c26f6..a2d5d72 100644 --- a/config/common_base +++ b/config/common_base @@ -484,6 +484,11 @@ CONFIG_RTE_LIBRTE_DISTRIBUTOR=y CONFIG_RTE_LIBRTE_REORDER=y # +# Compile the pdump library +# +CONFIG_RTE_LIBRTE_PDUMP=y + +# # Compile librte_port # CONFIG_RTE_LIBRTE_PORT=y diff --git a/lib/Makefile b/lib/Makefile index f254dba..ca7c02f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -57,6 +57,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PORT) += librte_port DIRS-$(CONFIG_RTE_LIBRTE_TABLE) += librte_table DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += librte_pipeline DIRS-$(CONFIG_RTE_LIBRTE_REORDER) += librte_reorder +DIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += librte_pdump ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y) DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile new file mode 100644 index 000..af81a28 --- /dev/null +++ b/lib/librte_pdump/Makefile @@ -0,0 +1,55 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +# library name +LIB = librte_pdump.a + +CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 +CFLAGS += -D_GNU_SOURCE + +EXPORT_MAP := rte_pdump_version.map + +LIBABIVER := 1 + +# all source are stored in SRCS-y +SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c + +# install this header file +SYMLINK-$(CONFIG_RTE_LIBRTE_PDUMP)-include := rte_pdump.h + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_eal +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_ether + +include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/li
[dpdk-dev] [PATCH v8 3/8] librte_ether: add new fields to rte_eth_dev_info struct
New fields nb_rx_queues and nb_tx_queues are added to rte_eth_dev_info structure. Changes to API rte_eth_dev_info_get() are done to update these new fields to rte_eth_dev_info object. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 2 ++ lib/librte_ether/rte_ethdev.h | 3 +++ lib/librte_ether/rte_ether_version.map | 1 + 3 files changed, 6 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 97d167e..1f634c9 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1661,6 +1661,8 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) (*dev->dev_ops->dev_infos_get)(dev, dev_info); dev_info->pci_dev = dev->pci_dev; dev_info->driver_name = dev->data->drv_name; + dev_info->nb_rx_queues = dev->data->nb_rx_queues; + dev_info->nb_tx_queues = dev->data->nb_tx_queues; } int diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 237e6ef..8ad7c01 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -882,6 +882,9 @@ struct rte_eth_dev_info { struct rte_eth_desc_lim rx_desc_lim; /**< RX descriptors limits */ struct rte_eth_desc_lim tx_desc_lim; /**< TX descriptors limits */ uint32_t speed_capa; /**< Supported speeds bitmap (ETH_LINK_SPEED_). */ + /** Configured number of rx/tx queues */ + uint16_t nb_rx_queues; /**< Number of RX queues. */ + uint16_t nb_tx_queues; /**< Number of TX queues. */ }; /** diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index c990b04..d06d648 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,4 +137,5 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v8 2/8] librte_ether: add new api rte_eth_add_first_rx_callback
Added new public api rte_eth_add_first_rx_callback to add given callback as head of list. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 35 ++ lib/librte_ether/rte_ethdev.h | 28 +++ lib/librte_ether/rte_ether_version.map | 6 ++ 3 files changed, 69 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index ce70d58..97d167e 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -2939,6 +2939,41 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, } void * +rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param) +{ +#ifndef RTE_ETHDEV_RXTX_CALLBACKS + rte_errno = ENOTSUP; + return NULL; +#endif + /* check input parameters */ + if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL || + queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) { + rte_errno = EINVAL; + return NULL; + } + + struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); + + if (cb == NULL) { + rte_errno = ENOMEM; + return NULL; + } + + cb->fn.rx = fn; + cb->param = user_param; + + rte_spinlock_lock(_eth_rx_cb_lock); + /* Add the callbacks at fisrt position*/ + cb->next = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; + rte_smp_wmb(); + rte_eth_devices[port_id].post_rx_burst_cbs[queue_id] = cb; + rte_spinlock_unlock(_eth_rx_cb_lock); + + return cb; +} + +void * rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, rte_tx_callback_fn fn, void *user_param) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 2757510..237e6ef 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -3825,6 +3825,34 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id, void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_rx_callback_fn fn, void *user_param); +/* +* Add a callback that must be called first on packet RX on a given port +* and queue. +* +* This API configures a first function to be called for each burst of +* packets received on a given NIC port queue. The return value is a pointer +* that can be used to later remove the callback using +* rte_eth_remove_rx_callback(). +* +* Multiple functions are called in the order that they are added. +* +* @param port_id +* The port identifier of the Ethernet device. +* @param queue_id +* The queue on the Ethernet device on which the callback is to be added. +* @param fn +* The callback function +* @param user_param +* A generic pointer parameter which will be passed to each invocation of the +* callback function on this port and queue. +* +* @return +* NULL on error. +* On success, a pointer value which can later be used to remove the callback. +*/ +void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param); + /** * Add a callback to be called on packet TX on a given port and queue. * diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index 214ecc7..c990b04 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -132,3 +132,9 @@ DPDK_16.04 { rte_eth_tx_buffer_set_err_callback; } DPDK_2.2; + +DPDK_16.07 { + global: + + rte_eth_add_first_rx_callback; +} DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v8 1/8] librte_ether: protect add/remove of rxtx callbacks with spinlocks
Added spinlocks around add/remove logic of rxtx callbacks to avoid corruption of callback lists in multithreaded context. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 82 +-- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index e148028..ce70d58 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -77,6 +77,12 @@ static uint8_t nb_ports; /* spinlock for eth device callbacks */ static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER; +/* spinlock for add/remove rx callbacks */ +static rte_spinlock_t rte_eth_rx_cb_lock = RTE_SPINLOCK_INITIALIZER; + +/* spinlock for add/remove tx callbacks */ +static rte_spinlock_t rte_eth_tx_cb_lock = RTE_SPINLOCK_INITIALIZER; + /* store statistics names and its offset in stats structure */ struct rte_eth_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; @@ -1634,7 +1640,6 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, STAT_QMAP_RX); } - void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) { @@ -2905,7 +2910,6 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_errno = EINVAL; return NULL; } - struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); if (cb == NULL) { @@ -2916,6 +2920,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.rx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_rx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; @@ -2928,6 +2933,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_rx_cb_lock); return cb; } @@ -2957,6 +2963,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.tx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_tx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id]; @@ -2969,6 +2976,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_tx_cb_lock); return cb; } @@ -2987,29 +2995,24 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->post_rx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + int ret = -EINVAL; + + rte_spinlock_lock(_eth_rx_cb_lock); + prev_cb = >post_rx_burst_cbs[queue_id]; + for (; *prev_cb != NULL; prev_cb = >next) { + cb = *prev_cb; if (cb == user_cb) { - prev_cb->next = user_cb->next; - return 0; + /* Remove the user cb from the callback list. */ + *prev_cb = cb->next; + ret = 0; + break; } + } + rte_spinlock_unlock(_eth_rx_cb_lock); - } while (cb != NULL); - - /* Callback wasn't found. */ - return -EINVAL; + return ret; } int @@ -3026,29 +3029,24 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->pre_tx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + int ret = -EINVAL; + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + + rte_spinlock_lock(_eth_tx_cb_lock); + prev_cb = >pr
[dpdk-dev] [PATCH v8 0/8] add packet capture framework
to PCAPMD vdev, so ultimately packets will be seen on the device that is passed in rx-dev|tx-dev. *Once the pdump tool is terminated with SIGINT it will disable the packet capturing. *Library receives the disable packet capture request, communicate the info to server, server will remove the Ethernet rxtx call-backs. *Packet capture can be seen using tcpdump command "tcpdump -ni " (or) "tcpdump ?nr " 5)Example command line == ./build/app/dpdk_pdump -- --pdump 'device_id=:02:0.0,queue=*,tx-dev=/tmp/dt-file.pcap,rx-dev=/tmp/dr-file.pcap,ring-size=8192,mbuf-size=2176,total-num-mbufs=32768' --pdump 'device_id=:01:00.0,queue=*,rx-dev=/tmp/d-file.pcap,tx-dev=/tmp/d-file.pcap,ring-size=16384,mbuf-size=2176,total-num-mbufs=32768' v8: added server socket argument to rte_pdump_init() API ==> http://dpdk.org/dev/patchwork/patch/13402/ added rte_pdump_set_socket_dir() API. updated documentation for new changes. v7: fixed lines over 90 characters. v6: removed below deprecation notice patch from patch set. http://dpdk.org/dev/patchwork/patch/13372/ v5: addressed code review comments for below patches http://dpdk.org/dev/patchwork/patch/12955/ http://dpdk.org/dev/patchwork/patch/12951/ v4: added missing deprecation notice for ABI changes of rte_eth_dev_info structure. made doc changes as per doc guidelines. replaced rte_eal_vdev_init with rte_eth_dev_attach in pdump tool. removed rxtx-dev parameter from pdump tool command line. v3: app/pdump: Moved cleanup code from signal handler to main. divided librte_ether changes into multiple patches. example command changed in app/pdump application guide v2: fix compilation issues for 4.8.3 fix unnecessary #includes Reshma Pattan (8): librte_ether: protect add/remove of rxtx callbacks with spinlocks librte_ether: add new api rte_eth_add_first_rx_callback librte_ether: add new fields to rte_eth_dev_info struct librte_ether: make rte_eth_dev_get_port_by_name rte_eth_dev_get_name_by_port public lib/librte_pdump: add new library for packet capturing support app/pdump: add pdump tool for packet capturing app/test-pmd: add pdump initialization uninitialization doc: update doc for packet capture framework MAINTAINERS | 8 + app/Makefile| 1 + app/pdump/Makefile | 45 ++ app/pdump/main.c| 844 + app/test-pmd/testpmd.c | 6 + config/common_base | 5 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 117 + doc/guides/rel_notes/release_16_07.rst | 13 + doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 + lib/Makefile| 1 + lib/librte_ether/rte_ethdev.c | 123 +++-- lib/librte_ether/rte_ethdev.h | 60 +++ lib/librte_ether/rte_ether_version.map | 9 + lib/librte_pdump/Makefile | 55 ++ lib/librte_pdump/rte_pdump.c| 904 lib/librte_pdump/rte_pdump.h| 208 lib/librte_pdump/rte_pdump_version.map | 13 + mk/rte.app.mk | 1 + 20 files changed, 2493 insertions(+), 44 deletions(-) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map Acked-by: Konstantin Ananyev -- 2.5.0
[dpdk-dev] [PATCH v7 8/8] doc: update doc for packet capture framework
Added programmers guide for librte_pdump. Added sample application guide for app/pdump application. Updated release note for packet capture framework changes. Signed-off-by: Reshma Pattan Acked-by: John McNamara --- MAINTAINERS | 3 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 107 doc/guides/rel_notes/release_16_07.rst | 13 doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 6 files changed, 247 insertions(+) create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst diff --git a/MAINTAINERS b/MAINTAINERS index a48c8de..ce7c941 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -436,6 +436,9 @@ Pdump M: Reshma Pattan F: lib/librte_pdump/ F: app/pdump/ +F: doc/guides/prog_guide/pdump_library.rst +F: doc/guides/sample_app_ug/pdump.rst + Hierarchical scheduler M: Cristian Dumitrescu diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index b862d0c..4caf969 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -71,6 +71,7 @@ Programmer's Guide writing_efficient_code profile_app glossary +pdump_library **Figures** diff --git a/doc/guides/prog_guide/pdump_library.rst b/doc/guides/prog_guide/pdump_library.rst new file mode 100644 index 000..1809234 --- /dev/null +++ b/doc/guides/prog_guide/pdump_library.rst @@ -0,0 +1,107 @@ +.. 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. + +.. _pdump_library: + +The librte_pdump Library + + +The ``librte_pdump`` library provides a framework for packet capturing in DPDK. +The library provides the following APIs to initialize the packet capture framework, to enable +or disable the packet capture, and to uninitialize it: + +* ``rte_pdump_init()``: + This API initializes the packet capture framework. + +* ``rte_pdump_enable()``: + This API enables the packet capture on a given port and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_enable_by_deviceid()``: + This API enables the packet capture on a given device id (``vdev name or pci address``) and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_disable()``: + This API disables the packet capture on a given port and queue. + +* ``rte_pdump_disable_by_deviceid()``: + This API disables the packet capture on a given device id (``vdev name or pci address``) and queue. + +* ``rte_pdump_uninit()``: + This API uninitializes the packet capture framework. + + +Operation +- + +The ``librte_pdump`` library works on a client/server model. The server is responsible for enabling or +disabling the packet capture and the clients are responsible for requesting the enabling or disabling of +the packet capture. + +The packet capture framework, as part of its initialization, creates the pthread and the server socket in +the pthread. The application that calls the framework initialization first will have the server socket created. +Further calls to the framework initialization by the same application or other applications is not allowed i.e., only +one server socket is allowed on the
[dpdk-dev] [PATCH v7 7/8] app/test-pmd: add pdump initialization uninitialization
Call rte_pdump_init and rte_pdump_uninit for packet capturing initialization and uninitialization. Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index dd6b046..f6089fa 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -76,6 +76,7 @@ #ifdef RTE_LIBRTE_PMD_XENVIRT #include #endif +#include #include "testpmd.h" @@ -2029,6 +2030,8 @@ signal_handler(int signum) if (signum == SIGINT || signum == SIGTERM) { printf("\nSignal %d received, preparing to exit...\n", signum); + /* uninitialize packet capture framework */ + rte_pdump_uninit(); force_quit(); /* exit with the expected status */ signal(signum, SIG_DFL); @@ -2049,6 +2052,9 @@ main(int argc, char** argv) if (diag < 0) rte_panic("Cannot init EAL\n"); + /* initialize packet capture framework */ + rte_pdump_init(); + nb_ports = (portid_t) rte_eth_dev_count(); if (nb_ports == 0) RTE_LOG(WARNING, EAL, "No probed ethernet devices\n"); -- 2.5.0
[dpdk-dev] [PATCH v7 6/8] app/pdump: add pdump tool for packet capturing
New tool added for packet capturing on dpdk. This tool supports command line options. This tool runs as secondary process by default. Command line supports various parameters to capture the packets. User should pass on a)port and queue (or) b)pci address and queue (or) c)device name and queue to capture the packets. Users also need to pass on either pcap file name or any linux iface, on to which packets captured from dpdk ports will be sent on for the users to view using tcpdump. Users have option to capture packets either a) in RX direction, b)(or) in TX direction c)(or) from both the directions. User can pass on ring_size and mempool parameters using command line, but these are optional parameters. These are used to create ring and mempool objects for packet mirroring from primary application to tool. If user doesn't provide any values, default values will be used internally for the creation of the ring and mempool. Signed-off-by: Reshma Pattan --- MAINTAINERS| 1 + app/Makefile | 1 + app/pdump/Makefile | 45 +++ app/pdump/main.c | 844 + 4 files changed, 891 insertions(+) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c diff --git a/MAINTAINERS b/MAINTAINERS index cc3ffdb..a48c8de 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -435,6 +435,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst Pdump M: Reshma Pattan F: lib/librte_pdump/ +F: app/pdump/ Hierarchical scheduler M: Cristian Dumitrescu diff --git a/app/Makefile b/app/Makefile index 1151e09..c593efa 100644 --- a/app/Makefile +++ b/app/Makefile @@ -37,5 +37,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += test-pipeline DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_test DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += proc_info +DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += pdump include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/app/pdump/Makefile b/app/pdump/Makefile new file mode 100644 index 000..96bb4af --- /dev/null +++ b/app/pdump/Makefile @@ -0,0 +1,45 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +APP = dpdk_pdump + +CFLAGS += $(WERROR_FLAGS) + +# all source are stored in SRCS-y + +SRCS-y := main.c + +# this application needs libraries first +DEPDIRS-y += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/pdump/main.c b/app/pdump/main.c new file mode 100644 index 000..f8923b9 --- /dev/null +++ b/app/pdump/main.c @@ -0,0 +1,844 @@ +/* + * 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 + *
[dpdk-dev] [PATCH v7 4/8] librte_ether: make rte_eth_dev_get_port_by_name rte_eth_dev_get_name_by_port public
Converted rte_eth_dev_get_port_by_name to a public API. Converted rte_eth_dev_get_name_by_port to a public API. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 4 ++-- lib/librte_ether/rte_ethdev.h | 29 + lib/librte_ether/rte_ether_version.map | 2 ++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 1f634c9..0b19569 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -406,7 +406,7 @@ rte_eth_dev_get_addr_by_port(uint8_t port_id, struct rte_pci_addr *addr) return 0; } -static int +int rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) { char *tmp; @@ -425,7 +425,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) return 0; } -static int +int rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id) { int i; diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 8ad7c01..fab281e 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -4284,6 +4284,35 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id, uint32_t mask, uint8_t en); +/** +* Get the port id from pci adrress or device name +* Ex: :2:00.0 or vdev name eth_pcap0 +* +* @param name +* pci address or name of the device +* @param port_id +* pointer to port identifier of the device +* @return +* - (0) if successful. +* - (-ENODEV or -EINVAL) on failure. +*/ +int +rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id); + +/** +* Get the device name from port id +* +* @param port_id +* pointer to port identifier of the device +* @param name +* pci address or name of the device +* @return +* - (0) if successful. +* - (-EINVAL) on failure. +*/ +int +rte_eth_dev_get_name_by_port(uint8_t port_id, char *name); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index d06d648..73e730d 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,5 +137,7 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_get_name_by_port; + rte_eth_dev_get_port_by_name; rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v7 3/8] librte_ether: add new fields to rte_eth_dev_info struct
New fields nb_rx_queues and nb_tx_queues are added to rte_eth_dev_info structure. Changes to API rte_eth_dev_info_get() are done to update these new fields to rte_eth_dev_info object. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 2 ++ lib/librte_ether/rte_ethdev.h | 3 +++ lib/librte_ether/rte_ether_version.map | 1 + 3 files changed, 6 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 97d167e..1f634c9 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1661,6 +1661,8 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) (*dev->dev_ops->dev_infos_get)(dev, dev_info); dev_info->pci_dev = dev->pci_dev; dev_info->driver_name = dev->data->drv_name; + dev_info->nb_rx_queues = dev->data->nb_rx_queues; + dev_info->nb_tx_queues = dev->data->nb_tx_queues; } int diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 237e6ef..8ad7c01 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -882,6 +882,9 @@ struct rte_eth_dev_info { struct rte_eth_desc_lim rx_desc_lim; /**< RX descriptors limits */ struct rte_eth_desc_lim tx_desc_lim; /**< TX descriptors limits */ uint32_t speed_capa; /**< Supported speeds bitmap (ETH_LINK_SPEED_). */ + /** Configured number of rx/tx queues */ + uint16_t nb_rx_queues; /**< Number of RX queues. */ + uint16_t nb_tx_queues; /**< Number of TX queues. */ }; /** diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index c990b04..d06d648 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,4 +137,5 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v7 2/8] librte_ether: add new api rte_eth_add_first_rx_callback
Added new public api rte_eth_add_first_rx_callback to add given callback as head of list. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 35 ++ lib/librte_ether/rte_ethdev.h | 28 +++ lib/librte_ether/rte_ether_version.map | 6 ++ 3 files changed, 69 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index ce70d58..97d167e 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -2939,6 +2939,41 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, } void * +rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param) +{ +#ifndef RTE_ETHDEV_RXTX_CALLBACKS + rte_errno = ENOTSUP; + return NULL; +#endif + /* check input parameters */ + if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL || + queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) { + rte_errno = EINVAL; + return NULL; + } + + struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); + + if (cb == NULL) { + rte_errno = ENOMEM; + return NULL; + } + + cb->fn.rx = fn; + cb->param = user_param; + + rte_spinlock_lock(_eth_rx_cb_lock); + /* Add the callbacks at fisrt position*/ + cb->next = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; + rte_smp_wmb(); + rte_eth_devices[port_id].post_rx_burst_cbs[queue_id] = cb; + rte_spinlock_unlock(_eth_rx_cb_lock); + + return cb; +} + +void * rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, rte_tx_callback_fn fn, void *user_param) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 2757510..237e6ef 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -3825,6 +3825,34 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id, void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_rx_callback_fn fn, void *user_param); +/* +* Add a callback that must be called first on packet RX on a given port +* and queue. +* +* This API configures a first function to be called for each burst of +* packets received on a given NIC port queue. The return value is a pointer +* that can be used to later remove the callback using +* rte_eth_remove_rx_callback(). +* +* Multiple functions are called in the order that they are added. +* +* @param port_id +* The port identifier of the Ethernet device. +* @param queue_id +* The queue on the Ethernet device on which the callback is to be added. +* @param fn +* The callback function +* @param user_param +* A generic pointer parameter which will be passed to each invocation of the +* callback function on this port and queue. +* +* @return +* NULL on error. +* On success, a pointer value which can later be used to remove the callback. +*/ +void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param); + /** * Add a callback to be called on packet TX on a given port and queue. * diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index 214ecc7..c990b04 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -132,3 +132,9 @@ DPDK_16.04 { rte_eth_tx_buffer_set_err_callback; } DPDK_2.2; + +DPDK_16.07 { + global: + + rte_eth_add_first_rx_callback; +} DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v7 1/8] librte_ether: protect add/remove of rxtx callbacks with spinlocks
Added spinlocks around add/remove logic of rxtx callbacks to avoid corruption of callback lists in multithreaded context. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 82 +-- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index e148028..ce70d58 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -77,6 +77,12 @@ static uint8_t nb_ports; /* spinlock for eth device callbacks */ static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER; +/* spinlock for add/remove rx callbacks */ +static rte_spinlock_t rte_eth_rx_cb_lock = RTE_SPINLOCK_INITIALIZER; + +/* spinlock for add/remove tx callbacks */ +static rte_spinlock_t rte_eth_tx_cb_lock = RTE_SPINLOCK_INITIALIZER; + /* store statistics names and its offset in stats structure */ struct rte_eth_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; @@ -1634,7 +1640,6 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, STAT_QMAP_RX); } - void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) { @@ -2905,7 +2910,6 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_errno = EINVAL; return NULL; } - struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); if (cb == NULL) { @@ -2916,6 +2920,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.rx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_rx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; @@ -2928,6 +2933,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_rx_cb_lock); return cb; } @@ -2957,6 +2963,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.tx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_tx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id]; @@ -2969,6 +2976,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_tx_cb_lock); return cb; } @@ -2987,29 +2995,24 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->post_rx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + int ret = -EINVAL; + + rte_spinlock_lock(_eth_rx_cb_lock); + prev_cb = >post_rx_burst_cbs[queue_id]; + for (; *prev_cb != NULL; prev_cb = >next) { + cb = *prev_cb; if (cb == user_cb) { - prev_cb->next = user_cb->next; - return 0; + /* Remove the user cb from the callback list. */ + *prev_cb = cb->next; + ret = 0; + break; } + } + rte_spinlock_unlock(_eth_rx_cb_lock); - } while (cb != NULL); - - /* Callback wasn't found. */ - return -EINVAL; + return ret; } int @@ -3026,29 +3029,24 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->pre_tx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + int ret = -EINVAL; + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + + rte_spinlock_lock(_eth_tx_cb_lock); + prev_cb = >pr
[dpdk-dev] [PATCH v7 0/8] add packet capture framework
will remove the Ethernet rxtx call-backs. *Packet capture can be seen using tcpdump command "tcpdump -ni " (or) "tcpdump ?nr " 5)Example command line == ./build/app/dpdk_pdump -- --pdump 'device_id=:02:0.0,queue=*,tx-dev=/tmp/dt-file.pcap,rx-dev=/tmp/dr-file.pcap,ring-size=8192,mbuf-size=2176,total-num-mbufs=32768' --pdump 'device_id=:01:00.0,queue=*,rx-dev=/tmp/d-file.pcap,tx-dev=/tmp/d-file.pcap,ring-size=16384,mbuf-size=2176,total-num-mbufs=32768' v7: fixed lines over 90 characters. v6: removed below deprecation notice patch from patch set. http://dpdk.org/dev/patchwork/patch/13372/ v5: addressed code review comments for below patches http://dpdk.org/dev/patchwork/patch/12955/ http://dpdk.org/dev/patchwork/patch/12951/ v4: added missing deprecation notice for ABI changes of rte_eth_dev_info structure. made doc changes as per doc guidelines. replaced rte_eal_vdev_init with rte_eth_dev_attach in pdump tool. removed rxtx-dev parameter from pdump tool command line. v3: app/pdump: Moved cleanup code from signal handler to main. divided librte_ether changes into multiple patches. example command changed in app/pdump application guide v2: fix compilation issues for 4.8.3 fix unnecessary #includes Reshma Pattan (8): librte_ether: protect add/remove of rxtx callbacks with spinlocks librte_ether: add new api rte_eth_add_first_rx_callback librte_ether: add new fields to rte_eth_dev_info struct librte_ether: make rte_eth_dev_get_port_by_name rte_eth_dev_get_name_by_port public lib/librte_pdump: add new library for packet capturing support app/pdump: add pdump tool for packet capturing app/test-pmd: add pdump initialization uninitialization doc: update doc for packet capture framework MAINTAINERS | 8 + app/Makefile| 1 + app/pdump/Makefile | 45 ++ app/pdump/main.c| 844 +++ app/test-pmd/testpmd.c | 6 + config/common_base | 5 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 107 doc/guides/rel_notes/release_16_07.rst | 13 + doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 + lib/Makefile| 1 + lib/librte_ether/rte_ethdev.c | 123 +++-- lib/librte_ether/rte_ethdev.h | 60 +++ lib/librte_ether/rte_ether_version.map | 9 + lib/librte_pdump/Makefile | 55 ++ lib/librte_pdump/rte_pdump.c| 872 lib/librte_pdump/rte_pdump.h| 186 +++ lib/librte_pdump/rte_pdump_version.map | 12 + mk/rte.app.mk | 1 + 20 files changed, 2428 insertions(+), 44 deletions(-) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map -- 2.5.0
[dpdk-dev] [PATCH v6 8/8] doc: update doc for packet capture framework
Added programmers guide for librte_pdump. Added sample application guide for app/pdump application. Updated release note for packet capture framework changes. Signed-off-by: Reshma Pattan Acked-by: John McNamara --- MAINTAINERS | 3 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 107 doc/guides/rel_notes/release_16_07.rst | 13 doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 6 files changed, 247 insertions(+) create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst diff --git a/MAINTAINERS b/MAINTAINERS index a48c8de..ce7c941 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -436,6 +436,9 @@ Pdump M: Reshma Pattan F: lib/librte_pdump/ F: app/pdump/ +F: doc/guides/prog_guide/pdump_library.rst +F: doc/guides/sample_app_ug/pdump.rst + Hierarchical scheduler M: Cristian Dumitrescu diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index b862d0c..4caf969 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -71,6 +71,7 @@ Programmer's Guide writing_efficient_code profile_app glossary +pdump_library **Figures** diff --git a/doc/guides/prog_guide/pdump_library.rst b/doc/guides/prog_guide/pdump_library.rst new file mode 100644 index 000..1809234 --- /dev/null +++ b/doc/guides/prog_guide/pdump_library.rst @@ -0,0 +1,107 @@ +.. 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. + +.. _pdump_library: + +The librte_pdump Library + + +The ``librte_pdump`` library provides a framework for packet capturing in DPDK. +The library provides the following APIs to initialize the packet capture framework, to enable +or disable the packet capture, and to uninitialize it: + +* ``rte_pdump_init()``: + This API initializes the packet capture framework. + +* ``rte_pdump_enable()``: + This API enables the packet capture on a given port and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_enable_by_deviceid()``: + This API enables the packet capture on a given device id (``vdev name or pci address``) and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_disable()``: + This API disables the packet capture on a given port and queue. + +* ``rte_pdump_disable_by_deviceid()``: + This API disables the packet capture on a given device id (``vdev name or pci address``) and queue. + +* ``rte_pdump_uninit()``: + This API uninitializes the packet capture framework. + + +Operation +- + +The ``librte_pdump`` library works on a client/server model. The server is responsible for enabling or +disabling the packet capture and the clients are responsible for requesting the enabling or disabling of +the packet capture. + +The packet capture framework, as part of its initialization, creates the pthread and the server socket in +the pthread. The application that calls the framework initialization first will have the server socket created. +Further calls to the framework initialization by the same application or other applications is not allowed i.e., only +one server socket is allowed on the
[dpdk-dev] [PATCH v6 7/8] app/test-pmd: add pdump initialization uninitialization
Call rte_pdump_init and rte_pdump_uninit for packet capturing initialization and uninitialization. Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index dd6b046..f6089fa 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -76,6 +76,7 @@ #ifdef RTE_LIBRTE_PMD_XENVIRT #include #endif +#include #include "testpmd.h" @@ -2029,6 +2030,8 @@ signal_handler(int signum) if (signum == SIGINT || signum == SIGTERM) { printf("\nSignal %d received, preparing to exit...\n", signum); + /* uninitialize packet capture framework */ + rte_pdump_uninit(); force_quit(); /* exit with the expected status */ signal(signum, SIG_DFL); @@ -2049,6 +2052,9 @@ main(int argc, char** argv) if (diag < 0) rte_panic("Cannot init EAL\n"); + /* initialize packet capture framework */ + rte_pdump_init(); + nb_ports = (portid_t) rte_eth_dev_count(); if (nb_ports == 0) RTE_LOG(WARNING, EAL, "No probed ethernet devices\n"); -- 2.5.0
[dpdk-dev] [PATCH v6 6/8] app/pdump: add pdump tool for packet capturing
New tool added for packet capturing on dpdk. This tool supports command line options. This tool runs as secondary process by default. Command line supports various parameters to capture the packets. User should pass on a)port and queue (or) b)pci address and queue (or) c)device name and queue to capture the packets. Users also need to pass on either pcap file name or any linux iface, on to which packets captured from dpdk ports will be sent on for the users to view using tcpdump. Users have option to capture packets either a) in RX direction, b)(or) in TX direction c)(or) from both the directions. User can pass on ring_size and mempool parameters using command line, but these are optional parameters. These are used to create ring and mempool objects for packet mirroring from primary application to tool. If user doesn't provide any values, default values will be used internally for the creation of the ring and mempool. Signed-off-by: Reshma Pattan --- MAINTAINERS| 1 + app/Makefile | 1 + app/pdump/Makefile | 45 +++ app/pdump/main.c | 814 + 4 files changed, 861 insertions(+) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c diff --git a/MAINTAINERS b/MAINTAINERS index cc3ffdb..a48c8de 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -435,6 +435,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst Pdump M: Reshma Pattan F: lib/librte_pdump/ +F: app/pdump/ Hierarchical scheduler M: Cristian Dumitrescu diff --git a/app/Makefile b/app/Makefile index 1151e09..c593efa 100644 --- a/app/Makefile +++ b/app/Makefile @@ -37,5 +37,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += test-pipeline DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_test DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += proc_info +DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += pdump include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/app/pdump/Makefile b/app/pdump/Makefile new file mode 100644 index 000..96bb4af --- /dev/null +++ b/app/pdump/Makefile @@ -0,0 +1,45 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +APP = dpdk_pdump + +CFLAGS += $(WERROR_FLAGS) + +# all source are stored in SRCS-y + +SRCS-y := main.c + +# this application needs libraries first +DEPDIRS-y += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/pdump/main.c b/app/pdump/main.c new file mode 100644 index 000..a4a5ca2 --- /dev/null +++ b/app/pdump/main.c @@ -0,0 +1,814 @@ +/* + * 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 + *
[dpdk-dev] [PATCH v6 5/8] lib/librte_pdump: add new library for packet capturing support
Added new library for packet capturing support. Added public api rte_pdump_init, applications should call this as part of their application setup to have packet capturing framework ready. Added public api rte_pdump_uninit to uninitialize the packet capturing framework. Added public apis rte_pdump_enable and rte_pdump_disable to enable and disable packet capturing on specific port and queue. Added public apis rte_pdump_enable_by_deviceid and rte_pdump_disable_by_deviceid to enable and disable packet capturing on a specific device (pci address or name) and queue. Signed-off-by: Reshma Pattan --- MAINTAINERS| 4 + config/common_base | 5 + lib/Makefile | 1 + lib/librte_pdump/Makefile | 55 +++ lib/librte_pdump/rte_pdump.c | 841 + lib/librte_pdump/rte_pdump.h | 186 lib/librte_pdump/rte_pdump_version.map | 12 + mk/rte.app.mk | 1 + 8 files changed, 1105 insertions(+) create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map diff --git a/MAINTAINERS b/MAINTAINERS index 3e8558f..cc3ffdb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -432,6 +432,10 @@ F: app/test/test_reorder* F: examples/packet_ordering/ F: doc/guides/sample_app_ug/packet_ordering.rst +Pdump +M: Reshma Pattan +F: lib/librte_pdump/ + Hierarchical scheduler M: Cristian Dumitrescu F: lib/librte_sched/ diff --git a/config/common_base b/config/common_base index 47c26f6..a2d5d72 100644 --- a/config/common_base +++ b/config/common_base @@ -484,6 +484,11 @@ CONFIG_RTE_LIBRTE_DISTRIBUTOR=y CONFIG_RTE_LIBRTE_REORDER=y # +# Compile the pdump library +# +CONFIG_RTE_LIBRTE_PDUMP=y + +# # Compile librte_port # CONFIG_RTE_LIBRTE_PORT=y diff --git a/lib/Makefile b/lib/Makefile index f254dba..ca7c02f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -57,6 +57,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PORT) += librte_port DIRS-$(CONFIG_RTE_LIBRTE_TABLE) += librte_table DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += librte_pipeline DIRS-$(CONFIG_RTE_LIBRTE_REORDER) += librte_reorder +DIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += librte_pdump ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y) DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile new file mode 100644 index 000..af81a28 --- /dev/null +++ b/lib/librte_pdump/Makefile @@ -0,0 +1,55 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +# library name +LIB = librte_pdump.a + +CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 +CFLAGS += -D_GNU_SOURCE + +EXPORT_MAP := rte_pdump_version.map + +LIBABIVER := 1 + +# all source are stored in SRCS-y +SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c + +# install this header file +SYMLINK-$(CONFIG_RTE_LIBRTE_PDUMP)-include := rte_pdump.h + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_eal +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_ether + +include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c new file mode 100644 ind
[dpdk-dev] [PATCH v6 4/8] librte_ether: make rte_eth_dev_get_port_by_name rte_eth_dev_get_name_by_port public
Converted rte_eth_dev_get_port_by_name to a public API. Converted rte_eth_dev_get_name_by_port to a public API. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 4 ++-- lib/librte_ether/rte_ethdev.h | 29 + lib/librte_ether/rte_ether_version.map | 2 ++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 4d732e8..d8aac99 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -406,7 +406,7 @@ rte_eth_dev_get_addr_by_port(uint8_t port_id, struct rte_pci_addr *addr) return 0; } -static int +int rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) { char *tmp; @@ -425,7 +425,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) return 0; } -static int +int rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id) { int i; diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 106318f..6f5a61a 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -4283,6 +4283,35 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id, uint32_t mask, uint8_t en); +/** +* Get the port id from pci adrress or device name +* Ex: :2:00.0 or vdev name eth_pcap0 +* +* @param name +* pci address or name of the device +* @param port_id +* pointer to port identifier of the device +* @return +* - (0) if successful. +* - (-ENODEV or -EINVAL) on failure. +*/ +int +rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id); + +/** +* Get the device name from port id +* +* @param port_id +* pointer to port identifier of the device +* @param name +* pci address or name of the device +* @return +* - (0) if successful. +* - (-EINVAL) on failure. +*/ +int +rte_eth_dev_get_name_by_port(uint8_t port_id, char *name); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index d06d648..73e730d 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,5 +137,7 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_get_name_by_port; + rte_eth_dev_get_port_by_name; rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v6 3/8] librte_ether: add new fields to rte_eth_dev_info struct
New fields nb_rx_queues and nb_tx_queues are added to rte_eth_dev_info structure. Changes to API rte_eth_dev_info_get() are done to update these new fields to rte_eth_dev_info object. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 2 ++ lib/librte_ether/rte_ethdev.h | 3 +++ lib/librte_ether/rte_ether_version.map | 1 + 3 files changed, 6 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index f13c70a..4d732e8 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1661,6 +1661,8 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) (*dev->dev_ops->dev_infos_get)(dev, dev_info); dev_info->pci_dev = dev->pci_dev; dev_info->driver_name = dev->data->drv_name; + dev_info->nb_rx_queues = dev->data->nb_rx_queues; + dev_info->nb_tx_queues = dev->data->nb_tx_queues; } int diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 92b07a9..106318f 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -882,6 +882,9 @@ struct rte_eth_dev_info { struct rte_eth_desc_lim rx_desc_lim; /**< RX descriptors limits */ struct rte_eth_desc_lim tx_desc_lim; /**< TX descriptors limits */ uint32_t speed_capa; /**< Supported speeds bitmap (ETH_LINK_SPEED_). */ + /** Configured number of rx/tx queues */ + uint16_t nb_rx_queues; /**< Number of RX queues. */ + uint16_t nb_tx_queues; /**< Number of TX queues. */ }; /** diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index c990b04..d06d648 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,4 +137,5 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v6 2/8] librte_ether: add new api rte_eth_add_first_rx_callback
Added new public api rte_eth_add_first_rx_callback to add given callback as head of list. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 35 ++ lib/librte_ether/rte_ethdev.h | 27 ++ lib/librte_ether/rte_ether_version.map | 6 ++ 3 files changed, 68 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index ce70d58..f13c70a 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -2939,6 +2939,41 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, } void * +rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param) +{ +#ifndef RTE_ETHDEV_RXTX_CALLBACKS + rte_errno = ENOTSUP; + return NULL; +#endif + /* check input parameters */ + if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL || + queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) { + rte_errno = EINVAL; + return NULL; + } + + struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); + + if (cb == NULL) { + rte_errno = ENOMEM; + return NULL; + } + + cb->fn.rx = fn; + cb->param = user_param; + + rte_spinlock_lock(_eth_rx_cb_lock); + /* Add the callbacks at fisrt position*/ + cb->next = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; + rte_smp_wmb(); + rte_eth_devices[port_id].post_rx_burst_cbs[queue_id] = cb; + rte_spinlock_unlock(_eth_rx_cb_lock); + + return cb; +} + +void * rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, rte_tx_callback_fn fn, void *user_param) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 2757510..92b07a9 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -3825,6 +3825,33 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id, void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_rx_callback_fn fn, void *user_param); +/* +* Add a callback that must be called first on packet RX on a given port and queue. +* +* This API configures a first function to be called for each burst of +* packets received on a given NIC port queue. The return value is a pointer +* that can be used to later remove the callback using +* rte_eth_remove_rx_callback(). +* +* Multiple functions are called in the order that they are added. +* +* @param port_id +* The port identifier of the Ethernet device. +* @param queue_id +* The queue on the Ethernet device on which the callback is to be added. +* @param fn +* The callback function +* @param user_param +* A generic pointer parameter which will be passed to each invocation of the +* callback function on this port and queue. +* +* @return +* NULL on error. +* On success, a pointer value which can later be used to remove the callback. +*/ +void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param); + /** * Add a callback to be called on packet TX on a given port and queue. * diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index 214ecc7..c990b04 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -132,3 +132,9 @@ DPDK_16.04 { rte_eth_tx_buffer_set_err_callback; } DPDK_2.2; + +DPDK_16.07 { + global: + + rte_eth_add_first_rx_callback; +} DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v6 1/8] librte_ether: protect add/remove of rxtx callbacks with spinlocks
Added spinlocks around add/remove logic of rxtx callbacks to avoid corruption of callback lists in multithreaded context. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 82 +-- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index e148028..ce70d58 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -77,6 +77,12 @@ static uint8_t nb_ports; /* spinlock for eth device callbacks */ static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER; +/* spinlock for add/remove rx callbacks */ +static rte_spinlock_t rte_eth_rx_cb_lock = RTE_SPINLOCK_INITIALIZER; + +/* spinlock for add/remove tx callbacks */ +static rte_spinlock_t rte_eth_tx_cb_lock = RTE_SPINLOCK_INITIALIZER; + /* store statistics names and its offset in stats structure */ struct rte_eth_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; @@ -1634,7 +1640,6 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, STAT_QMAP_RX); } - void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) { @@ -2905,7 +2910,6 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_errno = EINVAL; return NULL; } - struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); if (cb == NULL) { @@ -2916,6 +2920,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.rx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_rx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; @@ -2928,6 +2933,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_rx_cb_lock); return cb; } @@ -2957,6 +2963,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.tx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_tx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id]; @@ -2969,6 +2976,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_tx_cb_lock); return cb; } @@ -2987,29 +2995,24 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->post_rx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + int ret = -EINVAL; + + rte_spinlock_lock(_eth_rx_cb_lock); + prev_cb = >post_rx_burst_cbs[queue_id]; + for (; *prev_cb != NULL; prev_cb = >next) { + cb = *prev_cb; if (cb == user_cb) { - prev_cb->next = user_cb->next; - return 0; + /* Remove the user cb from the callback list. */ + *prev_cb = cb->next; + ret = 0; + break; } + } + rte_spinlock_unlock(_eth_rx_cb_lock); - } while (cb != NULL); - - /* Callback wasn't found. */ - return -EINVAL; + return ret; } int @@ -3026,29 +3029,24 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->pre_tx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + int ret = -EINVAL; + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + + rte_spinlock_lock(_eth_tx_cb_lock); + prev_cb = >pr
[dpdk-dev] [PATCH v6 0/8] add packet capture framework
will remove the Ethernet rxtx call-backs. *Packet capture can be seen using tcpdump command "tcpdump -ni " (or) "tcpdump ?nr " 5)Example command line == ./build/app/dpdk_pdump -- --pdump 'device_id=:02:0.0,queue=*,tx-dev=/tmp/dt-file.pcap,rx-dev=/tmp/dr-file.pcap,ring-size=8192,mbuf-size=2176,total-num-mbufs=32768' --pdump 'device_id=:01:00.0,queue=*,rx-dev=/tmp/d-file.pcap,tx-dev=/tmp/d-file.pcap,ring-size=16384,mbuf-size=2176,total-num-mbufs=32768' v6: removed below deprecation notice patch from patch set. http://dpdk.org/dev/patchwork/patch/13372/ v5: addressed code review comments for below patches http://dpdk.org/dev/patchwork/patch/12955/ http://dpdk.org/dev/patchwork/patch/12951/ v4: added missing deprecation notice for ABI changes of rte_eth_dev_info structure. made doc changes as per doc guidelines. replaced rte_eal_vdev_init with rte_eth_dev_attach in pdump tool. removed rxtx-dev parameter from pdump tool command line. v3: app/pdump: Moved cleanup code from signal handler to main. divided librte_ether changes into multiple patches. example command changed in app/pdump application guide v2: fix compilation issues for 4.8.3 fix unnecessary #includes Reshma Pattan (8): librte_ether: protect add/remove of rxtx callbacks with spinlocks librte_ether: add new api rte_eth_add_first_rx_callback librte_ether: add new fields to rte_eth_dev_info struct librte_ether: make rte_eth_dev_get_port_by_name rte_eth_dev_get_name_by_port public lib/librte_pdump: add new library for packet capturing support app/pdump: add pdump tool for packet capturing app/test-pmd: add pdump initialization uninitialization doc: update doc for packet capture framework MAINTAINERS | 8 + app/Makefile| 1 + app/pdump/Makefile | 45 ++ app/pdump/main.c| 814 +++ app/test-pmd/testpmd.c | 6 + config/common_base | 5 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 107 doc/guides/rel_notes/release_16_07.rst | 13 + doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 + lib/Makefile| 1 + lib/librte_ether/rte_ethdev.c | 123 +++-- lib/librte_ether/rte_ethdev.h | 59 +++ lib/librte_ether/rte_ether_version.map | 9 + lib/librte_pdump/Makefile | 55 +++ lib/librte_pdump/rte_pdump.c| 841 lib/librte_pdump/rte_pdump.h| 186 +++ lib/librte_pdump/rte_pdump_version.map | 12 + mk/rte.app.mk | 1 + 20 files changed, 2366 insertions(+), 44 deletions(-) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map -- 2.5.0
[dpdk-dev] [PATCH v5 9/9] doc: announce ABI change for rte_eth_dev_info structure
New fields nb_rx_queues and nb_tx_queues will be added to rte_eth_dev_info structure. Changes to API rte_eth_dev_info_get() will be done to update these new fields to rte_eth_dev_info object. Signed-off-by: Reshma Pattan --- doc/guides/rel_notes/deprecation.rst | 6 ++ 1 file changed, 6 insertions(+) diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index ad05eba..04316fb 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -57,3 +57,9 @@ Deprecation Notices a handle, like the way kernel exposes an fd to user for locating a specific file, and to keep all major structures internally, so that we are likely to be free from ABI violations in future. + +* A librte_ether public structure ``rte_eth_dev_info`` will be changed in 16.07. + The proposed change will add new parameters ``nb_rx_queues``, ``nb_tx_queues`` + to the structure. These are the number of queues configured by software. + Modification to definition of ``rte_eth_dev_info_get()`` will be done + to update new parameters to ``rte_eth_dev_info`` object. -- 2.5.0
[dpdk-dev] [PATCH v5 8/9] doc: update doc for packet capture framework
Added programmers guide for librte_pdump. Added sample application guide for app/pdump application. Updated release note for packet capture framework changes. Signed-off-by: Reshma Pattan --- MAINTAINERS | 3 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 107 doc/guides/rel_notes/release_16_07.rst | 13 doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 6 files changed, 247 insertions(+) create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst diff --git a/MAINTAINERS b/MAINTAINERS index a48c8de..ce7c941 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -436,6 +436,9 @@ Pdump M: Reshma Pattan F: lib/librte_pdump/ F: app/pdump/ +F: doc/guides/prog_guide/pdump_library.rst +F: doc/guides/sample_app_ug/pdump.rst + Hierarchical scheduler M: Cristian Dumitrescu diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index b862d0c..4caf969 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -71,6 +71,7 @@ Programmer's Guide writing_efficient_code profile_app glossary +pdump_library **Figures** diff --git a/doc/guides/prog_guide/pdump_library.rst b/doc/guides/prog_guide/pdump_library.rst new file mode 100644 index 000..1809234 --- /dev/null +++ b/doc/guides/prog_guide/pdump_library.rst @@ -0,0 +1,107 @@ +.. 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. + +.. _pdump_library: + +The librte_pdump Library + + +The ``librte_pdump`` library provides a framework for packet capturing in DPDK. +The library provides the following APIs to initialize the packet capture framework, to enable +or disable the packet capture, and to uninitialize it: + +* ``rte_pdump_init()``: + This API initializes the packet capture framework. + +* ``rte_pdump_enable()``: + This API enables the packet capture on a given port and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_enable_by_deviceid()``: + This API enables the packet capture on a given device id (``vdev name or pci address``) and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_disable()``: + This API disables the packet capture on a given port and queue. + +* ``rte_pdump_disable_by_deviceid()``: + This API disables the packet capture on a given device id (``vdev name or pci address``) and queue. + +* ``rte_pdump_uninit()``: + This API uninitializes the packet capture framework. + + +Operation +- + +The ``librte_pdump`` library works on a client/server model. The server is responsible for enabling or +disabling the packet capture and the clients are responsible for requesting the enabling or disabling of +the packet capture. + +The packet capture framework, as part of its initialization, creates the pthread and the server socket in +the pthread. The application that calls the framework initialization first will have the server socket created. +Further calls to the framework initialization by the same application or other applications is not allowed i.e., only +one server socket is allowed on the system. So the other ap
[dpdk-dev] [PATCH v5 7/9] app/test-pmd: add pdump initialization uninitialization
Call rte_pdump_init and rte_pdump_uninit for packet capturing initialization and uninitialization. Signed-off-by: Reshma Pattan --- app/test-pmd/testpmd.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 9d11830..645bf50 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -75,6 +75,7 @@ #ifdef RTE_LIBRTE_PMD_XENVIRT #include #endif +#include #include "testpmd.h" @@ -2023,6 +2024,8 @@ signal_handler(int signum) if (signum == SIGINT || signum == SIGTERM) { printf("\nSignal %d received, preparing to exit...\n", signum); + /* uninitialize packet capture framework */ + rte_pdump_uninit(); force_quit(); /* exit with the expected status */ signal(signum, SIG_DFL); @@ -2043,6 +2046,9 @@ main(int argc, char** argv) if (diag < 0) rte_panic("Cannot init EAL\n"); + /* initialize packet capture framework */ + rte_pdump_init(); + nb_ports = (portid_t) rte_eth_dev_count(); if (nb_ports == 0) RTE_LOG(WARNING, EAL, "No probed ethernet devices\n"); -- 2.5.0
[dpdk-dev] [PATCH v5 6/9] app/pdump: add pdump tool for packet capturing
New tool added for packet capturing on dpdk. This tool supports command line options. This tool runs as secondary process by default. Command line supports various parameters to capture the packets. User should pass on a)port and queue (or) b)pci address and queue (or) c)device name and queue to capture the packets. Users also need to pass on either pcap file name or any linux iface, on to which packets captured from dpdk ports will be sent on for the users to view using tcpdump. Users have option to capture packets either a) in RX direction, b)(or) in TX direction c)(or) from both the directions. User can pass on ring_size and mempool parameters using command line, but these are optional parameters. These are used to create ring and mempool objects for packet mirroring from primary application to tool. If user doesn't provide any values, default values will be used internally for the creation of the ring and mempool. Signed-off-by: Reshma Pattan --- MAINTAINERS| 1 + app/Makefile | 1 + app/pdump/Makefile | 45 +++ app/pdump/main.c | 814 + 4 files changed, 861 insertions(+) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c diff --git a/MAINTAINERS b/MAINTAINERS index cc3ffdb..a48c8de 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -435,6 +435,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst Pdump M: Reshma Pattan F: lib/librte_pdump/ +F: app/pdump/ Hierarchical scheduler M: Cristian Dumitrescu diff --git a/app/Makefile b/app/Makefile index 1151e09..c593efa 100644 --- a/app/Makefile +++ b/app/Makefile @@ -37,5 +37,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += test-pipeline DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_test DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += proc_info +DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += pdump include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/app/pdump/Makefile b/app/pdump/Makefile new file mode 100644 index 000..96bb4af --- /dev/null +++ b/app/pdump/Makefile @@ -0,0 +1,45 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +APP = dpdk_pdump + +CFLAGS += $(WERROR_FLAGS) + +# all source are stored in SRCS-y + +SRCS-y := main.c + +# this application needs libraries first +DEPDIRS-y += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/pdump/main.c b/app/pdump/main.c new file mode 100644 index 000..a4a5ca2 --- /dev/null +++ b/app/pdump/main.c @@ -0,0 +1,814 @@ +/* + * 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 + *
[dpdk-dev] [PATCH v5 5/9] lib/librte_pdump: add new library for packet capturing support
Added new library for packet capturing support. Added public api rte_pdump_init, applications should call this as part of their application setup to have packet capturing framework ready. Added public api rte_pdump_uninit to uninitialize the packet capturing framework. Added public apis rte_pdump_enable and rte_pdump_disable to enable and disable packet capturing on specific port and queue. Added public apis rte_pdump_enable_by_deviceid and rte_pdump_disable_by_deviceid to enable and disable packet capturing on a specific device (pci address or name) and queue. Signed-off-by: Reshma Pattan --- MAINTAINERS| 4 + config/common_base | 5 + lib/Makefile | 1 + lib/librte_pdump/Makefile | 55 +++ lib/librte_pdump/rte_pdump.c | 841 + lib/librte_pdump/rte_pdump.h | 186 lib/librte_pdump/rte_pdump_version.map | 12 + mk/rte.app.mk | 1 + 8 files changed, 1105 insertions(+) create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map diff --git a/MAINTAINERS b/MAINTAINERS index 3e8558f..cc3ffdb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -432,6 +432,10 @@ F: app/test/test_reorder* F: examples/packet_ordering/ F: doc/guides/sample_app_ug/packet_ordering.rst +Pdump +M: Reshma Pattan +F: lib/librte_pdump/ + Hierarchical scheduler M: Cristian Dumitrescu F: lib/librte_sched/ diff --git a/config/common_base b/config/common_base index 47c26f6..a2d5d72 100644 --- a/config/common_base +++ b/config/common_base @@ -484,6 +484,11 @@ CONFIG_RTE_LIBRTE_DISTRIBUTOR=y CONFIG_RTE_LIBRTE_REORDER=y # +# Compile the pdump library +# +CONFIG_RTE_LIBRTE_PDUMP=y + +# # Compile librte_port # CONFIG_RTE_LIBRTE_PORT=y diff --git a/lib/Makefile b/lib/Makefile index f254dba..ca7c02f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -57,6 +57,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PORT) += librte_port DIRS-$(CONFIG_RTE_LIBRTE_TABLE) += librte_table DIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += librte_pipeline DIRS-$(CONFIG_RTE_LIBRTE_REORDER) += librte_reorder +DIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += librte_pdump ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y) DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile new file mode 100644 index 000..af81a28 --- /dev/null +++ b/lib/librte_pdump/Makefile @@ -0,0 +1,55 @@ +# 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. + +include $(RTE_SDK)/mk/rte.vars.mk + +# library name +LIB = librte_pdump.a + +CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 +CFLAGS += -D_GNU_SOURCE + +EXPORT_MAP := rte_pdump_version.map + +LIBABIVER := 1 + +# all source are stored in SRCS-y +SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c + +# install this header file +SYMLINK-$(CONFIG_RTE_LIBRTE_PDUMP)-include := rte_pdump.h + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_eal +DEPDIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += lib/librte_ether + +include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c new file mode 100644 ind
[dpdk-dev] [PATCH v5 4/9] librte_ether: make rte_eth_dev_get_port_by_name rte_eth_dev_get_name_by_port public
Converted rte_eth_dev_get_port_by_name to a public API. Converted rte_eth_dev_get_name_by_port to a public API. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 4 ++-- lib/librte_ether/rte_ethdev.h | 29 + lib/librte_ether/rte_ether_version.map | 2 ++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 4d732e8..d8aac99 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -406,7 +406,7 @@ rte_eth_dev_get_addr_by_port(uint8_t port_id, struct rte_pci_addr *addr) return 0; } -static int +int rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) { char *tmp; @@ -425,7 +425,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) return 0; } -static int +int rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id) { int i; diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 106318f..6f5a61a 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -4283,6 +4283,35 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id, uint32_t mask, uint8_t en); +/** +* Get the port id from pci adrress or device name +* Ex: :2:00.0 or vdev name eth_pcap0 +* +* @param name +* pci address or name of the device +* @param port_id +* pointer to port identifier of the device +* @return +* - (0) if successful. +* - (-ENODEV or -EINVAL) on failure. +*/ +int +rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id); + +/** +* Get the device name from port id +* +* @param port_id +* pointer to port identifier of the device +* @param name +* pci address or name of the device +* @return +* - (0) if successful. +* - (-EINVAL) on failure. +*/ +int +rte_eth_dev_get_name_by_port(uint8_t port_id, char *name); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index d06d648..73e730d 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,5 +137,7 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_get_name_by_port; + rte_eth_dev_get_port_by_name; rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v5 3/9] librte_ether: add new fields to rte_eth_dev_info struct
New fields nb_rx_queues and nb_tx_queues are added to rte_eth_dev_info structure. Changes to API rte_eth_dev_info_get() are done to update these new fields to rte_eth_dev_info object. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 2 ++ lib/librte_ether/rte_ethdev.h | 3 +++ lib/librte_ether/rte_ether_version.map | 1 + 3 files changed, 6 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index f13c70a..4d732e8 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1661,6 +1661,8 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) (*dev->dev_ops->dev_infos_get)(dev, dev_info); dev_info->pci_dev = dev->pci_dev; dev_info->driver_name = dev->data->drv_name; + dev_info->nb_rx_queues = dev->data->nb_rx_queues; + dev_info->nb_tx_queues = dev->data->nb_tx_queues; } int diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 92b07a9..106318f 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -882,6 +882,9 @@ struct rte_eth_dev_info { struct rte_eth_desc_lim rx_desc_lim; /**< RX descriptors limits */ struct rte_eth_desc_lim tx_desc_lim; /**< TX descriptors limits */ uint32_t speed_capa; /**< Supported speeds bitmap (ETH_LINK_SPEED_). */ + /** Configured number of rx/tx queues */ + uint16_t nb_rx_queues; /**< Number of RX queues. */ + uint16_t nb_tx_queues; /**< Number of TX queues. */ }; /** diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index c990b04..d06d648 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -137,4 +137,5 @@ DPDK_16.07 { global: rte_eth_add_first_rx_callback; + rte_eth_dev_info_get; } DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v5 2/9] librte_ether: add new api rte_eth_add_first_rx_callback
Added new public api rte_eth_add_first_rx_callback to add given callback as head of list. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 35 ++ lib/librte_ether/rte_ethdev.h | 27 ++ lib/librte_ether/rte_ether_version.map | 6 ++ 3 files changed, 68 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index ce70d58..f13c70a 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -2939,6 +2939,41 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, } void * +rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param) +{ +#ifndef RTE_ETHDEV_RXTX_CALLBACKS + rte_errno = ENOTSUP; + return NULL; +#endif + /* check input parameters */ + if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL || + queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) { + rte_errno = EINVAL; + return NULL; + } + + struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); + + if (cb == NULL) { + rte_errno = ENOMEM; + return NULL; + } + + cb->fn.rx = fn; + cb->param = user_param; + + rte_spinlock_lock(_eth_rx_cb_lock); + /* Add the callbacks at fisrt position*/ + cb->next = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; + rte_smp_wmb(); + rte_eth_devices[port_id].post_rx_burst_cbs[queue_id] = cb; + rte_spinlock_unlock(_eth_rx_cb_lock); + + return cb; +} + +void * rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, rte_tx_callback_fn fn, void *user_param) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 2757510..92b07a9 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -3825,6 +3825,33 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id, void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_rx_callback_fn fn, void *user_param); +/* +* Add a callback that must be called first on packet RX on a given port and queue. +* +* This API configures a first function to be called for each burst of +* packets received on a given NIC port queue. The return value is a pointer +* that can be used to later remove the callback using +* rte_eth_remove_rx_callback(). +* +* Multiple functions are called in the order that they are added. +* +* @param port_id +* The port identifier of the Ethernet device. +* @param queue_id +* The queue on the Ethernet device on which the callback is to be added. +* @param fn +* The callback function +* @param user_param +* A generic pointer parameter which will be passed to each invocation of the +* callback function on this port and queue. +* +* @return +* NULL on error. +* On success, a pointer value which can later be used to remove the callback. +*/ +void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id, + rte_rx_callback_fn fn, void *user_param); + /** * Add a callback to be called on packet TX on a given port and queue. * diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index 214ecc7..c990b04 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -132,3 +132,9 @@ DPDK_16.04 { rte_eth_tx_buffer_set_err_callback; } DPDK_2.2; + +DPDK_16.07 { + global: + + rte_eth_add_first_rx_callback; +} DPDK_16.04; -- 2.5.0
[dpdk-dev] [PATCH v5 1/9] librte_ether: protect add/remove of rxtx callbacks with spinlocks
Added spinlocks around add/remove logic of rxtx callbacks to avoid corruption of callback lists in multithreaded context. Signed-off-by: Reshma Pattan --- lib/librte_ether/rte_ethdev.c | 82 +-- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index e148028..ce70d58 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -77,6 +77,12 @@ static uint8_t nb_ports; /* spinlock for eth device callbacks */ static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER; +/* spinlock for add/remove rx callbacks */ +static rte_spinlock_t rte_eth_rx_cb_lock = RTE_SPINLOCK_INITIALIZER; + +/* spinlock for add/remove tx callbacks */ +static rte_spinlock_t rte_eth_tx_cb_lock = RTE_SPINLOCK_INITIALIZER; + /* store statistics names and its offset in stats structure */ struct rte_eth_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; @@ -1634,7 +1640,6 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, STAT_QMAP_RX); } - void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) { @@ -2905,7 +2910,6 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, rte_errno = EINVAL; return NULL; } - struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0); if (cb == NULL) { @@ -2916,6 +2920,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.rx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_rx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id]; @@ -2928,6 +2933,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_rx_cb_lock); return cb; } @@ -2957,6 +2963,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, cb->fn.tx = fn; cb->param = user_param; + rte_spinlock_lock(_eth_tx_cb_lock); /* Add the callbacks in fifo order. */ struct rte_eth_rxtx_callback *tail = rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id]; @@ -2969,6 +2976,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id, tail = tail->next; tail->next = cb; } + rte_spinlock_unlock(_eth_tx_cb_lock); return cb; } @@ -2987,29 +2995,24 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->post_rx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + int ret = -EINVAL; + + rte_spinlock_lock(_eth_rx_cb_lock); + prev_cb = >post_rx_burst_cbs[queue_id]; + for (; *prev_cb != NULL; prev_cb = >next) { + cb = *prev_cb; if (cb == user_cb) { - prev_cb->next = user_cb->next; - return 0; + /* Remove the user cb from the callback list. */ + *prev_cb = cb->next; + ret = 0; + break; } + } + rte_spinlock_unlock(_eth_rx_cb_lock); - } while (cb != NULL); - - /* Callback wasn't found. */ - return -EINVAL; + return ret; } int @@ -3026,29 +3029,24 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, return -EINVAL; struct rte_eth_dev *dev = _eth_devices[port_id]; - struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id]; - struct rte_eth_rxtx_callback *prev_cb; - - /* Reset head pointer and remove user cb if first in the list. */ - if (cb == user_cb) { - dev->pre_tx_burst_cbs[queue_id] = user_cb->next; - return 0; - } - - /* Remove the user cb from the callback list. */ - do { - prev_cb = cb; - cb = cb->next; - + int ret = -EINVAL; + struct rte_eth_rxtx_callback *cb; + struct rte_eth_rxtx_callback **prev_cb; + + rte_spinlock_lock(_eth_tx_cb_lock); + prev_cb = >pr
[dpdk-dev] [PATCH v5 0/9] add packet capture framework
will remove the Ethernet rxtx call-backs. *Packet capture can be seen using tcpdump command "tcpdump -ni " (or) "tcpdump ?nr " 5)Example command line == ./build/app/dpdk_pdump -- --pdump 'device_id=:02:0.0,queue=*,tx-dev=/tmp/dt-file.pcap,rx-dev=/tmp/dr-file.pcap,ring-size=8192,mbuf-size=2176,total-num-mbufs=32768' --pdump 'device_id=:01:00.0,queue=*,rx-dev=/tmp/d-file.pcap,tx-dev=/tmp/d-file.pcap,ring-size=16384,mbuf-size=2176,total-num-mbufs=32768' v5: addressed code review comments for below patches http://dpdk.org/dev/patchwork/patch/12955/ http://dpdk.org/dev/patchwork/patch/12951/ v4: added missing deprecation notice for ABI changes of rte_eth_dev_info structure. made doc changes as per doc guidelines. replaced rte_eal_vdev_init with rte_eth_dev_attach in pdump tool. removed rxtx-dev parameter from pdump tool command line. v3: app/pdump: Moved cleanup code from signal handler to main. divided librte_ether changes into multiple patches. example command changed in app/pdump application guide v2: fix compilation issues for 4.8.3 fix unnecessary #includes Reshma Pattan (9): librte_ether: protect add/remove of rxtx callbacks with spinlocks librte_ether: add new api rte_eth_add_first_rx_callback librte_ether: add new fields to rte_eth_dev_info struct librte_ether: make rte_eth_dev_get_port_by_name rte_eth_dev_get_name_by_port public lib/librte_pdump: add new library for packet capturing support app/pdump: add pdump tool for packet capturing app/test-pmd: add pdump initialization uninitialization doc: update doc for packet capture framework doc: announce ABI change for rte_eth_dev_info structure MAINTAINERS | 8 + app/Makefile| 1 + app/pdump/Makefile | 45 ++ app/pdump/main.c| 814 +++ app/test-pmd/testpmd.c | 6 + config/common_base | 5 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/pdump_library.rst | 107 doc/guides/rel_notes/deprecation.rst| 6 + doc/guides/rel_notes/release_16_07.rst | 13 + doc/guides/sample_app_ug/index.rst | 1 + doc/guides/sample_app_ug/pdump.rst | 122 + lib/Makefile| 1 + lib/librte_ether/rte_ethdev.c | 123 +++-- lib/librte_ether/rte_ethdev.h | 59 +++ lib/librte_ether/rte_ether_version.map | 9 + lib/librte_pdump/Makefile | 55 +++ lib/librte_pdump/rte_pdump.c| 841 lib/librte_pdump/rte_pdump.h| 186 +++ lib/librte_pdump/rte_pdump_version.map | 12 + mk/rte.app.mk | 1 + 21 files changed, 2372 insertions(+), 44 deletions(-) create mode 100644 app/pdump/Makefile create mode 100644 app/pdump/main.c create mode 100644 doc/guides/prog_guide/pdump_library.rst create mode 100644 doc/guides/sample_app_ug/pdump.rst create mode 100644 lib/librte_pdump/Makefile create mode 100644 lib/librte_pdump/rte_pdump.c create mode 100644 lib/librte_pdump/rte_pdump.h create mode 100644 lib/librte_pdump/rte_pdump_version.map -- 2.5.0
[dpdk-dev] [PATCH v2] pcap: fix segfault in pcap pmd
Testpmd application will crash in fclose() upon quit after running the below command. "sudo gdb --args ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf0 -n 4 --vdev 'eth_pcap0,tx_iface=enp1s0f1,rx_pcap=/tmp/test.pcap' -- --port-topology=chained -i" The reason is, pcap vdev creation with tx stream type as "iface" as in above command don't need member ''dumpers'' of "struct tx_pcaps", hence will not have memory allocated. But contains a garbage values, as local object of struct tx_pcaps is not initialized to 0 inside rte_pmd_pcap_dev_init(). So calling pcap_dump_close() on dumper as part of eth_dev_stop() is causing segfault in fclose(). Fix is to initialize local object of struct tx_pcaps to 0. Also initialize local object of struct rx_pcaps to 0. So during eth_dev_stop(), pcap_dump_close() will not be called if dumper is NULL. Fixes:4c173302("pcap: add new driver") Signed-off-by: Reshma Pattan Acked-by: Ferruh Yigit --- v2: Fixed typos in commit message. Fixed commit message line length to 75. Fixed subject line of the patch. --- drivers/net/pcap/rte_eth_pcap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index c98e234..c86f17b 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -978,8 +978,8 @@ rte_pmd_pcap_devinit(const char *name, const char *params) unsigned numa_node, using_dumpers = 0; int ret; struct rte_kvargs *kvlist; - struct rx_pcaps pcaps; - struct tx_pcaps dumpers; + struct rx_pcaps pcaps = {0}; + struct tx_pcaps dumpers = {0}; RTE_LOG(INFO, PMD, "Initializing pmd_pcap for %s\n", name); -- 2.5.0
[dpdk-dev] [PATCH] drivers/net/pcap: fix segfault in pcap pmd
Testpmd application will crash in fclose() upon quit after running the below command. "sudo gdb --args ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf0 -n 4 --vdev 'eth_pcap0,tx_iface=enp1s0f1,rx_pcap=/tmp/test.pcap' -- --port-topology=chained -i" The reason is, pcap vdev creation with tx stream type as "iface" as in above command dont need member ''dumpers'' of "struct tx_pcaps", hence will not have memory allocated. But contains a garbage values, as local object of struct tx_pcaps is not initialized to 0 inside rte_pmd_pcap_dev_init(). So calling pcap_dump_close() on dumper as part of eth_dev_stop() is causing segfault in fclose(). Fix is to initilize local object of struct tx_pcaps to 0. Also initiliaze local object of stcruct rx_pcaps to 0. So during eth_dev_stop(), pcap_dump_close() will not be called if dumper is NULL. Fixes:4c173302("pcap: add new driver") Signed-off-by: Reshma Pattan --- drivers/net/pcap/rte_eth_pcap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index c98e234..c86f17b 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -978,8 +978,8 @@ rte_pmd_pcap_devinit(const char *name, const char *params) unsigned numa_node, using_dumpers = 0; int ret; struct rte_kvargs *kvlist; - struct rx_pcaps pcaps; - struct tx_pcaps dumpers; + struct rx_pcaps pcaps = {0}; + struct tx_pcaps dumpers = {0}; RTE_LOG(INFO, PMD, "Initializing pmd_pcap for %s\n", name); -- 2.5.0