blob: 6fd27308724e4bce879584131d4a92ae3f245964 [file] [log] [blame]
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -08001/*
2 * Copyright 2017-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/* -*- P4_16 -*- */
18#ifndef __INT_SOURCE__
19#define __INT_SOURCE__
20
21// Insert INT header to the packet
22control process_int_source (
23 inout headers_t hdr,
24 inout local_metadata_t local_metadata,
25 inout standard_metadata_t standard_metadata) {
26
27 direct_counter(CounterType.packets_and_bytes) counter_int_source;
28
29 action int_source(bit<8> max_hop, bit<5> ins_cnt, bit<4> ins_mask0003, bit<4> ins_mask0407) {
30 // insert INT shim header
31 hdr.intl4_shim.setValid();
32 // int_type: Hop-by-hop type (1) , destination type (2)
33 hdr.intl4_shim.int_type = 1;
34 hdr.intl4_shim.len = INT_HEADER_LEN_WORD;
35
36 // insert INT header
37 hdr.int_header.setValid();
38 hdr.int_header.ver = 0;
39 hdr.int_header.rep = 0;
40 hdr.int_header.c = 0;
41 hdr.int_header.e = 0;
42 hdr.int_header.rsvd1 = 0;
43 hdr.int_header.ins_cnt = ins_cnt;
44 hdr.int_header.max_hop_cnt = max_hop;
45 hdr.int_header.total_hop_cnt = 0;
46 hdr.int_header.instruction_mask_0003 = ins_mask0003;
47 hdr.int_header.instruction_mask_0407 = ins_mask0407;
48 hdr.int_header.instruction_mask_0811 = 0; // not supported
49 hdr.int_header.instruction_mask_1215 = 0; // not supported
50
51 // insert INT tail header
52 hdr.intl4_tail.setValid();
53 hdr.intl4_tail.next_proto = hdr.ipv4.protocol;
54 hdr.intl4_tail.dest_port = local_metadata.l4_dst_port;
Jonghwan Hyun8be03392017-12-04 15:48:44 -080055 hdr.intl4_tail.dscp = (bit<8>) hdr.ipv4.dscp;
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -080056
57 // add the header len (8 bytes) to total len
58 hdr.ipv4.len = hdr.ipv4.len + 16;
59 hdr.udp.length_ = hdr.udp.length_ + 16;
60 }
Jonghwan Hyun8be03392017-12-04 15:48:44 -080061 action int_source_dscp(bit<8> max_hop, bit<5> ins_cnt, bit<4> ins_mask0003, bit<4> ins_mask0407) {
62 int_source(max_hop, ins_cnt, ins_mask0003, ins_mask0407);
63 hdr.ipv4.dscp = INT_DSCP;
64 }
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -080065
66 table tb_int_source {
67 key = {
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -080068 hdr.ipv4.src_addr: ternary;
69 hdr.ipv4.dst_addr: ternary;
70 local_metadata.l4_src_port: ternary;
71 local_metadata.l4_dst_port: ternary;
72 }
73 actions = {
Jonghwan Hyun8be03392017-12-04 15:48:44 -080074 int_source_dscp;
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -080075 }
76 counters = counter_int_source;
77 size = 1024;
78 }
79
80 apply {
81 tb_int_source.apply();
82 }
83}
84
85control process_set_source_sink (
86 inout headers_t hdr,
87 inout local_metadata_t local_metadata,
88 inout standard_metadata_t standard_metadata) {
89
Jonghwan Hyunf5d57822018-05-09 10:19:50 -070090 direct_counter(CounterType.packets_and_bytes) counter_set_source;
91 direct_counter(CounterType.packets_and_bytes) counter_set_sink;
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -080092
93 action int_set_source () {
Jonghwan Hyun8be03392017-12-04 15:48:44 -080094 local_metadata.int_meta.source = 1;
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -080095 }
96
97 action int_set_sink () {
98 local_metadata.int_meta.sink = 1;
99 }
100
Jonghwan Hyunf5d57822018-05-09 10:19:50 -0700101 table tb_set_source {
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -0800102 key = {
Jonghwan Hyunf5d57822018-05-09 10:19:50 -0700103 standard_metadata.ingress_port: exact;
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -0800104 }
105 actions = {
106 int_set_source;
Jonghwan Hyunf5d57822018-05-09 10:19:50 -0700107 }
108 counters = counter_set_source;
109 size = 256;
110 }
111 table tb_set_sink {
112 key = {
Jonghwan Hyun6777d532018-11-18 20:50:16 +0900113 standard_metadata.egress_spec: exact;
Jonghwan Hyunf5d57822018-05-09 10:19:50 -0700114 }
115 actions = {
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -0800116 int_set_sink;
117 }
Jonghwan Hyunf5d57822018-05-09 10:19:50 -0700118 counters = counter_set_sink;
119 size = 256;
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -0800120 }
121
122 apply {
Jonghwan Hyunf5d57822018-05-09 10:19:50 -0700123 tb_set_source.apply();
124 tb_set_sink.apply();
Jonghwan Hyun4a9a6712017-11-13 14:43:55 -0800125 }
126}
127#endif