概述
目录
1 linux 网桥功能
2 相关数据结构
2.1 网桥 struct net_bridge
2.2 网桥端口 struct net_bridge_port
2.3 转发表项 struct net_bridge_fdb_entry
2.4 嵌套关系
1 linux 网桥功能
《linux 网桥浅析》
2 相关数据结构
2.1 网桥 struct net_bridge
struct net_bridge
{
spinlock_t lock; //自旋锁,在向net_bridge中增加port节点或改变net_bridge结构时使用
struct list_head port_list;//网桥端口列表
struct net_device *dev;//网桥设备
struct br_cpu_netstats __percpu *stats;
spinlock_t hash_lock;//对hash转发库进行操作时需要使用该自旋锁
struct hlist_head hash[BR_HASH_SIZE];//转发数据库hash表
#ifdef CONFIG_BRIDGE_NETFILTER
struct rtable fake_rtable;
bool nf_call_iptables;
bool nf_call_ip6tables;
bool nf_call_arptables;
#endif
u16 group_fwd_mask;
/* 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;
u8 group_addr[ETH_ALEN];
u16 root_port;//根端口的端口号
enum {
BR_NO_STP, /* no spanning tree */
BR_KERNEL_STP, /* old STP in kernel */
BR_USER_STP, /* new RSTP in userspace */
} stp_enabled;
unsigned char topology_change;
unsigned char topology_change_detected;
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
unsigned char multicast_router;
u8 multicast_disabled:1;
u8 multicast_querier:1;
u32 hash_elasticity;
u32 hash_max;
u32 multicast_last_member_count;
u32 multicast_startup_queries_sent;
u32 multicast_startup_query_count;
unsigned long multicast_last_member_interval;
unsigned long multicast_membership_interval;
unsigned long multicast_querier_interval;
unsigned long multicast_query_interval;
unsigned long multicast_query_response_interval;
unsigned long multicast_startup_query_interval;
spinlock_t multicast_lock;
struct net_bridge_mdb_htable __rcu *mdb;
struct hlist_head router_list;
struct timer_list multicast_router_timer;
struct timer_list multicast_querier_timer;
struct timer_list multicast_query_timer;
#endif
struct timer_list hello_timer;//网桥定时器
struct timer_list tcn_timer;
struct timer_list topology_change_timer;
struct timer_list gc_timer;
struct kobject *ifobj;
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
u8 vlan_enabled;
struct net_port_vlans __rcu *vlan_info;
#endif
};
2.2 网桥端口 struct net_bridge_port
网桥上的每个端口用net_bridge_port结构体来表示,从net_bridge_port结构体中可以看出,它主要有:
- 逻辑网段中的下一个端口(next)
- 本端口所属的逻辑网段(br)
- 本端口所指向的物理网卡(dev)
- 本端口在网桥中的编号(port_no)
- 用于生成树管理的信息
struct net_bridge_port
{
struct net_bridge *br;//指向该网桥端口所绑定的网桥
struct net_device *dev;//指向该网桥端口所绑定的网络设备
struct list_head list;//用于将该网桥端口链接到网桥的port_list链表的指针
/* STP */
u8 priority;//端口优先级
u8 state;//端口状态,在对数据进行转发时会对该state值进行判断
u16 port_no;//端口号
unsigned char topology_change_ack;
unsigned char config_pending;
port_id port_id;//端口ID
port_id designated_port;
bridge_id designated_root;
bridge_id designated_bridge;
u32 path_cost;//端口路径开销
u32 designated_cost;
unsigned long designated_age;
struct timer_list forward_delay_timer;//网桥端口定时器
struct timer_list hold_timer;
struct timer_list message_age_timer;
struct kobject kobj;
struct rcu_head rcu;
unsigned long flags;
#define BR_HAIRPIN_MODE 0x00000001
#define BR_BPDU_GUARD 0x00000002
#define BR_ROOT_BLOCK 0x00000004
#define BR_MULTICAST_FAST_LEAVE 0x00000008
#define BR_ADMIN_COST 0x00000010
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
u32 multicast_startup_queries_sent;
unsigned char multicast_router;
struct timer_list multicast_router_timer;
struct timer_list multicast_query_timer;
struct hlist_head mglist;
struct hlist_node rlist;
#endif
#ifdef CONFIG_SYSFS
char sysfs_name[IFNAMSIZ];
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER
struct netpoll *np;
#endif
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
struct net_port_vlans __rcu *vlan_info;
#endif
};
2.3 转发表项 struct net_bridge_fdb_entry
//Mac地址的数据结构
struct mac_addr
{
unsigned char addr[6];
};
struct net_bridge_fdb_entry
{
struct hlist_node hlist;//将该表项链接到hash表头的指针
struct net_bridge_port *dst;//指向目的网桥端口(实网口)
struct rcu_head rcu;//rcu机制使用
unsigned long updated;
unsigned long used;
mac_addr addr;//mac地址
unsigned char is_local;//是否是本地mac地
unsigned char is_static;//mac地址是否为静态的标志
__u16 vlan_id;
};
2.4 嵌套关系
其中最左边的net_device是一个代表网桥的虚拟设备结构,它关联了一个net_bridge结构,这是网桥设备所特有的数据结构。
在 net_bridge 结构中,port_list 成员下挂一个链表,链表中的每一个节点(net_bridge_port结构)关联到一个真实的网口设备的net_device。网口设备也通过其br_port指针做反向的关联(那么显然,一个网口最多只能同时被绑定到一个网桥)。
net_bridge结构中还维护了一个hash表,是用来处理地址学习的。当网桥准备转发一个报文时,以报文的目的Mac地址为key,如果可以在hash表中索引到一个net_bridge_fdb_entry结构,通过这个结构能找到一个网口设备的net_device,于是报文就应该从这个网口转发出去;否则,报文将从所有网口转发。
最后
以上就是强健麦片为你收集整理的linux 网桥代码分析之网桥功能及其相关数据结构Ⅰ1 linux 网桥功能2 相关数据结构的全部内容,希望文章能够帮你解决linux 网桥代码分析之网桥功能及其相关数据结构Ⅰ1 linux 网桥功能2 相关数据结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复