Ошибка netlink_broadcast с возвращаемым значением -3 - PullRequest
0 голосов
/ 29 июня 2018

Я не могу передать сообщение 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);
    }

1 Ответ

0 голосов
/ 05 июля 2018

sudo заставляет это работать. Кажется, код в порядке.

...