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

2016-06-14 Thread Thomas Monjalon
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 
> ---
> +/*
> +* 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?


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

2016-06-14 Thread Pattan, Reshma
Hi,

> -Original Message-
> From: Thomas Monjalon [mailto:thomas.monjalon at 6wind.com]
> Sent: Tuesday, June 14, 2016 9:02 PM
> To: Pattan, Reshma 
> Cc: dev at 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 
> > ---
> > +/*
> > +* 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


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

2016-06-14 Thread 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 
---
 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(&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;
-- 
2.5.0