路由下发内核
graph LR
static[静态和动态路由] --rt->queue--> kernel[内核main_table]
内核同步硬件
graph LR
do_fib_aggregate>do_fib_aggregate] --同步main_table--> list[RtA_Header list] --> Avl[Ftn_Avl_Tree] --> Avl2[RTC_Header] --> hardware(硬件)
路由相关表项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| rt - gated rt_table *rt_tables[AF_MAX][VRF_MAX_NUM];
fib_optimize.c -kernel
extern struct fib_table *local_table[VRF_MAX_NUM]; extern struct fib_table *main_table[VRF_MAX_NUM]; extern struct neigh_table arp_tbl;
route_infor_pt RtA_Header = &RtAs_Header; tc_infor_pt RtC_Header[VRF_MAX_NUM]; Ftn_Avl_Tree
rt_nh.c - rt_nh rtn (rtn_entry_head)
|
下发协议栈fib
都是调用tb->tb_insert
1 2
| ip_rt_ioctl fib_new_table
|
gated: gated_start -> ip_routing_task
1 2 3 4 5 6 7 8 9 10
| static-> rt : shell->Add_Route_shell->Add_Route->SRHead->rt_static_update_by_network->rt_add rip-> rt : rip_recv_response->rt_open->rt_add bgp > rt : bgp_network_scan_job -> rt_open -> RTLIST_ADD bgp_recv_v4_update -> bgp_sync_rt_add -> rt_add rt > queue : rt_add->rt_event_initialize->rt_insert ->INSQUE(insert_rt,insert_rth->rt_back) queue > fib : rt_flash_update -> krt_flash -> krt_q_flush krt_q_flush->krt_change->krt_action->ip_rt_ioctl
|
show ip route
协议栈同步硬件
fib_optimize.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| enum rt_scope_t { RT_SCOPE_UNIVERSE=0, RT_SCOPE_SITE=200, RT_SCOPE_LINK=253, RT_SCOPE_HOST=254, RT_SCOPE_NOWHERE=255 };
do_fib_aggregate { RtA_Header <- main_table
temp_rta = RtA_Header->forw; while ((temp_rta != RtA_Header)) avl_insert(Ftn_Avl_Tree, avl_compFtn, (avl_datum_t *)&(temp_rta->rt_gen));
+----160 行: {························································
insert_rtc_list -> RtC_Header l3drvAddNormalRoute
INSERT_DEFIP_TABLE_FULL:
l3drvAddNormalRoute }
|
UpDateDefIpByIP
//邻居更新后出发更新硬件路由
1
| lcalL3drvUpDateNormalRoute
|
下发路由时机
添加三层接口
register_netdevice
l3drvAddInterface
设置三层接口ip
SetIfAddr
set_if_ipaddr
下发静态单播路由
l3drvAddNormalRoute
kyland_l3_route_add
route_add
下发直连路由
lcalL3drvAddDirectRoute
l3drvAddDirectRoute
route_add
路由下发sdk
1 2 3 4 5
| route_add { lpm_alloc nc_ip_find lpm_set }
|
静态组播路由
lcalL3drvAddIpmcForwarding
l3drvAddIpmcEntryByIndex
kyland_l3_route_add