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. 什么是 AQS?简单说一下 ReentrantLock 的原理?

    AQS 简介 java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchr ...

  2. 设计模式之观察者模式C#实现

    说明:主要参考<Head First设计模式(中文版)>,使用C#代码实现. 代码:Github 1.观察者模式UML图 2.气象监测类图 3.气象监测代码(书中C#版) 3.1 Obse ...

  3. vue如何循环渲染element-ui中table内容

    对于大多数前端开发者来说,vuejs+element-ui是开发后台管理系统过程中必不可少的技术框架.而后台管理系统中,最常见的形式就是表格和表单,以便用来增删改查. element-ui中table ...

  4. ASP.NET MVC中使用MvcPager异步分页+在分页中复选框下一页上一页也保持选中

    ASP.NET MVC 分页使用的是作者杨涛的MvcPager分页控件  地址:http://www.webdiyer.com/mvcpager/demos/ajaxpaging/ 这个分页控件在里面 ...

  5. SQL Server启动/关闭xp_cmdshell

    ==>启用xp_cmdshell USE master RECONFIGURE WITH OVERRIDE RECONFIGURE WITH OVERRIDE RECONFIGURE WITH ...

  6. RAC环境下修改字符集

    跟单实例多少有点区别ORACLE 11g RAC 两节点第一步 查看字符集PRIMARY-SYS@mydb2>select userenv('language') from dual; USER ...

  7. springboot模板

    1.thymeleaf模板 2.Freemarker模板 Thymeleaf模板 首先导入依赖 <dependency> <groupId>org.springframewor ...

  8. C++ std::vector 基本用法

    #include <iostream> #include <vector> using namespace std; int main() { // 初始化的方式 std::v ...

  9. ubuntu 查看端口被占用并删除端口

    做网络的同学,估计会经常用到这个功能,这里就做一个记录吧. 首先查看特定端口是占用了: sudo netstat -nplt 其次要删除特定端口并查看: kill -9 pid_num sudo ne ...

  10. Redis缓存与数据库一致性解决方案

    背景 缓存是数据库的副本,应用在查询数据时,先从缓存中查询,如果命中直接返回,如果未命中,去数据库查询最新数据并返回,同时写入缓存. 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载.是应用架 ...