2011-05-04 32 views
1

我想使用netlink套接字来交换用户空间和内核空间之间的消息......我发送消息从用户空间到内核空间和所有工作正常,但是当我尝试从内核空间回复,系统冻结。尤其是我安排与工作队列,创造该消息的功能,发送到用户空间使用netlink_unicast功能...这里一些内核代码:问题与netlink套接字:内核冻结

void wq_func(struct work_queue *wq) 
{ 
    struct sk_buff *resp = alloc_skb(NLMSG_LENGTH(100), GFP_KERNEL); 
    if (!resp) 
    { 
    printk(KERN_INFO "alloc_skb failed"); 
    return; 
    } 

    struct nlmsghdr *nlh = (struct nlmsghdr *)skb_put(resp, NLMSG_LENGTH(100)); 
    memset(nlh, 0, NLMSG_LENGTH(100)); 
    nlh->nlmsg_len = NLMSG_LENGTH(100); 
    nlh->nlmsg_pid = 0; 
    nlh->nlmsg_flags = 0; 
    strcpy(NLMSG_DATA(nlh), "From kernel: Yes i'm here!"); 
    NETLINK_CB(resp).pid = 0; 
    NETLINK_CB(resp).dst_group = 0; 

    printk(KERN_INFO "Trying to send a netlink message to pid %d", pid); 
    int err = netlink_unicast(s, resp, pid, MSG_DONTWAIT); 
    if (err < 0) 
    printk(KERN_ALERT "Error sending message to user-space"); 
    kfree_skb(resp); 
} 
DECLARE_WORK(wq, wq_func); 

static void input_nl(struct sk_buff *buff) 
{ 
    printk(KERN_INFO "Received message socket NETLINK_TEST"); 
    if (buff == NULL) 
    { 
    printk(KERN_ALERT "NULL sk_buff!"); 
    return; 
    } 
    struct nlmsghdr *nlh = (struct nlmsghdr *)buff->data; 
    printk(KERN_INFO "Received netlink message from pid %d: %s", nlh->nlmsg_pid,  NLMSG_DATA(nlh)); 

    pid = nlh->nlmsg_pid; 

    schedule_work(&wq); 
} 

int __init knl_init() 
{ 
    printk(KERN_INFO "knl module loaded"); 

    s = netlink_kernel_create(&init_net, NETLINK_TEST, 0, input_nl, NULL, THIS_MODULE); 

    if (s == NULL) 
    return -1; 
    return 0; 
} 

,如果我尝试netlink_unicast内核不会评论通话冻结。从用户空间我可以正确发送消息。我记得过去的代码运行良好,现在我对这个奇怪的错误感到非常惊讶。

有什么想法?

谢谢大家!


我试图netlink_unicast通话和所有的作品后去除的kfree_skb电话...所以,为什么系统与呼叫挂起?我应该在哪里免费分配sk_buff?

+0

网络链路内成为同步在某些时候,尽量不使用'schedule_work()'调用。 – adobriyan 2011-05-04 17:24:18

回答

1

netlink_unicast()取得skb的所有权并将其自由释放。

+0

好的...这是一个缺失的概念!谢谢caf! – MirkoBanchi 2011-05-05 07:20:15

0

调用netlink_unicast后就可以不自由struct sk_buff