Try to reproduce casting bug
This commit is contained in:
		
					parent
					
						
							
								a5a75da6b4
							
						
					
				
			
			
				commit
				
					
						00c1425a88
					
				
			
		
					 10 changed files with 547 additions and 0 deletions
				
			
		
							
								
								
									
										41
									
								
								p4debug/bug2-cast-in-checksum/checksums.p4
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								p4debug/bug2-cast-in-checksum/checksums.p4
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					/* -*- P4_16 -*- */
 | 
				
			||||||
 | 
					#ifndef CHECKSUMS_P4
 | 
				
			||||||
 | 
					#define CHECKSUMS_P4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <core.p4>
 | 
				
			||||||
 | 
					#include <v1model.p4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "headers.p4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*************************************************************************
 | 
				
			||||||
 | 
					*************   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 {
 | 
				
			||||||
 | 
					        meta.cast_length = (bit<32>) hdr.ipv6.payload_length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        update_checksum_with_payload(meta.do_cksum == 1,
 | 
				
			||||||
 | 
							 	{
 | 
				
			||||||
 | 
					                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
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										140
									
								
								p4debug/bug2-cast-in-checksum/headers.p4
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								p4debug/bug2-cast-in-checksum/headers.p4
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,140 @@
 | 
				
			||||||
 | 
					/* -*- 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;
 | 
				
			||||||
 | 
					    bit<1> do_cksum;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										97
									
								
								p4debug/bug2-cast-in-checksum/parsers.p4
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								p4debug/bug2-cast-in-checksum/parsers.p4
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,97 @@
 | 
				
			||||||
 | 
					/* -*- P4_16 -*- */
 | 
				
			||||||
 | 
					#ifndef PARSERS_P4
 | 
				
			||||||
 | 
					#define PARSERS_P4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <core.p4>
 | 
				
			||||||
 | 
					#include <v1model.p4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "headers.p4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										14
									
								
								p4debug/bug2-cast-in-checksum/settings.p4
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								p4debug/bug2-cast-in-checksum/settings.p4
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					/* -*- P4_16 -*- */
 | 
				
			||||||
 | 
					/* table sizes, register widths, and such */
 | 
				
			||||||
 | 
					#ifndef SETTINGS_P4
 | 
				
			||||||
 | 
					#define SETTINGS_P4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <core.p4>
 | 
				
			||||||
 | 
					#include <v1model.p4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define THE_ANSWER_TO_LIFE_THE_UNIVERSE_AND_EVERYTHING 42   /* Important constant          */
 | 
				
			||||||
 | 
					#define ROUTING_TABLE_SIZE 64                               /* maximum routes per protocol */
 | 
				
			||||||
 | 
					#define ADDRESS_TABLE_SIZE 64                               /* maximum number of addresses per protocol */
 | 
				
			||||||
 | 
					#define NDP_TABLE_SIZE 64                                   /* maximum number of multicast groups */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										255
									
								
								p4debug/bug2-cast-in-checksum/static-mapping.p4
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								p4debug/bug2-cast-in-checksum/static-mapping.p4
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,255 @@
 | 
				
			||||||
 | 
					/* -*- P4_16 -*- */
 | 
				
			||||||
 | 
					#include <core.p4>
 | 
				
			||||||
 | 
					#include <v1model.p4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "headers.p4"
 | 
				
			||||||
 | 
					#include "parsers.p4"
 | 
				
			||||||
 | 
					#include "checksums.p4"
 | 
				
			||||||
 | 
					#include "settings.p4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*************************************************************************
 | 
				
			||||||
 | 
					**************  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 = 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* 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 = NDP_TABLE_SIZE;
 | 
				
			||||||
 | 
					        default_action = NoAction;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /********************** debugging / general support ***********************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    table port2mcast {
 | 
				
			||||||
 | 
					        key = {
 | 
				
			||||||
 | 
					            standard_metadata.ingress_port : exact;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        actions = {
 | 
				
			||||||
 | 
								multicast_pkg;
 | 
				
			||||||
 | 
					            controller_debug;
 | 
				
			||||||
 | 
					            NoAction;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        size = NDP_TABLE_SIZE;
 | 
				
			||||||
 | 
					        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 = NDP_TABLE_SIZE;
 | 
				
			||||||
 | 
					        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 = NDP_TABLE_SIZE;
 | 
				
			||||||
 | 
					//        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 = ADDRESS_TABLE_SIZE;
 | 
				
			||||||
 | 
					        default_action = NoAction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    table v6_networks {
 | 
				
			||||||
 | 
					        key = {
 | 
				
			||||||
 | 
					            hdr.ipv6.dst_addr: lpm;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        actions = {
 | 
				
			||||||
 | 
								set_egress_port;
 | 
				
			||||||
 | 
					            controller_debug;
 | 
				
			||||||
 | 
					            controller_reply;
 | 
				
			||||||
 | 
					            NoAction;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        size = ROUTING_TABLE_SIZE;
 | 
				
			||||||
 | 
					        default_action = NoAction;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    table v4_networks {
 | 
				
			||||||
 | 
					        key = {
 | 
				
			||||||
 | 
					            hdr.ipv4.dst_addr: lpm;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        actions = {
 | 
				
			||||||
 | 
								set_egress_port;
 | 
				
			||||||
 | 
					            NoAction;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        size = ROUTING_TABLE_SIZE;
 | 
				
			||||||
 | 
					        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
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue