140 lines
		
	
	
		
			No EOL
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			No EOL
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
/* -*- P4_16 -*- */
 | 
						|
#ifndef HEADERS_P4
 | 
						|
#define HEADERS_P4
 | 
						|
 | 
						|
#include <core.p4>
 | 
						|
#include <v1model.p4>
 | 
						|
 | 
						|
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;
 | 
						|
}
 | 
						|
 | 
						|
#endif |