---
name: "rte_event_timer_remaining_ticks_get"
section: "3"
platform: "linux"
package: "dpdk-doc"
version: "24.11.4-0+deb13u1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/rte_event_timer_adapter.h"
---

# rte\_event\_timer\_remaining\_ticks\_get(3)

Part of [rte\_event\_timer\_adapter.h(3)](/rte_event_timer_adapter.h/3.md).

## NAME

rte\_event\_timer\_adapter.h

## SYNOPSIS

`#include 'rte_eventdev.h'`\
 `#include 'rte_eventdev_trace_fp.h'`\

### Data Structures

struct **rte\_event\_timer\_adapter\_conf**\
 struct **rte\_event\_timer\_adapter\_stats**\
 struct **rte\_event\_timer\_adapter\_info**\
 struct **rte\_event\_timer**\

### Macros

\#define **RTE\_EVENT\_TIMER\_ADAPTER\_F\_ADJUST\_RES**   (1ULL \<\< 0)\
 \#define **RTE\_EVENT\_TIMER\_ADAPTER\_F\_SP\_PUT**   (1ULL \<\< 1)\
 \#define **RTE\_EVENT\_TIMER\_ADAPTER\_F\_PERIODIC**   (1ULL \<\< 2)\

### Typedefs

**typedef** int(\* **rte\_event\_timer\_adapter\_port\_conf\_cb\_t**) (uint16\_t id, uint8\_t event\_dev\_id, uint8\_t \*event\_port\_id, void \*conf\_arg)\

### Enumerations

enum **rte\_event\_timer\_adapter\_clk\_src** { **RTE\_EVENT\_TIMER\_ADAPTER\_CPU\_CLK**, **RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK0**, **RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK1**, **RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK2**, **RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK3** }\
 enum **rte\_event\_timer\_state** { **RTE\_EVENT\_TIMER\_NOT\_ARMED** = 0, **RTE\_EVENT\_TIMER\_ARMED** = 1, **RTE\_EVENT\_TIMER\_CANCELED** = 2, **RTE\_EVENT\_TIMER\_ERROR** = -1, **RTE\_EVENT\_TIMER\_ERROR\_TOOEARLY** = -2, **RTE\_EVENT\_TIMER\_ERROR\_TOOLATE** = -3 }\

### Functions

struct rte\_event\_timer\_adapter \* **rte\_event\_timer\_adapter\_create** (const struct **rte\_event\_timer\_adapter\_conf** \*conf)\
 struct rte\_event\_timer\_adapter \* **rte\_event\_timer\_adapter\_create\_ext** (const struct **rte\_event\_timer\_adapter\_conf** \*conf, **rte\_event\_timer\_adapter\_port\_conf\_cb\_t** conf\_cb, void \*conf\_arg)\
 int **rte\_event\_timer\_adapter\_get\_info** (const struct rte\_event\_timer\_adapter \*adapter, struct **rte\_event\_timer\_adapter\_info** \*adapter\_info)\
 int **rte\_event\_timer\_adapter\_start** (const struct rte\_event\_timer\_adapter \*adapter)\
 int **rte\_event\_timer\_adapter\_stop** (const struct rte\_event\_timer\_adapter \*adapter)\
 struct rte\_event\_timer\_adapter \* **rte\_event\_timer\_adapter\_lookup** (uint16\_t adapter\_id)\
 int **rte\_event\_timer\_adapter\_free** (struct rte\_event\_timer\_adapter \*adapter)\
 int **rte\_event\_timer\_adapter\_service\_id\_get** (struct rte\_event\_timer\_adapter \*adapter, uint32\_t \*service\_id)\
 int **rte\_event\_timer\_adapter\_stats\_get** (struct rte\_event\_timer\_adapter \*adapter, struct **rte\_event\_timer\_adapter\_stats** \*stats)\
 int **rte\_event\_timer\_adapter\_stats\_reset** (struct rte\_event\_timer\_adapter \*adapter)\
 static uint16\_t **rte\_event\_timer\_arm\_burst** (const struct rte\_event\_timer\_adapter \*adapter, struct **rte\_event\_timer** \*\*evtims, uint16\_t nb\_evtims)\
 static uint16\_t **rte\_event\_timer\_arm\_tmo\_tick\_burst** (const struct rte\_event\_timer\_adapter \*adapter, struct **rte\_event\_timer** \*\*evtims, const uint64\_t timeout\_ticks, const uint16\_t nb\_evtims)\
 static uint16\_t **rte\_event\_timer\_cancel\_burst** (const struct rte\_event\_timer\_adapter \*adapter, struct **rte\_event\_timer** \*\*evtims, uint16\_t nb\_evtims)\
 \_\_rte\_experimental int **rte\_event\_timer\_remaining\_ticks\_get** (const struct rte\_event\_timer\_adapter \*adapter, const struct **rte\_event\_timer** \*evtim, uint64\_t \*ticks\_remaining)\

