2019 SDN上机第7 次作业

basic补充`/* -- P4_16 -- */

include <core.p4>
include <v1model.p4>

const bit<16> TYPE_IPV4 = 0x800;

/*************************************************************************
*********************** H E A D E R S ***********************************
*************************************************************************/

typedef bit<9> egressSpec_t;
typedef bit<48> macAddr_t;
typedef bit<32> ip4Addr_t;

header ethernet_t {
​ macAddr_t dstAddr;
​ macAddr_t srcAddr;
​ bit<16> etherType;
}

header ipv4_t {
​ bit<4> version;
​ bit<4> ihl;
​ bit<8> diffserv;
​ bit<16> totalLen;
​ bit<16> identification;
​ bit<3> flags;
​ bit<13> fragOffset;
​ bit<8> ttl;
​ bit<8> protocol;
​ bit<16> hdrChecksum;
​ ip4Addr_t srcAddr;
​ ip4Addr_t dstAddr;
}

struct metadata {
​ /* empty */
}

struct headers {
​ ethernet_t ethernet;
​ ipv4_t ipv4;
}

/*************************************************************************
*********************** P A R S E R ***********************************
*************************************************************************/

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) {
​ 0x0800: parse_ipv4;
​ default: accept;
​ }
​ }
​ state parse_ipv4{
​ packet.extract(hdr.ipv4); //解析数据报文头部
​ transition accept;
​ }
}

/*************************************************************************
************ C H E C K S U M V E R I F I C A T I O N *************
*************************************************************************/

control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
​ apply { }
}

/*************************************************************************
************** I N G R E S S P R O C E S S I N G *******************
*************************************************************************/

control MyIngress(inout headers hdr,
​ inout metadata meta,
​ inout standard_metadata_t standard_metadata) {
​ action drop() {
​ mark_to_drop(standard_metadata);
​ }

​ action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
​ /* TODO: fill out code in action body /
​ hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
​ hdr.ethernet.dstAddr = dstAddr;
​ standard_metadata.egress_spec = port;
​ hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
​ }

​ table ipv4_lpm {
​ key = {
​ hdr.ipv4.dstAddr: lpm;
​ }
​ actions = {
​ ipv4_forward;
​ drop;
​ NoAction;
​ }
​ size = 1024;
​ default_action = NoAction();
​ }

​ apply {
​ /
TODO: fix ingress control logic
* - ipv4_lpm should be applied only when IPv4 header is valid
​ */
if(hdr.ipv4.isValid())
​ ipv4_lpm.apply();
}
}

/*************************************************************************
**************** E G R E S S P R O C E S S I N G *******************
*************************************************************************/

control MyEgress(inout headers hdr,
​ inout metadata meta,
​ inout standard_metadata_t standard_metadata) {
​ apply { }
}

/*************************************************************************
************* C H E C K S U M C O M P U T A T I O N **************
*************************************************************************/

control MyComputeChecksum(inout headers hdr, inout metadata meta) {
​ apply {
​ update_checksum(
​ hdr.ipv4.isValid(),
​ { hdr.ipv4.version,
​ hdr.ipv4.ihl,
​ hdr.ipv4.diffserv,
​ hdr.ipv4.totalLen,
​ hdr.ipv4.identification,
​ hdr.ipv4.flags,
​ hdr.ipv4.fragOffset,
​ hdr.ipv4.ttl,
​ hdr.ipv4.protocol,
​ hdr.ipv4.srcAddr,
​ hdr.ipv4.dstAddr },
​ hdr.ipv4.hdrChecksum,
​ HashAlgorithm.csum16);
​ }
}

/*************************************************************************
*********************** D E P A R S E R *******************************
*************************************************************************/

control MyDeparser(packet_out packet, in headers hdr) {
​ apply {
​ /* TODO: add deparser logic */
​ packet.emit(hdr.ethernet);
​ packet.emit(hdr.ipv4);
​ }
}

/*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/

V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;

make run运行结果: ![img](https://img2018.cnblogs.com/blog/1330691/201912/1330691-20191211193425206-62249920.png) ![img](https://img2018.cnblogs.com/blog/1330691/201912/1330691-20191211193449092-1071231128.png) 测试是否连通: ![img](https://img2018.cnblogs.com/blog/1330691/201912/1330691-20191211193641901-2128774931.png)basic_tunnel补充/* -- P4_16 -- */

include <core.p4>
include <v1model.p4>

// NOTE: new type added here
const bit<16> TYPE_MYTUNNEL = 0x1212;
const bit<16> TYPE_IPV4 = 0x800;

/*************************************************************************
*********************** H E A D E R S ***********************************
*************************************************************************/

typedef bit<9> egressSpec_t;
typedef bit<48> macAddr_t;
typedef bit<32> ip4Addr_t;

header ethernet_t {
​ macAddr_t dstAddr;
​ macAddr_t srcAddr;
​ bit<16> etherType;
}

// NOTE: added new header type
header myTunnel_t {
​ bit<16> proto_id;
​ bit<16> dst_id;
}

header ipv4_t {
​ bit<4> version;
​ bit<4> ihl;
​ bit<8> diffserv;
​ bit<16> totalLen;
​ bit<16> identification;
​ bit<3> flags;
​ bit<13> fragOffset;
​ bit<8> ttl;
​ bit<8> protocol;
​ bit<16> hdrChecksum;
​ ip4Addr_t srcAddr;
​ ip4Addr_t dstAddr;
}

struct metadata {
​ /* empty */
}

// NOTE: Added new header type to headers struct
struct headers {
​ ethernet_t ethernet;
​ myTunnel_t myTunnel;
​ ipv4_t ipv4;
}

/*************************************************************************
*********************** P A R S E R ***********************************
*************************************************************************/

// 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_IPV4 : parse_ipv4;
​ TYPE_MYTUNNEL: parse_myTunnel;
​ 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;
​ }

}

/*************************************************************************
************ C H E C K S U M V E R I F I C A T I O N *************
*************************************************************************/

control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
​ apply { }
}

/*************************************************************************
************** I N G R E S S P R O C E S S I N G *******************
*************************************************************************/

control MyIngress(inout headers hdr,
​ inout metadata meta,
​ inout standard_metadata_t standard_metadata) {
​ action drop() {
​ mark_to_drop(standard_metadata);
​ }

​ action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
​ standard_metadata.egress_spec = port;
​ hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
​ hdr.ethernet.dstAddr = dstAddr;
​ hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
​ }

​ table ipv4_lpm {
​ key = {
​ hdr.ipv4.dstAddr: lpm;
​ }
​ actions = {
​ ipv4_forward;
​ drop;
​ NoAction;
​ }
​ size = 1024;
​ default_action = drop();
​ }

​ // 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();
​ }

​ apply {
​ // TODO: Update control flow

​ if (hdr.ipv4.isValid()&&!hdr.myTunnel.isValid()) {
​ ipv4_lpm.apply();
​ }
​ if (hdr.myTunnel.isValid()) {
​ myTunnel_exact.apply();
​ }
​ }
}

/*************************************************************************
**************** E G R E S S P R O C E S S I N G *******************
*************************************************************************/

control MyEgress(inout headers hdr,
​ inout metadata meta,
​ inout standard_metadata_t standard_metadata) {
​ apply { }
}

/*************************************************************************
************* C H E C K S U M C O M P U T A T I O N **************
*************************************************************************/

control MyComputeChecksum(inout headers hdr, inout metadata meta) {
​ apply {
​ update_checksum(
​ hdr.ipv4.isValid(),
​ { hdr.ipv4.version,
​ hdr.ipv4.ihl,
​ hdr.ipv4.diffserv,
​ hdr.ipv4.totalLen,
​ hdr.ipv4.identification,
​ hdr.ipv4.flags,
​ hdr.ipv4.fragOffset,
​ hdr.ipv4.ttl,
​ hdr.ipv4.protocol,
​ hdr.ipv4.srcAddr,
​ hdr.ipv4.dstAddr },
​ hdr.ipv4.hdrChecksum,
​ HashAlgorithm.csum16);
​ }
}

/*************************************************************************
*********************** D E P A R S E R *******************************
*************************************************************************/

control MyDeparser(packet_out packet, in headers hdr) {
​ apply {
​ packet.emit(hdr.ethernet);
​ // TODO: emit myTunnel header as well
​ packet.emit(hdr.myTunnel);
​ packet.emit(hdr.ipv4);
​ }
}

/*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/

V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;
`make run运行:


