netif_receive_skb logic?
From: Khoa Nguyen
Date: Wed Mar 19 2008 - 15:31:25 EST
I am trying to understand the reason to use pt_prev in the following
code segment of netif_receive_skb() in net/core/dev.c. As far as I
understand, the first loop is to deliver the skb to all TAPs, the
second loop delivers the skb to all matching protocol handlers. My
question is that if there is only ONE TAP registered, then the first
loop is not going to call deliver_skb() at all. Why can't I just
replace pt_prev with ptype in both loops ?
Thanks,
Khoa
========================================================
pt_prev = 0;
/* omit some lines */
list_for_each_entry_rcu(ptype, &ptype_all, list) {
if (!ptype->dev || ptype->dev == skb->dev) {
if (pt_prev) {
ret = deliver_skb(skb, pt_prev, orig_dev);
}
pt_prev = ptype;
}
}
/* omit some lines ... */
type = skb->protocol;
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
if (ptype->type == type &&
(!ptype->dev || ptype->dev == skb->dev)) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
}
if (pt_prev) {
ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
} else {
kfree_skb(skb);
/* Jamal, now you will not able to escape explaining
* me how you were going to use this. :-)
*/
ret = NET_RX_DROP;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html