## Detailed Description

RTE Event Timer Adapter

An event timer adapter has the following abstract working model:

```
                          timer_tick_ns
                              +
                 +-------+    |
                 |       |    |
         +-------+ bkt 0 +----v---+
         |       |       |        |
         |       +-------+        |
     +---+---+                +---+---+  +---+---+---+---+
     |       |                |       |  |   |   |   |   |
     | bkt n |                | bkt 1 |<-> t0| t1| t2| tn|
     |       |                |       |  |   |   |   |   |
     +---+---+                +---+---+  +---+---+---+---+
         |     Timer adapter      |
     +---+---+                +---+---+
     |       |                |       |
     | bkt 4 |                | bkt 2 |<--- Current bucket
     |       |                |       |
     +---+---+                +---+---+
          |      +-------+       |
          |      |       |       |
          +------+ bkt 3 +-------+
                 |       |
                 +-------+
```

- •

  It has a virtual monotonically increasing 64-bit timer adapter clock based on *enum rte\_event\_timer\_adapter\_clk\_src* clock source. The clock source could be a CPU clock, or a platform dependent external clock.

- •

  The application creates a timer adapter instance with given the clock source, the total number of event timers, and a resolution(expressed in ns) to traverse between the buckets.

- •

  Each timer adapter may have 0 to n buckets based on the configured max timeout(max\_tmo\_ns) and resolution(timer\_tick\_ns). Upon starting the timer adapter, the adapter starts ticking at *timer\_tick\_ns* resolution.

- •

  The application arms an event timer that will expire *timer\_tick\_ns* from now.

- •

  The application can cancel an armed timer and no timer expiry event will be generated.

- •

  If a timer expires then the library injects the timer expiry event in the designated event queue.

- •

  The timer expiry event will be received through *rte\_event\_dequeue\_burst*.

- •

  The application frees the timer adapter instance.

Multiple timer adapters can be created with a varying level of resolution for various expiry use cases that run in parallel.

Before using the timer adapter, the application has to create and configure an event device along with the event port. Based on the event device capability it might require creating an additional event port to be used by the timer adapter.

The application creates the event timer adapter using the **rte\_event\_timer\_adapter\_create(). The event device id is passed to this function, inside this function the event device capability is checked, and if an in-built port is absent the application uses the default function to create a new producer port.**

**The application may also use the function rte\_event\_timer\_adapter\_create\_ext() to have granular control over producer port creation in a case where the in-built port is absent.**

**After creating the timer adapter, the application has to start it using rte\_event\_timer\_adapter\_start(). The buckets are traversed from 0 to n; when the adapter ticks, the next bucket is visited. Each time, the list per bucket is processed, and timer expiry events are sent to the designated event queue.**

**The application can arm one or more event timers using the rte\_event\_timer\_arm\_burst(). The** *timeout\_ticks* **represents the number of** *timer\_tick\_ns* **after which the timer has to expire. The timeout at which the timers expire can be grouped or be independent of each event timer instance. rte\_event\_timer\_arm\_tmo\_tick\_burst() addresses the former case and rte\_event\_timer\_arm\_burst() addresses the latter case.**

**The application can cancel the timers from expiring using the rte\_event\_timer\_cancel\_burst().**

**On the secondary process, rte\_event\_timer\_adapter\_lookup() can be used to get the timer adapter pointer from its id and use it to invoke fastpath operations such as arm and cancel.**

