net: Support non-blocking connect() calls
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Dec 2017 18:20:10 +0000 (13:20 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Dec 2017 18:37:08 +0000 (13:37 -0500)
commitf354424fe65f4974f640a4ee629dabea821b41be
treea1d6653b9c9cda40c4a89461745177de7ba5194a
parentd9b8448e5351433ab9cd5bb874fc013887bc0e0b
net: Support non-blocking connect() calls

Dropbear's port forwarding requires support for non-blocking connect().
Specifically, they will attempt a connection, then go back to their service
loop.  Once select() returns for that FD (which is a Qdata FD), it'll check
the socket options - a spurious select() will break it.

Without non-blocking connect(), the entire DB connection would lock up.
For instance, if you port-forward to a host on the other side of a firewall
that doesn't send resets, your connection will hang in SYN_SENT until TCP
times out.  Your DB connection (e.g. the shell associated with the port
forward) will hang.

As far as tapping and polling for the connection being up, we can use the
Qdata FD.  It will become writable when we know one way or the other about
the connection: e.g. either established or reset.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/net/devip.c