[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MirageOS-devel] tuntap on linux



On 7 Jun 2015, at 03:33, Justin Cormack <justin@xxxxxxxxxxxxxxxxxxxxx> wrote:
> 
> On 6 June 2015 at 23:54, Anil Madhavapeddy <anil@xxxxxxxxxx> wrote:
>> On 6 Jun 2015, at 15:49, Justin Cormack <justin@xxxxxxxxxxxxxxxxxxxxx>
>> wrote:
>> 
>> 
>> 
>> On Jun 6, 2015 4:56 PM, "Anil Madhavapeddy" <anil@xxxxxxxxxx> wrote:
>>> 
>>> I'm just testing out tuntap.1.3 for release on Linux, and am having some
>>> trouble getting it to work.  Just wanted to check if others are using it ok.
>>> I've done:
>>> 
>>>    $ sudo tunctl
>>>    $ sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 up
>>>    $ sudo ./_build/test/nonblock_read.native tap0
>>>    read: 0
>>>    read: 0
>>>    ...
>>> 
>>> This results in a stream of 0 byte reads.
>>> 
>>> If I change the Lwt_unix.of_unix_file_descr in mirage-net-unix to be
>>> blocking:true instead of blocking:false, then it works as expected on Linux,
>>> and all the tap networking is ok.  Tracing through the Lwt code shows that
>>> blocking:false should work, but for some reason the tap device on Linux is
>>> always readable and so EWOULDBLOCK never happens.
>>> 
>>> Anyone else having this problem on Linux, or is it just me? I don't often
>>> use tap networking there, so I don't want to apply the above workaround
>>> without understanding it.
>> 
>> I had what sounds like the same problem with tap devices and rump kernel.
>> 
>> I haven't yet filed a bug but I think there is one... 0 length reads should
>> not happen. I am not sure if it changed in recent versions but I think it
>> may have. Planning to investigate. If you do the first open with nonblock it
>> seems to work but fcntl does not
>> 
>> Tracked it down -- looks like a Linux 3.19 regression:
>> https://bugzilla.kernel.org/show_bug.cgi?id=96381
> 
> Ah, doesn't look like it is in a hurry to be fixed though, will try to
> bisect it.
> 
> If you apply this:
> 
> diff --git a/lib/tuntap_stubs.c b/lib/tuntap_stubs.c
> index dbccc79..e6fc6a1 100644
> --- a/lib/tuntap_stubs.c
> +++ b/lib/tuntap_stubs.c
> @@ -58,7 +58,7 @@ tun_alloc(char *dev, int kind, int pi, int persist,
> int user, int group)
>   struct ifreq ifr;
>   int fd;
> 
> -  if ((fd = open("/dev/net/tun", O_RDWR)) == -1)
> +  if ((fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK)) == -1)
>     tun_raise_error("open", -1);
> 
>   memset(&ifr, 0, sizeof(ifr));
> 
> I think it should work, but it does change the default to nonblocking.
> For some reason the bug does not manifest if the original fd is opened
> nonblock.

Yes, this seems to work fine for me as well.  I'll cut a release of
tuntap and mirage-net-unix that enforce this non-blocking initialisation
and use just as soon as Travis passes here:
https://github.com/mirage/ocaml-tuntap/pull/15

-anil
_______________________________________________
MirageOS-devel mailing list
MirageOS-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.