**Some of the use cases of event timer adapter are Beacon Timers, Generic SW Timeout, Wireless MAC Scheduling, 3G Frame Protocols, Packet Scheduling, Protocol Retransmission Timers, Supervision Timers. All these use cases require high resolution and low time drift.**

**Definition in file rte\_event\_timer\_adapter.h.**

## Macro Definition Documentation

### #define RTE\_EVENT\_TIMER\_ADAPTER\_F\_ADJUST\_RES (1ULL \<\< 0)

**The event timer adapter implementation may have constraints on the resolution (timer\_tick\_ns) and maximum timer expiry timeout(max\_tmo\_ns) based on the given timer adapter or system. If this flag is set, the implementation adjusts the resolution and maximum timeout to the best possible configuration. On successful timer adapter creation, the application can get the configured resolution and max timeout with rte\_event\_timer\_adapter\_get\_info().**

**See also**

**struct rte\_event\_timer\_adapter\_info::min\_resolution\_ns**

**struct rte\_event\_timer\_adapter\_info::max\_tmo\_ns**

**Definition at line 145 of file rte\_event\_timer\_adapter.h.**

### #define RTE\_EVENT\_TIMER\_ADAPTER\_F\_SP\_PUT (1ULL \<\< 1)

**rte\_event\_timer\_arm\_burst() API to be used in single producer mode.**

**See also**

**struct rte\_event\_timer\_adapter\_conf::flags**

**Definition at line 150 of file rte\_event\_timer\_adapter.h.**

### #define RTE\_EVENT\_TIMER\_ADAPTER\_F\_PERIODIC (1ULL \<\< 2)

**Flag to configure an event timer adapter in periodic mode; non-periodic mode is the default. A timer will fire once or periodically until the timer is cancelled based on the adapter mode.**

**See also**

**struct rte\_event\_timer\_adapter\_conf::flags**

**Definition at line 158 of file rte\_event\_timer\_adapter.h.**

## Typedef Documentation

### typedef int(\* rte\_event\_timer\_adapter\_port\_conf\_cb\_t) (uint16\_t id, uint8\_t event\_dev\_id, uint8\_t \*event\_port\_id, void \*conf\_arg)

**Callback function type for producer port creation.**

**Definition at line 205 of file rte\_event\_timer\_adapter.h.**

## Enumeration Type Documentation

### enum rte\_event\_timer\_adapter\_clk\_src

**Timer adapter clock source**

**Enumerator**

- *RTE\_EVENT\_TIMER\_ADAPTER\_CPU\_CLK*

  *Use CPU clock as the clock source.*

- *RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK0*

  *Platform dependent external clock source 0.*

- *RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK1*

  *Platform dependent external clock source 1.*

- *RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK2*

  *Platform dependent external clock source 2.*

- *RTE\_EVENT\_TIMER\_ADAPTER\_EXT\_CLK3*

  *Platform dependent external clock source 3.*

*Definition at line* **121** *of file* **rte\_event\_timer\_adapter.h***.*

### enum rte\_event\_timer\_state

*Event timer state.*

**Enumerator**

- *RTE\_EVENT\_TIMER\_NOT\_ARMED*

  *Event timer not armed.*

- *RTE\_EVENT\_TIMER\_ARMED*

  *Event timer successfully armed.*

- *RTE\_EVENT\_TIMER\_CANCELED*

  *Event timer successfully canceled.*

- *RTE\_EVENT\_TIMER\_ERROR*

  *Generic event timer error.*

- *RTE\_EVENT\_TIMER\_ERROR\_TOOEARLY*

  *Event timer timeout tick value is too small for the adapter to handle, given its configured resolution.*

- *RTE\_EVENT\_TIMER\_ERROR\_TOOLATE*

  *Event timer timeout tick is greater than the maximum timeout.*

*Definition at line* **455** *of file* **rte\_event\_timer\_adapter.h***.*

## Function Documentation

### struct rte\_event\_timer\_adapter \* rte\_event\_timer\_adapter\_create (const struct rte\_event\_timer\_adapter\_conf \* conf)

*Create an event timer adapter.*

*This function must be invoked first before any other function in the API.*

