# File lib/vagrant-libvirt/action/create_networks.rb, line 29
        def call(env)
          if env[:machine].provider_config.qemu_use_session
            @app.call(env)
            return
          end

          # only one vm at a time should try to set up networks
          # otherwise they'll have inconsitent views of current state
          # and conduct redundant operations that cause errors
          @@lock.synchronize do
            # Iterate over networks If some network is not
            # available, create it if possible. Otherwise raise an error.
            configured_networks(env, @logger).each do |options|
              # Only need to create private networks
              next if options[:iface_type] != :private_network ||
                      options.fetch(:tunnel_type, nil)
              @logger.debug "Searching for network with options #{options}"

              # should fix other methods so this doesn't have to be instance var
              @options = options

              # Get a list of all (active and inactive) libvirt networks. This
              # list is used throughout this class and should be easier to
              # process than libvirt API calls.
              @available_networks = libvirt_networks(
                env[:machine].provider.driver.connection.client
              )

              # Prepare a hash describing network for this specific interface.
              @interface_network = {
                name:             nil,
                ip_address:       nil,
                netmask:          @options[:netmask],
                network_address:  nil,
                bridge_name:      nil,
                domain_name:      nil,
                ipv6_address:     options[:ipv6_address] || nil,
                ipv6_prefix:      options[:ipv6_prefix] || nil,
                created:          false,
                active:           false,
                autostart:        options[:autostart] || false,
                guest_ipv6:       @options[:guest_ipv6] || 'yes',
                libvirt_network:  nil
              }

              if @options[:ip]
                handle_ip_option(env)
              elsif @options[:type].to_s == 'dhcp'
                handle_dhcp_private_network(env)
              elsif @options[:network_name]
                handle_network_name_option(env)
              else
                raise Errors::CreateNetworkError, error_message: @options
              end

              autostart_network if @interface_network[:autostart]
              activate_network unless @interface_network[:active]
            end
          end

          @app.call(env)
        end