使用Lua脚本运行Pktgen

我目前正在使用 pktgen 实现项目的高速数据包生成。 我使用的是 2.9.5 版本的 pktgen,还有 DPDK 2.1.0 版本。它的工作完美 (我能够以 10 Gb/s 的速率生成和发送数据包),直到我尝试使用 lua 脚本格式化数据包。

实际上,您可以在源文件中找到的脚本示例似乎并不总是具有预期的行为。最简单的脚本可以正常工作 (例如 HelloWorld.lua,我也能够使用脚本命令设置数据包大小、速率或突发 )。

  package.path = package.path ..";?.lua;test/?.lua;app/?.lua;"
  2
  3 pktgen.set("all", "count", 0);
  4 pktgen.set("all", "rate", 50);
  5 pktgen.set("all", "size", 256);
  6 pktgen.set("all", "burst", 128);
  7 pktgen.start(0)

(上面的代码可以工作)

然而,当我尝试像这个示例中那样直接使用一个表来定义数据包格式时,我遇到了问题。

-- Lua uses '--' as comment to end of line read the
  2 -- manual for more comment options.
  3 local seq_table = {                     -- entries can be in any order
  4     ["eth_dst_addr"] = "0011:4455:6677",
  5     ["eth_src_addr"] = "0011:1234:5678",
  6     ["ip_dst_addr"] = "10.12.0.1",
  7     ["ip_src_addr"] = "10.12.0.1/16",   -- the 16 is the size of the mask va    lue
  8     ["sport"] = 9,                      -- Standard port numbers
  9     ["dport"] = 10,                     -- Standard port numbers
 10     ["ethType"] = "ipv4",       -- ipv4|ipv6|vlan
 11     ["ipProto"] = "udp",        -- udp|tcp|icmp
 12     ["vlanid"] = 1,                     -- 1 - 4095
 13     ["pktSize"] = 128           -- 64 - 1518
 14   };
 15 -- seqTable( seq#, portlist, table );
 16 pktgen.seqTable(0, "all", seq_table );
 17 pktgen.set("all", "seqCnt", 1);

当我尝试运行此脚本时,Pktgen 通常会给我一个 错误:未知的 Ethertype 0x0000 的错误,只要我尝试在命令行中启动 0 (0 是我用来传输数据包的端口)。当我尝试 main.lua 脚本时也会出现同样的问题。

长话短说,我很难理解 pktgen.seqtable 函数的工作原理,以及为什么在我的情况下它不起作用。我在网上没有找到任何真正有用的关于这个主题的文档。

我使用的启动脚本命令是:

sudo -E $PKTGEN_CMD/pktgen -c 0x7 -n 4 -- -m "1.0,2.1" -f test/set_seq.lua

(test/set_seq.lua 是一个脚本示例)。

点赞
用户7665972
用户7665972

我已经进行了小的修改,使得数据包生成中能够启用vlan,请参考以下更改:

 local seq_table = {                     -- 可以按任意顺序输入条目
     ["eth_dst_addr"] = "0011:4455:6677",
     ["eth_src_addr"] = "0011:1234:5678",
     ["ip_dst_addr"] = "10.12.0.1",
     ["ip_src_addr"] = "10.12.0.1/16",   -- 16表示掩码大小
     ["sport"] = 9,                      -- 标准端口号
     ["dport"] = 10,                     -- 标准端口号
     ["ethType"] = "ipv4",       -- ipv4|ipv6|vlan
     ["ipProto"] = "udp",        -- udp|tcp|icmp
     ["vlanid"] = 1100,                     -- 1 - 4095
     ["pktSize"] = 128           -- 64 - 1518
   };
 -- seqTable( seq#, portlist, table );
 pktgen.seqTable(0, "all", seq_table );
 pktgen.vlan("all", "enable");
 pktgen.set("all", "seqCnt", 1);

执行修改后的脚本不会产生Pktgen将通常在我尝试在命令行中启动0(0是我用于传输数据包的端口)时给出未知的以太类型0x0000错误

注意:在pktgen文档第75页提到了解决范围和vlan id问题的修复版本3.0.01。因此,建议使用最新的pktgen(我已经在PKTGEN 21.11.0上进行了测试)。

2022-03-12 18:36:59