上一节我们了解到,数据包如何走进桥,这一节我们简单看看,入口帧处理函数br_handle_frame_finish.
作用:br_handle_frame_finish函数主要是决策将不同类别的数据包做不同的分发路径。
其函数处理的过程如下图所示:
首先判断该数据包是否符合桥转发的条件:
(1)桥端口状态是否是开启状态,如果没有开启则丢掉数据包
(2)是否允许从该桥上转发,如果不允许,则直接返回0
获得桥转发的条件以后,开始判断数据包的类型:
(1)判断此时桥的标志为允许做哪些事情,学习还是扩展,如果学习的标志位被至位,则更新数据转发表。否则继续向下走
(2)根据多播或者广播报文的类型决定数据包的去留
(3)判断此时端口的状态,如果是学习状态,则将数据包丢弃
(要注意的是:桥的端口状态(和上面的flag不冲突,上面的flag表示网桥可以做的事情)state表示网桥端口所处于的状态)
在处理完一些需要预备的事情之后,就要为数据包的转发开始做准备了
(1)网桥设备是否处于混杂模式,如果是则建立副本,为发往本地做个备份
(注意的是,所有网桥端口绑定的设备都会处于混杂模式,因为 网桥运行必须此模式。但除非明确的对其进行配置,否则网桥自己是不会处于混杂模式的)
(2)在次判断广播还是多播地址
广播地址:仅仅设置副本,进行广播转发和发往本地
多播地址:先查多播地址转发表,如果存在,设置副本,进行多播转发,原始数据包指向NULL,如果已经传送至本地,则会释放副本,不进行本地转发,否则重新转发到本地
(3)不是广播或者多播
判断是否本地地址,如果是本地地址,则将原始数据包指向NULL,发往本地。否则进行数据包转发