code: def begin_send(self, x):
          
          with self.tx_mutex:
              if self.tx_state != ISOTP_IDLE:
                  raise Scapy_Exception("Socket is already sending, retry later")
  
              self.tx_done.clear()
              self.tx_exception = None
              self.tx_state = ISOTP_SENDING
  
              length = len(x)
              if length > ISOTP_MAX_DLEN_2015:
                  raise Scapy_Exception("Too much data for ISOTP message")
  
              if len(self.ea_hdr) + length <= 7:
                  # send a single frame
                  data = self.ea_hdr
                  data += struct.pack("B", length)
                  data += x
                  self.tx_state = ISOTP_IDLE
                  self.can_send(data)
                  self.tx_done.set()
                  for cb in self.tx_callbacks:
                      cb()
                  return
  
              # send the first frame
              data = self.ea_hdr
              if length > ISOTP_MAX_DLEN:
                  data += struct.pack(">HI", 0x1000, length)
              else:
                  data += struct.pack(">H", 0x1000 | length)
              load = x[0:8 - len(data)]
              data += load
              self.can_send(data)
  
              self.tx_buf = x
              self.tx_sn = 1
              self.tx_bs = 0
              self.tx_idx = len(load)
  
              self.tx_state = ISOTP_WAIT_FIRST_FC
              self.tx_timer.set_timeout(self.fc_timeout, self._tx_timer_handler)
docs: Begins sending an ISOTP message. This method does not block.