Skip to main content

retina_core/dpdk/
mod.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(unused)]
5// TODO: Why does bindgen generate functions with u128 return types?
6#![allow(improper_ctypes)]
7
8include!(concat!(env!("OUT_DIR"), "/dpdk.rs"));
9
10use std::os::raw::{c_char, c_int, c_uint, c_void};
11
12#[link(name = "inlined")]
13extern "C" {
14    fn rte_pktmbuf_free_(packet: *const rte_mbuf);
15    fn rte_pktmbuf_alloc_(mp: *mut rte_mempool) -> *mut rte_mbuf;
16    fn rte_eth_tx_burst_(
17        port_id: u16,
18        queue_id: u16,
19        tx_pkts: *mut *mut rte_mbuf,
20        nb_pkts: u16,
21    ) -> u16;
22    fn rte_eth_rx_burst_(
23        port_id: u16,
24        queue_id: u16,
25        rx_pkts: *mut *mut rte_mbuf,
26        nb_pkts: u16,
27    ) -> u16;
28    fn rte_mbuf_refcnt_read_(m: *const rte_mbuf) -> u16;
29    fn rte_mbuf_refcnt_update_(m: *mut rte_mbuf, value: i16) -> u16;
30    fn rte_pktmbuf_adj_(packet: *mut rte_mbuf, len: u16) -> *mut c_char;
31    fn rte_pktmbuf_trim_(packet: *mut rte_mbuf, len: u16) -> c_int;
32    fn rte_lcore_id_() -> u16;
33    fn rte_rdtsc_() -> u64;
34    fn rte_ring_enqueue_(ring: *mut rte_ring, obj: *mut c_void) -> c_int;
35    fn rte_ring_sp_enqueue_(ring: *mut rte_ring, obj: *mut c_void) -> c_int;
36    fn rte_ring_mp_enqueue_(ring: *mut rte_ring, obj: *mut c_void) -> c_int;
37    fn rte_ring_dequeue_(ring: *mut rte_ring, obj_p: *mut *mut c_void) -> c_int;
38    fn rte_ring_sc_dequeue_(ring: *mut rte_ring, obj_p: *mut *mut c_void) -> c_int;
39    fn rte_ring_mc_dequeue_(ring: *mut rte_ring, obj_p: *mut *mut c_void) -> c_int;
40    fn rte_ring_count_(ring: *const rte_ring) -> c_uint;
41    fn rte_ring_free_count_(ring: *const rte_ring) -> c_uint;
42    fn rte_ring_full_(ring: *const rte_ring) -> c_int;
43    fn rte_ring_empty_(ring: *const rte_ring) -> c_int;
44    fn rte_ring_get_size_(ring: *const rte_ring) -> c_uint;
45    fn rte_ring_get_capacity_(ring: *const rte_ring) -> c_uint;
46}
47
48#[cfg(feature = "mlx5")]
49#[link(name = "rte_net_mlx5")]
50extern "C" {
51    fn rte_pmd_mlx5_get_dyn_flag_names();
52}
53
54#[cfg(feature = "mlx5")]
55#[inline(never)]
56pub fn load_drivers() {
57    if std::env::var("DONT_SET_THIS").is_ok() {
58        unsafe {
59            rte_pmd_mlx5_get_dyn_flag_names();
60        }
61    }
62}
63
64#[cfg(not(feature = "mlx5"))]
65#[inline(never)]
66pub fn load_drivers() {}
67
68#[inline]
69pub unsafe fn rte_pktmbuf_free(packet: *const rte_mbuf) {
70    rte_pktmbuf_free_(packet)
71}
72
73#[inline]
74pub unsafe fn rte_pktmbuf_alloc(mp: *mut rte_mempool) -> *mut rte_mbuf {
75    rte_pktmbuf_alloc_(mp)
76}
77
78#[inline]
79pub unsafe fn rte_eth_tx_burst(
80    port_id: u16,
81    queue_id: u16,
82    tx_pkts: *mut *mut rte_mbuf,
83    nb_pkts: u16,
84) -> u16 {
85    rte_eth_tx_burst_(port_id, queue_id, tx_pkts, nb_pkts)
86}
87
88#[inline]
89pub unsafe fn rte_eth_rx_burst(
90    port_id: u16,
91    queue_id: u16,
92    rx_pkts: *mut *mut rte_mbuf,
93    nb_pkts: u16,
94) -> u16 {
95    rte_eth_rx_burst_(port_id, queue_id, rx_pkts, nb_pkts)
96}
97
98#[inline]
99pub unsafe fn rte_mbuf_refcnt_read(m: *const rte_mbuf) -> u16 {
100    rte_mbuf_refcnt_read_(m)
101}
102
103#[inline]
104pub unsafe fn rte_mbuf_refcnt_update(m: *mut rte_mbuf, value: i16) -> u16 {
105    rte_mbuf_refcnt_update_(m, value)
106}
107
108#[inline]
109pub unsafe fn rte_pktmbuf_adj(packet: *mut rte_mbuf, len: u16) -> *mut c_char {
110    rte_pktmbuf_adj_(packet, len)
111}
112
113#[inline]
114pub unsafe fn rte_pktmbuf_trim(packet: *mut rte_mbuf, len: u16) -> c_int {
115    rte_pktmbuf_trim_(packet, len)
116}
117/// Returns the application thread ID of the execution unit.
118///
119/// In most cases, the lcore ID returned will correspond to the processor ID of the CPU
120/// on which the thread is pinned, but this will not be the case if the user has explicitly
121/// changed the thread-to-core affinities.
122///
123/// ## Remarks
124/// This is `unsafe` because it calls the DPDK `rte_lcore_id()` function via FFI. Use at your
125/// own risk.
126#[inline]
127pub unsafe fn rte_lcore_id() -> u16 {
128    rte_lcore_id_()
129}
130
131/// Reads the timestamp counter (TSC) register.
132///
133/// This is a low-overhead way to get CPU timing information, but may not be available on all
134/// platforms and could be imprecise. It should only be used to approximate cycle counts.
135///
136/// ## Remarks
137/// This is `unsafe` because it calls the DPDK `rte_rdtsc()` function via FFI. Use at your own risk.
138#[inline]
139pub unsafe fn rte_rdtsc() -> u64 {
140    rte_rdtsc_()
141}
142
143/* RTE_RING functions */
144
145#[inline]
146pub unsafe fn rte_ring_enqueue(ring: *mut rte_ring, obj: *mut c_void) -> c_int {
147    rte_ring_enqueue_(ring, obj)
148}
149
150#[inline]
151pub unsafe fn rte_ring_sp_enqueue(ring: *mut rte_ring, obj: *mut c_void) -> c_int {
152    rte_ring_sp_enqueue_(ring, obj)
153}
154
155#[inline]
156pub unsafe fn rte_ring_mp_enqueue(ring: *mut rte_ring, obj: *mut c_void) -> c_int {
157    rte_ring_mp_enqueue_(ring, obj)
158}
159
160#[inline]
161pub unsafe fn rte_ring_dequeue(ring: *mut rte_ring, obj_p: *mut *mut c_void) -> c_int {
162    rte_ring_dequeue_(ring, obj_p)
163}
164
165#[inline]
166pub unsafe fn rte_ring_sc_dequeue(ring: *mut rte_ring, obj_p: *mut *mut c_void) -> c_int {
167    rte_ring_sc_dequeue_(ring, obj_p)
168}
169
170#[inline]
171pub unsafe fn rte_ring_mc_dequeue(ring: *mut rte_ring, obj_p: *mut *mut c_void) -> c_int {
172    rte_ring_mc_dequeue_(ring, obj_p)
173}
174
175#[inline]
176pub unsafe fn rte_ring_count(ring: *const rte_ring) -> c_uint {
177    rte_ring_count_(ring)
178}
179
180#[inline]
181pub unsafe fn rte_ring_free_count(ring: *const rte_ring) -> c_uint {
182    rte_ring_free_count_(ring)
183}
184
185#[inline]
186pub unsafe fn rte_ring_full(ring: *const rte_ring) -> c_int {
187    rte_ring_full_(ring)
188}
189
190#[inline]
191pub unsafe fn rte_ring_empty(ring: *const rte_ring) -> c_int {
192    rte_ring_empty_(ring)
193}
194
195#[inline]
196pub unsafe fn rte_ring_get_size(ring: *const rte_ring) -> c_uint {
197    rte_ring_get_size_(ring)
198}
199
200#[inline]
201pub unsafe fn rte_ring_get_capacity(ring: *const rte_ring) -> c_uint {
202    rte_ring_get_capacity_(ring)
203}