0x01 緣由
繼續學習DPDK相關例子。此例子為用使用者定義的回調函數來為所有接收的資料包添加時間戳,計算每個資料包轉發的時間。
0x02 源碼
此例子與上篇《DPDK-實戰之skeleton(basicfwd)》有一點點不同,此處僅列出不同之處。
static inline int
port_init(uint8_t port, struct rte_mempool *mbuf_pool)
{
/*.....*/
//此處添加連個回調函數,一個使用者接收資料包(add_timestamps 添加時間戳),一個用于發送資料包(calc_latency 計算延遲)
rte_eth_add_rx_callback(port, 0, add_timestamps, NULL);
rte_eth_add_tx_callback(port, 0, calc_latency, NULL);
return 0;
}
static uint16_t
add_timestamps(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
struct rte_mbuf **pkts, uint16_t nb_pkts,
uint16_t max_pkts __rte_unused, void *_ __rte_unused)
{
unsigned i;
uint64_t now = rte_rdtsc();
for (i = 0; i < nb_pkts; i++)
pkts[i]->udata64 = now;
return nb_pkts;
}
static uint16_t
calc_latency(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
struct rte_mbuf **pkts, uint16_t nb_pkts, void *_ __rte_unused)
{
uint64_t cycles = 0;
uint64_t now = rte_rdtsc();
unsigned i;
for (i = 0; i < nb_pkts; i++)
cycles += now - pkts[i]->udata64;
latency_numbers.total_cycles += cycles;
latency_numbers.total_pkts += nb_pkts;
if (latency_numbers.total_pkts > (100 * 1000 * 1000ULL)) {
printf("Latency = %"PRIu64" cycles\n", /* PRIu64 為一個宏 列印64位整形值*/
latency_numbers.total_cycles / latency_numbers.total_pkts);
latency_numbers.total_cycles = latency_numbers.total_pkts = 0;
}
return nb_pkts;
}
0x03 總結
例子比較簡單,但是所有的基礎知識都是由簡單到難循序漸進的。