Changes

1,698 bytes added ,  21:30, 26 December 2011
Created page with "== Unix sockets initial support == Currently it can only work with stream sockets, which have no skbs in queues (listening or established -- both work OK). The cpt part uses th..."
== Unix sockets initial support ==

Currently it can only work with stream sockets, which have no skbs in queues
(listening or established -- both work OK).

The cpt part uses the sock_diag engine that was merged to Dave recently to
collect sockets. Then it dumps sockets by checking the filesystem ID of a
failed-to-open through /proc/pid/fd descriptors (sockets do not allow for
such tricks with opens through proc) against SOCKFS_TYPE.

The rst part is more tricky. Listen sockets are just restored, this is simple.
Connected sockets are restored like this:

# One end establishes a listening anon socket at the desired descriptor;
# The other end just creates a socket at the desired descriptor;
# All sockets, that are to be connect()-ed call connect. Unix sockets do not block connect() till the accept() time and thus we continue with...
# ... all listening sockets call accept() and ... dup2 the new fd into the accepting end.

There's a problem with this approach -- socket names are not preserved, but
looking into our OpenVZ implementation I think this is OK for existing apps.

=== What should be done next ===

* Need to merge the file IDs patches in our tree and make Andrey to support files sharing. This will solve the

<code>
sk = socket();
fork();
</code>

case. Currently it simply doesn't work :(
* Need to add support for DGRAM sockets -- I wrote comment how to do it in the can_dump_unix_sk()
* Need to add support for in-flight connections
* Implement support for UDP sockets (quite simple)
* Implement support for listening TCP sockets (also not very complex)
* Implement support for connected TCP scokets (hard one, Tejun's patches are not very good for this from my POV)