Beispiel #1
0
    def test204(self, debug=1):

        program = """
layout T1_def { fields { type: 8 ; }  }
layout T2_def { fields { type: 8 ; }  }

T1_def T1;
T2_def T2;

parser start  { extract ( T1 ) ; extract ( T2 ) ; 
                return P4_PARSING_DONE ; }

control ingress { 
    apply_table( table1 );
}

table table1 { 
    reads { T1.type : exact ; }
    actions { add_to_field next_table table2; } 
}

table table2 { 
    reads { T2.type : exact; }
    actions { add_to_field; } 
}

"""
        #                
        setup_cmds  = [  
                         'table1.add_entry( any, [5], add_to_field( T1.type, 5)  )',
                         'table2.add_entry( any, [6], add_to_field( T2.type, 22) )'
                      ] 

        exp_bytes_used = 2
        pkts = [ [ i+5 for i in range(exp_bytes_used) ] ]

        try:

            (p4, err, num_bytes_used ) = setup_tables_parse_and_run_test(
                    program, 
                    setup_cmds,              # List of Runtime cmds
                    pkts,                    # List of packets
                    init_state='start',      # parser
                    init_ctrl='ingress',     # control program start
                    debug=debug)

            self.assert_( err=='', 'Saw err:' + str(err) )
            self.assert_( num_bytes_used == exp_bytes_used, 
                      'Expected %d bytes consumed, Saw %d.' % (exp_bytes_used, num_bytes_used ))
            self.check_field( p4, 'T1.type', 0xa) 
            self.check_field( p4, 'T2.type', 28) 

        except GP4.GP4_Exceptions.RuntimeError as err:
            print "Unexpected Runtime Error:",err.data
            self.assert_(False)
        except GP4.GP4_Exceptions.InternalError as err:
            print "Unexpected Internal Error:",err.data
            self.assert_(False)
        except GP4.GP4_Exceptions.SyntaxError as ex_err:
            print "Unexpected SyntaxError:", ex_err.data
Beispiel #2
0
    def test201(self, debug=1):

        program = """
layout L3_def { fields { stuff : 32; }  }

L3_def L3_hdr[3];
L3_def L3_simple;

parser start  { extract ( L3_hdr[next] ); 
                return P4_PARSING_DONE ; }

control ingress { 
    apply_table( my_table );
}

table my_table { 
    reads { L3_hdr[0].stuff : exact ; 
            L3_hdr[0].stuff mask 0xff : ternary ; 
            L3_simple.stuff mask 0xff : lpm ; 
    }
    actions { add_to_field ; }
    min_size 1;
}


"""
        setup_cmds  = ['my_table.set_default_action( add_to_field ( L3_hdr[0].stuff, -1 ))'] 

        exp_bytes_used = 4
        pkts = [[ i for i in range(exp_bytes_used)]]

        try:

            (p4, err, num_bytes_used ) = setup_tables_parse_and_run_test(
                    program, 
                    setup_cmds,              # List of Runtime cmds
                    pkts,                    # List of packets
                    init_state='start',      # parser
                    init_ctrl='ingress',     # control program start
                    debug=debug)

            self.assert_( err=='', 'Saw parse runtime err:' + str(err) )
            self.assert_( num_bytes_used == exp_bytes_used, 
                      'Expected %d bytes consumed, Saw %d.' % (exp_bytes_used, num_bytes_used ))
            self.check_field( p4, 'L3_hdr[0].stuff', 0x10202)
            self.check_table( p4, 'my_table', min_size=1)

        except GP4.GP4_Exceptions.RuntimeError as err:
            print "Unexpected Runtime Error:",err.data
            self.assert_(False)
        except GP4.GP4_Exceptions.InternalError as err:
            print "Unexpected Internal Error:",err.data
            self.assert_(False)
Beispiel #3
0
    def test203(self, debug=1):

        program = """
layout Hop_count_def { fields { type: 8 ; count : 32; }  }

Hop_count_def  hop_count_hdr;

parser start  { extract ( hop_count_hdr ) ; 
                return P4_PARSING_DONE ; }

control ingress { 
    apply_table( my_table );
}

table my_table { 
    reads { hop_count_hdr.type : exact ; }
    actions { add_to_field ; } 
}

"""
        #                                     tuple( match, action ) 
        setup_cmds  = [  'my_table.set_default_action( add_to_field ( hop_count_hdr.count, 1 ))' ,
                         'my_table.add_entry( any, [5], add_to_field ( hop_count_hdr.count, hop_count_hdr.type ) )'
                      ] 

        exp_bytes_used = 5
        pkts = [ [ i+5 for i in range(exp_bytes_used) ] ]

        try:

            (p4, err, num_bytes_used ) = setup_tables_parse_and_run_test(
                    program, 
                    setup_cmds,              # List of Runtime cmds
                    pkts,                    # List of packets
                    init_state='start',      # parser
                    init_ctrl='ingress',     # control program start
                    debug=debug)

            self.assert_( err=='', 'Saw err:' + str(err) )
            self.assert_( num_bytes_used == exp_bytes_used, 
                      'Expected %d bytes consumed, Saw %d.' % (exp_bytes_used, num_bytes_used ))
            self.check_field( p4, 'hop_count_hdr.type', 0x5) 
            self.check_field( p4, 'hop_count_hdr.count', 0x607080e)

        except GP4.GP4_Exceptions.RuntimeError as err:
            print "Unexpected Runtime Error:",err.data
            self.assert_(False)
        except GP4.GP4_Exceptions.InternalError as err:
            print "Unexpected Internal Error:",err.data
            self.assert_(False)
        except GP4.GP4_Exceptions.SyntaxError as ex_err:
            print "Unexpected SyntaxError:", ex_err.data
Beispiel #4
0
    def test202(self, debug=1):

        program = """
layout Hop_count_def { fields { count : 32; }  }

Hop_count_def  hop_count_hdr[2];

parser start  { extract ( hop_count_hdr[next] ) ; 
                extract ( hop_count_hdr[next] ) ; 
                return P4_PARSING_DONE ; }

control ingress { 
    apply_table( my_table );
}

table my_table { 
    actions { add_to_field ; } 
}

"""

        setup_cmds  = ['my_table.set_default_action( add_to_field ( hop_count_hdr[0].count, hop_count_hdr[1].count ))'] 

        exp_bytes_used = 8
        pkts = [ [ i for i in range(exp_bytes_used) ] ]

        try:

            (p4, err, num_bytes_used ) = setup_tables_parse_and_run_test(
                    program, 
                    setup_cmds,              # List of Runtime cmds
                    pkts,                    # List of packets
                    init_state='start',      # parser
                    init_ctrl='ingress',     # control program start
                    debug=debug)

            self.assert_( err=='', 'Saw err:' + str(err) )
            self.assert_( num_bytes_used == exp_bytes_used, 
                      'Expected %d bytes consumed, Saw %d.' % (exp_bytes_used, num_bytes_used ))
            self.check_field( p4, 'hop_count_hdr[0].count', 0x406080a) # 0x10203 + 0x4050607
            self.check_field( p4, 'hop_count_hdr[1].count', 0x4050607)

        except GP4.GP4_Exceptions.RuntimeError as err:
            print "Unexpected Runtime Error:",err.data
            self.assert_(False)
        except GP4.GP4_Exceptions.InternalError as err:
            print "Unexpected Internal Error:",err.data
            self.assert_(False)
        except GP4.GP4_Exceptions.SyntaxError as ex_err:
            print "Unexpected SyntaxError:", ex_err.data