blob: 712c42b79d6dfd3b2585341999caa56e876ab692 [file] [log] [blame]
Yi Tseng21629932017-06-06 11:17:43 -07001#include <core.p4>
2#include <v1model.p4>
3#include "include/defines.p4"
4#include "include/headers.p4"
Carmelo Cascone3304fd52017-07-30 00:43:01 -04005
6#define SELECTOR_WIDTH 64
7const bit<SELECTOR_WIDTH> ONE = 64w1;
8
9typedef bit<16> group_id_t;
10
11struct wcmp_metadata_t {
12 group_id_t group_id;
13 bit<8> numBits;
14 bit<SELECTOR_WIDTH> selector;
15}
16
17struct metadata_t {
18 wcmp_metadata_t wcmp_metadata;
19 intrinsic_metadata_t intrinsic_metadata;
20}
21
Yi Tseng21629932017-06-06 11:17:43 -070022#include "include/parsers.p4"
23#include "include/port_counters.p4"
24#include "include/checksums.p4"
25#include "include/actions.p4"
Carmelo Cascone837e6452017-07-19 20:35:22 -040026#include "include/packet_io.p4"
Yi Tseng21629932017-06-06 11:17:43 -070027
Carmelo Cascone837e6452017-07-19 20:35:22 -040028control ingress(inout headers_t hdr, inout metadata_t meta, inout standard_metadata_t standard_metadata) {
29
Yi Tseng21629932017-06-06 11:17:43 -070030 direct_counter(CounterType.packets) table0_counter;
31 direct_counter(CounterType.packets) wcmp_group_table_counter;
32
Carmelo Cascone837e6452017-07-19 20:35:22 -040033 action wcmp_group(group_id_t group_id) {
Carmelo Cascone3304fd52017-07-30 00:43:01 -040034 meta.wcmp_metadata.group_id = group_id;
35 hash(meta.wcmp_metadata.numBits, HashAlgorithm.crc16, (bit<64>)2,
Carmelo Cascone837e6452017-07-19 20:35:22 -040036 { hdr.ipv4.srcAddr, hdr.ipv4.dstAddr, hdr.ipv4.protocol, hdr.tcp.srcPort, hdr.tcp.dstPort, hdr.udp.srcPort,
37 hdr.udp.dstPort },
38 (bit<128>)62);
Yi Tseng21629932017-06-06 11:17:43 -070039 }
40
41 action wcmp_set_selector() {
Carmelo Cascone3304fd52017-07-30 00:43:01 -040042 meta.wcmp_metadata.selector = ((ONE << meta.wcmp_metadata.numBits) - ONE) << (SELECTOR_WIDTH - meta.wcmp_metadata.numBits);
Yi Tseng21629932017-06-06 11:17:43 -070043 }
44
45 table table0 {
46 support_timeout = true;
47 actions = {
48 set_egress_port(standard_metadata);
49 wcmp_group;
50 send_to_cpu(standard_metadata);
51 drop(standard_metadata);
52 }
53 key = {
54 standard_metadata.ingress_port: ternary;
55 hdr.ethernet.dstAddr : ternary;
56 hdr.ethernet.srcAddr : ternary;
57 hdr.ethernet.etherType : ternary;
58 }
59 counters = table0_counter;
60 }
61
62 table wcmp_group_table {
63 actions = {
64 set_egress_port(standard_metadata);
65 }
66 key = {
Carmelo Cascone3304fd52017-07-30 00:43:01 -040067 meta.wcmp_metadata.group_id : exact;
68 meta.wcmp_metadata.selector: lpm;
Yi Tseng21629932017-06-06 11:17:43 -070069 }
70 counters = wcmp_group_table_counter;
71 }
72
73 PortCountersControl() port_counters_control;
Carmelo Cascone837e6452017-07-19 20:35:22 -040074 PacketIoIngressControl() packet_io_ingress_control;
75
Yi Tseng21629932017-06-06 11:17:43 -070076 apply {
Carmelo Cascone837e6452017-07-19 20:35:22 -040077 packet_io_ingress_control.apply(hdr, standard_metadata);
78 if (!hdr.packet_out.isValid()) {
79 switch (table0.apply().action_run) {
80 wcmp_group: {
81 wcmp_set_selector();
82 wcmp_group_table.apply();
83 }
Yi Tseng21629932017-06-06 11:17:43 -070084 }
85 }
86 port_counters_control.apply(hdr, meta, standard_metadata);
87 }
88}
89
Carmelo Cascone837e6452017-07-19 20:35:22 -040090control egress(inout headers_t hdr, inout metadata_t meta, inout standard_metadata_t standard_metadata) {
91
92 PacketIoEgressControl() packet_io_egress_control;
Yi Tseng21629932017-06-06 11:17:43 -070093 apply {
Carmelo Cascone837e6452017-07-19 20:35:22 -040094 packet_io_egress_control.apply(hdr, standard_metadata);
Yi Tseng21629932017-06-06 11:17:43 -070095 }
96}
97
98V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main;