首页 > 其他分享 >CS144-lab5

CS144-lab5

时间:2023-10-11 23:13:03浏览次数:30  
标签:dgram max CS144 length prefix lab5 router table

Checkpoint 5 Writeup

该lab较简单,没什么好说的
有两点是route函数for循环时必须用引用,还是ttl递减后要重新计算checksum,写的时候被坑到了。
至于找到最长前缀匹配,遍历路由表即可,注意prefix为0时要特判;为了方便判断是否在路由表中找到符合项,max_prefix设置为int8_t。

void Router::add_route( const uint32_t route_prefix,
                        const uint8_t prefix_length,
                        const optional<Address> next_hop,
                        const size_t interface_num )
{
  cerr << "DEBUG: adding route " << Address::from_ipv4_numeric( route_prefix ).ip() << "/"
       << static_cast<int>( prefix_length ) << " => " << ( next_hop.has_value() ? next_hop->ip() : "(direct)" )
       << " on interface " << interface_num << "\n";

  (void)route_prefix;
  (void)prefix_length;
  (void)next_hop;
  (void)interface_num;

  if ( next_hop.has_value() ) {
    router_table.push_back( { route_prefix, prefix_length, next_hop.value().ipv4_numeric(), interface_num } );
  } else {
    router_table.push_back( { route_prefix, prefix_length, std::nullopt, interface_num } );
  }
}

void Router::route()
{
  // !!! &
  for ( auto& inter : interfaces_ ) {
    std::optional<InternetDatagram> maybe_dgram = inter.maybe_receive();
    if ( maybe_dgram.has_value() ) {
      InternetDatagram dgram = maybe_dgram.value();
      if ( dgram.header.ttl <= 1 ) {
        continue;
      }
      dgram.header.ttl--;
      // !!!!
      dgram.header.compute_checksum();
      uint32_t dst_ip = dgram.header.dst;
      int8_t max_prefix = -1;
      size_t max_prefix_index = 0;
      for ( size_t i = 0; i < router_table.size(); i++ ) {
          if ( !router_table[i].prefix_length || (( dst_ip >> ( 32 - router_table[i].prefix_length ) )
               == ( router_table[i].route_prefix >> ( 32 - router_table[i].prefix_length ) )) ) {
            if(router_table[i].prefix_length > max_prefix)
            {
              max_prefix = router_table[i].prefix_length;
              max_prefix_index = i;
            }
        }
      }
      if(max_prefix == -1)
        continue;
      interfaces_[router_table[max_prefix_index].interface_num].send_datagram(
        dgram, Address::from_ipv4_numeric( router_table[max_prefix_index].next_hop.value_or( dst_ip ) ) );
    }
  }

标签:dgram,max,CS144,length,prefix,lab5,router,table
From: https://www.cnblogs.com/wangerblog/p/17758468.html

相关文章

  • CS144-lab3
    Checkpoint3Writeup该lab主要实现TCP发送方,细节比较多,具有一定难度,编写时需要从整体上理清设计思路,然后再实现具体的函数。Timer由于要实现TCP中的超时重传功能,所以需要在发送方维护一个定时器,但不需要自己使用计时函数,因为文档里说明了所有对时间的了解都是通过tick函数得到......
  • CS144-lab1
    Checkpoint1Writeup该lab要根据首字母索引来对收到的字符串进行重组,还原为原始数据(字符串可能乱序到达,可能有重叠)思路是将按顺序并小于可用容量的字符串(可能是部分子串)直接推流到输出流,将失序但在可用容量内的字符串放入本地buffer。考虑到最好用首字符索引对收到的字符......
  • CS144-lab0
    Checkpoint0Writeup该lab要实现一个字节流,兼具写入和读出的能力,并且buffer空间受限。根据要实现的函数和读写功能,内部要存储的成员为std::queue<std::string>buffer_{};用于存储写入的字符串(原本用的std::queue,但由于queue内存不连续,调用peek返回string_view时还要将cha......
  • CS144-lab4
    Checkpoint4Writeup报文头格式IPV4头/**+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*|Version|IHL|TypeofService|TotalLength|*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*|......
  • MIT6.s081/6.828 lectrue07:Page faults 以及 Lab5 心得
    本篇博客主要是复习MIT6.s081/6.828lectrue07:Pagefaults以及记录Lab5:COWfork的心得值得一提的是,2020年之前的版本第5个lab是lazyalloction,但是到了2020年之后就换成了难度稍高一点的COWfork,有兴趣的小伙伴可以把lazyalloction也一起做一做~毕竟这些lab......
  • 【学习笔记-CS144 计算机网络】传输层
    概述主要任务:对接端口连接管理分割和重组上下数据差错和纠错功能流量控制传输层协议TCP特点:可靠性高端到端,面向连接基于字节速度慢向下传递操作步骤:接受来自应用层的8位字节的数据流,并根据MTU分段。封装上队头标记,打包成数据包将......
  • CS144 计算机网络 Lab4:TCP Connection
    前言经过前面几个实验的铺垫,终于到了将他们组合起来的时候了。Lab4将实现TCPConnection功能,内部含有TCPReceiver和TCPSender,可以与TCP连接的另一个端点进行数据交换。实验要求简单来说,这次实验就是要在TCPConnection类中实现下图所示的有限状态机:这些状态对应T......
  • ICT实战系统集成-LAB5-OpenEuler软件管理
    系统集成-LAB5-OpenEuler软件管理1实验要求任务一:使用rpm包安装zziplib工具1、完成安装2、查询zziplib工具是否安装成功3、查询zziplib工具的文件列表和完整目录4、查询zziplib工具的详细信息5、对zziplib工具进行卸载任务二:使用yum/dnf安装java-1.8.01、完成yum/dnf源......
  • CS144 计算机网络 Lab3:TCP Sender
    前言在Lab2中我们实现了TCPReceiver,负责在收到报文段之后将数据写入重组器中,并回复给发送方确认应答号。在Lab3中,我们将实现TCP连接的另一个端点——发送方,负责读取ByteStream(由发送方上层应用程序创建并写入数据),并将字节流转换为报文段发送给接收方。代码实现TCPSe......
  • lab5:深入理解进程切换
    目录linux操作系统分析Lab5:深入理解进程切换context_switch函数执行过程1.prepare_task_switch()2.arch_start_context_switch()3.switch_mm_irqs_off()进程地址切换3.switch_to()实验总结linux操作系统分析Lab5:深入理解进程切换context_switch函数content_switch函......