blob: 17862c1ab1a1690c5e8cdddf8ecd57c4f2685af9 [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);
Garrick Evansc1ac5c42020-03-31 15:31:22 +090032 ~CrostiniService();
Garrick Evans47c19272019-11-21 10:58:21 +090033
Garrick Evans51d5b552020-01-30 10:42:06 +090034 bool Start(uint64_t vm_id, bool is_termina, int subnet_index);
35 void Stop(uint64_t vm_id, bool is_termina);
Garrick Evans47c19272019-11-21 10:58:21 +090036
Garrick Evans51d5b552020-01-30 10:42:06 +090037 const Device* const TAP(uint64_t vm_id, bool is_termina) const;
Garrick Evans47c19272019-11-21 10:58:21 +090038
39 private:
Garrick Evans51d5b552020-01-30 10:42:06 +090040 std::unique_ptr<Device> AddTAP(bool is_termina, int subnet_index);
Garrick Evans1b1f67c2020-02-04 16:21:25 +090041 void OnDefaultInterfaceChanged(const std::string& new_ifname,
42 const std::string& prev_ifname);
43 void StartForwarding(const std::string& phys_ifname,
Jason Jeremy Iman0e9f8262020-03-06 14:50:49 +090044 const std::string& virt_ifname);
Garrick Evans1b1f67c2020-02-04 16:21:25 +090045 void StopForwarding(const std::string& phys_ifname,
46 const std::string& virt_ifname);
Garrick Evansb1c93712020-01-22 09:28:25 +090047
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000048 // Checks ADB sideloading status and set it to |adb_sideloading_enabled_|.
49 // This function will call itself again if ADB sideloading status is not
50 // known yet. Otherwise, it will process all currently running Crostini VMs.
51 void CheckAdbSideloadingStatus();
52
53 // Start and stop ADB traffic forwarding from Crostini's TAP device
Garrick Evans3388a032020-03-24 11:25:55 +090054 // patchpanel's adb-proxy. |ifname| is the Crostini's TAP interface that
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000055 // will be forwarded. These methods call permission broker DBUS APIs to port
56 // forward and accept traffic.
57 void StartAdbPortForwarding(const std::string& ifname);
58 void StopAdbPortForwarding(const std::string& ifname);
59
Garrick Evans69b85872020-02-04 11:40:26 +090060 ShillClient* shill_client_;
Garrick Evans1b1f67c2020-02-04 16:21:25 +090061 AddressManager* addr_mgr_;
Garrick Evans47c19272019-11-21 10:58:21 +090062 Datapath* datapath_;
Garrick Evans1b1f67c2020-02-04 16:21:25 +090063 TrafficForwarder* forwarder_;
64
Garrick Evans51d5b552020-01-30 10:42:06 +090065 // Mapping of VM IDs to TAP devices
66 std::map<std::string, std::unique_ptr<Device>> taps_;
Garrick Evans47c19272019-11-21 10:58:21 +090067
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000068 bool adb_sideloading_enabled_;
69 scoped_refptr<dbus::Bus> bus_;
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000070
Garrick Evans47c19272019-11-21 10:58:21 +090071 base::WeakPtrFactory<CrostiniService> weak_factory_{this};
72 DISALLOW_COPY_AND_ASSIGN(CrostiniService);
73};
74
Garrick Evans3388a032020-03-24 11:25:55 +090075} // namespace patchpanel
Garrick Evans47c19272019-11-21 10:58:21 +090076
Garrick Evans3388a032020-03-24 11:25:55 +090077#endif // PATCHPANEL_CROSTINI_SERVICE_H_