网桥数据结构

网桥最主要有三个数据结构: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地址

}

没有评论: