4

我是内核模块开发的新手。我正在尝试开发一个伪网络驱动程序,在没有任何实际设备的情况下以环回模式运行。我的目标是使用以下设置:

iperf -s -u.........iperf -c 192.168.1.1 -p 5001 -u

======.......============

|...if0....|......|........if1....|

======.......============

 |              |
/|\            \|/
 |              |
  ---------------

我已经从驱动程序注册了两个接口。然后我修改了从 if1 接收到的 UDP 数据包,使它看起来像在 if0 接收到的一样。但它永远不会到达侦听所有 udp if 的 udp 端口​​的 iperf 服务器应用程序。但是每当我在 if0 上通过wireshark 嗅探数据包时,似乎是在 if0 接收到数据包。但由于某种原因,它没有通过网络堆栈。

任何线索?ip 校验和和 udp 校验和都已重新计算和验证(使用 wireshark)。我正在使用 netif_rx 将数据包指示到另一个接口句柄(if0 句柄)。

我只使用了 5 个函数 ptr 回调 {open、close、xmit_start、get_stats & config} 进行网络操作。校验和也设置为 UNNECESSARY。已设置 IF 标志以指示 NO_ARP。

编辑:IP 地址输出

eth1:mtu 1500 qdisc

pfifo_fast 状态 UP qlen 1000 链接/以太 00:e0:ff:00:00:e0 brd

ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 brd 192.168.1.255 范围 globa eth1 valid_lft

永远首选_lft永远4:

eth2:mtu 1500 qdisc pfifo_fast

状态 UP qlen 1000 链接/以太 00:e0:ff:40:00:e0 brd ff:ff:ff:ff:ff:ff

inet 192.168.2.1/24 brd 192.168.2.255 范围全局 eth2 valid_lft

永远首选_lft 永远

4

1 回答 1

0

好的,我已经弄清楚了。

我觉得很愚蠢,不去想它。由于路由问题,数据包被丢弃。

接收 IF 处接收到的数据包必须与 IF 具有相同的网络。

因此,如果 IF 有 192.168.1.1/24,则路由系统只接受来自 192.168.1.X/24 的数据包。

直到我尝试使用单个 IF 环回时,我才注意到它。谁能解释为什么会这样?

于 2012-11-27T14:22:42.420 回答