/*
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. Spring.Net Remoting 相关使用

    http://www.cnblogs.com/GoodHelper/archive/2009/11/19/SpringNet_Remoting.html  本博客系统转载  原文为 Spring.Se ...

  2. iOS开发实用干货——强化你的Xcode控制台

    f(x) 郑秀晶程序员不要整天看代码,偶尔也要看看风景?? www.90168.org先上一张我的Xcode控制台的图片让你们感受一下 酷炫控制台 是不是觉得很酷?不过仅仅是酷还是远远不够的,当你点击 ...

  3. Static Resources In ASP.NET Core 1.0

    静态资源包括HTML,CSS,图片和Js文件.在ASP.NET Core 1.0中,静态资源默认的所在目录是wwwroot,wwwroot可以在project.json中定义. Steps: 在www ...

  4. HTML元素的offsetWidht、clientWidth、scrollWidth属性区别

    每个HTML元素都有以下属性 offsetWidth:内容+内边距(padding)+边框+滚动条宽度,以css像素返回它的屏幕尺寸. offsetHeight:(同上) offsetLeft:如果o ...

  5. LightOJ1017 Brush (III)(DP)

    题目大概说一个平面上分布n个灰尘,现在要用一个宽w的刷子清理灰尘:选择一个起点,往水平线上扫过去这个水平线上的灰尘就消失了.问最多进行k次这样的操作能清理最多多少灰尘. 没什么的DP. 先按垂直坐标给 ...

  6. 每天一个Linux命令---tcpdump

    用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的“头” ...

  7. WPF学习笔记(3):Path绘制命令zz

    WPF的XAML提供了一系列功能强大.用法复杂的 mini-language 来描述可扩展应用程序标记语言 (XAML) 中的几何路径.如下所示: XAML <Canvas>   < ...

  8. BZOJ2629 : binomial

    根据Lucas定理,等价于在$P$进制下每一位分别求组合数最后乘积模$P$. 因为答案为$0$的并不好算,所以可以考虑用$n+1$减去其它所有的答案. 那么每一位的组合数都不能是$0$,那么这就保证了 ...

  9. BZOJ2990 : [Ontak2010]Keyboard

    考虑从$(1,1)$开始搜索移动方案,每次移动坐标的变化量都是$2$. 如果构成了环,那么环的周长肯定是偶数. 考虑这个环一定要被若干个骨牌覆盖,且还有一个位置是空的. 所以得出环的周长是奇数,矛盾, ...

  10. CSS样式覆盖顺序

    有时候在写CSS的过程中,某些限制总是不起作用,这就涉及了CSS样式覆盖的问题,如下 Css代码   #navigator { height: 100%; width: 200; position:  ...