def create_layer(self, params):
     address = isotp.Address(isotp.AddressingMode.Normal_11bits,
                             txid=self.TXID,
                             rxid=self.RXID)
     return isotp.TransportLayer(txfn=self.stack_txfn,
                                 rxfn=self.stack_rxfn,
                                 address=address,
                                 params=params)
Example #2
0
	def setUp(self):
		params = {
			'stmin' : 1,
			'blocksize' : 8,
			'squash_stmin_requirement' : False,
			'rx_flowcontrol_timeout'  : 1000,
			'rx_consecutive_frame_timeout' : 1000,
			'wftmax' : 0
		}
		address = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=self.TXID, rxid=self.RXID)
		self.stack = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address, error_handler = self.error_handler, params = params)
		self.error_triggered = {}

		self.init_test_case()
Example #3
0
    def test_single_frame_only_function_tatype(self):
        tatype = isotp.TargetAddressType.Functional

        address = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=1, rxid=2)
        layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address)
        layer.send(self.make_payload(7), tatype)
        with self.assertRaises(ValueError):
            layer.send(self.make_payload(8), tatype)

        address = isotp.Address(isotp.AddressingMode.Normal_29bits, txid=1, rxid=2)
        layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address)
        layer.send(self.make_payload(7), tatype)
        with self.assertRaises(ValueError):
            layer.send(self.make_payload(8), tatype)

        address = isotp.Address(isotp.AddressingMode.NormalFixed_29bits, source_address=1, target_address=2)
        layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address)
        layer.send(self.make_payload(7), tatype)
        with self.assertRaises(ValueError):
            layer.send(self.make_payload(8), tatype)

        address = isotp.Address(isotp.AddressingMode.Extended_11bits, txid=1, rxid=2, target_address=3)
        layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address)
        layer.send(self.make_payload(6), tatype)
        with self.assertRaises(ValueError):
            layer.send(self.make_payload(7), tatype)

        address = isotp.Address(isotp.AddressingMode.Extended_29bits, txid=1, rxid=2, target_address=3)
        layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address)
        layer.send(self.make_payload(6), tatype)
        with self.assertRaises(ValueError):
            layer.send(self.make_payload(7), tatype)

        address = isotp.Address(isotp.AddressingMode.Mixed_11bits, txid=1, rxid=2, address_extension=3)
        layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address)
        layer.send(self.make_payload(6), tatype)
        with self.assertRaises(ValueError):
            layer.send(self.make_payload(7), tatype)

        address = isotp.Address(isotp.AddressingMode.Mixed_29bits, source_address=1, target_address=2, address_extension=3)
        layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address)
        layer.send(self.make_payload(6), tatype)
        with self.assertRaises(ValueError):
            layer.send(self.make_payload(7), tatype)
    def test_11bits_mixed_through_layer(self):
        functional = isotp.TargetAddressType.Functional
        physical = isotp.TargetAddressType.Physical
        txid = 0x123
        rxid = 0x456
        ae = 0x99

        address = isotp.Address(isotp.AddressingMode.Mixed_11bits,
                                txid=txid,
                                rxid=rxid,
                                address_extension=ae)
        layer = isotp.TransportLayer(txfn=self.stack_txfn,
                                     rxfn=self.stack_rxfn,
                                     address=address,
                                     params={
                                         'stmin': 0,
                                         'blocksize': 0
                                     })

        # Receive Single frame - Physical / Functional
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray([ae, 0x03, 0x01, 0x02, 0x03]),
                    extended_id=False))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03')

        # Receive multiframe - Physical
        layer.reset()
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray(
                        [ae, 0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05]),
                    extended_id=False))
        layer.process()
        self.assert_sent_flow_control(prefix=[ae], stmin=0, blocksize=0)
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray([ae, 0x21, 0x06, 0x07, 0x08]),
                    extended_id=False))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08')

        #Transmit single frame - Physical
        layer.reset()
        layer.send(b'\x04\x05\x06', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([ae, 0x03, 0x04, 0x05, 0x06]))
        self.assertFalse(msg.is_extended_id)

        #Transmit single frame - Functional
        layer.reset()
        layer.send(b'\x04\x05\x06', functional)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([ae, 0x03, 0x04, 0x05, 0x06]))
        self.assertFalse(msg.is_extended_id)

        # Transmit multiframe - Physical
        layer.reset()
        layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(
            msg.data, bytearray([ae, 0x10, 0x08, 0x04, 0x05, 0x06, 0x07,
                                 0x08]))
        self.assertFalse(msg.is_extended_id)

        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=self.make_flow_control_data(flow_status=0,
                                                     stmin=0,
                                                     blocksize=0,
                                                     prefix=[ae]),
                    extended_id=False))
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([ae, 0x21, 0x09, 0x0A, 0x0B]))
        self.assertFalse(msg.is_extended_id)
    def test_11bits_extended_through_layer(self):
        functional = isotp.TargetAddressType.Functional
        physical = isotp.TargetAddressType.Physical
        txid = 0x123
        rxid = 0x456
        sa = 0x55
        ta = 0xAA

        address = isotp.Address(isotp.AddressingMode.Extended_11bits,
                                txid=txid,
                                rxid=rxid,
                                source_address=sa,
                                target_address=ta)
        layer = isotp.TransportLayer(txfn=self.stack_txfn,
                                     rxfn=self.stack_rxfn,
                                     address=address,
                                     params={
                                         'stmin': 0,
                                         'blocksize': 0
                                     })

        # Receive Single frame - Physical / Functional
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray([sa, 0x03, 0x01, 0x02, 0x03]),
                    extended_id=False))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03')

        # Receive multiframe - Physical
        layer.reset()
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray(
                        [sa, 0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05]),
                    extended_id=False))
        layer.process()
        self.assert_sent_flow_control(prefix=[ta], stmin=0, blocksize=0)
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray([sa, 0x21, 0x06, 0x07, 0x08]),
                    extended_id=False))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08')

        #Transmit single frame - Physical
        layer.reset()
        layer.send(b'\x04\x05\x06', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([ta, 0x03, 0x04, 0x05, 0x06]))
        self.assertFalse(msg.is_extended_id)

        #Transmit single frame - Functional
        layer.reset()
        layer.send(b'\x04\x05\x06', functional)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([ta, 0x03, 0x04, 0x05, 0x06]))
        self.assertFalse(msg.is_extended_id)

        #Transmit single frame - Functional; txdl=32
        layer.reset()
        layer.params.set('tx_data_length', 32)
        layer.send(b'\x55' * 29, functional)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([ta, 0x00, 29] + [0x55] * 29))
        self.assertFalse(msg.is_extended_id)

        #Transmit single frame - Functional; txdl=32
        with self.assertRaises(ValueError):
            layer.reset()
            layer.params.set('tx_data_length', 32)
            layer.send(b'\x55' * 30, functional)
        layer.params.set('tx_data_length', 8)

        # Transmit single frame with payload length 7 - Physical; txdl=16...64
        for tx_len in (12, 16, 20, 24, 32, 48, 64):
            layer.reset()
            layer.params.set("tx_data_length", tx_len)
            layer.send(b'\x55' * 7)
            layer.process()

            msg = self.get_tx_can_msg()
            self.assertIsNotNone(msg)
            self.assertEqual(msg.arbitration_id, txid)
            self.assertEqual(
                msg.data,
                bytearray([ta, 0x00, 0x07] + [0x55] * 7 + [0xCC] * 2))
            self.assertFalse(msg.is_extended_id)
        layer.params.set("tx_data_length", 8)

        # Transmit multiframe - Physical
        layer.reset()
        layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(
            msg.data, bytearray([ta, 0x10, 0x08, 0x04, 0x05, 0x06, 0x07,
                                 0x08]))
        self.assertFalse(msg.is_extended_id)

        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=self.make_flow_control_data(flow_status=0,
                                                     stmin=0,
                                                     blocksize=0,
                                                     prefix=[sa]),
                    extended_id=False))
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([ta, 0x21, 0x09, 0x0A, 0x0B]))
        self.assertFalse(msg.is_extended_id)
    def test_29bits_normal_fixed_through_layer(self):
        functional = isotp.TargetAddressType.Functional
        physical = isotp.TargetAddressType.Physical
        ta = 0x55
        sa = 0xAA
        rxid_physical = 0x18DAAA55
        rxid_functional = 0x18DBAA55
        txid_physical = 0x18DA55AA
        txid_functional = 0x18DB55AA

        address = isotp.Address(isotp.AddressingMode.NormalFixed_29bits,
                                target_address=ta,
                                source_address=sa)
        layer = isotp.TransportLayer(txfn=self.stack_txfn,
                                     rxfn=self.stack_rxfn,
                                     address=address,
                                     params={
                                         'stmin': 0,
                                         'blocksize': 0
                                     })

        # Receive Single frame - Physical
        self.simulate_rx_msg(
            Message(arbitration_id=rxid_physical,
                    data=bytearray([0x03, 0x01, 0x02, 0x03]),
                    extended_id=True))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03')

        # Receive Single frame - Functional
        layer.reset()
        self.simulate_rx_msg(
            Message(arbitration_id=rxid_functional,
                    data=bytearray([0x03, 0x01, 0x02, 0x03]),
                    extended_id=True))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03')

        # Receive multiframe - Physical
        layer.reset()
        self.simulate_rx_msg(
            Message(arbitration_id=rxid_physical,
                    data=bytearray(
                        [0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06]),
                    extended_id=True))
        layer.process()
        self.assert_sent_flow_control(stmin=0, blocksize=0)
        self.simulate_rx_msg(
            Message(arbitration_id=rxid_physical,
                    data=bytearray([0x21, 0x07, 0x08]),
                    extended_id=True))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08')

        #Transmit single frame - Physical
        layer.reset()
        layer.send(b'\x04\x05\x06', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid_physical)
        self.assertEqual(msg.data, bytearray([0x03, 0x04, 0x05, 0x06]))
        self.assertTrue(msg.is_extended_id)

        #Transmit single frame - Functional
        layer.reset()
        layer.send(b'\x04\x05\x06', functional)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid_functional)
        self.assertEqual(msg.data, bytearray([0x03, 0x04, 0x05, 0x06]))
        self.assertTrue(msg.is_extended_id)

        # Transmit multiframe - Physical
        layer.reset()
        layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid_physical)
        self.assertEqual(
            msg.data,
            bytearray([0x10, 0x08, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09]))
        self.assertTrue(msg.is_extended_id)

        self.simulate_rx_msg(
            Message(arbitration_id=rxid_physical,
                    data=self.make_flow_control_data(flow_status=0,
                                                     stmin=0,
                                                     blocksize=0),
                    extended_id=True))
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid_physical)
        self.assertEqual(msg.data, bytearray([0x21, 0x0A, 0x0B]))
        self.assertTrue(msg.is_extended_id)
    def test_11bits_normal_through_layer(self):
        functional = isotp.TargetAddressType.Functional
        physical = isotp.TargetAddressType.Physical
        rxid = 0x123
        txid = 0x456
        address = isotp.Address(isotp.AddressingMode.Normal_11bits,
                                txid=txid,
                                rxid=rxid)
        layer = isotp.TransportLayer(txfn=self.stack_txfn,
                                     rxfn=self.stack_rxfn,
                                     address=address,
                                     params={
                                         'stmin': 0,
                                         'blocksize': 0
                                     })

        # Receive Single frame - Physical
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray([0x03, 0x01, 0x02, 0x03]),
                    extended_id=False))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03')

        # Receive Single frame - Functional
        layer.reset()
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray([0x03, 0x01, 0x02, 0x03]),
                    extended_id=False))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03')

        # Receive multiframe - Physical
        layer.reset()
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray(
                        [0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06]),
                    extended_id=False))
        layer.process()
        self.assert_sent_flow_control(stmin=0, blocksize=0)
        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=bytearray([0x21, 0x07, 0x08]),
                    extended_id=False))
        layer.process()
        frame = layer.recv()
        self.assertIsNotNone(frame)
        self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08')

        #Transmit single frame - Physical / Functional
        layer.reset()
        layer.send(b'\x04\x05\x06', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([0x03, 0x04, 0x05, 0x06]))
        self.assertFalse(msg.is_extended_id)

        #Transmit single frame - Functional : tx_dl = 32
        layer.reset()
        layer.params.set('tx_data_length', 32)
        layer.send(b'\xAA' * 30, functional)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([0x00, 30] + [0xaa] * 30))
        self.assertFalse(msg.is_extended_id)

        with self.assertRaises(ValueError):
            layer.reset()
            layer.params.set('tx_data_length', 32)
            layer.send(b'\x04' * 31, functional)
        layer.params.set('tx_data_length', 8)

        # Transmit multiframe - Physical
        layer.reset()
        layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical)
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(
            msg.data,
            bytearray([0x10, 0x08, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09]))
        self.assertFalse(msg.is_extended_id)

        self.simulate_rx_msg(
            Message(arbitration_id=rxid,
                    data=self.make_flow_control_data(flow_status=0,
                                                     stmin=0,
                                                     blocksize=0),
                    extended_id=False))
        layer.process()
        msg = self.get_tx_can_msg()
        self.assertIsNotNone(msg)
        self.assertEqual(msg.arbitration_id, txid)
        self.assertEqual(msg.data, bytearray([0x21, 0x0A, 0x0B]))
        self.assertFalse(msg.is_extended_id)