- 论坛徽章:
- 16
|
bridge转发流程:
int br_handle_frame_finish(struct sk_buff *skb)
{
const unsigned char *dest = eth_hdr(skb)->h_dest;
struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
struct net_bridge *br;
struct net_bridge_fdb_entry *dst;
struct sk_buff *skb2;
if (!p || p->state == BR_STATE_DISABLED)
goto drop;
/* insert into forwarding database after filtering to avoid spoofing */
br = p->br;
/*相当于二层mac地址的学习*/
br_fdb_update(br, p, eth_hdr(skb)->h_source);
if (p->state == BR_STATE_LEARNING)
goto drop;
/* The packet skb2 goes to the local host (NULL to skip). */
skb2 = NULL;
if (br->dev->flags & IFF_PROMISC)
skb2 = skb;
dst = NULL;
if (is_multicast_ether_addr(dest)) {
br->statistics.multicast++;
skb2 = skb;
} else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) {
skb2 = skb;
/* Do not forward the packet since it's local. */
skb = NULL;
}
if (skb2 == skb)
skb2 = skb_clone(skb, GFP_ATOMIC);
if (skb2)
br_pass_frame_up(br, skb2);
if (skb) {
if (dst)
br_forward(dst->dst, skb);
else
br_flood_forward(br, skb);
}
out:
return 0;
drop:
kfree_skb(skb);
goto out;
}
对应网桥设备为混杂模式,以及收到数据包为多播目的mac以及目的mac地址为本地的目的mac的都要通过br_pass_frame_up(br,skb2)发送到上层协议,但是在跟踪br_pass_frame_up(br,skb2)的时候,发现实质又是调用了
indev = skb->dev;skb->dev = br->dev;
NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,netif_receive_skb);再次送到上层协议的,在此调用netif_receive_skb的时候,会不会还要存在循环处理该数据包呢
在没有找到目的出接口转发的时候,会在整个网桥中泛出去。在泛和时候发现调用br_flood(br, skb, __br_forward);时候,在br_flood函数中遍历整个bridge网桥的设备端口时候,为什么会出现两个struct net_bridge_port *p;struct net_bridge_port *prev;?何不使用一个指针遍历整个链表,若不为空,就从该网桥端口发送出去。不太明白内核那样做是不是还有什么其他的考虑,会不会是多余的一步啊 或者是我哪里理解错了 |
|