[dpdk-dev,v9,2/8] ethdev: add new api to add Rx callback as head of the list

Message ID 1465897108-26548-3-git-send-email-reshma.pattan@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Commit Message

Pattan, Reshma June 14, 2016, 9:38 a.m. UTC
  Added new public api rte_eth_add_first_rx_callback to add given
callback as head of the list.

Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
---
 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(+)
  

Comments

Thomas Monjalon June 14, 2016, 8:01 p.m. UTC | #1
2016-06-14 10:38, Reshma Pattan:
> Added new public api rte_eth_add_first_rx_callback to add given
> callback as head of the list.
> 
> Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> ---
> +/*
> +* 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);

Sorry I fail to understand why this function is needed.
What cannot be done in rte_eth_add_rx_callback?
  
Pattan, Reshma June 14, 2016, 9:43 p.m. UTC | #2
Hi,

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Tuesday, June 14, 2016 9:02 PM
> To: Pattan, Reshma <reshma.pattan@intel.com>
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v9 2/8] ethdev: add new api to add Rx callback
> as head of the list
> 
> 2016-06-14 10:38, Reshma Pattan:
> > Added new public api rte_eth_add_first_rx_callback to add given
> > callback as head of the list.
> >
> > Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> > ---
> > +/*
> > +* 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);
> 
> Sorry I fail to understand why this function is needed.
> What cannot be done in rte_eth_add_rx_callback?

Packet capturing framework should display Rx packets of NIC even before they are being processed by other callbacks of the 
application (because other callback s of application may change the packet data as part of the processing).
So packet capturing framework should register  a callback at the head of the Rx callback list so that callback always gets 
called  first before any other callbacks of the applications.  Hence this API is introduced. 

Thanks,
Reshma
  

Patch

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(&rte_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(&rte_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;