网桥最主要有三个数据结构:struct net_bridge,struct net_bridge_port,struct net_bridge_fdb_entry,他们之间的关系如下图:
展开来如下图:
说明:
1. 其中最左边的net_device是一个代表网桥的虚拟设备结构,它关联了一个net_bridge结构,这是网桥设备所特有的数据结构。
2. 在net_bridge结构中,port_list成员下挂一个链表,链表中的每一个节点(net_bridge_port结构)关联到一个真实的网口设 备的net_device。网口设备也通过其br_port指针做反向的关联(那么显然,一个网口最多只能同时被绑定到一个网桥)。
3. net_bridge结构中还维护了一个hash表,是用来处理地址学习的。当网桥准备转发一个报文时,以报文的目的Mac地址为key,如果可以在 hash表中索引到一个net_bridge_fdb_entry结构,通过这个结构能找到一个网口设备的net_device,于是报文就应该从这个网 口转发出去;否则,报文将从所有网口转发。
各个结构体具体内容如下:
struct net_bridge
struct net_bridge
{
spinlock_t lock; //读写锁
//网桥所有端口的链表,其中每个元素都是一个net_bridge_port结构
struct list_head port_list;
struct net_device *dev; //网桥对应的设备
struct net_device_stats statistics; //网桥对应的虚拟网卡的统计数据
spinlock_t hash_lock; //hash表的锁
/*--CAM: 保存forwarding database的一个hash链表(这个也就是地址学习的东东,
所以通过hash能 快速定位),这里每个元素都是一个net_bridge_fsb_entry结构--*/
struct hlist_head hash[BR_HASH_SIZE];
struct list_head age_list;
/* STP */ //与stp 协议对应的数据
bridge_id designated_root;
bridge_id bridge_id;
u32 root_path_cost;
unsigned long max_age;
unsigned long hello_time;
unsigned long forward_delay;
unsigned long bridge_max_age;
unsigned long ageing_time;
unsigned long bridge_hello_time;
unsigned long bridge_forward_delay;
u16 root_port;
unsigned char stp_enabled;
unsigned char topology_change;
unsigned char topology_change_detected;
//stp要用的一些定时器列表。
struct timer_list hello_timer;
struct timer_list tcn_timer;
struct timer_list topology_change_timer;
struct timer_list gc_timer;
struct kobject ifobj;
}
2. struct net_bridge_port
struct net_bridge_port
{
struct net_bridge *br; //从属于的网桥设备
struct net_device *dev;//表示链接到这个端口的物理设备
struct list_head list;
/* STP */ //stp相关的一些参数。
u8 priority;
u8 state;
u16 port_no; //本端口在网桥中的编号
unsigned char topology_change_ack;
unsigned char config_pending;
port_id port_id;
port_id designated_port;
bridge_id designated_root;
bridge_id designated_bridge;
u32 path_cost;
u32 designated_cost;
//端口定时器,也就是stp控制超时的一些定时器列表
struct timer_list forward_delay_timer;
struct timer_list hold_timer;
struct timer_list message_age_timer;
struct kobject kobj;
struct rcu_head rcu;
}
3. struct net_bridge_fdb_entry
struct net_bridge_fdb_entry
{
struct hlist_node hlist;
//桥的端口(最主要的两个域就是这个域和下面的mac地址域)
struct net_bridge_port *dst;
struct rcu_head rcu; //当使用RCU策略,才用到
atomic_t use_count; //引用计数
unsigned long ageing_timer; //MAC超时时间
mac_addr addr; //mac地址。
unsigned char is_local; //是否为本机的MAC地址
unsigned char is_static; //是否为静态MAC地址
}
没有评论:
发表评论