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. SSM + VUE 实现简单的 CRUD

    一.项目分析 1.需求 (1)使用 ssm + vue 实现一个crud(数据库增删改查)的简单实现.(2)前后端分离,前端页面展示+后台管理. 2.技术点 (1)基础框架: SSM(Spring,S ...

  2. TCP/IP网络协议初识

    目录 一.什么是协议? 二.什么是TCP/IP协议? 三.TCP/IP为什么这么多协议? 四.TCP/IP协议为什么分层? 五.TCP/IP协议如何入门? 六.TCP/IP 的分层: 七.各协议层打包 ...

  3. MySQL数据库:多表连接查询

    多表连接查询 注意:使用连接技术建议将表经行重命名! # explain 检索连接是否达标 # 内连接 # 语法1 from 表1 inner join 表2 on 主键字段=外键字段 [where ...

  4. Python语法速查: 16. 时间日期处理

    返回目录 (1)datetime模块 datetime模块可以处理时间和日期,其中包含以下类:date类.time对象.datetime对象.timedelt对象.tzinfo对象. ● date类 ...

  5. (办公)记事本_通过xshell连接Liunx服务器

    任务:需要用xshell连接到Liunx服务器,装配环境,放置项目,查看日志,以后就要做,磁盘扩容,均衡负载,以及病毒错误. 第一步,先连接上: 1.xshell新建会话,刚才买的liunx的公网地址 ...

  6. Windows中安装Pytorch和Torch

    近年来,深度学习框架如雨后春笋般的涌现出来,如TensorFlow.caffe.caffe2.PyTorch.Keras.Theano.Torch等,对于从事计算机视觉/机器学习/图像处理方面的研究者 ...

  7. 使用python - selenium模拟登陆b站

    思路 输入用户名密码点击登陆 获取验证码的原始图片与有缺口的图片 找出两张图片的缺口起始处 拖动碎片 功能代码段 # 使用到的库 from selenium import webdriver from ...

  8. PowerMock学习(八)之Mock Argument Matcher的使用

    前言 本计划在上周六日将powermock学完,并同步到博客中,结果自己没经得住诱惑,又开始去打王者荣耀了.虽然两天时间我从钻石一升到了星耀V四星,但是我并没有觉得很开心,相反很失落呢.不得不说腾讯的 ...

  9. 在eclipse中添加jdk源码

    window->Preferences->java->Installed JREs 点击你的jre然后点右边的Edit 找到以rt.jar结尾的jar,点击右边的Source Att ...

  10. Spring常用注解式开发

    1.组件注册@Configuration.@Bean给容器中注册组件. 注解,@Configuration告诉Spring这是一个配置类,相当于bean.xml配置文件. 注解,@Bean给Sprin ...