*When this API is used for creating adapter instance,* **rte\_event\_dev\_config::nb\_event\_ports is automatically incremented, and the event device is reconfigured with additional event port during service initialization. This event device reconfigure logic also increments the rte\_event\_dev\_config::nb\_single\_link\_event\_port\_queues parameter if the adapter event port config is of type** `RTE_EVENT_PORT_CFG_SINGLE_LINK`**.**

**Application no longer needs to account for rte\_event\_dev\_config::nb\_event\_ports and rte\_event\_dev\_config::nb\_single\_link\_event\_port\_queues parameters required for Timer adapter in event device configuration when the adapter is created with this API.**

**Parameters**

*conf* **The event timer adapter configuration structure.**

**Returns**

**A pointer to the new allocated event timer adapter on success. NULL on error with rte\_errno set appropriately. Possible rte\_errno values include:**

- •

  **ERANGE: timer\_tick\_ns is not in supported range.**

- •

  **ENOMEM: unable to allocate sufficient memory for adapter instances**

- •

  **EINVAL: invalid event device identifier specified in config**

- •

  **ENOSPC: maximum number of adapters already created**

- •

  **EIO: event device reconfiguration and restart error. The adapter reconfigures the event device with an additional port by default if it is required to use a service to manage timers. If the device had been started before this call, this error code indicates an error in restart following an error in reconfiguration, i.e., a combination of the two error codes.**

### struct rte\_event\_timer\_adapter \* rte\_event\_timer\_adapter\_create\_ext (const struct rte\_event\_timer\_adapter\_conf \* conf, rte\_event\_timer\_adapter\_port\_conf\_cb\_t conf\_cb, void \* conf\_arg)

**Create a timer adapter with the supplied callback.**

**This function can be used to have a more granular control over the timer adapter creation. If a built-in port is absent, then the function uses the callback provided to create and get the port id to be used as a producer port.**

**Parameters**

*conf* **The timer adapter configuration structure** \
 *conf\_cb* **The port config callback function.** \
 *conf\_arg* **Opaque pointer to the argument for the callback function**

**Returns**

**A pointer to the new allocated event timer adapter on success. NULL on error with rte\_errno set appropriately. Possible rte\_errno values include:**

- •

  **ERANGE: timer\_tick\_ns is not in supported range.**

- •

  **ENOMEM: unable to allocate sufficient memory for adapter instances**

- •

  **EINVAL: invalid event device identifier specified in config**

- •

  **ENOSPC: maximum number of adapters already created**

### int rte\_event\_timer\_adapter\_get\_info (const struct rte\_event\_timer\_adapter \* adapter, struct rte\_event\_timer\_adapter\_info \* adapter\_info)

**Retrieve the contextual information of an event timer adapter.**

**Parameters**

*adapter* **A pointer to the event timer adapter structure.**\
 *adapter\_info* **A pointer to a structure of type rte\_event\_timer\_adapter\_info to be filled with the contextual information of the adapter.**

**Returns**

- •

  **0: Success, driver updates the contextual information of the timer adapter**

- •

  **\<0: Error code returned by the driver info get function.**

- •

  **-EINVAL: adapter identifier invalid**

**See also**

**RTE\_EVENT\_TIMER\_ADAPTER\_F\_ADJUST\_RES, struct rte\_event\_timer\_adapter\_info**

### int rte\_event\_timer\_adapter\_start (const struct rte\_event\_timer\_adapter \* adapter)

**Start a timer adapter.**

**The adapter start step is the last one and consists of setting the timer adapter to start accepting the timers and schedules to event queues.**

**On success, all basic functions exported by the API (timer arm, timer cancel and so on) can be invoked.**

**Parameters**

*adapter* **A pointer to the event timer adapter structure.**

**Returns**

- •

  **0: Success, adapter started.**

- •

  **\<0: Error code returned by the driver start function.**

- •

  **-EINVAL if adapter identifier invalid**

- •

  **-ENOENT if software adapter but no service core mapped**

- •

  **-ENOTSUP if software adapter and more than one service core mapped**

- •

  **-EALREADY if adapter has already been started**

**Note**

**The eventdev to which the event\_timer\_adapter is connected needs to be started before calling rte\_event\_timer\_adapter\_start().**

### int rte\_event\_timer\_adapter\_stop (const struct rte\_event\_timer\_adapter \* adapter)

