Netlink sockets and libnl - nl_recvmsgs_default returning -16 (EBUSY)
I'm trying to code some basic kernel module - userspace program communication using netlink sockets (libnl on user side). Userspace program sends a message to kernel and expects a reply. Unfortunately, receiving reply fails with return value -16 (EBUSY).

Does anyone have an idea why this is happening?

Here is the userspace code (parse_cb is a callback that doesn't get invoked):

	struct nl_sock *sock;
	struct nl_msg *msg;
	int family, res;

	// Allocate a new netlink socket
	sock = nl_socket_alloc();

	// Connect to generic netlink socket on kernel side
	genl_connect(sock);

	// Ask kernel to resolve family name to family id
	family = genl_ctrl_resolve(sock, PSVFS_FAMILY_NAME);

	// Construct a generic netlink by allocating a new message, fill in
	// the header and append a simple integer attribute.
	msg = nlmsg_alloc();
	genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, NLM_F_ECHO,
			PSVFS_C_INIT, PSVFS_VERSION);
	nla_put_string(msg, PSVFS_A_MSG, "stuff");

	// Send message over netlink socket
	nl_send_auto_complete(sock, msg);

	// Free message
	nlmsg_free(msg);

	nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, parse_cb, NULL);

	res = nl_recvmsgs_default(sock);
	printf("After receive %i.\n", res);

Here is the kernel-side callback for messsage sent by userspace program (this one gets invoked properly):

    int psvfs_vfs_init(struct sk_buff *skb2, struct genl_info *info) {
    	send_to_daemon("VFS initialized.", PSVFS_C_INIT, info->snd_seq+1, info->snd_pid);
    
    	return 0;
    }

And here is the 'send_to_daemon' function:

    int send_to_daemon(char* msg, int command, int seq, u32 pid) {
    	int res = 0;
    	struct sk_buff* skb;
    	void* msg_head;
    
    	skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
    	if (skb == NULL) {
    		res = -ENOMEM;
    		goto out;
    	}
    
    	msg_head = genlmsg_put(skb, 0, seq, &psvfs_gnl_family, 0, command);
    	if (msg_head == NULL) {
    		res = -ENOMEM;
    		goto out;
    	}
    
    	res = nla_put_string(skb, PSVFS_A_MSG, msg);
    	if (res != 0)
    		goto out;
    
    	genlmsg_end(skb, msg_head);
    
    	res = genlmsg_unicast(&init_net, skb, pid);
    	if (res != 0)
    		goto out;
    
      out:
      	return res;
    }
Netlink sockets and libnl - nl_recvmsgs_default returning -16 (EBUSY)
===

I'm trying to code some basic kernel module - userspace program communication using netlink sockets (libnl on user side). Userspace program sends a message to kernel and expects a reply. Unfortunately, receiving reply fails with return value -16 (EBUSY).

Does anyone have an idea why this is happening?

Here is the userspace code (parse_cb is a callback that doesn't get invoked):

	struct nl_sock *sock;
	struct nl_msg *msg;
	int family, res;

	// Allocate a new netlink socket
	sock = nl_socket_alloc();

	// Connect to generic netlink socket on kernel side
	genl_connect(sock);

	// Ask kernel to resolve family name to family id
	family = genl_ctrl_resolve(sock, PSVFS_FAMILY_NAME);

	// Construct a generic netlink by allocating a new message, fill in
	// the header and append a simple integer attribute.
	msg = nlmsg_alloc();
	genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, NLM_F_ECHO,
			PSVFS_C_INIT, PSVFS_VERSION);
	nla_put_string(msg, PSVFS_A_MSG, "stuff");

	// Send message over netlink socket
	nl_send_auto_complete(sock, msg);

	// Free message
	nlmsg_free(msg);

	nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, parse_cb, NULL);

	res = nl_recvmsgs_default(sock);
	printf("After receive %i.\n", res);

Here is the kernel-side callback for messsage sent by userspace program (this one gets invoked properly):

    int psvfs_vfs_init(struct sk_buff *skb2, struct genl_info *info) {
    	send_to_daemon("VFS initialized.", PSVFS_C_INIT, info->snd_seq+1, info->snd_pid);
    
    	return 0;
    }

And here is the 'send_to_daemon' function:

    int send_to_daemon(char* msg, int command, int seq, u32 pid) {
    	int res = 0;
    	struct sk_buff* skb;
    	void* msg_head;
    
    	skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
    	if (skb == NULL) {
    		res = -ENOMEM;
    		goto out;
    	}
    
    	msg_head = genlmsg_put(skb, 0, seq, &psvfs_gnl_family, 0, command);
    	if (msg_head == NULL) {
    		res = -ENOMEM;
    		goto out;
    	}
    
    	res = nla_put_string(skb, PSVFS_A_MSG, msg);
    	if (res != 0)
    		goto out;
    
    	genlmsg_end(skb, msg_head);
    
    	res = genlmsg_unicast(&init_net, skb, pid);
    	if (res != 0)
    		goto out;
    
      out:
      	return res;
    }