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