使用ip解析发送信息:

使用通道发送信息:

向不同主机发送信息:

认识和体会:利用p4进行配置,极大地增加了灵活性,非常方便。可以不更换硬件,就进行报文的动态修改。

2019 SDN上机第7次作业的更多相关文章

  1. 2019 SDN上机第6次作业

    2019 SDN上机第6次作业 1.实验拓扑 (1)实验拓扑 (2)使用Python脚本完成拓扑搭建 from mininet.topo import Topo from mininet.net im ...

  2. 2019 SDN上机第5次作业

    2019 SDN上机第5次作业 1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于: 描述官方教程实现了一个什么样的交换机功能? 答:官方教程实现了一 ...

  3. 2019 SDN上机第四次作业

    2019 SDN上机第4次作业 1. 解压安装OpenDayLight控制器(本次实验统一使用Beryllium版本) 修改环境变量 2. 启动并安装插件 3. 用Python脚本搭建如下拓扑,连接O ...

  4. 2019 SDN上机第三次作业

    2019 SDN上机第三次作业 实验一 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网络连通性 ...

  5. 2019 SDN上机第六次作业

    1.实验拓扑 (1)实验拓扑 (2)使用python脚本完成拓扑搭建 from mininet.topo import Topo class Mytopo(Topo): def __init__(se ...

  6. 2019 SDN上机第五次作业

    1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于: 描述官方教程实现了一个什么样的交换机功能? 实现将接收到的数据包发送到所有端口 控制器设定交换机 ...

  7. 2019 SDN上机第4次作业

    1. 解压安装OpenDayLight控制器(本次实验统一使用Beryllium版本) 配置java环境 安装OpenDayLight控制器 2. 启动并安装插件 cd distribution-ka ...

  8. 2019 SDN上机第3次作业

    1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网络连通性 创建拓扑 配置主机h1和h2的I ...

  9. 2019 SDN上机第2次作业

    1.利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 1.1拓扑 1.2 代码 #!/us ...

随机推荐

  1. iOS技术博客

    iOS 技术提高 原文 http://blog.devtang.com/2014/07/27/ios-levelup-tips/# 1.阅读博客 美团技术博客 https://tech.meituan ...

  2. 【转载】Java程序模拟公安局人员管理系统

    编程题:公安人员的管理系统1) 学生类:a) 属性:i. 身份号—默认没有,需要手动进行输入ii. 姓名iii. 性别iv. 年龄v. 密码vi. 居住地址vii. 注册日期viii. 人员的信誉程度 ...

  3. Java_foreach不能remove

    foreach 阿里巴巴java开发手册 [强制]不要在foreach循环里进行元素的remove/add操作.remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁 ...

  4. node_modules/.bin/babel : 无法加载文件 D:\node\node_project\es6\node_modules\.bin\babel.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.co m/fwlink/?LinkID=135170 中的 about_Execution_Policies。

    刚入门es6,遇到上面问题,然后 解决方案: 以管理员身份运行vs code执行:get-ExecutionPolicy,显示Restricted,表示状态是禁止的执行:set-ExecutionPo ...

  5. leetcode动态规划--基础题

    跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 思路 根据题目意思,最大跳跃距离,说明可以跳0--n ...

  6. Qt的诞生和本质

    有没有发现,在这个主函数里面没有了消息循环了.消息循环到哪里去了呢? 我们知道,每个GUI应用程序都有消息循环,一般都需要将消息循环while那个函数写到main的最后位置.那既然如此,为了代码复用, ...

  7. 基于 CAS 无锁实现的 Disruptor.NET 居然慢于 BlockingCollection,是真的吗?

    StackOverflow 有人说自己的Disruptor.NET 代码比 BlockingCollection 还有慢 2 倍,并且把完整代码贴出,楼下几个老外也的回复说了一堆,但是没研究出个所以然 ...

  8. 蓝牙spp协议分析

    基本概念 蓝牙串口是基于 SPP 协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输的一种设备. 蓝牙串口的目的是针对如何在两个不同设备(通信的两端)上的应用之间保证 ...

  9. 基于 Swoole 的微信扫码登录

    随着微信的普及,扫码登录方式越来越被现在的应用所使用.它因为不用去记住密码,只要有微信号即可方便快捷登录.微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行实 ...

  10. wireshark和tcpdump抓包TCP乱序和重传怎么办?PCAP TCP排序工具分享

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍TCP排序方法,分享一个Windows版的TCP排序工具." 在分析协议的过程中,不可避免地需要抓包. 无论抓包条件如何优越, ...