前几章稍分析了网桥,接着我们继续1中的收包流程,说到
struct net_device *orig_dev)
{
atomic_inc(&skb->users);
return pt_prev-> func (skb, skb->dev, pt_prev, orig_dev);
}
对该数据包转达到其他L3协议的处理函数:
type = skb->protocol;
list_for_each_entry_rcu(ptype,
& ptype_base[ntohs( type) & PTYPE_HASH_MASK], list) {
if (ptype->type == type &&
(ptype->dev == null_or_orig || ptype->dev == skb->dev ||
ptype->dev == orig_dev)) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
}
& ptype_base[ntohs( type) & PTYPE_HASH_MASK], list) {
if (ptype->type == type &&
(ptype->dev == null_or_orig || ptype->dev == skb->dev ||
ptype->dev == orig_dev)) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
}
->static inline int deliver_skb(struct sk_buff *skb,
struct packet_type *pt_prev,
struct net_device *orig_dev)
{
atomic_inc(&skb->users);
return pt_prev-> func (skb, skb->dev, pt_prev, orig_dev);
}
ptype_base
: 协议模块通过dev_add_pack()加入 arp pppoe ip等
我们看ptype_base的建立
void dev_add_pack(struct packet_type *pt)
{
int hash;
spin_lock_bh(&am
{
int hash;
spin_lock_bh(&am