netlink: Postpone choosing sequence numbers until send time.
authorBen Pfaff <blp@nicira.com>
Mon, 16 Apr 2012 23:01:01 +0000 (16:01 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 19 Apr 2012 03:28:46 +0000 (20:28 -0700)
commit7d7447df778f7c9eacd0506369103e823bf20d6f
treecfddb12393f8e515310e6871804e20a478280875
parent2b459b83afe20f644f801dbdeafb750c7dade5d1
netlink: Postpone choosing sequence numbers until send time.

Choosing sequence numbers at time of creating a packet means that
nl_sock_transact_multiple() has to search for the sequence number
of a reply, because the sequence numbers of the requests aren't
necessarily sequential.  This commit makes it possible to avoid
the search, by deferring choice of sequence numbers until the
time that we send the packets.  It doesn't actually modify
nl_sock_transact_multiple(), which will happen in a later commit.

Previously, I was concerned about a theoretical race condition
described in a comment in the old versino of this code:

    This implementation uses sequence numbers that are unique
    process-wide, to avoid a hypothetical race: send request, close
    socket, open new socket that reuses the old socket's PID value,
    send request on new socket, receive reply from kernel to old
    socket but with same PID and sequence number.  (This race could be
    avoided other ways, e.g. by preventing PIDs from being quickly
    reused).

However, I no longer believe that this can be a real problem,
because Netlink operates synchronously.  The reply to a request
will always arrive before the socket can be closed and a new
socket opened with the old socket's PID.

Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/netlink-socket.c
lib/netlink.c