/*
Copyright 2013-present Barefoot Networks, Inc. Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/ #include "includes/headers.p4"
#include "includes/parser.p4"
#include "includes/intrinsic.p4" #define FLOWLET_MAP_SIZE 13 // 8K
#define FLOWLET_INACTIVE_TOUT 50000 // usec -> 50ms header_type ingress_metadata_t {
fields {
flow_ipg : 32; // inter-packet gap
flowlet_map_index : FLOWLET_MAP_SIZE; // flowlet map index
flowlet_id : 16; // flowlet id
flowlet_lasttime : 32; // flowlet's last reference time ecmp_offset : 14; // offset into the ecmp table nhop_ipv4 : 32;
}
} metadata ingress_metadata_t ingress_metadata; action _drop() {
drop();
} field_list l3_hash_fields {
ipv4.srcAddr;
ipv4.dstAddr;
ipv4.protocol;
tcp.srcPort;
tcp.dstPort;
} field_list_calculation flowlet_map_hash {
input {
l3_hash_fields;
}
algorithm : crc16;
output_width : FLOWLET_MAP_SIZE;
} register flowlet_lasttime {
width : 32;
instance_count : 8192;
} register flowlet_id {
width : 16;
instance_count : 8192;
} action set_nhop(nhop_ipv4, port) {
modify_field(ingress_metadata.nhop_ipv4, nhop_ipv4);
modify_field(standard_metadata.egress_spec, port);
add_to_field(ipv4.ttl, -1);
} action lookup_flowlet_map() {
modify_field_with_hash_based_offset(ingress_metadata.flowlet_map_index, 0,
flowlet_map_hash, FLOWLET_MAP_SIZE); register_read(ingress_metadata.flowlet_id,
flowlet_id, ingress_metadata.flowlet_map_index); modify_field(ingress_metadata.flow_ipg,
intrinsic_metadata.ingress_global_timestamp);
register_read(ingress_metadata.flowlet_lasttime,
flowlet_lasttime, ingress_metadata.flowlet_map_index);
subtract_from_field(ingress_metadata.flow_ipg,
ingress_metadata.flowlet_lasttime); register_write(flowlet_lasttime, ingress_metadata.flowlet_map_index,
intrinsic_metadata.ingress_global_timestamp);
} table flowlet {
actions { lookup_flowlet_map; }
} action update_flowlet_id() {
add_to_field(ingress_metadata.flowlet_id, 1);
register_write(flowlet_id, ingress_metadata.flowlet_map_index,
ingress_metadata.flowlet_id);
} table new_flowlet {
actions { update_flowlet_id; }
} field_list flowlet_l3_hash_fields {
ipv4.srcAddr;
ipv4.dstAddr;
ipv4.protocol;
tcp.srcPort;
tcp.dstPort;
ingress_metadata.flowlet_id;
} #define ECMP_BIT_WIDTH 10
#define ECMP_GROUP_TABLE_SIZE 1024
#define ECMP_NHOP_TABLE_SIZE 16384 field_list_calculation flowlet_ecmp_hash {
input {
flowlet_l3_hash_fields;
}
algorithm : crc16;
output_width : ECMP_BIT_WIDTH;
} action set_ecmp_select(ecmp_base, ecmp_count) {
modify_field_with_hash_based_offset(ingress_metadata.ecmp_offset, ecmp_base,
flowlet_ecmp_hash, ecmp_count);
} table ecmp_group {
reads {
ipv4.dstAddr : lpm;
}
actions {
_drop;
set_ecmp_select;
}
size : ECMP_GROUP_TABLE_SIZE;
} table ecmp_nhop {
reads {
ingress_metadata.ecmp_offset : exact;
}
actions {
_drop;
set_nhop;
}
size : ECMP_NHOP_TABLE_SIZE;
} action set_dmac(dmac) {
modify_field(ethernet.dstAddr, dmac);
} table forward {
reads {
ingress_metadata.nhop_ipv4 : exact;
}
actions {
set_dmac;
_drop;
}
size: 512;
} action rewrite_mac(smac) {
modify_field(ethernet.srcAddr, smac);
} table send_frame {
reads {
standard_metadata.egress_port: exact;
}
actions {
rewrite_mac;
_drop;
}
size: 256;
} control ingress {
apply(flowlet);
if (ingress_metadata.flow_ipg > FLOWLET_INACTIVE_TOUT) {
apply(new_flowlet);
}
apply(ecmp_group);
apply(ecmp_nhop);
apply(forward);
} control egress {
apply(send_frame);
}

Run P4 without P4factory - A Simple Example In Tutorials. -2 附 simple_router源码的更多相关文章

  1. Run P4 without P4factory - A Simple Example In Tutorials. -2

    Reference:Github-Tutorial Exercise 2: Implementing TCP flowlet switching 实验准备: 参考之前的博客:Run P4 withou ...

  2. Run P4 without P4factory - A Simple Example In Tutorials.

    前言 本文是我运行P4社区于Github开源教程Tutorials中的P4 SIGCOMM 2015 Tutorial一些实战小结,Github链接: Github. 测试的例子:P4 SIGCOMM ...

  3. flask 源码专题(一):app.run()的背后

    当我们用Flask写好一个app后, 运行app.run()表示监听指定的端口, 对收到的request运行app生成response并返回. 现在分析一下, 运行app.run()后具体发生了什么事 ...

  4. Quartz源码——QuartzSchedulerThread.run() 源码分析(三)

    QuartzSchedulerThread.run()是主要处理任务的方法!下面进行分析,方便自己查看! 我都是分析的jobStore 方式为jdbc的SimpleTrigger!RAM的方式类似分析 ...

  5. spring-boot-2.0.3启动源码篇四 - run方法(三)之createApplicationContext

    前言 此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事.如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助 ...

  6. Spring boot 源码分析(一)SpringApplication.run(上)

    SpringApplication.run(Main.class, args); 从这个方法开始讲吧: public static ConfigurableApplicationContext run ...

  7. spring-boot-2.0.3启动源码篇三 - run方法(二)之prepareEnvironment

    前言 此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事.如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助 ...

  8. spring-boot-2.0.3启动源码篇二 - run方法(一)之SpringApplicationRunListener

    前言 Springboot启动源码系列还只写了一篇,已经过去一周,又到了每周一更的时间了(是不是很熟悉?),大家有没有很期待了?我会尽量保证启动源码系列每周一更,争取不让大家每周的期望落空.一周之中可 ...

  9. spring-boot-2.0.3启动源码篇五 - run方法(四)之prepareContext

    前言 此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事.如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助 ...

随机推荐

  1. ajax上传后用超链接展示无法下载问题

    ajax插件上传后用超链接展示出来,但是点击超链接无法下载,最后发现是上传文件名为中文在作怪,于是修改了tomcat配置文件server.xml中的 <Connector port=" ...

  2. 8659 Mine Sweeping

    时间限制:500MS  内存限制:65535K提交次数:37 通过次数:15 题型: 编程题   语言: G++;GCC Description The opening ceremony of the ...

  3. Wiki上的Ue4文件结构以及命名规范

    https://wiki.unrealengine.com/Assets_Naming_Convention

  4. C#资源文件与与资源名称字符串之间的互相转化

    1.使用ResourceManager string st = Properties.Resources.ResourceManager.GetString(tableName);value = Pr ...

  5. 在windows和linux下如何查看80端口占用情况?是被哪个进程占用?如何终止等

    一.在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&quo ...

  6. [linux]crontab 命令执行问题

    在服务器上设置了一个R脚本的crontab任务,死活不执行.在网上搜了很久,终于解决了. 这里主要说一下crontab异常时,该如何排查. 假设cron命令为:* * * * Rscript /you ...

  7. ACM Coin Test

    Coin Test 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 As is known to all,if you throw a coin up and let ...

  8. YSLOW

    什么是YSlow? YSlow是Yahoo发布的一款基于FireFox的插件. 如何安装YSlow? 安装YSlow必须首先先安装 Firebug,然后下载YSlow,再对其安装. YSlow有什么用 ...

  9. JavaScript基础学习篇

    1.alert消息弹出框 alert(字符串或变量); 消息对话框通常可以用于调试程序. 与document.write 相似. 2.确认:confirm消息对话框 confirm(弹出时要显示的文本 ...

  10. HDU 4751 Divide Groups

    题目链接 比赛时候,建图建错了.大体算法想到了,不过很多细节都没想好. #include <cstdio> #include <cstring> #include <cm ...