-/* Netlink PID.
- *
- * Every Netlink socket must be bound to a unique 32-bit PID. By convention,
- * programs that have a single Netlink socket use their Unix process ID as PID,
- * and programs with multiple Netlink sockets add a unique per-socket
- * identifier in the bits above the Unix process ID.
- *
- * The kernel has Netlink PID 0.
- */
-
-/* Parameters for how many bits in the PID should come from the Unix process ID
- * and how many unique per-socket. */
-#define SOCKET_BITS 10
-#define MAX_SOCKETS (1u << SOCKET_BITS)
-
-#define PROCESS_BITS (32 - SOCKET_BITS)
-#define MAX_PROCESSES (1u << PROCESS_BITS)
-#define PROCESS_MASK ((uint32_t) (MAX_PROCESSES - 1))
-
-/* Bit vector of unused socket identifiers. */
-static uint32_t avail_sockets[ROUND_UP(MAX_SOCKETS, 32)];
-
-/* Allocates and returns a new Netlink PID. */
-static int
-alloc_pid(uint32_t *pid)
-{
- int i;
-
- for (i = 0; i < MAX_SOCKETS; i++) {
- if ((avail_sockets[i / 32] & (1u << (i % 32))) == 0) {
- avail_sockets[i / 32] |= 1u << (i % 32);
- *pid = (getpid() & PROCESS_MASK) | (i << PROCESS_BITS);
- return 0;
- }
- }
- VLOG_ERR("netlink pid space exhausted");
- return ENOBUFS;
-}
-
-/* Makes the specified 'pid' available for reuse. */
-static void
-free_pid(uint32_t pid)
-{
- int sock = pid >> PROCESS_BITS;
- assert(avail_sockets[sock / 32] & (1u << (sock % 32)));
- avail_sockets[sock / 32] &= ~(1u << (sock % 32));
-}
-\f