1.补充并运行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) {
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();
} apply {
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 {
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv4);
}
} /*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/ V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;
  • 进入basic所在文件夹,命令make run编译运行



  • 命令pingall测试连通性

2.补充并运行basic_tunnel

/* -*- P4_16 -*- */
#include <core.p4>
#include <v1model.p4> 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;
} 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 */
} 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_MYTUNNEL: parse_myTunnel;
TYPE_IPV4: parse_ipv4;
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();
} action myTunnel_forward(egressSpec_t port) {
standard_metadata.egress_spec = port;
} table myTunnel_exact {
key = {
hdr.myTunnel.dst_id: exact;
}
actions = {
myTunnel_forward;
drop;
}
size = 1024;
default_action = drop();
} apply {
if (hdr.ipv4.isValid() && !hdr.myTunnel.isValid()) {
// Process only non-tunneled IPv4 packets
ipv4_lpm.apply();
} if (hdr.myTunnel.isValid()) {
// process tunneled packets
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;
  • 进入basic_tunnel所在文件夹,命令make run编译运行



  • 在mininet命令提示符界面输入xterm h1 h2来模拟两个终端
    • 先在主机2的xterm界面输入./receive.py

    • 接着在主机1的xterm界面输入./send.py 10.0.2.2 "I am linbei"

    • 检查主机2的xterm界面,可以看到已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息

    • 接着在主机1的xterm界面修改IP地址,再一次发送信息./send.py 10.0.3.3 "I am linbei" --dst_id 2

    • 检查主机2的xterm界面,可以看到已经接收到了信息,IP地址变更为了主机3的地址



      原因:交换机不再使用IP头部数据来定位,而是用数据包中的隧道头部数据来定位

3.提交你对P4的认识和体会

P4是一门主要用于数据平面的编程语言,主要用于编程程序以下达指令给数据转发平面的设备(如交换机、网卡、防火墙、过滤器等)如何处理数据包,P4试图在从根本上改变我们设计网络系统的方式。但由于P4编程语言更新较快,对于语法等的掌握还不够全面,在之后将继续加强学习。

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

  1. 2019 SDN上机第7次作业

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

  2. 2019 SDN上机第6次作业

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

  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. 2019 SDN上机第六次作业

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

  7. 2019 SDN上机第五次作业

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

  8. 2019 SDN上机第4次作业

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

  9. 2019 SDN上机第3次作业

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

随机推荐

  1. maven中pom的继承以及dependencies与dependencyManagement的区别

    https://blog.csdn.net/zzm3280/article/details/84952623 分类专栏: maven   本文转自:https://blog.csdn.net/liut ...

  2. C#视频拍照、视频录制项目示例

    1.AForge 2.WPFMediaKit 3.ffmpeg

  3. poj 2102 A计划

    可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下 ...

  4. English--并列句

    English|并列句 现在开始讲解英语中的最简单的长句,即并列句. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用我自己的方式, ...

  5. [摘抄] 4.require命令

    4.require命令 1. 基本用法 Node适用CommonJS模块规范,内置的require命令用于加载模块文件. require命令的基本功能是,读入并执行一个JavaScript文件,然后返 ...

  6. 15、vue项目封装axios并访问接口

    1.在src下新建util文件夹,在util下新建request.js文件: 封装axios: import axios from 'axios' import QS from 'qs'; // im ...

  7. Fiddler抓本机包

    使用Fiddler抓本机包的方法: File -->Capture Traffic 选中之后自动设置本机的Internet代理选项.

  8. 面试题:java内存中的堆区和数据结构中的堆有什么区别

    java内存中的堆是一个  链表, 数据结构中的堆:就是一个栈

  9. NGINX PHP 报错整理合集

    NGINX PHP "No input file specified" 修改php.ini conf cgi.fix_pathinfo=1; 修改nginx.conf,中的fast ...

  10. Java开发环境之Svn

    查看更多Java开发环境配置,请点击<Java开发环境配置大全> 拾肆章:Svn安装教程 1)去官网下载TortoiseSVN安装包 https://tortoisesvn.net/ 2) ...