skb桥转发蓝图(五)
来源:互联网 发布:sopcast软件1.28版本 编辑:程序博客网 时间:2024/05/16 12:47
在前几节中,对于桥设备,桥端口的添加删除,初始化等等做了简单的介绍,这节开始我们开始看看数据在桥上是怎么转发的
话不多说,先看一张桥转发时函数调用的一个基本蓝图。
这张图中,简单的展示了,数据的接收和发送,其中还包括netfilet的钩子点所处的位置。
需要说明的是:
1.我们先暂时忽略数据包从一开始是怎么从驱动进入到netif_receive_skb的,因为这个暂时不影响我们理解这幅图的流程。
2.由于桥转发的篇幅较大,图中没有标示出,数据包中途被丢弃的情况。约定数据包会发送成功。
现在数据包(skb)已经准备好了装备要闯关了
1.首先skb从驱动经过繁杂的路线走到了netif_receive_skb这个函数中经过一些小波折到达__netif_receive_skb_core中时遇到了第一个十字路口是看了看自己有没有skb->dev->rx_handler(注1)这个装备,如果有,则进入br_handle_frame(注2).如果没有则直接上协议栈。
注1:桥下的设备注册过rx_handler函数,所以数据包会进入桥,br_pass_frame_up函数将原先的设备换成了桥设备, 而桥设备没有注册过rx_handler函数,所以数据包不会二次进入桥。
注2:br_handle_frame我们在前几节提到过,是skb进入桥的入口函数,在br_add_if的时候会注册该函数。
2.skb注定要经历一番劫难,刚进入br_handle_frame又将陷入两难境地,此时有两个入口,这两个是netfilter设下的连个hook点,分别是,NF_BR_PRE_ROUTING,和NF_BR_LOCAL_IN,两种路径,如果数据包只想去本地,则会选择NF_BR_LOCAL_IN入口,然后发往本地,如果暂时还确定不了,则先进入NF_BR_PRE_ROUTING入口.
3.进入NF_BR_PRE_ROUTING入口后,会遇到br_handle_frame_finish函数,这个函数决定了skb的何去何从,(1)如果是转发,则在经过NF_BR_FORWARD钩子点进入转发阶段的障碍,最后在进入NF_BR_POST_ROUTING,以及最终的dev_queue_xmit,实现最终转发。(2)如果发往本地则重新进入NF_BR_LOCAL_IN最后在进入netif_receive_skb,进行转发。skb在经过目前口述的磨练最终得以释放。
4.如果是如果是本地发出的数据包,经过NF_BR_LOCAL_OUT钩子点然后进入最后阶段的NF_BR_POST_ROUTING,进行相应的转发。
关于转发的细节部分,请看下一节。
- skb桥转发蓝图(五)
- skb
- skb_put(skb,len)和skb_push(skb,len)的区别
- SAP CRM实施---蓝图设计五
- (74)蓝图简介
- (77)蓝图事件
- (80)蓝图剖析
- (82)蓝图工具栏
- (82)蓝图菜单
- (84)关卡蓝图
- (96)蓝图变量
- (97)蓝图函数
- (99)蓝图数组
- 写的将skb copy/clone后转发到源地址的一段代码
- SERVLETJSP学习(五)—— 转发 、JSP开发常见问题
- (86)蓝图UI之我的蓝图
- Confluence 使用蓝图(Blueprint)
- Confluence 决定(Decisions )蓝图
- rabbit ack机制
- Scala 最佳实践:纯函数
- Java Split注意事项
- ConcurrentHashMap的研究
- 监听Editext焦点获取
- skb桥转发蓝图(五)
- mysql安装
- SAP MM批次管理(7)分割评估
- python小白入门教程——TypeScript的语言特性
- githubPages+jekyll制作博客教程
- CodeForces
- HDU 6040 Hints of sd0061 STL
- nginx 配置项 root与alias区别
- BeanFactory和ApplicationContext的区别