[p4,controller] Begin to add icmp6 echo reply support + more NDP "fixes"
This commit is contained in:
		
					parent
					
						
							
								6b601a09f7
							
						
					
				
			
			
				commit
				
					
						c38eb0dfc4
					
				
			
		
					 5 changed files with 58 additions and 4 deletions
				
			
		| 
						 | 
					@ -110,8 +110,7 @@ class L2Controller(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.controller.table_clear("v6_addresses")
 | 
					        self.controller.table_clear("v6_addresses")
 | 
				
			||||||
        for v6addr in self.v6_addresses[self.mode]:
 | 
					        for v6addr in self.v6_addresses[self.mode]:
 | 
				
			||||||
            self.controller.table_add("v6_addresses", "icmp6_answer", [v6addr['addr']], [v6addr['port']])
 | 
					            self.controller.table_add("v6_addresses", "icmp6_answer", [v6addr['addr']])
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def config_hosts(self):
 | 
					    def config_hosts(self):
 | 
				
			||||||
| 
						 | 
					@ -133,6 +132,14 @@ class L2Controller(object):
 | 
				
			||||||
            # mx h$i "ip -6 route add default via 2001:db8:6::42"
 | 
					            # mx h$i "ip -6 route add default via 2001:db8:6::42"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #for v4route in self.v4_routes[self.mode]:
 | 
					        #for v4route in self.v4_routes[self.mode]:
 | 
				
			||||||
 | 
					        # Todo: add v4 routes / ip addresses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Fake mac addresses - this gets REALLY messy now
 | 
				
			||||||
 | 
					        # for host in range(4):
 | 
				
			||||||
 | 
					        #     macrange = [1, 2, 3, 4, 42]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #     for mac in macrange:
 | 
				
			||||||
 | 
					        #         subprocess.call(["mx", host, "ip", "addr", "add", ipaddr, "dev", dev])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def debug_print_pkg(self, pkg, msg="INCOMING"):
 | 
					    def debug_print_pkg(self, pkg, msg="INCOMING"):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,8 @@ for i in 1 2; do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # add neighbors
 | 
					    # add neighbors
 | 
				
			||||||
    for j in 1 2 42; do
 | 
					    for j in 1 2 42; do
 | 
				
			||||||
        mx h$i "ip -6 neigh add 2001:db8:6::${j} dev $dev lladdr 00:00:0a:00:00:0${j}"
 | 
					        mx h$i "ip -6 neigh add 2001:db8:61::${j} dev $dev lladdr 00:00:0a:00:00:0${j}"
 | 
				
			||||||
 | 
					        mx h$i "ip -6 neigh add 2001:db8:62::${j} dev $dev lladdr 00:00:0a:00:00:0${j}"
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,38 @@ control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
control MyComputeChecksum(inout headers  hdr, inout metadata meta) {
 | 
					control MyComputeChecksum(inout headers  hdr, inout metadata meta) {
 | 
				
			||||||
    apply {
 | 
					    apply {
 | 
				
			||||||
 | 
					        /* 512 bit+ according to
 | 
				
			||||||
 | 
					        https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_checksum_for_IPv4
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
								update_checksum_with_payload(
 | 
				
			||||||
 | 
								hdr.ipv6.isValid(),
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
					                hdr.ipv6.src_addr, /* 128 */
 | 
				
			||||||
 | 
									hdr.ipv6.dst_addr, /* 128 */
 | 
				
			||||||
 | 
									meta.tcpLength,
 | 
				
			||||||
 | 
									24w0,
 | 
				
			||||||
 | 
									hdr.ipv6.next_header,
 | 
				
			||||||
 | 
									// TCP header
 | 
				
			||||||
 | 
									hdr.tcp.src_port,
 | 
				
			||||||
 | 
									hdr.tcp.dst_port,
 | 
				
			||||||
 | 
									hdr.tcp.seqNo,
 | 
				
			||||||
 | 
									hdr.tcp.ackNo,
 | 
				
			||||||
 | 
									hdr.tcp.data_offset,
 | 
				
			||||||
 | 
									hdr.tcp.res,
 | 
				
			||||||
 | 
									hdr.tcp.cwr,
 | 
				
			||||||
 | 
									hdr.tcp.ece,
 | 
				
			||||||
 | 
									hdr.tcp.urg,
 | 
				
			||||||
 | 
									hdr.tcp.ack,
 | 
				
			||||||
 | 
									hdr.tcp.psh,
 | 
				
			||||||
 | 
									hdr.tcp.rst,
 | 
				
			||||||
 | 
									hdr.tcp.syn,
 | 
				
			||||||
 | 
									hdr.tcp.fin,
 | 
				
			||||||
 | 
									hdr.tcp.window,
 | 
				
			||||||
 | 
									hdr.tcp.urgentPtr
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								hdr.tcp.checksum,
 | 
				
			||||||
 | 
								HashAlgorithm.csum16);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,9 @@ const bit<8>  PROTO_ICMP6  = 58;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const bit<8>  TCP_SEQ_LEN = 4;
 | 
					const bit<8>  TCP_SEQ_LEN = 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const bit<8>  ICMP6_ECHO_REQUEST = 128;
 | 
				
			||||||
 | 
					const bit<8>  ICMP6_ECHO_REPLY   = 129;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
header ethernet_t {
 | 
					header ethernet_t {
 | 
				
			||||||
    mac_addr_t dst_addr;
 | 
					    mac_addr_t dst_addr;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,17 @@ control MyIngress(inout headers hdr,
 | 
				
			||||||
    inout standard_metadata_t standard_metadata) {
 | 
					    inout standard_metadata_t standard_metadata) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /********************** ADDRESS TABLES ***********************************/
 | 
					    /********************** ADDRESS TABLES ***********************************/
 | 
				
			||||||
    action icmp6_answer(port_t port) {
 | 
					    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:
 | 
					        /* do something:
 | 
				
			||||||
        - change src/dst
 | 
					        - change src/dst
 | 
				
			||||||
        - change type
 | 
					        - change type
 | 
				
			||||||
| 
						 | 
					@ -27,6 +37,7 @@ control MyIngress(inout headers hdr,
 | 
				
			||||||
    table v6_addresses {
 | 
					    table v6_addresses {
 | 
				
			||||||
        key = {
 | 
					        key = {
 | 
				
			||||||
            hdr.ipv6.dst_addr: exact;
 | 
					            hdr.ipv6.dst_addr: exact;
 | 
				
			||||||
 | 
					//            hdr.ipv6.next_header: exact;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        actions = {
 | 
					        actions = {
 | 
				
			||||||
			icmp6_answer;
 | 
								icmp6_answer;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue