- 论坛徽章:
- 0
|
本帖最后由 denallo 于 2013-12-11 19:51 编辑
我自己注册的netlink协议,从用户层将数据发往内核一切正常,不过要是从内核往用户层发数据的话(用netlink_unicast),用户层收得到数据,但是recvmsg返回的数值显示它收到的数据比内核发送的数据少。
补充:刚刚测了下,nlmsg报头的长度是16个字节,然后NLMSG_DATA所指向的数据缓冲区的长度是12个字节,在内核层发送时,netlink_unicast返回的字节数是28个字节,而在用户层接收数据时,recvmsg返回的字节数是16个字节,这大概能证明用户层只收到了nlmsg的报头,却没有收到报头后面的数据吧,在用户层通过NLMSG_DATA(nh)->nlmsg_len == 28,但是不知道为什么数据部分根本没从内核层的nlh复制到用户层的nh中。
一下是内核发送数据的代码
- static void kernel_send_msg(struct frwl_msg m)//frwl_msg是我自己定义的
- {
- struct sk_buff *nl_skb;
- nl_skb = alloc_skb(NLMSG_SPACE(sizeof(struct frwl_msg)),GFP_ATOMIC);
- if(nl_skb == NULL)
- {
- printk(KERN_ERR "alloc skb failed\n");
- return;
- }
- NETLINK_CB(nl_skb).pid = 0;
- NETLINK_CB(nl_skb).dst_group = 0;
- nlh = nlmsg_put(nl_skb,0,0,0,
- NLMSG_SPACE(sizeof(struct frwl_msg))-sizeof(struct nlmsghdr),0);
- memcpy(NLMSG_DATA(nlh),&m,sizeof(struct frwl_msg));
- printk("sizeof nh:%d\n",sizeof(*nlh));//16
- printk("sizeof data:%d\n",sizeof(*((struct frwl_msg *)NLMSG_DATA(nlh))));//12
- debug_frwl_print(*((struct frwl_msg *)NLMSG_DATA(nlh)),"in send");//这一句的输出表明数据已经成功地复制到nlh的缓冲区里了
- int report = netlink_unicast(kernel_sk,nl_skb,pid,MSG_DONTWAIT);
- printk("report = %d\n",report);//输出28
- }
复制代码 然后用户层接收数据的代码如下
- void interface_rcv_msg(struct frwl_msg * buff)
- {
- struct nlmsghdr *nh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));//MAX_PAYLOAD==2048
- struct iovec iov2 = { nh, sizeof(*nh) };
- struct msghdr msg = {
- (void *)&nl_dest_addr,
- sizeof(nl_dest_addr),
- &iov2,1,NULL,0,0};
- printf("sizeof nlh:%d\n",sizeof(*nh));//输出16
- int len = recvmsg(interface_sk,&msg,0);
- printf("rcvlen=%d\n datalen=%d\n",len,nh->nlmsg_len);//rcvlen=16 datalen=28
- debug_frwl_print(*((struct frwl_msg *)NLMSG_DATA(nh)));//这一句的输出表明nh的缓冲区里一片空白。。。。。。。。。。。
复制代码 求助路过的大牛
大概会是哪里出的问题,给个思路也行。。。。。
对了,内核版本是2.6.32-358.el6.i686
发行版scientific linux 6 |
|