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只能依据现有的协议来定义流表项这个缺点。

原文地址:https://www.cnblogs.com/fangdaoyou/p/12024541.html