我是靠谱客的博主 强健麦片,最近开发中收集的这篇文章主要介绍linux 网桥代码分析之网桥功能及其相关数据结构Ⅰ1 linux 网桥功能2 相关数据结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

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结构体中可以看出,它主要有:

  1. 逻辑网段中的下一个端口(next)
  2. 本端口所属的逻辑网段(br)
  3. 本端口所指向的物理网卡(dev)
  4. 本端口在网桥中的编号(port_no)
  5. 用于生成树管理的信息
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 嵌套关系

       

                              图2:Linux网桥数据结构描述图

其中最左边的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 相关数据结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部