2015-09-22 38 views
1

我想从一个Python应用程序发送一个IOCTL调用到我在Ubuntu 12.04中运行的假网络接口。我知道我可以打开套接字并将其绑定到假网络接口正在管理的网络,然后使用fcntl.ioctl(socket, IOC_COMMAND_NUM, some_struct)发送IOCTL调用。但是,这似乎使用了不同于我需要的网络接口。所以,我的问题是,我如何确保使用特定的网络接口?而且,为了发送一个IOCTL呼叫,打开一个套接字看起来很麻烦,那么是否有绕过这个步骤?以下是一些示例Python代码,其行为如上所述。使用Python向网络驱动程序发送IOCTL调用

>>> 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电话。)

谢谢,我感谢任何和所有的帮助。

回答

0

虽然这并不一定回答我所有的问题,但我能找到解决方案。 IOCTL的调用与我预期的有点不同。我需要解决的第一件事是使用正确的IOCTL编号。与字符驱动程序不同,网络驱动程序只能为自定义IOCTL使用一定范围(从0x89F0开始)。我必须做的另一件事是把一个ifreq结构作为IOCTL调用的第三个参数。 ifreq结构有一个ifr_name成员,用于选择要与之交互的特定网络接口。这两个修复允许我完美地与我的驱动程序进行通信。