道系统三层交换机路由框架

路由下发内核

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;//获取所有的FIB信息形成链表RtA_Header->Ftn_Avl_Tree
tc_infor_pt RtC_Header[VRF_MAX_NUM]; //C表记录成功加入DEF_IP中的路由 DEF_IP为下硬件路由
Ftn_Avl_Tree //将RtA_Header链表转换成为一个AVL结构,按照mask, netaddr, nexthop作为key排序

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
//flush entries from krt route queue into kernel

show ip route

1
show -> main_table

协议栈同步硬件

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
{
/* 获取所有的FIB 信息,但是最多获取rt_data_mem_max 条,形成链表RtA_Header*/
RtA_Header <- main_table

//AVL_CONVERT
/*将RtA_Header 链表转换成为一个AVL 结构,按照mask , netaddr , nexthop 作为key 排序*/
temp_rta = RtA_Header->forw;
while ((temp_rta != RtA_Header))
avl_insert(Ftn_Avl_Tree, avl_compFtn, (avl_datum_t *)&(temp_rta->rt_gen));

/* 遍历RTC表,和AVL Tree进行比较
* 如果RTC表中存在,AVL Tree中不存在,在RTC表中和DEFIP中进行删除
* 如果RTC表中存在,在AVL Tree中存在,从AVL Tree中作标记*/
+----160 行: {························································
/* 遍历AVL Tree,将AVL Tree中的未作标记的元素加入到DEFIP和RTC表中
* 如果插入DEFIP表满,进入DEFIP_FULL 处理流程
* 如果插入DEFIP表出错,进入DEFIP_ERROR 处理流程*/
insert_rtc_list -> RtC_Header
l3drvAddNormalRoute

INSERT_DEFIP_TABLE_FULL:
/* DEFIP_FULL处理流程
将RTC表和DEFIP 表中所有表项删除,按照AVL Tree 进行重新插入,如果
如果插入DEFIP表满,退出插入流程
添加一条指向CPU的虚拟路由*/
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 //创建lpm软件表相
nc_ip_find //查看下一跳,没有就创建一个
lpm_set //真正写寄存器
}

静态组播路由

   lcalL3drvAddIpmcForwarding
   l3drvAddIpmcEntryByIndex
   kyland_l3_route_add

道系统三层交换机路由框架
http://witbit.cn/NETWORK/route/道系统三层交换机路由框架.html
作者
朝彻
发布于
2025年2月13日
许可协议