I'm trying to send a message from kernel to user space using generic netlink and libnl, the part of my code which does this is implemented as follow:
int struct my_callback(struct sk_buff *skb, struct genl_info *info){ struct sk_buff *obuff; void *msg_head; if ((obuff = genlmsg_new(0, GFP_KERNEL)) == NULL) { // I've tried to change the len to NLMSG_GOODSIZE but not worked pr_err("Failed allocating message to an reply\n"); return 0; } if ((msg_head = genlmsg_put_reply(obuff, info, &lunatik_family, 0, LIST_STATES)) == NULL) { pr_err("Failed to put generic netlink header\n"); return 0; } //I've tried to put a genlmsg_end(obuff, msg_head); but didn't work as well if (genlmsg_reply(obuff, info) < 0) { pr_err("Failed to send message to user space\n"); return 0; } pr_info("Message sent to user-space\n"); return 0;}
P.s: LIST_STATES
is a member of enum and have the value of 3
And my user space code is basically:
static int req_handler(struct nl_msg *msg, void *arg){ struct nlmsghdr *nlhdr; struct genlmsghdr *genlhdr; nlhdr = nlmsg_hdr(msg); genlhdr = genlmsg_hdr(nlhdr); printf("Received a message from kernel: %d\n", genlhdr->cmd); return NL_OK;}int socket_init(struct nl_sock *sock){ int err = -1; if ((sock = nl_socket_alloc()) == NULL) return err; if ((err = genl_connect(sock))) return err; if ((err = genl_ctrl_resolve(sock, LUNATIK_FAMILY)) < 0) return err; // I've tried to use NL_CB_VALID, but when I use it I receive no message at all nl_socket_modify_cb(sock, NL_CB_MSG_IN, NL_CB_CUSTOM, req_handler, NULL); return 0;}
My output on dmesg is:
Message sent to user-space
And my output on user space is:
Received a message from kernel: 0
I should receive 3 instead of 0, I noticed that I'm receiving only the ACK message, but not the message that I'm sending, I would like to know why this is happening and what I'm doing wrong.