使用 Python 向网络驱动程序发送 IOCTL 调用
Sending IOCTL Call to Network Driver using Python
我想从 Python 应用程序发送一个 IOCTL 调用到我在 Ubuntu 12.04 中有 运行 的假网络接口。我知道我可以打开一个套接字并将其绑定到假网络接口管理的网络,然后使用 fcntl.ioctl(socket, IOC_COMMAND_NUM, some_struct)
发送 IOCTL 调用。但是,这似乎使用了与我需要的不同的网络接口。所以,我的问题是,如何确保使用特定的网络接口?而且,打开一个套接字只是为了发送一个IOCTL调用似乎很麻烦,那么有没有办法绕过这一步呢?下面是一些示例 Python 代码,其行为如上所述。
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.bind(("192.168.0.1",0))
>>> fcntl.ioctl(sock,IOC_COMMAND_NUM,some_struct)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 25] Inappropriate ioctl for device
# This proves that it is sending the IOCTL to a different interface because my
# interface automatically returns success for any IOCTL call.
下面是 ifconfig myDummyNetInter
.
的输出
myDummyNetInter0 Link encap:Ethernet HWaddr e2:44:46:d5:79:3e
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::e044:46ff:fed5:793e/64 Scope:Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:2682 (2.6 KB)
如果有帮助,我确实有另一个使用此网络接口用 C++ 编写的应用程序,没有任何问题。 (包括 IOCTL 调用。)
谢谢,感谢所有帮助。
虽然这不一定能回答我所有的问题,但我找到了解决方案。 IOCTL 调用与我预期的有点不同。我需要修复的第一件事是使用正确的 IOCTL 编号。与字符驱动程序不同,网络驱动程序只能使用特定范围(从 0x89F0 开始)用于自定义 IOCTL。我必须做的另一件事是将 ifreq
结构作为 IOCTL 调用的第三个参数。 ifreq
结构有一个 ifr_name
成员,用于 select 要与之交互的特定网络接口。这两个修复让我可以完美地与我的驱动程序通信。
我想从 Python 应用程序发送一个 IOCTL 调用到我在 Ubuntu 12.04 中有 运行 的假网络接口。我知道我可以打开一个套接字并将其绑定到假网络接口管理的网络,然后使用 fcntl.ioctl(socket, IOC_COMMAND_NUM, some_struct)
发送 IOCTL 调用。但是,这似乎使用了与我需要的不同的网络接口。所以,我的问题是,如何确保使用特定的网络接口?而且,打开一个套接字只是为了发送一个IOCTL调用似乎很麻烦,那么有没有办法绕过这一步呢?下面是一些示例 Python 代码,其行为如上所述。
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.bind(("192.168.0.1",0))
>>> fcntl.ioctl(sock,IOC_COMMAND_NUM,some_struct)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 25] Inappropriate ioctl for device
# This proves that it is sending the IOCTL to a different interface because my
# interface automatically returns success for any IOCTL call.
下面是 ifconfig myDummyNetInter
.
myDummyNetInter0 Link encap:Ethernet HWaddr e2:44:46:d5:79:3e
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::e044:46ff:fed5:793e/64 Scope:Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:2682 (2.6 KB)
如果有帮助,我确实有另一个使用此网络接口用 C++ 编写的应用程序,没有任何问题。 (包括 IOCTL 调用。)
谢谢,感谢所有帮助。
虽然这不一定能回答我所有的问题,但我找到了解决方案。 IOCTL 调用与我预期的有点不同。我需要修复的第一件事是使用正确的 IOCTL 编号。与字符驱动程序不同,网络驱动程序只能使用特定范围(从 0x89F0 开始)用于自定义 IOCTL。我必须做的另一件事是将 ifreq
结构作为 IOCTL 调用的第三个参数。 ifreq
结构有一个 ifr_name
成员,用于 select 要与之交互的特定网络接口。这两个修复让我可以完美地与我的驱动程序通信。