Я не могу передать сообщение netlink в пространство пользователя с помощью следующего кода. Однако я не могу найти ничего плохого. Моя пользовательская программа может получать широковещательные сообщения других типов, например sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
, но не мой тип SYSHOOK_NL_NUM
.
Я думаю, что ошибки прячутся в моем коде ядра. Может кто нибудь разобраться в чем дело? Спасибо.
syshook_nl_sk = netlink_kernel_create(&init_net, SYSHOOK_NL_NUM, 1, NULL, NULL, THIS_MODULE);
skb = alloc_skb(NLMSG_SPACE(nl_send_len), GFP_ATOMIC);
if(!skb) {
error = -ENOMEM;
goto err;
}
nlh = (struct nlmsghdr *)skb->data;
nlh->nlmsg_len = NLMSG_SPACE(nl_send_len);
nlh->nlmsg_pid = 0;
nlh->nlmsg_flags = 0;
nlh = nlmsg_put(skb, 0, 0, 0, NLMSG_SPACE(nl_send_len) - sizeof (struct nlmsghdr), 0);
NETLINK_CB(skb).pid = 0;
NETLINK_CB(skb).dst_group = 1;
error = netlink_broadcast(syshook_nl_sk, skb, 0, 1, GFP_KERNEL);
Код пользовательского пространства, получающий широковещательные сообщения от ядра.
sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
// sock_fd=socket(PF_NETLINK, SOCK_RAW, 15);
if(sock_fd < 0) {
printf("create nl failed.\n");
return -1;
}
memset(&src_addr, 0, sizeof(src_addr));
memset(&msg, 0, sizeof(msg));
src_addr.nl_family = AF_NETLINK;
src_addr.nl_pid = 100; /* self pid */
/* interested in group 1<<0 */
src_addr.nl_groups = 1;
// setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr));
memset(&dest_addr, 0, sizeof(dest_addr));
nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
iov.iov_base = (void *)nlh;
iov.iov_len = NLMSG_SPACE(MAX_PAYLOAD);
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
char buf[1024] = {0};
printf("begin to recvmsg jiang \n");
int rcvlen;
while (1) {
/* Read message from kernel */
rcvlen = recv(sock_fd, &buf, sizeof(buf), 0);
// rcvlen = recvmsg(sock_fd, &msg, 0);
printf("--%d--%s\n",rcvlen, buf);
}