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
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)
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
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