打开P4的目录,运行主程序

make run

此时输入命令

pingall

会显示所有的网络不通

改为下方代码

/* -*- 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; /*设置为0x0800,parse_ipv4状态*/
default: accept; /*默认设置为接受*/
}
}
state parse_ipv4
{
packet.extract(hdr.ipv4); /*提取ip包的头部*/
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) {
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 {
if (hdr.ipv4.isValid())
{
ipv4_lpm.apply(); /*这里要求搞定入口协议逻辑编写,即数据包处理逻辑,条件是ipv4头部有效时ipv4_lpm可以使用*/
}
}
} /*************************************************************************
**************** 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);
packet.emit(hdr.ipv4);
}
} /*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/ V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;

再次输入命令

make run

在CLT中输入命令

pingall

展示所有的拓扑

打开所有的xterm

/* -*- 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 ***********************************
*************************************************************************/
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; /*设置mytunnel头类型对应的以太类型为ipv4*/
default : accept;
}
} state parse_myTunnel /*要求更新解析器,解析mytunnel头部,那么添加mytunnel头类型。其中类型字段为16位的proto_id*/
{
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();
} 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();
} action myTunnel_forward(egressSpec_t port) { /*要求定义一个新动作,将出口端口设置为控制平面提供的端口号*/
standard_metadata.egress_spec = port;
} table myTunnel_exact { /*要求定义一个新表,将它的dstid匹配mytunnel字段,如果myTunnel_forward存在匹配项,就调用drop操作*/
key = {
hdr.myTunnel.dst_id: exact;
}
actions = {
myTunnel_forward;
drop;
}
size = 1024;
default_action = drop();
} apply {
if (hdr.ipv4.isValid()&&!hdr.myTunnel.isValid()) { /*处理未经过通道的ipv4包*/
ipv4_lpm.apply();
}
if (hdr.myTunnel.isValid()) { /* 处理经过通道的ipv4包*/
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);
packet.emit(hdr.myTunnel); /*把通道头部加进去*/
packet.emit(hdr.ipv4);
}
} /*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/ V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;

再次运行主程序

查看网络属性

h1发送字段

h2接受字段

再次发送字段

再次接受字段

【2019.12.11】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上机第7次作业

    2019 SDN上机第7 次作业 basic补充`/* -- P4_16 -- */ include <core.p4> include <v1model.p4> const ...

  3. 2019 SDN上机第5次作业

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

  4. 2019 SDN上机第四次作业

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

  5. 2019 SDN上机第三次作业

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

  6. SDN上机第五次作业

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

  7. 【2019.12.04】SDN上机第6次作业

    实验拓扑 通过图形化界面建立拓扑 先清除网络拓扑 sudo mn -c 生成Python语句 #!/usr/bin/python from mininet.net import Mininet fro ...

  8. 【2019.11.27】SDN上机第5次作业

    参考资料: https://www.cnblogs.com/zzqsss/p/11924685.html 问答环节 描述官方教程实现了一个什么样的交换机功能? Ryu是一个基于组件的软件定义的网络框架 ...

  9. 【2019.11.20】SDN上机第4次作业

    安装OpenDayLight控制器 配置JAVA环境 https://www.opendaylight.org/ 在官网进行下载OpenDayLight控制器 启动OpenDayLight控制器和安装 ...

随机推荐

  1. fulltext全文索引的使用

    Fulltext全文索引 Fulltext相关属性 查看数据库关于fulltext的配置 SHOW VARIABLES LIKE 'ft%'; -- ft就是FullText的简写 ft_boolea ...

  2. java static变量及函数

    java以类为基础,没有游离在类之外单独存在的变量.所以,c++中的全局变量,在java中应该是不存在的.java中有的是成员变量和成员方法.当成员前以static修饰时,即为静态成员变量或静态成员方 ...

  3. MongoDB 基本概念

    MongoDB和关系型数据库的对应关系 关系数据库 MongoDB 数据库   database 数据库   database 表格  table 集合  collection 行  row 文档  ...

  4. Pod Hook

    Pod Hook kubernetes为容器提供了生命周期,称为Pod Hook,Pod Hook 是由kubelet 发起的, 可以发生在容器启动和停止之前运行,包含在容器的生命周期中.我们可以为所 ...

  5. xtrbackup备份,及恢复数据

    模拟定时任务周日备份数据,周一数据变化,周一crontab定时任务增量备份,周二数据变化,周二crontabl增量备份,然后有人删库,我们进行恢复数据 模拟crontab 里的定时任务周日全备 [ro ...

  6. HTML&CSS基础-标签的属性

    HTML&CSS基础-标签的属性 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html源代码 <!-- html 根标签,一个页面中有且只有一个根标签,网页中的 ...

  7. SpringCloud2.0 Hystrix Dashboard 断路器指标看板 基础教程(八)

    1.启动基础工程 1.1.启动[服务中心]集群,工程名称:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) ...

  8. 一个线上JVM的CPU资源占用过高问题的排查

    原文:https://www.iteye.com/blog/tyrion-2293369 上午线上某应用的一台JVM的CPU占比突然飙高到192%,并且一直下不来,导致监控一直告警,好久没处理这种问题 ...

  9. 动态规划——背包问题python实现(01背包、完全背包、多重背包)

    目录 01背包问题 完全背包问题 多重背包问题 参考: 背包九讲--哔哩哔哩 背包九讲 01背包问题 01背包问题 描述: 有N件物品和一个容量为V的背包. 第i件物品的体积是vi,价值是wi. 求解 ...

  10. 动态管理upsteam---nginx_http_dyups_module

    nginx_http_dyups_module  nginx_http_dyups_module是第三方开源软件,它提供API动态修改upstream的配置,并且支持Nginx的ip_hash.kee ...