使用 DPDK 基本 FWD 示例如何将自定义数据包发送到所需端口



要求:我想利用DPDK basicfwd,将自定义回复发回传入端口。

解释:

DPDK 端口:端口 0 和端口 1 示例代码:编辑 DPDK 基本代码。 自定义功能:PacketHandler()要求:有时我需要将自定义数据包(一种 RST 数据包)发送到传入端口。

示例:Port-0 -> RX burst -> PacketHandler() -> normal packets fwd to Port-1, special packets send back to Port-0

代码片段:

while (isRun) {
num_rx = rte_eth_rx_burst(port_id, queue_id, mbufs, BURST_SIZE);
if (num_rx == 0) {
continue;
}
num_tx = 0;
for (int idx = 0; idx < num_rx; idx++) {
struct pcap_pkthdr pktHdr;
gettimeofday(&pktHdr.ts, NULL);
pktHdr.caplen = rte_pktmbuf_pkt_len(mbufs[idx]);
pktHdr.len = rte_pktmbuf_pkt_len(mbufs[idx]);
if (PacketHandler(&pktHdr, rte_pktmbuf_mtod(mbufs[idx], unsigned char *)) > 1) {
printf("Blocked Packets, do not fwd");
//TODO: send custom packet to incoming way
rte_pktmbuf_free(mbufs[idx]);
continue;
}
txbufs[num_tx++] = mbufs[idx];            
}
if (num_tx > 0) {
sent = rte_eth_tx_burst(port_id ^ 1, queue_id, txbufs, num_tx);
for (int idx = sent; idx < num_tx; idx++) {
rte_pktmbuf_free(txbufs[idx]);
}
}
}

我的自定义数据包类型是u_char。如何将我的数据包发送到传入方式?

谢谢

选项1: 简单的方法(但会影响性能)

  1. 通过rte_eth_rx_burst获取数据包

  2. 迭代数据包,以更新dest_port = PacketHandler() ? mbufs[idx]->port
  3. : (mbufs[idx]->port ^ 1)

  4. 使用dest_port发送带有rte_eth_tx_burst的数据包

  5. 注释掉下面的tx_burst通用调用。

选项2

  1. 创建 2 个 mbof 阵列,即 mbufs_inport 和 mbufs_outport。

  2. 迭代数据包,以调用 PacketHandler()。匹配的数据包转到mbufs_inport,不匹配的数据包转到mbufs_outport

  3. mbufs_inportmbufs_outprt调用rte_eth_tx_burst

选项3

  1. 注册 rx 回调以使用packethandler过滤数据包。

  2. 现在,您可以选择根据mbuf->portid直接发回选定的邮件。而不匹配的数据包继续在主环路中。

  3. 如果担心packet orderprevious packets needs to be processed,请使用mbuf-udata64作为出口端口的占位符。对于不匹配的情况,集合为-1。然后在主循环中,您有n数据包的转换tx_burst,以迭代每个数据包,因为您必须检查udata64值。

最新更新