当前位置: 技术问答>linux和unix
struct sock *sk和 struct sk_buff *skb之间的关系
来源: 互联网 发布时间:2016-09-08
本文导语: 函数struct sock *netlink_kernel_create原型里,有一个回调函数:在FC6的内核下是void (*input)(struct sock *sk, int len),新的回调函数是void (*input)(struct sk_buff *skb), 这个是FC6下的代码 void input( struct sock *sk, int len ) { ...
函数struct sock *netlink_kernel_create原型里,有一个回调函数:在FC6的内核下是void (*input)(struct sock *sk, int len),新的回调函数是void (*input)(struct sk_buff *skb),
这个是FC6下的代码
void input( struct sock *sk, int len )
{
do
{
struct sk_buff *skb;
if(down_trylock(&receive_sem))
return;
while((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL)
{
{
struct nlmsghdr *nlh = NULL;
if(skb->len >= sizeof(struct nlmsghdr))
{
nlh = (struct nlmsghdr *)skb->data;
if((nlh->nlmsg_len >= sizeof(struct nlmsghdr)) && (skb->len >= nlh->nlmsg_len))
{
if(nlh->nlmsg_type == IB_U_PID)
{
write_lock_bh(&user_proc.lock);
user_proc.pid = nlh->nlmsg_pid;
usersk = sk;
printk("user pid=%d , size of recv buff : %dn",user_proc.pid, sk->sk_rcvbuf);
write_unlock_bh(&user_proc.lock);
}
}
}
}
kfree_skb(skb);
}
up(&receive_sem);
}while(nlfd && nlfd->sk_receive_queue.qlen);
}
我要怎么改,才能改到接口函数是void (*input)(struct sk_buff *skb)
不懂驱动的人来改驱动,就是累,希望各路大虾帮忙,在此先谢了
这个是FC6下的代码
void input( struct sock *sk, int len )
{
do
{
struct sk_buff *skb;
if(down_trylock(&receive_sem))
return;
while((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL)
{
{
struct nlmsghdr *nlh = NULL;
if(skb->len >= sizeof(struct nlmsghdr))
{
nlh = (struct nlmsghdr *)skb->data;
if((nlh->nlmsg_len >= sizeof(struct nlmsghdr)) && (skb->len >= nlh->nlmsg_len))
{
if(nlh->nlmsg_type == IB_U_PID)
{
write_lock_bh(&user_proc.lock);
user_proc.pid = nlh->nlmsg_pid;
usersk = sk;
printk("user pid=%d , size of recv buff : %dn",user_proc.pid, sk->sk_rcvbuf);
write_unlock_bh(&user_proc.lock);
}
}
}
}
kfree_skb(skb);
}
up(&receive_sem);
}while(nlfd && nlfd->sk_receive_queue.qlen);
}
我要怎么改,才能改到接口函数是void (*input)(struct sk_buff *skb)
不懂驱动的人来改驱动,就是累,希望各路大虾帮忙,在此先谢了
|
看错了,把sk堪称skb了,哈哈。。那就不用adapter了,新接口直接用skb,这个skb从代码上看应该是socket的recveiv queue来的,查查内核怎么掉input,说不定他已经帮你拿到这个skb了(所不定连取包的循环也在内核处理了),如果是,那你只要保留对单个skb的操作就行了。