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. 部署vue-element-admin流程

    1.修改环境变量: 在以下两个文件: .env_staging [如果修改这个,需要以npm run build:stage启动] .env_production [如果修改这个,需要以npm run ...

  2. JS Navigator

    JS Navigator window.navigator 对象包含有关访问者浏览器的信息. Window Navigator window.navigator 对象在编写时可不使用 window 这 ...

  3. 一文解读Redis (转)

    本文由葡萄城技术团队编撰并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原 ...

  4. python中 遇到的读取坑2.7和3.6版本的问题

    2.7读取,需要使用io.open 3.x使用open 使用io.open的时候路径需要使用\\ 目前io.open的文件名不能为中文

  5. json属性里面出现特殊字符怎么获取属性

    直接上代码. 这样的 获取这个object后需要获取里面的书属性,但是正常情况下是XX.属性名.但是属性名有特殊符号.这时候我们可以这样. XX['属性名']['属性名']....可以一直这样写 XX ...

  6. facl 用户以及Linux 终端

    FACL : Filesystem Access Control List 利用文件扩展保存额外的访问控制权限setfacl -b:Remove all -m:设定 u:UID:perm g:GID: ...

  7. CALL和RET指令实验

    实验10 1.在屏幕8行3列,用绿色显示data段中的字符串 assume cs:code data segment db data ends code segment start: ;行 ;列 ;颜 ...

  8. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性那些事(2)- RT1052DVL6性能实测(CoreMark)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的性能. 在前面的文章 i.MXRTyyyy微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2 ...

  9. InfluxDB从原理到实战 - 一篇文章搞懂InfluxDB时区

    0x00 简介    InfluxDB默认以UTC时间存储并返回时间戳,当接收到一个时序数据记录时,InfluxDB将时间戳从本地时区时间转换为UTC时间并存储,查询时,InfluxDB返回的时间戳对 ...

  10. Netty服务端Channel的创建与初始化

    Netty创建服务端Channel时,从服务端 ServerBootstrap 类的 bind 方法进入,下图是创建服务端Channel的函数调用链.在后续代码中通过反射的方式创建服务端Channel ...