blob: 0051d812e99fb7f90da42f984367b184f7be5074 [file] [log] [blame]
Tim Detwiler566cf252018-04-12 12:20:19 -07001// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "garnet/bin/guest/mgr/guest_environment_impl.h"
6
7#include "lib/fxl/logging.h"
8
9namespace guestmgr {
10
Tim Detwiler566cf252018-04-12 12:20:19 -070011GuestEnvironmentImpl::GuestEnvironmentImpl(
Alhaad Gokhaledbcca202018-06-01 10:51:01 -070012 uint32_t id, const std::string& label,
13 fuchsia::sys::StartupContext* context,
Tim Detwilerdd15a812018-05-17 16:25:51 -070014 fidl::InterfaceRequest<fuchsia::guest::GuestEnvironment> request)
Tim Detwiler8c437da2018-05-08 23:11:34 -070015 : id_(id),
16 label_(label),
17 context_(context),
Tim Detwilerdd15a812018-05-17 16:25:51 -070018 host_socket_endpoint_(fuchsia::guest::kHostCid) {
Alhaad Gokhale34d9e9e2018-05-24 14:41:46 -070019 CreateEnvironment(label);
Tim Detwiler212fbf62018-05-05 13:19:52 -070020 AddBinding(std::move(request));
Tim Detwiler8c437da2018-05-08 23:11:34 -070021 FXL_CHECK(socket_server_.AddEndpoint(&host_socket_endpoint_) == ZX_OK);
Tim Detwiler566cf252018-04-12 12:20:19 -070022}
Tim Detwiler212fbf62018-05-05 13:19:52 -070023
Tim Detwiler566cf252018-04-12 12:20:19 -070024GuestEnvironmentImpl::~GuestEnvironmentImpl() = default;
25
Tim Detwiler212fbf62018-05-05 13:19:52 -070026void GuestEnvironmentImpl::AddBinding(
27 fidl::InterfaceRequest<GuestEnvironment> request) {
28 bindings_.AddBinding(this, std::move(request));
Tim Detwiler566cf252018-04-12 12:20:19 -070029}
30
Tim Detwiler2c4510a2018-05-16 11:05:56 -070031void GuestEnvironmentImpl::set_unbound_handler(std::function<void()> handler) {
32 bindings_.set_empty_set_handler(std::move(handler));
33}
34
Tim Detwiler566cf252018-04-12 12:20:19 -070035void GuestEnvironmentImpl::LaunchGuest(
Tim Detwilerdd15a812018-05-17 16:25:51 -070036 fuchsia::guest::GuestLaunchInfo launch_info,
37 fidl::InterfaceRequest<fuchsia::guest::GuestController> controller,
Tim Detwilerfa560b32018-05-03 19:32:51 -070038 LaunchGuestCallback callback) {
Ankur Mittalf36f68e2018-05-29 14:21:08 -070039 fuchsia::sys::Services guest_services;
40 fuchsia::sys::ComponentControllerPtr guest_component_controller;
41 fuchsia::sys::LaunchInfo guest_launch_info;
Tim Detwiler566cf252018-04-12 12:20:19 -070042 guest_launch_info.url = launch_info.url;
43 guest_launch_info.arguments = std::move(launch_info.vmm_args);
44 guest_launch_info.directory_request = guest_services.NewRequest();
45 guest_launch_info.flat_namespace = std::move(launch_info.flat_namespace);
Alhaad Gokhaledbcca202018-06-01 10:51:01 -070046 launcher_->CreateComponent(std::move(guest_launch_info),
47 guest_component_controller.NewRequest());
Tim Detwiler566cf252018-04-12 12:20:19 -070048
Tim Detwilerfa560b32018-05-03 19:32:51 -070049 // Setup Socket Endpoint
Tim Detwilerfa560b32018-05-03 19:32:51 -070050 uint32_t cid = next_guest_cid_++;
Tim Detwiler8c437da2018-05-08 23:11:34 -070051 auto vsock_endpoint = std::make_unique<RemoteVsockEndpoint>(cid);
52 zx_status_t status = socket_server_.AddEndpoint(vsock_endpoint.get());
Tim Detwilerfa560b32018-05-03 19:32:51 -070053 if (status != ZX_OK) {
54 FXL_LOG(ERROR) << "Failed to allocate socked endpoint on CID " << cid
55 << ": " << status;
Tim Detwilerdd15a812018-05-17 16:25:51 -070056 callback(fuchsia::guest::GuestInfo());
Tim Detwilerfa560b32018-05-03 19:32:51 -070057 return;
58 }
Tim Detwilerdd15a812018-05-17 16:25:51 -070059 fuchsia::guest::SocketEndpointPtr remote_endpoint;
Tim Detwilerfa560b32018-05-03 19:32:51 -070060 guest_services.ConnectToService(remote_endpoint.NewRequest());
61 vsock_endpoint->BindSocketEndpoint(std::move(remote_endpoint));
62
Alhaad Gokhale2165f892018-05-25 11:53:30 -070063 guest_component_controller.set_error_handler(
64 [this, cid] { guests_.erase(cid); });
Tim Detwiler566cf252018-04-12 12:20:19 -070065 auto& label = launch_info.label ? launch_info.label : launch_info.url;
Tim Detwilerfa560b32018-05-03 19:32:51 -070066 auto holder = std::make_unique<GuestHolder>(
67 cid, label, std::move(vsock_endpoint), std::move(guest_services),
Alhaad Gokhale2165f892018-05-25 11:53:30 -070068 std::move(guest_component_controller));
Tim Detwiler212fbf62018-05-05 13:19:52 -070069 holder->AddBinding(std::move(controller));
Tim Detwilerfa560b32018-05-03 19:32:51 -070070 guests_.insert({cid, std::move(holder)});
71
Tim Detwilerdd15a812018-05-17 16:25:51 -070072 fuchsia::guest::GuestInfo info;
Tim Detwilerfa560b32018-05-03 19:32:51 -070073 info.cid = cid;
74 info.label = label;
75 callback(std::move(info));
Tim Detwiler566cf252018-04-12 12:20:19 -070076}
77
Tim Detwiler8c437da2018-05-08 23:11:34 -070078void GuestEnvironmentImpl::GetHostSocketEndpoint(
Tim Detwilerdd15a812018-05-17 16:25:51 -070079 fidl::InterfaceRequest<fuchsia::guest::ManagedSocketEndpoint> request) {
Tim Detwiler8c437da2018-05-08 23:11:34 -070080 host_socket_endpoint_.AddBinding(std::move(request));
Tim Detwiler566cf252018-04-12 12:20:19 -070081}
82
Tim Detwilerdd15a812018-05-17 16:25:51 -070083fidl::VectorPtr<fuchsia::guest::GuestInfo> GuestEnvironmentImpl::ListGuests() {
84 fidl::VectorPtr<fuchsia::guest::GuestInfo> guest_infos =
85 fidl::VectorPtr<fuchsia::guest::GuestInfo>::New(0);
Tim Detwiler212fbf62018-05-05 13:19:52 -070086 for (const auto& it : guests_) {
Tim Detwilerdd15a812018-05-17 16:25:51 -070087 fuchsia::guest::GuestInfo guest_info;
Tim Detwilerfa560b32018-05-03 19:32:51 -070088 guest_info.cid = it.first;
Tim Detwiler212fbf62018-05-05 13:19:52 -070089 guest_info.label = it.second->label();
90 guest_infos.push_back(std::move(guest_info));
91 }
92 return guest_infos;
93}
94
95void GuestEnvironmentImpl::ListGuests(ListGuestsCallback callback) {
96 callback(ListGuests());
97}
98
99void GuestEnvironmentImpl::ConnectToGuest(
Tim Detwilerdd15a812018-05-17 16:25:51 -0700100 uint32_t id,
101 fidl::InterfaceRequest<fuchsia::guest::GuestController> request) {
Tim Detwiler212fbf62018-05-05 13:19:52 -0700102 const auto& it = guests_.find(id);
103 if (it == guests_.end()) {
104 return;
105 }
106 it->second->AddBinding(std::move(request));
107}
108
Alhaad Gokhale34d9e9e2018-05-24 14:41:46 -0700109void GuestEnvironmentImpl::CreateEnvironment(const std::string& label) {
Tim Detwiler566cf252018-04-12 12:20:19 -0700110 context_->environment()->CreateNestedEnvironment(
111 service_provider_bridge_.OpenAsDirectory(), env_.NewRequest(),
112 env_controller_.NewRequest(), label);
Alhaad Gokhaledbcca202018-06-01 10:51:01 -0700113 env_->GetLauncher(launcher_.NewRequest());
Tim Detwiler566cf252018-04-12 12:20:19 -0700114 zx::channel h1, h2;
115 if (zx::channel::create(0, &h1, &h2) < 0) {
116 return;
117 }
118 context_->environment()->GetDirectory(std::move(h1));
119 service_provider_bridge_.set_backing_dir(std::move(h2));
120}
121
122} // namespace guestmgr
OSZAR »