blob: 071ce70899c6f3aaf0f6dad5041cf58ca6b4e1b1 [file] [log] [blame]
Garrick Evans47c19272019-11-21 10:58:21 +09001// Copyright 2019 The Chromium OS 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
Garrick Evans3388a032020-03-24 11:25:55 +09005#ifndef PATCHPANEL_CROSTINI_SERVICE_H_
6#define PATCHPANEL_CROSTINI_SERVICE_H_
Garrick Evans47c19272019-11-21 10:58:21 +09007
Garrick Evansb1c93712020-01-22 09:28:25 +09008#include <map>
9#include <memory>
Garrick Evans47c19272019-11-21 10:58:21 +090010#include <string>
11
12#include <base/memory/weak_ptr.h>
13
Garrick Evans3388a032020-03-24 11:25:55 +090014#include "patchpanel/address_manager.h"
15#include "patchpanel/datapath.h"
16#include "patchpanel/device.h"
17#include "patchpanel/shill_client.h"
18#include "patchpanel/traffic_forwarder.h"
Garrick Evans47c19272019-11-21 10:58:21 +090019
Garrick Evans3388a032020-03-24 11:25:55 +090020namespace patchpanel {
Garrick Evans47c19272019-11-21 10:58:21 +090021
Garrick Evansb1c93712020-01-22 09:28:25 +090022// Crostini networking service handling address allocation and TAP device
Garrick Evans51d5b552020-01-30 10:42:06 +090023// management for Crostini VMs.
Garrick Evansf29f5a32019-12-06 11:34:25 +090024class CrostiniService {
Garrick Evans47c19272019-11-21 10:58:21 +090025 public:
Garrick Evans69b85872020-02-04 11:40:26 +090026 // All pointers are required and must not be null, and are owned by the
27 // caller.
28 CrostiniService(ShillClient* shill_client,
Garrick Evans1b1f67c2020-02-04 16:21:25 +090029 AddressManager* addr_mgr,
30 Datapath* datapath,
31 TrafficForwarder* forwarder);
Qijiang Fan6bc59e12020-11-11 02:51:06 +090032 CrostiniService(const CrostiniService&) = delete;
33 CrostiniService& operator=(const CrostiniService&) = delete;
34
Garrick Evansc1ac5c42020-03-31 15:31:22 +090035 ~CrostiniService();
Garrick Evans47c19272019-11-21 10:58:21 +090036
Garrick Evans51d5b552020-01-30 10:42:06 +090037 bool Start(uint64_t vm_id, bool is_termina, int subnet_index);
38 void Stop(uint64_t vm_id, bool is_termina);
Garrick Evans47c19272019-11-21 10:58:21 +090039
Garrick Evans51d5b552020-01-30 10:42:06 +090040 const Device* const TAP(uint64_t vm_id, bool is_termina) const;
Garrick Evans47c19272019-11-21 10:58:21 +090041
42 private:
Garrick Evans51d5b552020-01-30 10:42:06 +090043 std::unique_ptr<Device> AddTAP(bool is_termina, int subnet_index);
Hugo Benichi78148a02020-10-30 18:37:00 +090044 void OnDefaultDeviceChanged(const ShillClient::Device& new_device,
45 const ShillClient::Device& prev_device);
Garrick Evans1b1f67c2020-02-04 16:21:25 +090046 void StartForwarding(const std::string& phys_ifname,
Jason Jeremy Iman0e9f8262020-03-06 14:50:49 +090047 const std::string& virt_ifname);
Garrick Evans1b1f67c2020-02-04 16:21:25 +090048 void StopForwarding(const std::string& phys_ifname,
49 const std::string& virt_ifname);
Garrick Evansb1c93712020-01-22 09:28:25 +090050
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000051 // Checks ADB sideloading status and set it to |adb_sideloading_enabled_|.
52 // This function will call itself again if ADB sideloading status is not
53 // known yet. Otherwise, it will process all currently running Crostini VMs.
54 void CheckAdbSideloadingStatus();
55
56 // Start and stop ADB traffic forwarding from Crostini's TAP device
Garrick Evans3388a032020-03-24 11:25:55 +090057 // patchpanel's adb-proxy. |ifname| is the Crostini's TAP interface that
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000058 // will be forwarded. These methods call permission broker DBUS APIs to port
59 // forward and accept traffic.
60 void StartAdbPortForwarding(const std::string& ifname);
61 void StopAdbPortForwarding(const std::string& ifname);
62
Garrick Evans69b85872020-02-04 11:40:26 +090063 ShillClient* shill_client_;
Garrick Evans1b1f67c2020-02-04 16:21:25 +090064 AddressManager* addr_mgr_;
Garrick Evans47c19272019-11-21 10:58:21 +090065 Datapath* datapath_;
Garrick Evans1b1f67c2020-02-04 16:21:25 +090066 TrafficForwarder* forwarder_;
67
Garrick Evans51d5b552020-01-30 10:42:06 +090068 // Mapping of VM IDs to TAP devices
69 std::map<std::string, std::unique_ptr<Device>> taps_;
Garrick Evans47c19272019-11-21 10:58:21 +090070
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000071 bool adb_sideloading_enabled_;
72 scoped_refptr<dbus::Bus> bus_;
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000073
Garrick Evans47c19272019-11-21 10:58:21 +090074 base::WeakPtrFactory<CrostiniService> weak_factory_{this};
Garrick Evans47c19272019-11-21 10:58:21 +090075};
76
Garrick Evans3388a032020-03-24 11:25:55 +090077} // namespace patchpanel
Garrick Evans47c19272019-11-21 10:58:21 +090078
Garrick Evans3388a032020-03-24 11:25:55 +090079#endif // PATCHPANEL_CROSTINI_SERVICE_H_