Hello, I'd like to use several netlink sockets in one process. Into "man 7 netlink" I read: nl_pid is the unicast address of netlink socket. It's always 0 if the destination is in the kernel. For a userspace process, nl_pid is usu- ally the PID of the process owning the destination socket. However, nl_pid identifies a netlink socket, not a process. If a process owns several netlink sockets, then nl_pid can only be equal to the process ID for at most one socket. There are two ways to assign nl_pid to a netlink socket. If the application sets nl_pid before calling bind(2), then it is up to the application to make sure that nl_pid is unique. If the application sets it to 0, the kernel takes care of assigning it. The kernel assigns the process ID to the first netlink socket the pro- cess opens and assigns a unique nl_pid to every netlink socket that the process subsequently creates. So to execute the bind() in userland I do: /* Bind the socket with the source address */ memset(&src_addr, 0, sizeof(src_addr)); src_addr.nl_family = AF_NETLINK; src_addr.nl_pid = 0; src_addr.nl_groups = 0; /* not in mcast groups */ ret = bind(handle->socket, (struct sockaddr *) &src_addr, sizeof(src_addr)); if (ret < 0) { close(handle->socket); return ret; } and to replay into kernelland I do: /* Send an answer to the userland */ dbg("start sending replay..."); NETLINK_CB(skb).pid = 0; /* from the kernel */ NETLINK_CB(skb).dst_pid = nlh->nlmsg_pid; NETLINK_CB(skb).dst_group = 0; /* not in mcast groups */ ret = netlink_unicast(nl_sk, skb, nlh->nlmsg_pid, MSG_DONTWAIT); dbg("... replay sent (%d)", ret); When I open the first socket everything works well, but when I use the second I notice that the request goes into the kernel which in turn replays using netlink_unicast() but the userland program blocks forever. Can you pleae suggest me where I do wrong? Thanks, Rodolfo -- GNU/Linux Solutions e-mail: giometti@xxxxxxxxxxxx Linux Device Driver giometti@xxxxxxxxx Embedded Systems giometti@xxxxxxxx UNIX programming phone: +39 349 2432127
Attachment:
signature.asc
Description: Digital signature