这两天折腾 tun,之前完全没接触驱动这么底层的东西,全靠 GlacJAY 大大的这篇文章入门了。
一句话,参照此 gist,同时将TUNSETIFF = 0x400454ca
改为TUNSETIFF = -2147199798
即可。
那篇文章的代码在 Windows 和 Ubuntu 下都正常运行,但今天在路由器上运行时却报错了:
Traceback (most recent call last):
……
File "/root/movpn/tun.py", line 218, in _open_tun
fcntl.ioctl(tun, TUNSETIFF, ifr)
IOError: [Errno 81] File descriptor in bad state
因为 vtun 运行正常,所以 tun 本身应该是没问题的。又测试了一下,这个错误在 ioctl 的request
不正确时出现。遂铺天盖地地寻找此值,发现不少相同遭遇,如这里,还有这,但没找到解决方案。
先去解了 ioctl,得知第二个参数是由好几个部分组成的,从 if_tun.h 找到了 ioctl.h,最后卡在一点C语言也不会,琢磨半天也没弄明白 TUNSETIFF 取值多少..
无奈,只好试着自己写段代码把 TUNSETIFF 打出来了..
之前只听说过 交叉编译 这个词,现在就要动手了好鸡冻,好在 OpenWrt 的相关资料很丰富:参照 wiki 以及 这篇帖子 外加一晚上时间终于完成了。
找了一个 C Hello Word 改了一下: 继续阅读 →