首页 > 解决方案 > 使用 DPDK-basicfwd 示例如何将自定义数据包发送到所需端口

问题描述

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

解释:

DPDK 端口:Port-0 和 Port-1 示例代码:编辑 DPDK basicfwd。自定义功能: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。我怎样才能将我的数据包发送到传入的方式?

谢谢

标签: dpdk

解决方案


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

  1. 通过获取数据包rte_eth_rx_burst

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

  3. rte_eth_tx_burst用with发送数据包dest_port

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

选项2

  1. 创建 2 个 mbuf-array,即 mbufs_inport 和 mbufs_outport。

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

  3. 调用rte_eth_tx_burstformbufs_inportmbufs_outprt

选项3

  1. 注册 rx-callback 以过滤数据包packethandler

  2. 现在您可以选择根据mbuf->portid. 而不匹配的数据包继续在主循环中。

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


推荐阅读