1036 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			1036 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								# 1 "../bug1-bool/static-mapping.p4"
							 | 
						||
| 
								 | 
							
								# 1 "<built-in>"
							 | 
						||
| 
								 | 
							
								# 1 "<command-line>"
							 | 
						||
| 
								 | 
							
								# 1 "../bug1-bool/static-mapping.p4"
							 | 
						||
| 
								 | 
							
								/* -*- P4_16 -*- */
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/core.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// 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.
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								# 3 "../bug1-bool/static-mapping.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/v1model.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/core.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 23 "/usr/local/share/p4c/p4include/v1model.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								    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.
							 | 
						||
| 
								 | 
							
								    // TODO: this should be deprecated in favor of parser_error
							 | 
						||
| 
								 | 
							
								    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 or stacks
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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
							 | 
						||
| 
								 | 
							
								                       );
							 | 
						||
| 
								 | 
							
								# 4 "../bug1-bool/static-mapping.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "../bug1-bool/headers.p4" 1
							 | 
						||
| 
								 | 
							
								/* -*- P4_16 -*- */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/core.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 6 "../bug1-bool/headers.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/v1model.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 7 "../bug1-bool/headers.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef bit<48> mac_addr_t;
							 | 
						||
| 
								 | 
							
								typedef bit<32> ipv4_addr_t;
							 | 
						||
| 
								 | 
							
								typedef bit<128> ipv6_addr_t;
							 | 
						||
| 
								 | 
							
								typedef bit<9> port_t;
							 | 
						||
| 
								 | 
							
								typedef bit<16> mcast_t;
							 | 
						||
| 
								 | 
							
								typedef bit<16> task_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const bit<16> TYPE_IPV4 = 0x0800;
							 | 
						||
| 
								 | 
							
								const bit<16> TYPE_IPV6 = 0x86DD;
							 | 
						||
| 
								 | 
							
								const bit<16> TYPE_CPU = 0x4242;
							 | 
						||
| 
								 | 
							
								const bit<16> TYPE_DEBUG = 0x2323;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const bit<8> PROTO_ICMP = 1;
							 | 
						||
| 
								 | 
							
								const bit<8> PROTO_TCP = 6;
							 | 
						||
| 
								 | 
							
								const bit<8> PROTO_UDP = 17;
							 | 
						||
| 
								 | 
							
								const bit<8> PROTO_ICMP6 = 58;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const bit<8> TCP_SEQ_LEN = 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const bit<8> ICMP6_ECHO_REQUEST = 128;
							 | 
						||
| 
								 | 
							
								const bit<8> ICMP6_ECHO_REPLY = 129;
							 | 
						||
| 
								 | 
							
								const bit<8> ICMP6_NS = 135;
							 | 
						||
| 
								 | 
							
								const bit<8> ICMP6_NA = 136;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const task_t TASK_ICMP6_NS = 1;
							 | 
						||
| 
								 | 
							
								const task_t TASK_ICMP6_GENERAL = 2;
							 | 
						||
| 
								 | 
							
								const task_t TASK_DEBUG = 3;
							 | 
						||