**Stop an event timer adapter.**

**The adapter can be restarted with a call to rte\_event\_timer\_adapter\_start().**

**Parameters**

*adapter* **A pointer to the event timer adapter structure.**

**Returns**

- •

  **0: Success, adapter stopped.**

- •

  **\<0: Error code returned by the driver stop function.**

- •

  **-EINVAL if adapter identifier invalid**

### struct rte\_event\_timer\_adapter \* rte\_event\_timer\_adapter\_lookup (uint16\_t adapter\_id)

**Lookup an event timer adapter using its identifier.**

**If an event timer adapter was created in another process with the same identifier, this function will locate its state and set up access to it so that it can be used in this process.**

**Parameters**

*adapter\_id* **The event timer adapter identifier.**

**Returns**

**A pointer to the event timer adapter matching the identifier on success. NULL on error with rte\_errno set appropriately. Possible rte\_errno values include:**

- •

  **ENOENT - requested entry not available to return.**

### int rte\_event\_timer\_adapter\_free (struct rte\_event\_timer\_adapter \* adapter)

**Free an event timer adapter.**

**Destroy an event timer adapter, freeing all resources.**

**Before invoking this function, the application must wait for all the armed timers to expire or cancel the outstanding armed timers.**

**Parameters**

*adapter* **A pointer to an event timer adapter structure.**

**Returns**

- •

  **0: Successfully freed the event timer adapter resources.**

- •

  **\<0: Failed to free the event timer adapter resources.**

- •

  **-EAGAIN: adapter is busy; timers outstanding**

- •

  **-EBUSY: stop hasn't been called for this adapter yet**

- •

  **-EINVAL: adapter id invalid, or adapter invalid**

### int rte\_event\_timer\_adapter\_service\_id\_get (struct rte\_event\_timer\_adapter \* adapter, uint32\_t \* service\_id)

**Retrieve the service ID of the event timer adapter. If the adapter doesn't use an rte\_service function, this function returns -ESRCH.**

**Parameters**

*adapter* **A pointer to an event timer adapter.**\
 *service\_id* **A pointer to a uint32\_t, to be filled in with the service id.**

**Returns**

- •

  **0: Success**

- •

  **\<0: Error code on failure**

- •

  **-ESRCH: the adapter does not require a service to operate**

### int rte\_event\_timer\_adapter\_stats\_get (struct rte\_event\_timer\_adapter \* adapter, struct rte\_event\_timer\_adapter\_stats \* stats)

**Retrieve statistics for an event timer adapter instance.**

**Parameters**

*adapter* **A pointer to an event timer adapter structure.** \
 *stats* **A pointer to a structure to fill with statistics.**

**Returns**

- •

  **0: Successfully retrieved.**

- •

  **\<0: Failure; error code returned.**

### int rte\_event\_timer\_adapter\_stats\_reset (struct rte\_event\_timer\_adapter \* adapter)

**Reset statistics for an event timer adapter instance.**

**Parameters**

*adapter* **A pointer to an event timer adapter structure.**

**Returns**

- •

  **0: Successfully reset;**

- •

  **\<0: Failure; error code returned.**

### static uint16\_t rte\_event\_timer\_arm\_burst (const struct rte\_event\_timer\_adapter \* adapter, struct rte\_event\_timer \*\* evtims, uint16\_t nb\_evtims)` [inline]`, ` [static]`

**Arm a burst of event timers with separate expiration timeout tick for each event timer.**

**Before calling this function, the application allocates** `struct `**rte\_event\_timer objects from mempool or huge page backed application buffers of desired size. On successful allocation, application updates the** `struct `**rte\_event\_timer attributes such as expiry event attributes, timeout ticks from now. This function submits the event timer arm requests to the event timer adapter and on expiry, the events will be injected to designated event queue. Timer expiry events will be generated once or periodically until cancellation based on the adapter mode.**

**Parameters**

*adapter* **A pointer to an event timer adapter structure.** \
 *evtims* **Pointer to an array of objects of type rte\_event\_timer structure.** \
 *nb\_evtims* **Number of event timers in the supplied array.**

**Returns**

