git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
net/pcap: switch Rx timestamp to dynamic mbuf field
[dpdk.git]
/
drivers
/
net
/
pcap
/
rte_eth_pcap.c
diff --git
a/drivers/net/pcap/rte_eth_pcap.c
b/drivers/net/pcap/rte_eth_pcap.c
index
909eef8
..
4e6d493
100644
(file)
--- a/
drivers/net/pcap/rte_eth_pcap.c
+++ b/
drivers/net/pcap/rte_eth_pcap.c
@@
-51,6
+51,9
@@
static uint64_t start_cycles;
static uint64_t hz;
static uint8_t iface_idx;
static uint64_t hz;
static uint8_t iface_idx;
+static uint64_t timestamp_rx_dynflag;
+static int timestamp_dynfield_offset = -1;
+
struct queue_stat {
volatile unsigned long pkts;
volatile unsigned long bytes;
struct queue_stat {
volatile unsigned long pkts;
volatile unsigned long bytes;
@@
-265,9
+268,11
@@
eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
}
mbuf->pkt_len = (uint16_t)header.caplen;
}
mbuf->pkt_len = (uint16_t)header.caplen;
- mbuf->timestamp = (uint64_t)header.ts.tv_sec * 1000000
- + header.ts.tv_usec;
- mbuf->ol_flags |= PKT_RX_TIMESTAMP;
+ *RTE_MBUF_DYNFIELD(mbuf, timestamp_dynfield_offset,
+ rte_mbuf_timestamp_t *) =
+ (uint64_t)header.ts.tv_sec * 1000000 +
+ header.ts.tv_usec;
+ mbuf->ol_flags |= timestamp_rx_dynflag;
mbuf->port = pcap_q->port_id;
bufs[num_rx] = mbuf;
num_rx++;
mbuf->port = pcap_q->port_id;
bufs[num_rx] = mbuf;
num_rx++;
@@
-607,7
+612,7
@@
status_up:
* Is the only place for us to close all the tx streams dumpers.
* If not called the dumpers will be flushed within each tx burst.
*/
* Is the only place for us to close all the tx streams dumpers.
* If not called the dumpers will be flushed within each tx burst.
*/
-static
void
+static
int
eth_dev_stop(struct rte_eth_dev *dev)
{
unsigned int i;
eth_dev_stop(struct rte_eth_dev *dev)
{
unsigned int i;
@@
-649,11
+654,22
@@
status_down:
dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
dev->data->dev_link.link_status = ETH_LINK_DOWN;
dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
dev->data->dev_link.link_status = ETH_LINK_DOWN;
+
+ return 0;
}
static int
eth_dev_configure(struct rte_eth_dev *dev __rte_unused)
{
}
static int
eth_dev_configure(struct rte_eth_dev *dev __rte_unused)
{
+ int ret;
+
+ ret = rte_mbuf_dyn_rx_timestamp_register(×tamp_dynfield_offset,
+ ×tamp_rx_dynflag);
+ if (ret != 0) {
+ PMD_LOG(ERR, "Failed to register Rx timestamp field/flag");
+ return -rte_errno;
+ }
+
return 0;
}
return 0;
}
@@
-748,6
+764,13
@@
eth_dev_close(struct rte_eth_dev *dev)
struct pcap_rx_queue *pcap_q = &internals->rx_queue[i];
struct rte_mbuf *pcap_buf;
struct pcap_rx_queue *pcap_q = &internals->rx_queue[i];
struct rte_mbuf *pcap_buf;
+ /*
+ * 'pcap_q->pkts' can be NULL if 'eth_dev_close()'
+ * called before 'eth_rx_queue_setup()' has been called
+ */
+ if (pcap_q->pkts == NULL)
+ continue;
+
while (!rte_ring_dequeue(pcap_q->pkts,
(void **)&pcap_buf))
rte_pktmbuf_free(pcap_buf);
while (!rte_ring_dequeue(pcap_q->pkts,
(void **)&pcap_buf))
rte_pktmbuf_free(pcap_buf);
@@
-1149,6
+1172,7
@@
pmd_init_internals(struct rte_vdev_device *vdev,
data->mac_addrs = &(*internals)->eth_addr;
data->promiscuous = 1;
data->all_multicast = 1;
data->mac_addrs = &(*internals)->eth_addr;
data->promiscuous = 1;
data->all_multicast = 1;
+ data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
/*
* NOTE: we'll replace the data element, of originally allocated
/*
* NOTE: we'll replace the data element, of originally allocated
@@
-1334,7
+1358,6
@@
eth_from_pcaps(struct rte_vdev_device *vdev,
else
eth_dev->tx_pkt_burst = eth_tx_drop;
else
eth_dev->tx_pkt_burst = eth_tx_drop;
- eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
rte_eth_dev_probing_finish(eth_dev);
return 0;
}
rte_eth_dev_probing_finish(eth_dev);
return 0;
}
@@
-1417,7
+1440,8
@@
pmd_pcap_probe(struct rte_vdev_device *dev)
devargs_all.is_rx_pcap =
rte_kvargs_count(kvlist, ETH_PCAP_RX_PCAP_ARG) ? 1 : 0;
devargs_all.is_rx_iface =
devargs_all.is_rx_pcap =
rte_kvargs_count(kvlist, ETH_PCAP_RX_PCAP_ARG) ? 1 : 0;
devargs_all.is_rx_iface =
- rte_kvargs_count(kvlist, ETH_PCAP_RX_IFACE_ARG) ? 1 : 0;
+ (rte_kvargs_count(kvlist, ETH_PCAP_RX_IFACE_ARG) +
+ rte_kvargs_count(kvlist, ETH_PCAP_RX_IFACE_IN_ARG)) ? 1 : 0;
pcaps.num_of_queue = 0;
devargs_all.is_tx_pcap =
pcaps.num_of_queue = 0;
devargs_all.is_tx_pcap =