/* -*- P4_16 -*- */ #ifndef HEADERS_P4 #define HEADERS_P4 #include /**************************************** NetPFGA ****************************************/ /* already defined in sume_switch.p4 */ #ifndef _SUME_SWITCH_P4_ typedef bit<9> port_t; #endif /**************************************** types ****************************************/ typedef bit<48> mac_addr_t; typedef bit<32> ipv4_addr_t; typedef bit<128> ipv6_addr_t; typedef bit<16> mcast_t; typedef bit<16> task_t; typedef bit<16> table_t; /* to map debug messages - 16 bit to match shortenumfield */ /**************************************** constants ****************************************/ const bit<16> TABLE_NAT64 = 1; const bit<16> TABLE_ICMP6 = 2; const bit<16> TABLE_V6_NETWORKS = 3; const bit<16> TABLE_NAT46 = 4; const bit<16> TABLE_V4_NETWORKS = 5; const bit<16> TABLE_ARP = 6; const bit<16> TABLE_ARP_EGRESS = 7; const bit<16> TABLE_ICMP = 8; const bit<16> TABLE_NAT64_TCP = 9; const bit<16> TABLE_NAT64_UDP = 10; const bit<16> TABLE_NAT64_ICMP6 = 11; const bit<16> TABLE_NAT64_SESSION = 12; 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<16> TYPE_ARP = 0x0806; 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 bit<8> ICMP_ECHO_REPLY = 0; const bit<8> ICMP_ECHO_REQUEST = 8; const bit<16> ARP_REQUEST = 1; const bit<16> ARP_REPLY = 2; /* RFC4861, Section 4.6 */ const bit<8> ICMP6_NDP_OPT_SOURCE_LL = 1; const bit<8> ICMP6_NDP_OPT_TARGET_LL = 2; const bit<8> ICMP6_NDP_OPT_PREFIX_INFO = 3; const bit<8> ICMP6_NDP_OPT_REDIR_HEADER = 4; const bit<8> ICMP6_NDP_OPT_MTU = 5; /* Tasks from switch to controller - no RFC, internal */ 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; const task_t TASK_CHECKSUM_ICMP6 = 5; /* data plane */ const task_t TASK_CHECKSUM_ICMP6_NA = 6; /* data plane */ const task_t TASK_CHECKSUM_ICMP = 7; /* data plane */ const task_t TASK_NAT64_TCP_SESSION = 8; /* control plane */ /**************************************** header ****************************************/ /* 48+48+16 = 112 */ 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> checksum; ipv4_addr_t src_addr; ipv4_addr_t dst_addr; } /* https://en.wikipedia.org/wiki/IPv6_packet 64 + 256 = 320 */ 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; } /* https://tools.ietf.org/html/rfc4861#section-4.4 */ header icmp6_na_ns_t { bit<1> router; bit<1> solicitated; bit<1> override; bit<29> reserved; ipv6_addr_t target_addr; } header icmp6_option_link_layer_addr_t { bit<8> type; bit<8> ll_length; mac_addr_t mac_addr; } header icmp_t { bit<8> type; bit<8> code; bit<16> checksum; } header arp_t { bit<16> hw_type; bit<16> protocol; bit<8> hw_size; bit<8> protocol_size; bit<16> opcode; mac_addr_t src_mac_addr; ipv4_addr_t src_ipv4_addr; mac_addr_t dst_mac_addr; ipv4_addr_t dst_ipv4_addr; } header cpu_t { task_t task; bit<16> ingress_port; bit<16> ethertype; table_t table_id; } /**************************************** struct ****************************************/ struct headers { ethernet_t ethernet; ipv4_t ipv4; ipv6_t ipv6; tcp_t tcp; udp_t udp; icmp_t icmp; cpu_t cpu; icmp6_t icmp6; icmp6_na_ns_t icmp6_na_ns; icmp6_option_link_layer_addr_t icmp6_option_link_layer_addr; arp_t arp; } struct metadata { port_t ingress_port; task_t task; task_t switch_task; /* migrate tasks to bool */ bit<1> chk_icmp6_na_ns; bit<1> chk_icmp6; bit<1> chk_icmp; bit<1> chk_ipv4; bit<1> chk_udp_v4; bit<1> chk_udp_v6; bit<1> chk_tcp_v4; bit<1> chk_tcp_v6; bit<16> length_without_ip_header; bit<32> cast_length; /* for delta checksums */ bit<16> v4sum; bit<16> v6sum; bit<16> headerdiff; table_t table_id; } #endif