loopback.c中的loopback_xmit函数中有这么一段:
static int loopback_xmit(struct sk_buff * skb,struct net_device * dev)
{
struct net_device_stats * stats = (struct net_device_stats *)dev_priv;
if (atomic_read(&skb->users)!=1){/*问题1:这个条件判断什么意思?
skb->users表示user count,是指该
sk_buff由几个用户拥有么?为什么要
检查这个条件?*/
struct sk_buff * skb2 = skb;
skb=skb_clone(skb,GFP_ATOMIC);
if(skb==NULL){
kfree_skb(skb2);
return 0;/*问题2:这里系统内存不足,为什么不报错?
因为后面好像整个函数执行成功也是return 0*/
}
kfree_skb(skb2);
}
else
skb_orphan(skb);/*查
skb_orphan ---- orphan a buffer
@skb: buffer to orphan
If a buffer currently has an owner then we
call the owner's destructor function and
make the @skb unowned.The buffer continues
to exist but is no longer charged to its
former owner
那么skb_orphan以后,原来skb所指向的sk_buff
结构如何使用呢?skb是否成了一个空指针?
skb_orphan和kfree_skb有什么本质的区别?*/
.
.
.
}
望高手不吝赐教
发信人: mephisto (梦菲斯特:饼干), 信区: KernelTech
【 在 theFuehrer (亦正亦邪) 的大作中提到: 】
∶ 各位大侠,最近我看Linux源码中的网络驱动部分。
∶ 先从loopback.c入手的。
∶ loopback.c中的loopback_xmit函数中有这么一段:
∶ static int loopback_xmit(struct sk_buff * skb,struct net_device * dev)
∶ {
∶ struct net_device_stats * stats = (struct net_device_stats *)dev_priv;
∶ if (atomic_read(&skb->users)!=1){/*问题1:这个条件判断什么意思?
∶ skb->users表示user count,是指该
∶ sk_buff由几个用户拥有么?为什么要
∶ 检查这个条件?*/
就是判断有几个人用skb. 是会有多出用skb,例如一边运行一边sniff.有些时候
会修改skb, 这就要clone,如果这个skb也被其他人用了..
∶ struct sk_buff * skb2 = skb;
∶ skb=skb_clone(skb,GFP_ATOMIC);
∶ if(skb==NULL){
∶ kfree_skb(skb2);
∶ return 0;/*问题2:这里系统内存不足,为什么不报错?
因为对kernel来说,mem 不够不是错,是会出现的实际情况,.
在这里的处理方式就是把这个包drop调.不loopback了.
∶ 因为后面好像整个函数执行成功也是return 0*/
∶ }
∶ kfree_skb(skb2);
∶ }
∶ else
∶ skb_orphan(skb);/*查
∶ skb_orphan ---- orphan a buffer
∶ @skb: buffer to orphan
∶ If a buffer currently has an owner then we
∶ call the owner's destructor function and
∶ make the @skb unowned.The buffer continues
∶ to exist but is no longer charged to its
∶ former owner
∶ 那么skb_orphan以后,原来skb所指向的sk_buff
∶ 结构如何使用呢?skb是否成了一个空指针?
∶ skb_orphan和kfree_skb有什么本质的区别?*/
应该不是free调的.还是可以用的.但是取消原来的owner的引用而已.
∶ .
∶ .
∶ .
∶ }
∶ 望高手不吝赐教
No comments:
Post a Comment