[libvirt] [PATCHv3 3/4] util: function to get local nl_pid used by netlink event service socket

Eric Blake eblake at redhat.com
Fri May 4 20:00:52 UTC 2012


On 05/04/2012 12:51 PM, Laine Stump wrote:
> This value will be needed to set the src_pid when sending netlink
> messages to lldpad. It is part of the solution to:
> 
>   https://bugzilla.redhat.com/show_bug.cgi?id=816465
> 
> Note that libnl's port generation algorithm guarantees that the
> nl_socket_get_local_port() will always be > 0, so it is okay to cast
> the uint32_t to int (thus allowing us to use -1 as an error sentinel).

I had to look; we always let libnl generate a socket, and indeed the
libnl code:

http://git.infradead.org/users/tgr/libnl.git/blob?f=lib/socket.c#l50

returns a uint32_t, but computes that value as 'pid + (n << 22);', where
n is at most 32, and where pid is at most PID_MAX_LIMIT of 2^22, so the
end result is less than 31 bits and therefore positive when cast to int.
 Maybe it would help to tweak the wording a bit:

Note that libnl's port generation algorithm guarantees that the uint32_t
result of nl_socket_get_local_port() will never set the most significant
bit, and therefore will be positive when cast to int, allowing us to use
-1 as an error sentinel.


>  /**
> + * virNetlinkEventServiceLocalPid:
> + *
> + * Returns the nl_pid value that was used to bind() the netlink socket
> + * used by the netlink event service, or -1 on error (netlink
> + * guarantees that this value will always be > 0).
> + */
> +int virNetlinkEventServiceLocalPid(void)
> +{
> +    if (!(server && server->netlinknh)) {
> +        netlinkError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                     _("netlink event service not running"));
> +        return -1;
> +    }
> +    return (int)nl_socket_get_local_port(server->netlinknh);

Technically, the cast is redundant, but I'm okay if you leave it in.

ACK; this one can technically be applied without test results, although
it doesn't hurt to wait for the rest of the series.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120504/8e65aa5b/attachment-0001.sig>


More information about the libvir-list mailing list