释放 sk_buff 是谁的责任

Posted

技术标签:

【中文标题】释放 sk_buff 是谁的责任【英文标题】:Whose responsibility is it to free sk_buff 【发布时间】:2011-03-19 18:02:40 【问题描述】:

使用netlink_kernel_create() 创建netlink 套接字时,函数指针作为参数传递给此函数,当在此套接字上接收到消息时调用该函数。这个回调函数接收一个sk_buff作为参数,其中包含接收到的消息。

我的问题是释放这个sk_buff是谁的责任?

示例代码

#include #include #include #include

#define NETLINK_USER 31

结构袜子 *nl_sk = NULL;

static void my_nl_recv_msg(struct sk_buff *skb)

struct nlmsghdr *nlh;  
int pid;  

printk(KERN_INFO "Entering: %s\n", __FUNCTION__);  

nlh=(struct nlmsghdr*)skb->data;  
printk(KERN_INFO "Netlink received msg payload: %s\n",  
    (char*)NLMSG_DATA(nlh));  
pid = nlh->nlmsg_pid; /*pid of sending process */  
NETLINK_CB(skb).dst_group = 0; /* not in mcast group */  
NETLINK_CB(skb).pid = 0;      /* from kernel */  
//printk("About to send msg bak:\n");  
//netlink_unicast(nl_sk,skb,pid,MSG_DONTWAIT);

静态 int __init hello_init(void)

printk("Entering: %s\n",__FUNCTION__);  
nl_sk=netlink_kernel_create(&init_net, NETLINK_USER, 0,  
        my_nl_recv_msg, NULL, THIS_MODULE);  
if(!nl_sk)  
  
    printk(KERN_ALERT "Error creating socket.\n");  
    return -10;  
  
return 0;

【问题讨论】:

【参考方案1】:

net/netlink/af_netlink.c:netlink_unicast_kernelmy_nl_recv_msg 函数的调用者将负责释放它。

【讨论】:

以上是关于释放 sk_buff 是谁的责任的主要内容,如果未能解决你的问题,请参考以下文章

设计模式—责任链模式

责任链模式

入门设计模式之责任链模式

Chain of Responsibility(责任链)

《Head First 软件开发》阅读六

了解 Alloc 的 Instruments 结果中的负责任调用者