package p4pp
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file bake.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
let core_p4_str = {|/* 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. */ /* This is the P4-16 core library, which declares some built-in P4 constructs using P4 */ #ifndef _CORE_P4_ #define _CORE_P4_ /// Standard error codes. New error codes can be declared by users. error { NoError, /// No error. PacketTooShort, /// Not enough bits in packet for 'extract'. NoMatch, /// 'select' expression has no matches. StackOutOfBounds, /// Reference to invalid element of a header stack. HeaderTooShort, /// Extracting too many bits into a varbit field. ParserTimeout, /// Parser execution time limit exceeded. ParserInvalidArgument /// Parser operation was called with a value /// not supported by the implementation. } extern packet_in { /// Read a header from the packet into a fixed-sized header @hdr and advance the cursor. /// May trigger error PacketTooShort or StackOutOfBounds. /// @T must be a fixed-size header type void extract<T>(out T hdr); /// Read bits from the packet into a variable-sized header @variableSizeHeader /// and advance the cursor. /// @T must be a header containing exactly 1 varbit field. /// May trigger errors PacketTooShort, StackOutOfBounds, or HeaderTooShort. void extract<T>(out T variableSizeHeader, in bit<32> variableFieldSizeInBits); /// Read bits from the packet without advancing the cursor. /// @returns: the bits read from the packet. /// T may be an arbitrary fixed-size type. T lookahead<T>(); /// Advance the packet cursor by the specified number of bits. void advance(in bit<32> sizeInBits); /// @return packet length in bytes. This method may be unavailable on /// some target architectures. bit<32> length(); } extern packet_out { /// Write @hdr into the output packet, advancing cursor. /// @T can be a header type, a header stack, a header_union, or a struct /// containing fields with such types. void emit<T>(in T hdr); } // TODO: remove from this file, convert to built-in /// Check a predicate @check in the parser; if the predicate is true do nothing, /// otherwise set the parser error to @toSignal, and transition to the `reject` state. extern void verify(in bool check, in error toSignal); /// Built-in action that does nothing. action NoAction() {} /// Standard match kinds for table key fields. /// Some architectures may not support all these match kinds. /// Architectures can declare additional match kinds. match_kind { /// Match bits exactly. exact, /// Ternary match, using a mask. ternary, /// Longest-prefix match. lpm } #endif /* _CORE_P4_ */ |} let v1model_p4_str = {|/* 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. */ /* P4-16 declaration of the P4 v1.0 switch model */ #ifndef _V1_MODEL_P4_ #define _V1_MODEL_P4_ #include "core.p4" match_kind { range, // Used for implementing dynamic_action_selection selector } // Are these correct? @metadata @name("standard_metadata") struct standard_metadata_t { bit<9> ingress_port; bit<9> egress_spec; bit<9> egress_port; bit<32> clone_spec; bit<32> instance_type; // The drop and recirculate_port fields are not used at all by the // behavioral-model simple_switch software switch as of September // 2018, and perhaps never was. They may be considered // deprecated, at least for that P4 target device. simple_switch // uses the value of the egress_spec field to determine whether a // packet is dropped or not, and it is recommended to use the // P4_14 drop() primitive action, or the P4_16 + v1model // mark_to_drop() primitive action, to cause that field to be // changed so the packet will be dropped. bit<1> drop; bit<16> recirculate_port; bit<32> packet_length; // // @alias is used to generate the field_alias section of the BMV2 JSON. // Field alias creates a mapping from the metadata name in P4 program to // the behavioral model's internal metadata name. Here we use it to // expose all metadata supported by simple switch to the user through // standard_metadata_t. // // flattening fields that exist in bmv2-ss // queueing metadata @alias("queueing_metadata.enq_timestamp") bit<32> enq_timestamp; @alias("queueing_metadata.enq_qdepth") bit<19> enq_qdepth; @alias("queueing_metadata.deq_timedelta") bit<32> deq_timedelta; @alias("queueing_metadata.deq_qdepth") bit<19> deq_qdepth; // intrinsic metadata @alias("intrinsic_metadata.ingress_global_timestamp") bit<48> ingress_global_timestamp; @alias("intrinsic_metadata.egress_global_timestamp") bit<48> egress_global_timestamp; @alias("intrinsic_metadata.lf_field_list") bit<32> lf_field_list; @alias("intrinsic_metadata.mcast_grp") bit<16> mcast_grp; @alias("intrinsic_metadata.resubmit_flag") bit<32> resubmit_flag; @alias("intrinsic_metadata.egress_rid") bit<16> egress_rid; /// Indicates that a verify_checksum() method has failed. // 1 if a checksum error was found, otherwise 0. bit<1> checksum_error; @alias("intrinsic_metadata.recirculate_flag") bit<32> recirculate_flag; /// Error produced by parsing error parser_error; } enum CounterType { packets, bytes, packets_and_bytes } enum MeterType { packets, bytes } extern counter { counter(bit<32> size, CounterType type); void count(in bit<32> index); } extern direct_counter { direct_counter(CounterType type); void count(); } extern meter { meter(bit<32> size, MeterType type); void execute_meter<T>(in bit<32> index, out T result); } extern direct_meter<T> { direct_meter(MeterType type); void read(out T result); } extern register<T> { register(bit<32> size); void read(out T result, in bit<32> index); void write(in bit<32> index, in T value); } // used as table implementation attribute extern action_profile { action_profile(bit<32> size); } // Get a random number in the range lo..hi extern void random<T>(out T result, in T lo, in T hi); // If the type T is a named struct, the name is used // to generate the control-plane API. extern void digest<T>(in bit<32> receiver, in T data); enum HashAlgorithm { crc32, crc32_custom, crc16, crc16_custom, random, identity, csum16, xor16 } extern void mark_to_drop(); extern void hash<O, T, D, M>(out O result, in HashAlgorithm algo, in T base, in D data, in M max); extern action_selector { action_selector(HashAlgorithm algorithm, bit<32> size, bit<32> outputWidth); } enum CloneType { I2E, E2E } @deprecated("Please use verify_checksum/update_checksum instead.") extern Checksum16 { Checksum16(); bit<16> get<D>(in D data); } /** Verifies the checksum of the supplied data. If this method detects that a checksum of the data is not correct it sets the standard_metadata checksum_error bit. @param T Must be a tuple type where all the fields are bit-fields or varbits. The total dynamic length of the fields is a multiple of the output size. @param O Checksum type; must be bit<X> type. @param condition If 'false' the verification always succeeds. @param data Data whose checksum is verified. @param checksum Expected checksum of the data; note that is must be a left-value. @param algo Algorithm to use for checksum (not all algorithms may be supported). Must be a compile-time constant. */ extern void verify_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo); /** Computes the checksum of the supplied data. @param T Must be a tuple type where all the fields are bit-fields or varbits. The total dynamic length of the fields is a multiple of the output size. @param O Output type; must be bit<X> type. @param condition If 'false' the checksum is not changed @param data Data whose checksum is computed. @param checksum Checksum of the data. @param algo Algorithm to use for checksum (not all algorithms may be supported). Must be a compile-time constant. */ extern void update_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo); /** Verifies the checksum of the supplied data including the payload. The payload is defined as "all bytes of the packet which were not parsed by the parser". If this method detects that a checksum of the data is not correct it sets the standard_metadata checksum_error bit. @param T Must be a tuple type where all the fields are bit-fields or varbits. The total dynamic length of the fields is a multiple of the output size. @param O Checksum type; must be bit<X> type. @param condition If 'false' the verification always succeeds. @param data Data whose checksum is verified. @param checksum Expected checksum of the data; note that is must be a left-value. @param algo Algorithm to use for checksum (not all algorithms may be supported). Must be a compile-time constant. */ extern void verify_checksum_with_payload<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo); /** Computes the checksum of the supplied data including the payload. The payload is defined as "all bytes of the packet which were not parsed by the parser". @param T Must be a tuple type where all the fields are bit-fields or varbits. The total dynamic length of the fields is a multiple of the output size. @param O Output type; must be bit<X> type. @param condition If 'false' the checksum is not changed @param data Data whose checksum is computed. @param checksum Checksum of the data. @param algo Algorithm to use for checksum (not all algorithms may be supported). Must be a compile-time constant. */ extern void update_checksum_with_payload<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo); extern void resubmit<T>(in T data); extern void recirculate<T>(in T data); extern void clone(in CloneType type, in bit<32> session); extern void clone3<T>(in CloneType type, in bit<32> session, in T data); extern void truncate(in bit<32> length); // The name 'standard_metadata' is reserved // Architecture. // M should be a struct of structs // H should be a struct of headers, stacks or header_unions parser Parser<H, M>(packet_in b, out H parsedHdr, inout M meta, inout standard_metadata_t standard_metadata); /* The only legal statements in the implementation of the VerifyChecksum control are: block statements, calls to the verify_checksum and verify_checksum_with_payload methods, and return statements. */ control VerifyChecksum<H, M>(inout H hdr, inout M meta); @pipeline control Ingress<H, M>(inout H hdr, inout M meta, inout standard_metadata_t standard_metadata); @pipeline control Egress<H, M>(inout H hdr, inout M meta, inout standard_metadata_t standard_metadata); /* The only legal statements in the implementation of the ComputeChecksum control are: block statements, calls to the update_checksum and update_checksum_with_payload methods, and return statements. */ control ComputeChecksum<H, M>(inout H hdr, inout M meta); @deparser control Deparser<H>(packet_out b, in H hdr); package V1Switch<H, M>(Parser<H, M> p, VerifyChecksum<H, M> vr, Ingress<H, M> ig, Egress<H, M> eg, ComputeChecksum<H, M> ck, Deparser<H> dep ); #endif /* _V1_MODEL_P4_ */ |}