blob: d10eafca9d2b8b64f85a39efebd3359962e58301 [file] [log] [blame]
Garrick Evans08843932019-09-17 14:41:08 +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_CLIENT_H_
6#define PATCHPANEL_CLIENT_H_
Garrick Evans08843932019-09-17 14:41:08 +09007
8#include <memory>
Jason Jeremy Iman6f1f3e72020-07-06 13:04:03 +09009#include <string>
Garrick Evans08843932019-09-17 14:41:08 +090010#include <utility>
11#include <vector>
12
Hugo Benichicc6850f2020-01-17 13:26:06 +090013#include "base/files/scoped_file.h"
Garrick Evans08843932019-09-17 14:41:08 +090014#include <brillo/brillo_export.h>
15#include <dbus/bus.h>
16#include <dbus/object_proxy.h>
Hugo Benichi8135e562019-12-12 15:56:36 +090017#include <patchpanel/proto_bindings/patchpanel_service.pb.h>
Garrick Evans08843932019-09-17 14:41:08 +090018
19namespace patchpanel {
20
Hugo Benichi51ff71b2020-08-19 00:55:15 +090021// Simple wrapper around patchpanel DBus API. All public functions are blocking
22// DBus calls to patchpaneld. The method names and protobuf schema used by
23// patchpanel DBus API are defined in platform2/system_api/dbus/patchpanel.
24// Access control for clients is defined in platform2/patchpanel/dbus.
Garrick Evans08843932019-09-17 14:41:08 +090025class BRILLO_EXPORT Client {
26 public:
27 static std::unique_ptr<Client> New();
28
Garrick Evans93a83fc2020-03-31 15:16:55 +090029 Client(const scoped_refptr<dbus::Bus>& bus, dbus::ObjectProxy* proxy)
Garrick Evans08843932019-09-17 14:41:08 +090030 : bus_(std::move(bus)), proxy_(proxy) {}
Garrick Evans93a83fc2020-03-31 15:16:55 +090031 ~Client();
Garrick Evans08843932019-09-17 14:41:08 +090032
33 bool NotifyArcStartup(pid_t pid);
Garrick Evansca2b41b2019-12-02 09:06:11 +090034 bool NotifyArcShutdown();
Garrick Evans27b74032019-11-19 13:33:47 +090035
Garrick Evans3388a032020-03-24 11:25:55 +090036 std::vector<NetworkDevice> NotifyArcVmStartup(uint32_t cid);
Garrick Evans0a189372020-02-07 08:55:27 +090037 bool NotifyArcVmShutdown(uint32_t cid);
Garrick Evans08843932019-09-17 14:41:08 +090038
Garrick Evans0a189372020-02-07 08:55:27 +090039 bool NotifyTerminaVmStartup(uint32_t cid,
Garrick Evans3388a032020-03-24 11:25:55 +090040 NetworkDevice* device,
41 IPv4Subnet* container_subnet);
Garrick Evans0a189372020-02-07 08:55:27 +090042 bool NotifyTerminaVmShutdown(uint32_t cid);
Garrick Evans27b74032019-11-19 13:33:47 +090043
Garrick Evans376f0672020-01-07 15:31:50 +090044 bool NotifyPluginVmStartup(uint64_t vm_id,
45 int subnet_index,
Garrick Evans3388a032020-03-24 11:25:55 +090046 NetworkDevice* device);
Garrick Evans376f0672020-01-07 15:31:50 +090047 bool NotifyPluginVmShutdown(uint64_t vm_id);
48
Hugo Benichi7d9d8db2020-03-30 15:56:56 +090049 // Reset the VPN routing intent mark on a socket to the default policy for
50 // the current uid. This is in general incorrect to call this method for
51 // a socket that is already connected.
52 bool DefaultVpnRouting(int socket);
53
54 // Mark a socket to be always routed through a VPN if there is one.
55 // Must be called before the socket is connected.
56 bool RouteOnVpn(int socket);
57
58 // Mark a socket to be always routed through the physical network.
59 // Must be called before the socket is connected.
60 bool BypassVpn(int socket);
61
Hugo Benichicc6850f2020-01-17 13:26:06 +090062 // Sends a ConnectNamespaceRequest for the given namespace pid. Returns a
63 // pair with a valid ScopedFD and the ConnectNamespaceResponse proto message
64 // received if the request succeeded. Closing the ScopedFD will teardown the
65 // veth and routing setup and free the allocated IPv4 subnet.
66 std::pair<base::ScopedFD, patchpanel::ConnectNamespaceResponse>
67 ConnectNamespace(pid_t pid,
68 const std::string& outbound_ifname,
69 bool forward_user_traffic);
70
Jie Jiange02d1202020-07-27 16:57:04 +090071 // Gets the traffic counters kept by patchpanel. |devices| is the set of
72 // interfaces (shill devices) for which counters should be returned, any
73 // unknown interfaces will be ignored. If |devices| is empty, counters for all
74 // known interfaces will be returned.
75 std::vector<TrafficCounter> GetTrafficCounters(
76 const std::set<std::string>& devices);
77
Jason Jeremy Iman6f1f3e72020-07-06 13:04:03 +090078 // Sends a ModifyPortRuleRequest to modify iptables ingress rules.
79 // This should only be called by permission_broker's 'devbroker'.
80 bool ModifyPortRule(patchpanel::ModifyPortRuleRequest::Operation op,
81 patchpanel::ModifyPortRuleRequest::RuleType type,
82 patchpanel::ModifyPortRuleRequest::Protocol proto,
83 const std::string& input_ifname,
84 const std::string& input_dst_ip,
85 uint32_t input_dst_port,
86 const std::string& dst_ip,
87 uint32_t dst_port);
88
Garrick Evans08843932019-09-17 14:41:08 +090089 private:
90 scoped_refptr<dbus::Bus> bus_;
91 dbus::ObjectProxy* proxy_ = nullptr; // owned by bus_
92
Hugo Benichi7d9d8db2020-03-30 15:56:56 +090093 bool SendSetVpnIntentRequest(int socket,
94 SetVpnIntentRequest::VpnRoutingPolicy policy);
95
Garrick Evans08843932019-09-17 14:41:08 +090096 DISALLOW_COPY_AND_ASSIGN(Client);
97};
98
99} // namespace patchpanel
100
Garrick Evans3388a032020-03-24 11:25:55 +0900101#endif // PATCHPANEL_CLIENT_H_