| 
								 | 
							
								const task_t TASK_ICMP6_REPLY = 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								header ethernet_t {
							 | 
						||
| 
								 | 
							
								    mac_addr_t dst_addr;
							 | 
						||
| 
								 | 
							
								    mac_addr_t src_addr;
							 | 
						||
| 
								 | 
							
								    bit<16> ethertype;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								header ipv4_t {
							 | 
						||
| 
								 | 
							
								    bit<4> version;
							 | 
						||
| 
								 | 
							
								    bit<4> ihl;
							 | 
						||
| 
								 | 
							
								    bit<6> diff_serv;
							 | 
						||
| 
								 | 
							
								    bit<2> ecn;
							 | 
						||
| 
								 | 
							
								    bit<16> totalLen;
							 | 
						||
| 
								 | 
							
								    bit<16> identification;
							 | 
						||
| 
								 | 
							
								    bit<3> flags;
							 | 
						||
| 
								 | 
							
								    bit<13> fragOffset;
							 | 
						||
| 
								 | 
							
								    bit<8> ttl;
							 | 
						||
| 
								 | 
							
								    bit<8> protocol;
							 | 
						||
| 
								 | 
							
								    bit<16> hdrChecksum;
							 | 
						||
| 
								 | 
							
								    ipv4_addr_t src_addr;
							 | 
						||
| 
								 | 
							
								    ipv4_addr_t dst_addr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* https://en.wikipedia.org/wiki/IPv6_packet */
							 | 
						||
| 
								 | 
							
								header ipv6_t {
							 | 
						||
| 
								 | 
							
								    bit<4> version;
							 | 
						||
| 
								 | 
							
								    bit<8> traffic_class;
							 | 
						||
| 
								 | 
							
								    bit<20> flow_label;
							 | 
						||
| 
								 | 
							
								    bit<16> payload_length;
							 | 
						||
| 
								 | 
							
								    bit<8> next_header;
							 | 
						||
| 
								 | 
							
								    bit<8> hop_limit;
							 | 
						||
| 
								 | 
							
								    ipv6_addr_t src_addr;
							 | 
						||
| 
								 | 
							
								    ipv6_addr_t dst_addr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								header tcp_t{
							 | 
						||
| 
								 | 
							
								    bit<16> src_port;
							 | 
						||
| 
								 | 
							
								    bit<16> dst_port;
							 | 
						||
| 
								 | 
							
								    int<32> seqNo;
							 | 
						||
| 
								 | 
							
								    int<32> ackNo;
							 | 
						||
| 
								 | 
							
								    bit<4> data_offset;
							 | 
						||
| 
								 | 
							
								    bit<4> res;
							 | 
						||
| 
								 | 
							
								    bit<1> cwr;
							 | 
						||
| 
								 | 
							
								    bit<1> ece;
							 | 
						||
| 
								 | 
							
								    bit<1> urg;
							 | 
						||
| 
								 | 
							
								    bit<1> ack;
							 | 
						||
| 
								 | 
							
								    bit<1> psh;
							 | 
						||
| 
								 | 
							
								    bit<1> rst;
							 | 
						||
| 
								 | 
							
								    bit<1> syn;
							 | 
						||
| 
								 | 
							
								    bit<1> fin;
							 | 
						||
| 
								 | 
							
								    bit<16> window;
							 | 
						||
| 
								 | 
							
								    bit<16> checksum;
							 | 
						||
| 
								 | 
							
								    bit<16> urgentPtr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								header udp_t {
							 | 
						||
| 
								 | 
							
								    bit<16> src_port;
							 | 
						||
| 
								 | 
							
								    bit<16> dst_port;
							 | 
						||
| 
								 | 
							
								    bit<16> payload_length;
							 | 
						||
| 
								 | 
							
								    bit<16> checksum;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								header icmp6_t {
							 | 
						||
| 
								 | 
							
								    bit<8> type;
							 | 
						||
| 
								 | 
							
								    bit<8> code;
							 | 
						||
| 
								 | 
							
								    bit<16> checksum;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								header icmp_t {
							 | 
						||
| 
								 | 
							
								    bit<8> type;
							 | 
						||
| 
								 | 
							
								    bit<8> code;
							 | 
						||
| 
								 | 
							
								    bit<16> checksum;
							 | 
						||
| 
								 | 
							
								    bit<32> rest;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								header cpu_t {
							 | 
						||
| 
								 | 
							
								    task_t task;
							 | 
						||
| 
								 | 
							
								    bit<16> ingress_port;
							 | 
						||
| 
								 | 
							
								    bit<16> ethertype;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct headers {
							 | 
						||
| 
								 | 
							
								    ethernet_t ethernet;
							 | 
						||
| 
								 | 
							
								    ipv4_t ipv4;
							 | 
						||
| 
								 | 
							
								    ipv6_t ipv6;
							 | 
						||
| 
								 | 
							
								    tcp_t tcp;
							 | 
						||
| 
								 | 
							
								    udp_t udp;
							 | 
						||
| 
								 | 
							
								    icmp6_t icmp6;
							 | 
						||
| 
								 | 
							
								    icmp_t icmp;
							 | 
						||
| 
								 | 
							
								    cpu_t cpu;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct metadata {
							 | 
						||
| 
								 | 
							
								    port_t ingress_port;
							 | 
						||
| 
								 | 
							
								    task_t task;
							 | 
						||
| 
								 | 
							
								    bit<16> tcp_length;
							 | 
						||
| 
								 | 
							
								    bit<32> cast_length;
							 | 
						||
| 
								 | 
							
								    bool do_cksum;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								# 6 "../bug1-bool/static-mapping.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "../bug1-bool/parsers.p4" 1
							 | 
						||
| 
								 | 
							
								/* -*- P4_16 -*- */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/core.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 6 "../bug1-bool/parsers.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/v1model.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 7 "../bug1-bool/parsers.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "../bug1-bool/headers.p4" 1
							 | 
						||
| 
								 | 
							
								/* -*- P4_16 -*- */
							 | 
						||
| 
								 | 
							
								# 9 "../bug1-bool/parsers.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parser MyParser(packet_in packet,
							 | 
						||
| 
								 | 
							
								                out headers hdr,
							 | 
						||
| 
								 | 
							
								                inout metadata meta,
							 | 
						||
| 
								 | 
							
								                inout standard_metadata_t standard_metadata) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    state start {
							 | 
						||
| 
								 | 
							
								        packet.extract(hdr.ethernet);
							 | 
						||
| 
								 | 
							
								        transition select(hdr.ethernet.ethertype){
							 | 
						||
| 
								 | 
							
								            TYPE_IPV4: ipv4;
							 | 
						||
| 
								 | 
							
								            TYPE_IPV6: ipv6;
							 | 
						||
| 
								 | 
							
								            default: accept;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    state ipv4 {
							 | 
						||
| 
								 | 
							
								        packet.extract(hdr.ipv4);
							 | 
						||
| 
								 | 
							
								  meta.tcp_length = hdr.ipv4.totalLen - 16w20;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        transition select(hdr.ipv4.protocol){
							 | 
						||
| 
								 | 
							
								            PROTO_TCP: tcp;
							 | 
						||
| 
								 | 
							
								            PROTO_UDP: udp;
							 | 
						||
| 
								 | 
							
								            PROTO_ICMP: icmp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            default: accept;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    state ipv6 {
							 | 
						||
| 
								 | 
							
								        packet.extract(hdr.ipv6);
							 | 
						||
| 
								 | 
							
								  meta.tcp_length = hdr.ipv6.payload_length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        transition select(hdr.ipv6.next_header){
							 | 
						||
| 
								 | 
							
								            PROTO_TCP: tcp;
							 | 
						||
| 
								 | 
							
								            PROTO_UDP: udp;
							 | 
						||
| 
								 | 
							
								            PROTO_ICMP6: icmp6;
							 | 
						||
| 
								 | 
							
								            default: accept;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Leaf */
							 | 
						||
| 
								 | 
							
								    state tcp {
							 | 
						||
| 
								 | 
							
								       packet.extract(hdr.tcp);
							 | 
						||
| 
								 | 
							
								       transition accept;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    state udp {
							 | 
						||
| 
								 | 
							
								       packet.extract(hdr.udp);
							 | 
						||
| 
								 | 
							
								       transition accept;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    state icmp6 {
							 | 
						||
| 
								 | 
							
								       packet.extract(hdr.icmp6);
							 | 
						||
| 
								 | 
							
								       transition accept;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    state icmp {
							 | 
						||
| 
								 | 
							
								       packet.extract(hdr.icmp);
							 | 
						||
| 
								 | 
							
								       transition accept;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************************************
							 | 
						||
| 
								 | 
							
								************************  D E P A R S E R  *******************************
							 | 
						||
| 
								 | 
							
								*************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								control MyDeparser(packet_out packet, in headers hdr) {
							 | 
						||
| 
								 | 
							
								    apply {
							 | 
						||
| 
								 | 
							
								        /* always */
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.ethernet);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* only if information is sent to the controller */
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.cpu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* either */
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.ipv4);
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.ipv6);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* either */
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.tcp);
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.udp);
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.icmp);
							 | 
						||
| 
								 | 
							
								        packet.emit(hdr.icmp6);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								# 7 "../bug1-bool/static-mapping.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "../bug1-bool/checksums.p4" 1
							 | 
						||
| 
								 | 
							
								/* -*- P4_16 -*- */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/core.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 6 "../bug1-bool/checksums.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/v1model.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 7 "../bug1-bool/checksums.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "../bug1-bool/headers.p4" 1
							 | 
						||
| 
								 | 
							
								/* -*- P4_16 -*- */
							 | 
						||
| 
								 | 
							
								# 9 "../bug1-bool/checksums.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************************************
							 | 
						||
| 
								 | 
							
								*************   C H E C K S U M    V E R I F I C A T I O N   *************
							 | 
						||
| 
								 | 
							
								*************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
							 | 
						||
| 
								 | 
							
								    apply {}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************************************
							 | 
						||
| 
								 | 
							
								**************   C H E C K S U M    C O M P U T A T I O N   **************
							 | 
						||
| 
								 | 
							
								*************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								control MyComputeChecksum(inout headers hdr, inout metadata meta) {
							 | 
						||
| 
								 | 
							
								    apply {
							 | 
						||
| 
								 | 
							
								        update_checksum_with_payload(meta.do_cksum,
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								                hdr.ipv6.src_addr, /* 128 */
							 | 
						||
| 
								 | 
							
								     hdr.ipv6.dst_addr, /* 128 */
							 | 
						||
| 
								 | 
							
								                meta.cast_length, /* 32 */
							 | 
						||
| 
								 | 
							
								                24w0, /* 24 0's */
							 | 
						||
| 
								 | 
							
								                PROTO_ICMP6 /* 8 */
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            hdr.icmp6.checksum,
							 | 
						||
| 
								 | 
							
								            HashAlgorithm.csum16
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								# 8 "../bug1-bool/static-mapping.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "../bug1-bool/settings.p4" 1
							 | 
						||
| 
								 | 
							
								/* -*- P4_16 -*- */
							 | 
						||
| 
								 | 
							
								/* table sizes, register widths, and such */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/core.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 7 "../bug1-bool/settings.p4" 2
							 | 
						||
| 
								 | 
							
								# 1 "/usr/local/share/p4c/p4include/v1model.p4" 1
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								# 8 "../bug1-bool/settings.p4" 2
							 | 
						||
| 
								 | 
							
								# 9 "../bug1-bool/static-mapping.p4" 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************************************
							 | 
						||
| 
								 | 
							
								**************  I N G R E S S   P R O C E S S I N G   *******************
							 | 
						||
| 
								 | 
							
								*************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								control MyIngress(inout headers hdr,
							 | 
						||
| 
								 | 
							
								    inout metadata meta,
							 | 
						||
| 
								 | 
							
								    inout standard_metadata_t standard_metadata) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /********************** ACTIONS ***********************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    action drop() {
							 | 
						||
| 
								 | 
							
								        mark_to_drop();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 action set_egress_port (port_t out_port) {
							 | 
						||
| 
								 | 
							
								        standard_metadata.egress_spec = out_port;
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    action controller_debug() {
							 | 
						||
| 
								 | 
							
								        meta.task = TASK_DEBUG;
							 | 
						||
| 
								 | 
							
								        meta.ingress_port = standard_metadata.ingress_port;
							 | 
						||
| 
								 | 
							
								        clone3(CloneType.I2E, 100, meta);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    action controller_reply(task_t task) {
							 | 
						||
| 
								 | 
							
								        meta.task = task;
							 | 
						||
| 
								 | 
							
								        meta.ingress_port = standard_metadata.ingress_port;
							 | 
						||
| 
								 | 
							
								        clone3(CloneType.I2E, 100, meta);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    action multicast_pkg(mcast_t mcast_grp) { /* Output PKG on correct ports (plural) */
							 | 
						||
| 
								 | 
							
								        standard_metadata.mcast_grp = mcast_grp;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    action icmp6_neighbor_solicitation(ipv6_addr_t addr) {
							 | 
						||
| 
								 | 
							
								        /* egress = ingress */
							 | 
						||
| 
								 | 
							
								        standard_metadata.egress_spec = standard_metadata.ingress_port;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        hdr.ipv6.dst_addr = hdr.ipv6.src_addr;
							 | 
						||
| 
								 | 
							
								        hdr.ipv6.src_addr = addr;
							 | 
						||
| 
								 | 
							
								        hdr.icmp6.type = ICMP6_NA;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    action icmp6_echo_reply() {
							 | 
						||
| 
								 | 
							
								        mac_addr_t mac_tmp = hdr.ethernet.dst_addr;
							 | 
						||
| 
								 | 
							
								        hdr.ethernet.dst_addr = hdr.ethernet.src_addr;
							 | 
						||
| 
								 | 
							
								        hdr.ethernet.src_addr = mac_tmp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ipv6_addr_t addr_tmp = hdr.ipv6.dst_addr;
							 | 
						||
| 
								 | 
							
								        hdr.ipv6.dst_addr = hdr.ipv6.src_addr;
							 | 
						||
| 
								 | 
							
								        hdr.ipv6.src_addr = addr_tmp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        hdr.icmp6.type = ICMP6_ECHO_REPLY;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        meta.do_cksum = true;
							 | 
						||
| 
								 | 
							
								        meta.cast_length = (bit<32>) hdr.ipv6.payload_length;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* this needs SESSIONS!!
							 | 
						||
| 
								 | 
							
								    - icmp6: (src addr, dst addr, ID??, )
							 | 
						||
| 
								 | 
							
								    - tcp: (src port, dst port, dst_addr, src addr)
							 | 
						||
| 
								 | 
							
								    - udp: (src port, dst port, dst_addr, src addr)
							 | 
						||
| 
								 | 
							
								    */
							 | 
						||
| 
								 | 
							
								    // action nat64_static(ipv4_addr_t nataddr, ipv6_addr_t nat64_prefix) {
							 | 
						||
| 
								 | 
							
								    //     hdr.ipv4.dst_addr = hdr.ipv6.dst_addr - nat64_prefix;
							 | 
						||
| 
								 | 
							
								    //     hdr.ipv4.dst_addr = hdr.ipv6.dst_addr - nat64_prefix;
							 | 
						||
| 
								 | 
							
								    // }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /********************** Reply to NDP for US ***********************************/
							 | 
						||
| 
								 | 
							
								    table ndp_answer {
							 | 
						||
| 
								 | 
							
								        key = {
							 | 
						||
| 
								 | 
							
								            hdr.ipv6.dst_addr: exact; /* our multicast embedded mac address */
							 | 
						||
| 
								 | 
							
								            hdr.icmp6.type: exact;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        actions = {
							 | 
						||
| 
								 | 
							
								            controller_debug;
							 | 
						||
| 
								 | 
							
								            icmp6_neighbor_solicitation;
							 | 
						||
| 
								 | 
							
								            NoAction;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        size = 64;
							 | 
						||
| 
								 | 
							
								        default_action = NoAction;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /********************** debugging / general support ***********************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    table port2mcast {
							 | 
						||
| 
								 | 
							
								        key = {
							 | 
						||
| 
								 | 
							
								            standard_metadata.ingress_port : exact;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        actions = {
							 | 
						||
| 
								 | 
							
								   multicast_pkg;
							 | 
						||
| 
								 | 
							
								            controller_debug;
							 | 
						||
| 
								 | 
							
								            NoAction;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        size = 64;
							 | 
						||
| 
								 | 
							
								        default_action = NoAction;
							 | 
						||
| 
								 | 
							
								//        default_action = controller_debug;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Handle multicast registration of NDP */
							 | 
						||
| 
								 | 
							
								    table addr2mcast {
							 | 
						||
| 
								 | 
							
								        key = {
							 | 
						||
| 
								 | 
							
								            hdr.ipv6.dst_addr: exact;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        actions = {
							 | 
						||
| 
								 | 
							
								   multicast_pkg;
							 | 
						||
| 
								 | 
							
								            controller_debug;
							 | 
						||
| 
								 | 
							
								            NoAction;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        size = 64;
							 | 
						||
| 
								 | 
							
								        default_action = NoAction;
							 | 
						||
| 
								 | 
							
								//        default_action = controller_debug;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /********************** NDP support ***********************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    table ndp {
							 | 
						||
| 
								 | 
							
								        key = {
							 | 
						||
| 
								 | 
							
								            hdr.ipv6.dst_addr: lpm;
							 | 
						||
| 
								 | 
							
								            standard_metadata.ingress_port : exact;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        actions = {
							 | 
						||
| 
								 | 
							
								   multicast_pkg;
							 | 
						||
| 
								 | 
							
								            controller_debug;
							 | 
						||
| 
								 | 
							
								            NoAction;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        size = 64;
							 | 
						||
| 
								 | 
							
								//        default_action = NoAction;
							 | 
						||
| 
								 | 
							
								        default_action = controller_debug;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /********************** ADDRESS TABLES ***********************************/
							 | 
						||
| 
								 | 
							
								    action icmp6_answer() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if(hdr.icmp6.isValid()) {
							 | 
						||
| 
								 | 
							
								            if(hdr.icmp6.code == ICMP6_ECHO_REQUEST) {
							 | 
						||
| 
								 | 
							
								                ipv6_addr_t tmp = hdr.ipv6.src_addr;
							 | 
						||
| 
								 | 
							
								                hdr.ipv6.src_addr = hdr.ipv6.dst_addr;
							 | 
						||
| 
								 | 
							
								                hdr.ipv6.dst_addr = tmp;
							 | 
						||
| 
								 | 
							
								                hdr.icmp6.code = ICMP6_ECHO_REPLY;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* do something:
							 | 
						||
| 
								 | 
							
								        - change src/dst
							 | 
						||
| 
								 | 
							
								        - change type
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 /********************** ROUTING (egress definiton) TABLES ***********************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    table v6_addresses {
							 | 
						||
| 
								 | 
							
								        key = {
							 | 
						||
| 
								 | 
							
								            hdr.ipv6.dst_addr: exact;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        actions = {
							 | 
						||
| 
								 | 
							
								            controller_debug;
							 | 
						||
| 
								 | 
							
								            controller_reply;
							 | 
						||
| 
								 | 
							
								            icmp6_echo_reply;
							 | 
						||
| 
								 | 
							
								            NoAction;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        size = 64;
							 | 
						||
| 
								 | 
							
								        default_action = NoAction;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    table v6_networks {
							 | 
						||
| 
								 | 
							
								        key = {
							 | 
						||
| 
								 | 
							
								            hdr.ipv6.dst_addr: lpm;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        actions = {
							 | 
						||
| 
								 | 
							
								   set_egress_port;
							 | 
						||
| 
								 | 
							
								            controller_debug;
							 | 
						||
| 
								 | 
							
								            controller_reply;
							 | 
						||
| 
								 | 
							
								            NoAction;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        size = 64;
							 | 
						||
| 
								 | 
							
								        default_action = NoAction;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    table v4_networks {
							 | 
						||
| 
								 | 
							
								        key = {
							 | 
						||
| 
								 | 
							
								            hdr.ipv4.dst_addr: lpm;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        actions = {
							 | 
						||
| 
								 | 
							
								   set_egress_port;
							 | 
						||
| 
								 | 
							
								            NoAction;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        size = 64;
							 | 
						||
| 
								 | 
							
								        default_action = NoAction;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 /********************** APPLYING TABLES ***********************************/
							 | 
						||
| 
								 | 
							
								    apply {
							 | 
						||
| 
								 | 
							
								        if(hdr.ipv6.isValid()) {
							 | 
						||
| 
								 | 
							
								            /* FIXME: structure / use .hit to do logic */
							 | 
						||
| 
								 | 
							
								            // ndp_answer.apply();
							 | 
						||
| 
								 | 
							
								            //ndp.apply(); /* flood or if it is us - answer */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            v6_addresses.apply();
							 | 
						||
| 
								 | 
							
								            v6_networks.apply();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if(hdr.ipv4.isValid()) {
							 | 
						||
| 
								 | 
							
								            v4_networks.apply();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************************************
							 | 
						||
| 
								 | 
							
								****************  E G R E S S   P R O C E S S I N G   *******************
							 | 
						||
| 
								 | 
							
								*************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								control MyEgress(inout headers hdr,
							 | 
						||
| 
								 | 
							
								                 inout metadata meta,
							 | 
						||
| 
								 | 
							
								                 inout standard_metadata_t standard_metadata) {
							 | 
						||
| 
								 | 
							
								 apply {
							 | 
						||
| 
								 | 
							
								        // ingress clone
							 | 
						||
| 
								 | 
							
								        if (standard_metadata.instance_type == 1){
							 | 
						||
| 
								 | 
							
								            hdr.cpu.setValid();
							 | 
						||
| 
								 | 
							
								            hdr.cpu.task = meta.task;
							 | 
						||
| 
								 | 
							
								            hdr.cpu.ethertype = hdr.ethernet.ethertype;
							 | 
						||
| 
								 | 
							
								            hdr.cpu.ingress_port = (bit<16>)meta.ingress_port;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            hdr.ethernet.ethertype = TYPE_CPU;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************************************
							 | 
						||
| 
								 | 
							
								***********************  S W I T C H  *******************************
							 | 
						||
| 
								 | 
							
								*************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								V1Switch(
							 | 
						||
| 
								 | 
							
								MyParser(),
							 | 
						||
| 
								 | 
							
								MyVerifyChecksum(),
							 | 
						||
| 
								 | 
							
								MyIngress(),
							 | 
						||
| 
								 | 
							
								MyEgress(),
							 | 
						||
| 
								 | 
							
								MyComputeChecksum(),
							 | 
						||
| 
								 | 
							
								MyDeparser()
							 | 
						||
| 
								 | 
							
								) main;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //     truncate((bit<32>)22); //ether+cpu header
							 |