type
Post
status
Published
slug
2023/08/12/CS144-2023-Spring-router.cc-Function-Partial-Implementation-Explanation
summary
tags
开发
category
技术分享
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
route.hh
routing_table_
- key:前缀长度
- value:路由项列表
// A routing table entry struct RouteEntry { uint32_t route_prefix {}; uint8_t prefix_length {}; std::optional<Address> next_hop; size_t interface_num {}; }; // The router's routing table std::map<uint32_t, std::list<RouteEntry>> routing_table_ {};
成员函数实现介绍
add_route
函数定义:给一个前缀,前缀长度,下一跳,接口数,然后生成一个对应的路由信息,插入到路由表中
// route_prefix: The "up-to-32-bit" IPv4 address prefix to match the datagram's destination address against // prefix_length: For this route to be applicable, how many high-order (most-significant) bits of // the route_prefix will need to match the corresponding bits of the datagram's destination address? // next_hop: The IP address of the next hop. Will be empty if the network is directly attached to the router (in // which case, the next hop address should be the datagram's final destination). // interface_num: The index of the interface to send the datagram out on. void Router::add_route( const uint32_t route_prefix, const uint8_t prefix_length, const optional<Address> next_hop, const size_t interface_num )
函数逻辑:
- 如果路由表中有相关前缀长度的路由表项
- 将其插入到列表后面
- 否则
- 直接插入到对应前缀长度并初始化一个列表
route()
函数逻辑:
- 遍历每个接口
- 尝试接收数据
- 如果有数据
- 如果 ttl ≤ 1
- ttl 过期
- continue
- ttl -1
- 重新计算校验和
- 取出目标地址
- 最长前缀匹配的路由,初始化为默认路由
- 遍历路由表项
- 获取路由表项前缀长度
- 如果是默认路由
- continue
- 获取目标地址掩码
- 获得目标网络号
- 获取该前缀长度的路由表项列表
- 遍历路由表项列表
- 获取路由表项网络前缀
- 将路由表项前缀与掩码与获得路由表项目标网络地址
- 如果路由表项网络与目标地址网络一致
- 如果路由表项长度大于目前最长匹配项的长度
- 将最长匹配路由表项更新为现在的路由表项
- 如果最长匹配项存在
- 如果下一跳不为空
- 向最长匹配路径中端口发送目标地址为对应下一跳地址的数据报
- 如果为空
- 项最长匹配路径中的端口发送目标地址为目的地址的数据报
欢迎加入“喵星计算机技术研究院”,原创技术文章第一时间推送。
- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2023/08/12/CS144-2023-Spring-router.cc-Function-Partial-Implementation-Explanation
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章