Professional Documents
Culture Documents
linux
LAN1LAN2 1.0 2.0 eth0 eth1
Bridge Bridge Bridge
STP
DISABLED
BLOCKING
LISTENING
LEARNING
FORWARDING
br_add_bridge [net\bridge\br_if.c]
SIOCBRADDBR ioctl
br_add_bridge
3. .name = "bridge",
4. };
dev ifconfig
br_add_if() [net\bridge\br_if.c]
SIOCBRADDIF ioctl br_add_if
net_bridge_port p br->port_list port_nop->br
brp->state BR_STATE_DISABLED p
view plaincopy to clipboardprint?
1. p = new_nbp(br, dev);
p CAM CAM mac
p
dst
net_bridge_port
view plaincopy to clipboardprint?
1. err = br_fdb_insert(br, p, dev->dev_addr);
br_port pnet_bridge
net_bridge_port
dev
br_port
netif_receive_skb()->handle_bridge()
view plaincopy to clipboardprint?
1. static inline struct sk_buff *handle_bridge(struct sk_buff *skb,
2.
struct packet_type **pt_prev, int *ret,
3.
struct net_device *orig_dev)
4. {
5. struct net_bridge_port *port;
6.
7. if (skb->pkt_type == PACKET_LOOPBACK ||
8.
(port = rcu_dereference(skb->dev->br_port)) == NULL)
9. return skb;
10.
11. if (*pt_prev) {
12. *ret = deliver_skb(skb, *pt_prev, orig_dev);
13. *pt_prev = NULL;
14. }
15.
16. return br_handle_frame_hook(port, skb);
17. }
1.
lo
dev->br_port (skb->dev
dev->br_port p)
( CAM )
view plaincopy to clipboardprint?
1. static int br_handle_local_finish(struct sk_buff *skb)
2. {
3. struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
4.
5. if (p)
6. br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
7. return 0; /* process further */
8. }
br_handle_frame()
state= BR_STATE_FORWARDING
br_should_route_hook skb
state=BR_STATE_LEARNING
view plaincopy to clipboardprint?
1. rhook = rcu_dereference(br_should_route_hook);
2. if (rhook != NULL) {
3. if (rhook(skb))
4. return skb;
5. dest = eth_hdr(skb)->h_dest;
6. }
state= BR_STATE_LEARNING pkt_type
PACKET_HOST br_handle_frame_finish
PACKET_HOST
netif_receive_skb()()
br_handle_frame_finish()
mac CAM hub
netif_receive_skb()->handle_bridge() skb->dev
dev>br_port br_port
br_dev_xmit()[net\bridge\br_device.c]
br_multicast_deliver() br_flood_deliver() br_deliver() skb>dev brdev dev