zoukankan      html  css  js  c++  java
  • 2019 SDN上机第7次作业

    1.根据P4教程,将basic和basic_tunnel两个案例程序补充完整,成功运行。

    • basic:

      • 补全代码:
      /* TODO: add parser logic */
      state start {
          transition parse_ethernet;
      }
      
      state parse_ethernet {
          packet.extract(hdr.ethernet);
          transition select(hdr.ethernet.etherType) {
              TYPE_IPV4: parse_ipv4;
              default: accept;
          }
      }
      
      state parse_ipv4 {
          packet.extract(hdr.ipv4);
          transition accept;
      }
      
      /* TODO: fill out code in action body */
      standard_metadata.egress_spec = port;
      hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
      hdr.ethernet.dstAddr = dstAddr;
      hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
      
      /* TODO: fix ingress control logic
      *  - ipv4_lpm should be applied only when IPv4 header is valid
      */
      if (hdr.ipv4.isValid()) {
              ipv4_lpm.apply();
      }
      
      /* TODO: add deparser logic */
      packet.emit(hdr.ethernet);
      packet.emit(hdr.ipv4);
      
      • 接着打开终端,进入basic文件夹,输入make run编译运行:

      • ping通测试:

        • ping h1 h2
        • pingall
        • 均成功,说明代码补充正确
    • basic_tunnel

      • 补全代码:
      // TODO: Update the parser to parse the myTunnel header as well
      parser MyParser(packet_in packet,
          out headers hdr,
          inout metadata meta,
          inout standard_metadata_t standard_metadata) {
              state start {
                  transition parse_ethernet;
              }
      
              state parse_ethernet {
                  packet.extract(hdr.ethernet);
                  transition select(hdr.ethernet.etherType) {
                      TYPE_MYTUNNEL: parse_myTunnel;
                      TYPE_IPV4: parse_ipv4;
                      default: accept;
              }
          }
      
          state parse_myTunnel {
              packet.extract(hdr.myTunnel);
              transition select(hdr.myTunnel.proto_id) {
                  TYPE_IPV4: parse_ipv4;
                  default: accept;
              }
          }
      
          state parse_ipv4 {
              packet.extract(hdr.ipv4);
              transition accept;
          }
      }
      
      // TODO: declare a new action: myTunnel_forward(egressSpec_t port)
      action myTunnel_forward(egressSpec_t port) {
          standard_metadata.egress_spec = port;
      }
      
      // TODO: declare a new table: myTunnel_exact
      // TODO: also remember to add table entries!
      table myTunnel_exact {
          key = {
              hdr.myTunnel.dst_id: exact;
          }
          actions = {
              myTunnel_forward;
              drop;
          }
          size = 1024;
          default_action = drop();
      }
      
      
      // TODO: Update control flow
      
      if (hdr.ipv4.isValid() && !hdr.myTunnel.isValid()) {
          ipv4_lpm.apply();
      }
      
      if (hdr.myTunnel.isValid()) {
          myTunnel_exact.apply();
      }
      
      // TODO: emit myTunnel header as well
      packet.emit(hdr.myTunnel);
      
      • make run:

      • xterm h1 h2打开主机终端

        • 主机2输入./receive.py

        • 主机2输入./send.py 10.0.2.2 "OHHHHH"

        • 主机1界面

          已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息

        • 主机1输入./send.py 10.0.2.2 "OHHHH" --dst_id 2

        • 主机2界面已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息

        • 主机1输入./send.py 10.0.4.4 "OHHHH" --dst_id 2

        • 主机2界面已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息

    2.说明案例程序的编译执行流程

    • basic.p4

      • make run
      • 编译basic.p4 代码,生成basic.json
      • 解析topology.json, 并且构建相应的mininet仿真拓扑
      • 进入mininet命令行
    • basic_tunnel.p4

      • make run
      • 编译basic_tunnel.p4,生成basic_tunnel.json
      • 构建相应的mininet仿真拓扑,三个交换机(s1,s2,s3),被配置成三角形,每个连接到一个主机(h1,h2,和h3)
      • 该主机被分配的IP地址10.0.1.1,10.0.2.2和10.0.3.3
      • 进入mininet命令行

    3.提交你对P4的认识和体会。

    P4模型的核心特征仍然是基于网络包处理的高速交换,它可以实现Packet通信相关事件的处理,灵活匹配,灵活编辑,以及小容量的高速存储查找。通过p4可以实现数据平面可编程,我们可以对超高速ASIC数据平面的转发行为与流水线逻辑进行自行定制,能很好地弥补OpenFlow只能依据现有的协议来定义流表项这个缺点。

  • 相关阅读:
    C++面向对象高级编程(下)第二周-Geekband
    C++面向对象高级编程(下)第一周-Geekband
    C++面向对象高级编程(下)-Geekband
    堆,栈,内存管理, 拓展补充-Geekband
    C++面向对象高级编程(上)-Geekband
    MFC 多屏显示
    Open CASCADE Technology: IGES Support
    JAVA反射
    HashMap
    Linux 系统编程
  • 原文地址:https://www.cnblogs.com/fangdaoyou/p/12024541.html
Copyright © 2011-2022 走看看