dpdk - 使用 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。我怎样才能将我的数据包发送到传入的方式?
谢谢
解决方案
选项1
:简单的方法(但会影响性能)
通过获取数据包
rte_eth_rx_burst
迭代数据包,更新 dest_port = PacketHandler() ?mbufs[idx]->port : (mbufs[idx]->port ^ 1)
rte_eth_tx_burst
用with发送数据包dest_port
注释掉下面的 tx_burst 通用调用。
选项2
:
创建 2 个 mbuf-array,即 mbufs_inport 和 mbufs_outport。
迭代数据包,调用 PacketHandler()。匹配的数据包去
mbufs_inport
和不匹配的去mbufs_outport
调用
rte_eth_tx_burst
formbufs_inport
和mbufs_outprt
。
选项3
:
注册 rx-callback 以过滤数据包
packethandler
。现在您可以选择根据
mbuf->portid
. 而不匹配的数据包继续在主循环中。如果担心
packet order
orprevious packets needs to be processed
,请使用mbuf-udata64
作为出口端口的占位符。对于不匹配的情况,设置为-1
. 然后在主循环中,您必须将数据包的 tx_burst 转换为n
对每个数据包进行迭代,因为您必须检查udata64
值。
推荐阅读
- c# - 存储获取 blob TaskCanceledException
- ios - UITableView 的 Item 向下滚动后改变颜色,然后备份 Swift
- bash - 如何在 bash 文件中尝试并捕获?
- angular - 向 ng-container 添加动画
- html - 在 react-quill 编辑器中直接输入 HTML 标记
- numpy - 如何将 numpy 数组作为逻辑回归的输入?
- php - PHPExcel:某些行在导入时未在我的 .xls 文件中导出,但在我回显输出时显示?
- c# - 如何找出哪个Windows进程正在使用文件?
- javascript - 如何确定同一数组中是否存在重复值?
- php - 如何在 laravel 中为我的购物项目创建 cms 用户类型和常规配置文件