You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
5.5 KiB
241 lines
5.5 KiB
/* -*- P4_16 -*- */ |
|
#ifndef HEADERS_P4 |
|
#define HEADERS_P4 |
|
|
|
#include <core.p4> |
|
|
|
/**************************************** 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 |