| /* |
| * Copyright 2017-present Open Networking Foundation |
| * |
| * 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. |
| */ |
| |
| #ifndef __HEADER__ |
| #define __HEADER__ |
| |
| #include "define.p4" |
| |
| @controller_header("packet_in") |
| header packet_in_header_t { |
| port_num_t ingress_port; |
| bit<7> _pad; |
| } |
| |
| _PKT_OUT_HDR_ANNOT |
| @controller_header("packet_out") |
| header packet_out_header_t { |
| port_num_t egress_port; |
| bit<7> _pad; |
| } |
| |
| header ethernet_t { |
| mac_addr_t dst_addr; |
| mac_addr_t src_addr; |
| bit<16> ether_type; |
| } |
| |
| header vlan_tag_t { |
| bit<3> pri; |
| bit<1> cfi; |
| vlan_id_t vlan_id; |
| bit<16> ether_type; |
| } |
| |
| header mpls_t { |
| bit<20> label; |
| bit<3> tc; |
| bit<1> bos; |
| bit<8> ttl; |
| } |
| |
| header ipv4_t { |
| bit<4> version; |
| bit<4> ihl; |
| bit<6> dscp; |
| bit<2> ecn; |
| bit<16> total_len; |
| bit<16> identification; |
| bit<3> flags; |
| bit<13> frag_offset; |
| bit<8> ttl; |
| bit<8> protocol; |
| bit<16> hdr_checksum; |
| bit<32> src_addr; |
| bit<32> dst_addr; |
| } |
| |
| header ipv6_t { |
| bit<4> version; |
| bit<8> traffic_class; |
| bit<20> flow_label; |
| bit<16> payload_len; |
| bit<8> next_hdr; |
| bit<8> hop_limit; |
| bit<128> src_addr; |
| bit<128> dst_addr; |
| } |
| |
| header arp_t { |
| bit<16> hw_type; |
| bit<16> proto_type; |
| bit<8> hw_addr_len; |
| bit<8> proto_addr_len; |
| bit<16> opcode; |
| } |
| |
| header tcp_t { |
| bit<16> src_port; |
| bit<16> dst_port; |
| bit<32> seq_no; |
| bit<32> ack_no; |
| bit<4> data_offset; |
| bit<3> res; |
| bit<3> ecn; |
| bit<6> ctrl; |
| bit<16> window; |
| bit<16> checksum; |
| bit<16> urgent_ptr; |
| } |
| |
| header udp_t { |
| bit<16> src_port; |
| bit<16> dst_port; |
| bit<16> len; |
| bit<16> checksum; |
| } |
| |
| header icmp_t { |
| bit<8> icmp_type; |
| bit<8> icmp_code; |
| bit<16> checksum; |
| bit<16> identifier; |
| bit<16> sequence_number; |
| bit<64> timestamp; |
| } |
| |
| #ifdef WITH_SPGW |
| // GTPU v1 |
| header gtpu_t { |
| bit<3> version; /* version */ |
| bit<1> pt; /* protocol type */ |
| bit<1> spare; /* reserved */ |
| bit<1> ex_flag; /* next extension hdr present? */ |
| bit<1> seq_flag; /* sequence no. */ |
| bit<1> npdu_flag; /* n-pdn number present ? */ |
| bit<8> msgtype; /* message type */ |
| bit<16> msglen; /* message length */ |
| bit<32> teid; /* tunnel endpoint id */ |
| } |
| |
| struct spgw_meta_t { |
| direction_t direction; |
| bit<16> ipv4_len; |
| bit<32> teid; |
| bit<32> s1u_enb_addr; |
| bit<32> s1u_sgw_addr; |
| #ifdef WITH_SPGW_PCC_GATING |
| bit<16> l4_src_port; |
| bit<16> l4_dst_port; |
| pcc_gate_status_t pcc_gate_status; |
| sdf_rule_id_t sdf_rule_id; |
| pcc_rule_id_t pcc_rule_id; |
| #endif // WITH_SPGW_PCC_GATING |
| } |
| #endif // WITH_SPGW |
| |
| #ifdef WITH_INT |
| // Report Telemetry Headers |
| header report_fixed_header_t { |
| bit<4> ver; |
| bit<4> nproto; |
| bit<1> d; |
| bit<1> q; |
| bit<1> f; |
| bit<15> rsvd; |
| bit<6> hw_id; |
| bit<32> seq_no; |
| bit<32> ingress_tstamp; |
| } |
| |
| // Telemetry drop report header |
| header drop_report_header_t { |
| bit<32> switch_id; |
| bit<16> ingress_port_id; |
| bit<16> egress_port_id; |
| bit<8> queue_id; |
| bit<8> drop_reason; |
| bit<16> pad; |
| } |
| |
| // Switch Local Report Header |
| header local_report_header_t { |
| bit<32> switch_id; |
| bit<16> ingress_port_id; |
| bit<16> egress_port_id; |
| bit<8> queue_id; |
| bit<24> queue_occupancy; |
| bit<32> egress_tstamp; |
| } |
| |
| header_union local_report_t { |
| drop_report_header_t drop_report_header; |
| local_report_header_t local_report_header; |
| } |
| |
| // INT headers |
| header int_header_t { |
| bit<2> ver; |
| bit<2> rep; |
| bit<1> c; |
| bit<1> e; |
| bit<5> rsvd1; |
| bit<5> ins_cnt; |
| bit<8> max_hop_cnt; |
| bit<8> total_hop_cnt; |
| bit<4> instruction_mask_0003; /* split the bits for lookup */ |
| bit<4> instruction_mask_0407; |
| bit<4> instruction_mask_0811; |
| bit<4> instruction_mask_1215; |
| bit<16> rsvd2; |
| } |
| |
| // INT meta-value headers - different header for each value type |
| header int_switch_id_t { |
| bit<32> switch_id; |
| } |
| header int_port_ids_t { |
| bit<16> ingress_port_id; |
| bit<16> egress_port_id; |
| } |
| header int_hop_latency_t { |
| bit<32> hop_latency; |
| } |
| header int_q_occupancy_t { |
| bit<8> q_id; |
| bit<24> q_occupancy; |
| } |
| header int_ingress_tstamp_t { |
| bit<32> ingress_tstamp; |
| } |
| header int_egress_tstamp_t { |
| bit<32> egress_tstamp; |
| } |
| header int_q_congestion_t { |
| bit<8> q_id; |
| bit<24> q_congestion; |
| } |
| header int_egress_port_tx_util_t { |
| bit<32> egress_port_tx_util; |
| } |
| |
| header int_data_t { |
| // Maximum int metadata stack size in bits: |
| // (0xFF -4) * 32 (excluding INT shim header, tail header and INT header) |
| varbit<8032> data; |
| } |
| |
| /* INT shim header for TCP/UDP */ |
| header intl4_shim_t { |
| bit<8> int_type; |
| bit<8> rsvd1; |
| bit<8> len; |
| bit<8> rsvd2; |
| } |
| /* INT tail header for TCP/UDP */ |
| header intl4_tail_t { |
| bit<8> next_proto; |
| bit<16> dest_port; |
| bit<8> dscp; |
| } |
| |
| struct int_metadata_t { |
| switch_id_t switch_id; |
| bit<16> insert_byte_cnt; |
| bit<1> source; |
| bit<1> sink; |
| bit<8> mirror_id; |
| bit<16> flow_id; |
| bit<8> metadata_len; |
| } |
| #endif // WITH_INT |
| |
| //Custom metadata definition |
| struct fabric_metadata_t { |
| fwd_type_t fwd_type; |
| next_id_t next_id; |
| _BOOL pop_vlan_when_packet_in; |
| _BOOL is_multicast; |
| _BOOL is_controller_packet_out; |
| _BOOL clone_to_cpu; |
| bit<8> ip_proto; |
| bit<16> l4_src_port; |
| bit<16> l4_dst_port; |
| #ifdef WITH_SPGW |
| spgw_meta_t spgw; |
| #endif // WITH_SPGW |
| #ifdef WITH_INT |
| int_metadata_t int_meta; |
| bool compute_checksum; |
| #endif // WITH_INT |
| } |
| |
| struct parsed_headers_t { |
| ethernet_t ethernet; |
| vlan_tag_t vlan_tag; |
| mpls_t mpls; |
| #ifdef WITH_SPGW |
| ipv4_t gtpu_ipv4; |
| udp_t gtpu_udp; |
| gtpu_t gtpu; |
| ipv4_t inner_ipv4; |
| udp_t inner_udp; |
| #endif // WITH_SPGW |
| ipv4_t ipv4; |
| #ifdef WITH_IPV6 |
| ipv6_t ipv6; |
| #endif // WITH_IPV6 |
| arp_t arp; |
| tcp_t tcp; |
| udp_t udp; |
| icmp_t icmp; |
| packet_out_header_t packet_out; |
| packet_in_header_t packet_in; |
| #ifdef WITH_INT |
| // INT Report Encapsulation |
| ethernet_t report_ethernet; |
| ipv4_t report_ipv4; |
| udp_t report_udp; |
| // INT Report Headers |
| report_fixed_header_t report_fixed_header; |
| local_report_t report_local; |
| // INT specific headers |
| intl4_shim_t intl4_shim; |
| int_header_t int_header; |
| int_data_t int_data; |
| int_switch_id_t int_switch_id; |
| int_port_ids_t int_port_ids; |
| int_hop_latency_t int_hop_latency; |
| int_q_occupancy_t int_q_occupancy; |
| int_ingress_tstamp_t int_ingress_tstamp; |
| int_egress_tstamp_t int_egress_tstamp; |
| int_q_congestion_t int_q_congestion; |
| int_egress_port_tx_util_t int_egress_tx_util; |
| intl4_tail_t intl4_tail; |
| #endif //WITH_INT |
| } |
| |
| #endif |