<div dir="ltr">Hi,<br>    nowadays i am learning how to use netlink achieve user mode and kernel interaction. and when i finsh it ,i found kernel can not get the data from user mode.<br>next is my code. can you tell me why?   thank u<br>
<br>user mode code:<br>   #include &lt;stdio.h&gt;<br>#include &lt;errno.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/socket.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;linux/netlink.h&gt;<br>#include &lt;fcntl.h&gt;<br>
#include &lt;sys/stat.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;string.h&gt;<br> <br>void myerr(const char * err_string,int line)<br>{<br>    fprintf(stderr,&quot;line:%d &quot;,line);<br>    perror(err_string);<br>
    exit(1);<br>}<br><br>#define MAX_PAYLOAD  2046<br>#define NETLINK_TEST 26<br><br>/*struct req {<br>    struct nlmsghdr nlh;<br>    char buf[MAX_PAYLOAD];<br>}*/<br><br>int main (int argc,char * argv[])<br>{<br>    int fd;<br>
    struct sockaddr_nl saddr,daddr;<br>    int sock_fd;<br>    struct nlmsghdr *nlhdr = NULL;<br>    struct iovec iov;<br>    struct msghdr msg;<br>    char text[MAX_PAYLOAD];<br>    int ret;<br>        <br>    if(argc &lt; 2){<br>
        printf(&quot;Usage:%s textfile\n&quot;,argv[0]);<br>        exit(1);<br>    }<br><br>    <br>    if(fd = (open(argv[1],O_RDWR|O_CREAT,S_IRWXU)) == -1){<br>        myerr(&quot;open&quot;,__LINE__);<br>    }else{<br>
        printf(&quot;file open success!\n&quot;);<br>    }<br><br><br>    sock_fd = socket( AF_NETLINK,SOCK_RAW,NETLINK_TEST);<br>    if( sock_fd &lt; 0 ){<br>    myerr(&quot;sock_fd&quot;,__LINE__);<br>    }<br><br>    memset(&amp;saddr,0,sizeof(saddr));<br>
    memset(&amp;daddr,0,sizeof(daddr));<br><br>    saddr.nl_family = AF_NETLINK;<br>    saddr.nl_pid = getpid();<br>    saddr.nl_groups = 0;<br><br>    if(bind(sock_fd,(struct sockaddr * )&amp;saddr,sizeof( saddr)))<br>    {<br>
        myerr(&quot;bind&quot;,__LINE__);<br>    }<br>    <br>    daddr.nl_family = AF_NETLINK;<br>    daddr.nl_pid = 0;<br>    daddr.nl_groups = 0;<br>    nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));<br><br>
    while(1){<br>        if(read(fd,text,MAX_PAYLOAD) == -1){<br>            myerr(&quot;read&quot;,__LINE__);<br>        }<br>//    while(read(fd,text,MAX_PAYLOAD)){        <br>        memcpy(NLMSG_DATA(nlhdr),text,strlen(text));<br>
        memset(&amp;msg,0,sizeof(struct msghdr));<br><br>        nlhdr-&gt;nlmsg_len = NLMSG_LENGTH(strlen(text));<br>        nlhdr-&gt;nlmsg_pid = getpid();<br>        nlhdr-&gt;nlmsg_flags = 0;<br>    <br>        iov.iov_base = (void *)nlhdr;<br>
        iov.iov_len = nlhdr-&gt;nlmsg_len;<br>        msg.msg_name = (void * )&amp;daddr;<br>        msg.msg_namelen = sizeof(daddr);<br>        msg.msg_iov = &amp;iov;<br>        msg.msg_iovlen = 1;<br>        <br>        ret = sendmsg(sock_fd,&amp;msg,0);<br>
        if(ret == -1){<br>            myerr(&quot;sendmsg&quot;,__LINE__);<br>        }else{<br>            printf(&quot;usr send message to kernel\n&quot;);<br>            }<br>        <br>    }<br>    close(sock_fd);<br>
}<br><br><br><br><br>kernel module:<br>#include &lt;linux/module.h&gt;<br>//#include &lt;linux/kernel.h&gt;<br>#include &lt;linux/netlink.h&gt;<br>#include &lt;linux/skbuff.h&gt;<br>#include &lt;net/sock.h&gt;<br>   <br>struct sock *nl_sk = NULL;<br>
#define MAX_PAYLOAD 2046<br>#define NETLINK_TEST 26<br>  <br>void nl_data_handler(struct sk_buff *__skb)<br> {<br>         struct sk_buff *skb;<br>         struct nlmsghdr *nlh;<br>         pid_t pid;<br>         char str[2046];<br>
       //  int len = NLMSG_SPACE(MAX_PAYLOAD);<br>            int rc;<br>    <br>     printk(&quot;start reading...\n&quot;); <br>         skb = skb_get(__skb);<br> <br>         if(skb-&gt;len &gt;= NLMSG_SPACE(0)) {<br>                  nlh = nlmsg_hdr(skb);<br>
                  printk(&quot;recv:%s\n&quot;,(char *)NLMSG_DATA(nlh));<br>                  memcpy(str,NLMSG_DATA(nlh),sizeof(str));<br>          pid = nlh-&gt;nlmsg_pid;<br>          printk(&quot;pid is %d\n&quot;,pid);<br>
                  kfree_skb(skb);<br>    <br>       skb = alloc_skb(NLMSG_SPACE(MAX_PAYLOAD),GFP_ATOMIC);<br>      if(!skb){<br>          printk(KERN_ERR &quot;allocate failed!\n&quot;);<br>        return ;<br>          }<br>
        nlh = nlmsg_put(skb,0,0,0,MAX_PAYLOAD,0);<br>        NETLINK_CB(skb).pid = 0;<br><br>        memcpy(NLMSG_DATA(nlh),str,sizeof(str));<br>        printk(&quot;net_link: ready send message\n&quot;);<br>        <br>        rc = netlink_unicast(nl_sk,skb,pid,MSG_DONTWAIT);<br>
        if(rc &lt; 0){<br>            printk(&quot;can`t unicast skb\n&quot;);<br>        }<br>        printk(&quot;send ok!\n&quot;);<br>    }<br><br>  }<br>  <br>  static int __init net_init(void)<br>  {<br>          struct net init_net;<br>
//      struct sock *nl_sk = NULL;<br>          printk(&quot;net creat start.....\n&quot;);<br>          nl_sk = netlink_kernel_create(&amp;init_net,NETLINK_TEST,0,nl_data_handler,NULL,THIS_MODULE);<br>          if(nl_sk == 0)<br>
          {<br>                  printk(&quot;create netlink faile!\n&quot;);<br>                  return -1;<br>          }else{<br>        printk(&quot;netlink create success!\n&quot;);<br>        }<br>          return 0;<br>
  }<br>  <br>  static void __exit net_exit(void)<br>  {<br>         printk(&quot;lal\n&quot;);<br>      sock_release(nl_sk-&gt;sk_socket);<br>          printk(&quot;netlink over!\n&quot;);<br>  }<br>  <br>  module_init(net_init);<br>
  module_exit(net_exit);<br>  MODULE_LICENSE(&quot;GPL&quot;);<br><br></div>