linux内核路由子系统
2020-08-28 13:48:36 0 举报
linux内核路由子系统
作者其他创作
大纲/内容
grec->grec_type判断mld2组播报文类型
判断此报文是否没有送往本地并且本地有套接字在监听组播报文
否
ip_route_input_mc查找组播路由的路由条目
组播
重置组播老化定时器,更新组播信息
ip6mr_cache_find查找组播转发缓存
proxy
br_ip6_multicast_add_group添加ipv6组播组
不是
其他字段
__mkroute_output生成skb的路由缓存dst_entry
组播数据报文
br_ip4_multicast_igmp3_report处理igmpv3组播报文
传输层协议处理
ip_route_input_rcu预分流,查找路由缓存
type判断igmpv3组播报文类型
不能
1
ipmr_rt_fib_lookup使用注册的ip_mr_rules_ops查找组播路由表
br_ip4_multicast_query处理ipv4组播query报文
ip_mr_queue_xmit根据dst_entry的output将报文发送出去
ip_mr_input组播相关处理
送往上层应用进行处理
ip6_mc_input根据扩展头部以及组播路由缓存来处理组播报文
判断是组播还是单播
ip_rcv_finish_core等三层协议
mld->mld_type判断组播报文类型
ip_mr_forward使用虚接口vif转发到其他主机
ip_route_input_slow查找单播路由的路由条目,填充flowi4信息
br_ip6_multicast_leave_group处理ipv4组播query报文
根据skb的dst_entry的input函数对报文进行处理
链路层协议栈
br_ip4_multicast_add_group添加ipv4组播组
判断有无开启BROPT_MULTICAST_QUERIER离组时发送查询报文
转发到其他主机
ip6_input本地接收处理
ipv4报文
tcp_v4_early_demux/udp_v4_early_demux根据四层协议头进行预分流,查找路由缓存
IGMPV3_HOST_MEMBERSHIP_REPORT
桥接单播报文处理流程
有
br_multicast_new_group先查找桥接有没有这个组的mdb,如果没有则创建一个mdb并添加到桥下面的br->mdb_list
br_ip4_multicast_leave_group处理ipv4组播l离组报文
ICMPV6_MLD2_REPORT
找到路由
br_port_group_equal遍历端口能否查找到组播组相对应的端口
ip6mr_fib_lookup使用注册的mr6_rules_ops查找组播路由表
br_multicast_ipv6_rcv处理ipv6组播报文
fib_lookup查找路由表
udp_sendmsg等四层协议
送往本地
ipv6_rcv
IGMP_HOST_MEMBERSHIP_QUERY
ip_rcv_finish_core
ipv6组播proxy 守护进程
没有找到
fib_table_lookupnet->ipv4.fib_main查找主路由表
__br_multicast_send_query发送查询报文
sk_dst_check从sk里查找路由缓存rtable
可以
对报文进行转发
br_multicast_ipv4_rcv处理ipv4组播报文
skb->protocol判断是ipv4还是ipv6组播报文
是
IGMP_HOST_LEAVE_MESSAGE
MLD2_CHANGE_TO_INCLUDMLD2_MODE_IS_INCLUDEE
__mkroute_output为skb选择合适的dst_entry处理函数
skb_valid_dst判断能否获取到路由缓存
snooping
ipv6_mc_check_mld检查ipv6报文完整性
ip_error地址错误处理
组播子系统
将路由缓存dst_entry保存到skb里
对特殊组播报文进行特殊处理
ICMPV6_MGM_REDUCTION
ip_mkroute_input根据路由表信息生成skb的路由缓存dst_entry
is_multicast_ether_addr判断是否是组播报文
IGMPV3_CHANGE_TO_INCLUDEIGMPV3_MODE_IS_INCLUDE
ICMPV6_MGM_QUERY
发送到其他主机
br_ip6_multicast_query处理ipv6组播query报文
ipv4组播报文
br_multicast_rcv处理桥模式下的sbooping组播流程
路由子系统
ip6_mr_forward使用虚接口vif转发到其他主机
删除组播表象
ip6_route_input查找组播路由并将dst_entry->nput设置为ip6_mc_input
ip_mc_check_igmp检查组播报文信息
无
fib_table_lookupnet->ipv4.fib_default查找默认路由表
if (!rt)判断能否获取到路由缓存
get/set操作组播缓存
ICMPV6_MGM_REPORT
ip6_rcv_finish_core判断skb有没有dst_entry路由缓存
2
ipmr_cache_find查找组播路由缓存
IGMPV2_HOST_MEMBERSHIP_REPORT
net->ipv4.fib_has_custom_rules判断有无策略路由
ipv4组播proxy 守护进程
__br_forward进行组播报文转发
ipv4_is_multicast判断是否是组播报文
br_multicast_flood根据net_bridge_mdb_entry里的组播表项进行端口转发
判断是否为BR_MULTICAST_FAST_LEAVE模式
ip_route_output_flow填充flowi4信息
单播
查询时间超时
raw_rcv使用原始套接字协议进行处理
IPv4单播报文处理流程
br_ip6_multicast_mld2_report处理ipv6 mld2组播报文
__fib_lookup通过注册的路由查找方法查找策略路由
判断是送往本地还是进行转发
br_handle_frame_finish桥接报文处理函数
ih->type判断组播报文类型
ip_route_input_mcskb的dst_entry->input设置为ip_mr_input
ipv6组播报文
ip_route_input_rcu路由子系统处理组播报文
ip_local_deliver本地接收处理
br_multicast_new_port_group创建一个组播端口成员表项并添加到port->mglist
0 条评论
回复 删除
下一页