**The number of successfully armed event timers. The return value can be less than the value of the** *nb\_evtims* **parameter. If the return value is less than** *nb\_evtims***, the remaining event timers at the end of** *evtims* **are not consumed, and the caller has to take care of them, and rte\_errno is set accordingly. Possible errno values include:**

- •

  **EINVAL Invalid timer adapter, expiry event queue ID is invalid, or an expiry event's sched type doesn't match the capabilities of the destination event queue.**

- •

  **EAGAIN Specified timer adapter is not running**

- •

  **EALREADY A timer was encountered that was already armed**

**See also**

**RTE\_EVENT\_TIMER\_ADAPTER\_F\_PERIODIC**

**Definition at line 598 of file rte\_event\_timer\_adapter.h.**

### static uint16\_t rte\_event\_timer\_arm\_tmo\_tick\_burst (const struct rte\_event\_timer\_adapter \* adapter, struct rte\_event\_timer \*\* evtims, const uint64\_t timeout\_ticks, const uint16\_t nb\_evtims)` [inline]`, ` [static]`

**Arm a burst of event timers with same expiration timeout tick.**

**Provides the same functionality as rte\_event\_timer\_arm\_burst(), except that application can use this API when all the event timers have the same timeout expiration tick. This specialized function can provide the additional hint to the adapter implementation and optimize if possible.**

**Parameters**

*adapter* **A pointer to an event timer adapter structure.** \
 *evtims* **Points to an array of objects of type rte\_event\_timer structure.** \
 *timeout\_ticks* **The number of ticks in which the timers should expire.** \
 *nb\_evtims* **Number of event timers in the supplied array.**

**Returns**

**The number of successfully armed event timers. The return value can be less than the value of the** *nb\_evtims* **parameter. If the return value is less than** *nb\_evtims***, the remaining event timers at the end of** *evtims* **are not consumed, and the caller has to take care of them, and rte\_errno is set accordingly. Possible errno values include:**

- •

  **EINVAL Invalid timer adapter, expiry event queue ID is invalid, or an expiry event's sched type doesn't match the capabilities of the destination event queue.**

- •

  **EAGAIN Specified event timer adapter is not running**

- •

  **EALREADY A timer was encountered that was already armed**

**Definition at line 641 of file rte\_event\_timer\_adapter.h.**

### static uint16\_t rte\_event\_timer\_cancel\_burst (const struct rte\_event\_timer\_adapter \* adapter, struct rte\_event\_timer \*\* evtims, uint16\_t nb\_evtims)` [inline]`, ` [static]`

**Cancel a burst of event timers from being scheduled to the event device.**

**Parameters**

*adapter* **A pointer to an event timer adapter structure.** \
 *evtims* **Points to an array of objects of type rte\_event\_timer structure** \
 *nb\_evtims* **Number of event timer instances in the supplied array.**

**Returns**

**The number of successfully canceled event timers. The return value can be less than the value of the** *nb\_evtims* **parameter. If the return value is less than** *nb\_evtims***, the remaining event timers at the end of** *evtims* **are not consumed, and the caller has to take care of them, and rte\_errno is set accordingly. Possible errno values include:**

- •

  **EINVAL Invalid timer adapter identifier**

- •

  **EAGAIN Specified timer adapter is not running**

- •

  **EALREADY A timer was encountered that was already canceled**

**Definition at line 678 of file rte\_event\_timer\_adapter.h.**

### \_\_rte\_experimental int rte\_event\_timer\_remaining\_ticks\_get (const struct rte\_event\_timer\_adapter \* adapter, const struct rte\_event\_timer \* evtim, uint64\_t \* ticks\_remaining)

**Get the number of ticks remaining until event timer expiry.**

**Parameters**

*adapter* **A pointer to an event timer adapter structure** \
 *evtim* **A pointer to an rte\_event\_timer structure** \
 *ticks\_remaining* **Pointer to variable into which to write the number of ticks remaining until event timer expiry**

**Returns**

- •

  **0: Success**

- •

  **-EINVAL Invalid timer adapter identifier or the event timer is not in the armed state or ticks\_remaining is NULL**

- •

  **-ENOTSUP The timer adapter implementation does not support this API.**

## Author

**Generated automatically by Doxygen for DPDK from the source code.**
