@@ -192,6 +192,7 @@ noinst_HEADERS = \
${srcdir}/include/odp_pktio_ops_ipc.h \
${srcdir}/include/odp_pktio_ops_loopback.h \
${srcdir}/include/odp_pktio_ops_netmap.h \
+ ${srcdir}/include/odp_pktio_ops_pcap.h \
${srcdir}/include/odp_pktio_ops_subsystem.h \
${srcdir}/include/odp_pkt_queue_internal.h \
${srcdir}/include/odp_pool_internal.h \
@@ -50,21 +50,6 @@ typedef union pktio_entry_u pktio_entry_t;
* requested number of packets were not handled. */
#define SOCK_ERR_REPORT(e) (e != EAGAIN && e != EWOULDBLOCK && e != EINTR)
-#ifdef HAVE_PCAP
-typedef struct {
- char *fname_rx; /**< name of pcap file for rx */
- char *fname_tx; /**< name of pcap file for tx */
- void *rx; /**< rx pcap handle */
- void *tx; /**< tx pcap handle */
- void *tx_dump; /**< tx pcap dumper handle */
- odp_pool_t pool; /**< rx pool */
- unsigned char *buf; /**< per-pktio temp buffer */
- int loops; /**< number of times to loop rx pcap */
- int loop_cnt; /**< number of loops completed */
- odp_bool_t promisc; /**< promiscuous mode state */
-} pkt_pcap_t;
-#endif
-
struct pktio_entry {
const pktio_ops_module_t *ops; /**< Implementation specific methods */
pktio_ops_data_t ops_data; /**< IO operation specific data */
@@ -78,9 +63,6 @@ struct pktio_entry {
pkt_sock_mmap_t pkt_sock_mmap; /**< using socket mmap
* API for IO */
pkt_dpdk_t pkt_dpdk; /**< using DPDK for IO */
-#ifdef HAVE_PCAP
- pkt_pcap_t pkt_pcap; /**< Using pcap for IO */
-#endif
pkt_tap_t pkt_tap; /**< using TAP for IO */
};
enum {
new file mode 100644
@@ -0,0 +1,25 @@
+/* Copyright (c) 2017, ARM Limited. All rights reserved.
+ *
+ * Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_PKTIO_OPS_PCAP_H_
+#define ODP_PKTIO_OPS_PCAP_H_
+
+typedef struct {
+ char *fname_rx; /**< name of pcap file for rx */
+ char *fname_tx; /**< name of pcap file for tx */
+ void *rx; /**< rx pcap handle */
+ void *tx; /**< tx pcap handle */
+ void *tx_dump; /**< tx pcap dumper handle */
+ odp_pool_t pool; /**< rx pool */
+ unsigned char *buf; /**< per-pktio temp buffer */
+ int loops; /**< number of times to loop rx pcap */
+ int loop_cnt; /**< number of loops completed */
+ odp_bool_t promisc; /**< promiscuous mode state */
+} pktio_ops_pcap_data_t;
+
+#endif
@@ -82,6 +82,7 @@ typedef ODP_MODULE_CLASS(pktio_ops) {
#include <odp_pktio_ops_ipc.h>
#include <odp_pktio_ops_loopback.h>
#include <odp_pktio_ops_netmap.h>
+#include <odp_pktio_ops_pcap.h>
/* Per implementation private data
* TODO: refactory each implementation to hide it internally
@@ -90,6 +91,7 @@ typedef union {
pktio_ops_ipc_data_t ipc;
pktio_ops_loopback_data_t loopback;
pktio_ops_netmap_data_t netmap;
+ pktio_ops_pcap_data_t pcap;
} pktio_ops_data_t;
/* Extract pktio ops data from pktio entry structure */
@@ -51,7 +51,8 @@ static const char pcap_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x04};
static int pcapif_stats_reset(pktio_entry_t *pktio_entry);
-static int _pcapif_parse_devname(pkt_pcap_t *pcap, const char *devname)
+static int _pcapif_parse_devname(
+ pktio_ops_pcap_data_t *pcap, const char *devname)
{
char *tok;
char in[PKTIO_NAME_LEN];
@@ -80,7 +81,7 @@ static int _pcapif_parse_devname(pkt_pcap_t *pcap, const char *devname)
return 0;
}
-static int _pcapif_init_rx(pkt_pcap_t *pcap)
+static int _pcapif_init_rx(pktio_ops_pcap_data_t *pcap)
{
char errbuf[PCAP_ERRBUF_SIZE];
int linktype;
@@ -101,7 +102,7 @@ static int _pcapif_init_rx(pkt_pcap_t *pcap)
return 0;
}
-static int _pcapif_init_tx(pkt_pcap_t *pcap)
+static int _pcapif_init_tx(pktio_ops_pcap_data_t *pcap)
{
pcap_t *tx = pcap->rx;
@@ -136,10 +137,11 @@ static int _pcapif_init_tx(pkt_pcap_t *pcap)
static int pcapif_init(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
const char *devname, odp_pool_t pool)
{
- pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap;
+ pktio_ops_pcap_data_t *pcap =
+ &pktio_entry->ops_data(pcap);
int ret;
- memset(pcap, 0, sizeof(pkt_pcap_t));
+ memset(pcap, 0, sizeof(pktio_ops_pcap_data_t));
pcap->loop_cnt = 1;
pcap->loops = 1;
pcap->pool = pool;
@@ -163,7 +165,8 @@ static int pcapif_init(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
static int pcapif_close(pktio_entry_t *pktio_entry)
{
- pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap;
+ pktio_ops_pcap_data_t *pcap =
+ &pktio_entry->ops_data(pcap);
if (pcap->tx_dump)
pcap_dump_close(pcap->tx_dump);
@@ -181,7 +184,7 @@ static int pcapif_close(pktio_entry_t *pktio_entry)
return 0;
}
-static int _pcapif_reopen(pkt_pcap_t *pcap)
+static int _pcapif_reopen(pktio_ops_pcap_data_t *pcap)
{
char errbuf[PCAP_ERRBUF_SIZE];
@@ -210,7 +213,8 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
odp_packet_t pkt;
odp_packet_hdr_t *pkt_hdr;
uint32_t pkt_len;
- pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap;
+ pktio_ops_pcap_data_t *pcap =
+ &pktio_entry->ops_data(pcap);
odp_time_t ts_val;
odp_time_t *ts = NULL;
@@ -270,7 +274,7 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
return i;
}
-static int _pcapif_dump_pkt(pkt_pcap_t *pcap, odp_packet_t pkt)
+static int _pcapif_dump_pkt(pktio_ops_pcap_data_t *pcap, odp_packet_t pkt)
{
struct pcap_pkthdr hdr;
@@ -293,7 +297,8 @@ static int _pcapif_dump_pkt(pkt_pcap_t *pcap, odp_packet_t pkt)
static int pcapif_send_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
const odp_packet_t pkts[], int len)
{
- pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap;
+ pktio_ops_pcap_data_t *pcap =
+ &pktio_entry->ops_data(pcap);
int i;
odp_ticketlock_lock(&pktio_entry->s.txl);
@@ -361,7 +366,8 @@ static int pcapif_promisc_mode_set(pktio_entry_t *pktio_entry,
{
char filter_exp[64] = {0};
struct bpf_program bpf;
- pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap;
+ pktio_ops_pcap_data_t *pcap =
+ &pktio_entry->ops_data(pcap);
if (!pcap->rx) {
pcap->promisc = enable;
@@ -401,7 +407,7 @@ static int pcapif_promisc_mode_set(pktio_entry_t *pktio_entry,
static int pcapif_promisc_mode_get(pktio_entry_t *pktio_entry)
{
- return pktio_entry->s.pkt_pcap.promisc;
+ return pktio_entry->ops_data(pcap).promisc;
}
static int pcapif_stats_reset(pktio_entry_t *pktio_entry)