aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/linux-generic/Makefile.am3
-rw-r--r--platform/linux-generic/include/odp_packet_io_internal.h12
-rw-r--r--platform/linux-generic/include/odp_packet_io_stats.h30
-rw-r--r--platform/linux-generic/include/odp_packet_io_stats_common.h23
-rw-r--r--platform/linux-generic/pktio/netmap.c1
-rw-r--r--platform/linux-generic/pktio/pktio_common.c75
-rw-r--r--platform/linux-generic/pktio/socket.c23
-rw-r--r--platform/linux-generic/pktio/socket_mmap.c23
-rw-r--r--platform/linux-generic/pktio/stats/packet_io_stats.c97
9 files changed, 166 insertions, 121 deletions
diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am
index b730a92e6..6fb0fb32f 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -113,6 +113,8 @@ noinst_HEADERS = \
include/odp_packet_io_ring_internal.h \
include/odp_packet_socket.h \
include/odp_socket_common.h \
+ include/odp_packet_io_stats_common.h \
+ include/odp_packet_io_stats.h \
include/odp_sysfs_stats.h \
include/odp_ethtool_stats.h \
include/odp_ethtool_rss.h \
@@ -204,6 +206,7 @@ __LIB__libodp_linux_la_SOURCES = \
odp_weak.c \
pktio/stats/ethtool_stats.c \
pktio/stats/sysfs_stats.c \
+ pktio/stats/packet_io_stats.c \
pktio/dpdk.c \
pktio/dpdk_parse.c \
pktio/socket_common.c \
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h
index 776a8442c..d2446d19f 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -26,6 +26,7 @@ extern "C" {
#include <odp_align_internal.h>
#include <odp_debug_internal.h>
#include <odp_packet_io_ring_internal.h>
+#include <odp_packet_io_stats_common.h>
#include <odp_queue_if.h>
#include <odp_config_internal.h>
@@ -89,11 +90,7 @@ struct pktio_entry {
classifier_t cls; /**< classifier linked with this pktio*/
odp_pktio_stats_t stats; /**< statistic counters for pktio */
odp_proto_chksums_t in_chksums; /**< Checksums validation settings */
- enum {
- STATS_SYSFS = 0,
- STATS_ETHTOOL,
- STATS_UNSUPPORTED
- } stats_type;
+ pktio_stats_type_t stats_type;
char name[PKTIO_NAME_LEN]; /**< name of pktio provided to
pktio_open() */
@@ -221,11 +218,6 @@ extern const pktio_if_ops_t null_pktio_ops;
extern const pktio_if_ops_t ipc_pktio_ops;
extern const pktio_if_ops_t * const pktio_if_ops[];
-int sock_stats_fd(pktio_entry_t *pktio_entry,
- odp_pktio_stats_t *stats,
- int fd);
-int sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd);
-
/**
* Try interrupt-driven receive
*
diff --git a/platform/linux-generic/include/odp_packet_io_stats.h b/platform/linux-generic/include/odp_packet_io_stats.h
new file mode 100644
index 000000000..4ed46e0aa
--- /dev/null
+++ b/platform/linux-generic/include/odp_packet_io_stats.h
@@ -0,0 +1,30 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_PACKET_IO_STATS_H_
+#define ODP_PACKET_IO_STATS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/api/std_types.h>
+#include <odp/api/packet_io.h>
+#include <odp/api/packet_io_stats.h>
+#include <odp_packet_io_internal.h>
+#include <odp_packet_io_stats_common.h>
+
+int sock_stats_fd(pktio_entry_t *pktio_entry,
+ odp_pktio_stats_t *stats,
+ int fd);
+int sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd);
+
+pktio_stats_type_t sock_stats_type_fd(pktio_entry_t *pktio_entry, int fd);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* ODP_PACKET_IO_STATS_H_ */
diff --git a/platform/linux-generic/include/odp_packet_io_stats_common.h b/platform/linux-generic/include/odp_packet_io_stats_common.h
new file mode 100644
index 000000000..19bd7c448
--- /dev/null
+++ b/platform/linux-generic/include/odp_packet_io_stats_common.h
@@ -0,0 +1,23 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_PACKET_IO_STATS_COMMON_H_
+#define ODP_PACKET_IO_STATS_COMMON_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ STATS_SYSFS = 0,
+ STATS_ETHTOOL,
+ STATS_UNSUPPORTED
+} pktio_stats_type_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* ODP_PACKET_IO_STATS_COMMON_H_ */
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 6333847df..0da2b7afd 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -16,6 +16,7 @@
#include <odp/api/plat/time_inlines.h>
#include <odp_packet_io_internal.h>
+#include <odp_packet_io_stats.h>
#include <odp_ethtool_stats.h>
#include <odp_ethtool_rss.h>
#include <odp_socket_common.h>
diff --git a/platform/linux-generic/pktio/pktio_common.c b/platform/linux-generic/pktio/pktio_common.c
index ca297fd5d..f0abadd1b 100644
--- a/platform/linux-generic/pktio/pktio_common.c
+++ b/platform/linux-generic/pktio/pktio_common.c
@@ -8,83 +8,8 @@
#include "config.h"
#include <odp_packet_io_internal.h>
-#include <odp_ethtool_stats.h>
-#include <odp_sysfs_stats.h>
-#include <odp_classification_internal.h>
#include <errno.h>
-int sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd)
-{
- int err = 0;
- odp_pktio_stats_t cur_stats;
-
- if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) {
- memset(&pktio_entry->s.stats, 0,
- sizeof(odp_pktio_stats_t));
- return 0;
- }
-
- memset(&cur_stats, 0, sizeof(odp_pktio_stats_t));
-
- if (pktio_entry->s.stats_type == STATS_ETHTOOL) {
- (void)ethtool_stats_get_fd(fd,
- pktio_entry->s.name,
- &cur_stats);
- } else if (pktio_entry->s.stats_type == STATS_SYSFS) {
- err = sysfs_stats(pktio_entry, &cur_stats);
- if (err != 0)
- ODP_ERR("stats error\n");
- }
-
- if (err == 0)
- memcpy(&pktio_entry->s.stats, &cur_stats,
- sizeof(odp_pktio_stats_t));
-
- return err;
-}
-
-int sock_stats_fd(pktio_entry_t *pktio_entry,
- odp_pktio_stats_t *stats,
- int fd)
-{
- odp_pktio_stats_t cur_stats;
- int ret = 0;
-
- if (pktio_entry->s.stats_type == STATS_UNSUPPORTED)
- return 0;
-
- memset(&cur_stats, 0, sizeof(odp_pktio_stats_t));
- if (pktio_entry->s.stats_type == STATS_ETHTOOL) {
- (void)ethtool_stats_get_fd(fd,
- pktio_entry->s.name,
- &cur_stats);
- } else if (pktio_entry->s.stats_type == STATS_SYSFS) {
- sysfs_stats(pktio_entry, &cur_stats);
- }
-
- stats->in_octets = cur_stats.in_octets -
- pktio_entry->s.stats.in_octets;
- stats->in_ucast_pkts = cur_stats.in_ucast_pkts -
- pktio_entry->s.stats.in_ucast_pkts;
- stats->in_discards = cur_stats.in_discards -
- pktio_entry->s.stats.in_discards;
- stats->in_errors = cur_stats.in_errors -
- pktio_entry->s.stats.in_errors;
- stats->in_unknown_protos = cur_stats.in_unknown_protos -
- pktio_entry->s.stats.in_unknown_protos;
-
- stats->out_octets = cur_stats.out_octets -
- pktio_entry->s.stats.out_octets;
- stats->out_ucast_pkts = cur_stats.out_ucast_pkts -
- pktio_entry->s.stats.out_ucast_pkts;
- stats->out_discards = cur_stats.out_discards -
- pktio_entry->s.stats.out_discards;
- stats->out_errors = cur_stats.out_errors -
- pktio_entry->s.stats.out_errors;
-
- return ret;
-}
-
static int sock_recv_mq_tmo_select(pktio_entry_t * const *entry,
const int index[],
unsigned num_q, unsigned *from,
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c
index 97a063c77..cee97f2c4 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -39,8 +39,7 @@
#include <odp_socket_common.h>
#include <odp_packet_internal.h>
#include <odp_packet_io_internal.h>
-#include <odp_ethtool_stats.h>
-#include <odp_sysfs_stats.h>
+#include <odp_packet_io_stats.h>
#include <odp_align_internal.h>
#include <odp_debug_internal.h>
#include <odp_errno_define.h>
@@ -148,7 +147,6 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev,
struct sockaddr_ll sa_ll;
char shm_name[ODP_SHM_NAME_LEN];
pkt_sock_t *pkt_sock = pkt_priv(pktio_entry);
- odp_pktio_stats_t cur_stats;
/* Init pktio entry */
memset(pkt_sock, 0, sizeof(*pkt_sock));
@@ -200,21 +198,10 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev,
goto error;
}
- err = ethtool_stats_get_fd(pkt_priv(pktio_entry)->sockfd,
- pktio_entry->s.name,
- &cur_stats);
- if (err != 0) {
- err = sysfs_stats(pktio_entry, &cur_stats);
- if (err != 0) {
- pktio_entry->s.stats_type = STATS_UNSUPPORTED;
- ODP_DBG("pktio: %s unsupported stats\n",
- pktio_entry->s.name);
- } else {
- pktio_entry->s.stats_type = STATS_SYSFS;
- }
- } else {
- pktio_entry->s.stats_type = STATS_ETHTOOL;
- }
+ pktio_entry->s.stats_type = sock_stats_type_fd(pktio_entry,
+ pkt_sock->sockfd);
+ if (pktio_entry->s.stats_type == STATS_UNSUPPORTED)
+ ODP_DBG("pktio: %s unsupported stats\n", pktio_entry->s.name);
err = sock_stats_reset(pktio_entry);
if (err != 0)
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c
index 6718eb9e9..459c65525 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -31,8 +31,7 @@
#include <odp_socket_common.h>
#include <odp_packet_internal.h>
#include <odp_packet_io_internal.h>
-#include <odp_ethtool_stats.h>
-#include <odp_sysfs_stats.h>
+#include <odp_packet_io_stats.h>
#include <odp_debug_internal.h>
#include <odp_errno_define.h>
#include <odp_classification_datamodel.h>
@@ -587,7 +586,6 @@ static int sock_mmap_open(odp_pktio_t id ODP_UNUSED,
{
int if_idx;
int ret = 0;
- odp_pktio_stats_t cur_stats;
if (disable_pktio)
return -1;
@@ -651,21 +649,10 @@ static int sock_mmap_open(odp_pktio_t id ODP_UNUSED,
goto error;
}
- ret = ethtool_stats_get_fd(pkt_priv(pktio_entry)->sockfd,
- pktio_entry->s.name,
- &cur_stats);
- if (ret != 0) {
- ret = sysfs_stats(pktio_entry, &cur_stats);
- if (ret != 0) {
- pktio_entry->s.stats_type = STATS_UNSUPPORTED;
- ODP_DBG("pktio: %s unsupported stats\n",
- pktio_entry->s.name);
- } else {
- pktio_entry->s.stats_type = STATS_SYSFS;
- }
- } else {
- pktio_entry->s.stats_type = STATS_ETHTOOL;
- }
+ pktio_entry->s.stats_type = sock_stats_type_fd(pktio_entry,
+ pkt_sock->sockfd);
+ if (pktio_entry->s.stats_type == STATS_UNSUPPORTED)
+ ODP_DBG("pktio: %s unsupported stats\n", pktio_entry->s.name);
ret = sock_stats_reset_fd(pktio_entry,
pkt_priv(pktio_entry)->sockfd);
diff --git a/platform/linux-generic/pktio/stats/packet_io_stats.c b/platform/linux-generic/pktio/stats/packet_io_stats.c
new file mode 100644
index 000000000..be87b5191
--- /dev/null
+++ b/platform/linux-generic/pktio/stats/packet_io_stats.c
@@ -0,0 +1,97 @@
+/* Copyright (c) 2014-2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <odp_packet_io_stats.h>
+#include <odp_ethtool_stats.h>
+#include <odp_sysfs_stats.h>
+
+int sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd)
+{
+ int err = 0;
+ odp_pktio_stats_t cur_stats;
+
+ if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) {
+ memset(&pktio_entry->s.stats, 0,
+ sizeof(odp_pktio_stats_t));
+ return 0;
+ }
+
+ memset(&cur_stats, 0, sizeof(odp_pktio_stats_t));
+
+ if (pktio_entry->s.stats_type == STATS_ETHTOOL) {
+ (void)ethtool_stats_get_fd(fd,
+ pktio_entry->s.name,
+ &cur_stats);
+ } else if (pktio_entry->s.stats_type == STATS_SYSFS) {
+ err = sysfs_stats(pktio_entry, &cur_stats);
+ if (err != 0)
+ ODP_ERR("stats error\n");
+ }
+
+ if (err == 0)
+ memcpy(&pktio_entry->s.stats, &cur_stats,
+ sizeof(odp_pktio_stats_t));
+
+ return err;
+}
+
+int sock_stats_fd(pktio_entry_t *pktio_entry,
+ odp_pktio_stats_t *stats,
+ int fd)
+{
+ odp_pktio_stats_t cur_stats;
+ int ret = 0;
+
+ if (pktio_entry->s.stats_type == STATS_UNSUPPORTED)
+ return 0;
+
+ memset(&cur_stats, 0, sizeof(odp_pktio_stats_t));
+ if (pktio_entry->s.stats_type == STATS_ETHTOOL) {
+ (void)ethtool_stats_get_fd(fd,
+ pktio_entry->s.name,
+ &cur_stats);
+ } else if (pktio_entry->s.stats_type == STATS_SYSFS) {
+ sysfs_stats(pktio_entry, &cur_stats);
+ }
+
+ stats->in_octets = cur_stats.in_octets -
+ pktio_entry->s.stats.in_octets;
+ stats->in_ucast_pkts = cur_stats.in_ucast_pkts -
+ pktio_entry->s.stats.in_ucast_pkts;
+ stats->in_discards = cur_stats.in_discards -
+ pktio_entry->s.stats.in_discards;
+ stats->in_errors = cur_stats.in_errors -
+ pktio_entry->s.stats.in_errors;
+ stats->in_unknown_protos = cur_stats.in_unknown_protos -
+ pktio_entry->s.stats.in_unknown_protos;
+
+ stats->out_octets = cur_stats.out_octets -
+ pktio_entry->s.stats.out_octets;
+ stats->out_ucast_pkts = cur_stats.out_ucast_pkts -
+ pktio_entry->s.stats.out_ucast_pkts;
+ stats->out_discards = cur_stats.out_discards -
+ pktio_entry->s.stats.out_discards;
+ stats->out_errors = cur_stats.out_errors -
+ pktio_entry->s.stats.out_errors;
+
+ return ret;
+}
+
+pktio_stats_type_t sock_stats_type_fd(pktio_entry_t *pktio_entry, int fd)
+{
+ odp_pktio_stats_t cur_stats;
+
+ if (!ethtool_stats_get_fd(fd, pktio_entry->s.name, &cur_stats))
+ return STATS_ETHTOOL;
+
+ if (!sysfs_stats(pktio_entry, &cur_stats))
+ return STATS_SYSFS;
+
+ return STATS_UNSUPPORTED;
+}