REVERT-ME: power: Send upstart events for modem WDS status

This is a temporary hack for Modem SSR on trogdor and will be
removed once qc-netmgr is merged into the driver.
As per QC WDS is a better indicator of the health of modem.
During a modem crash, the node can still be up, but WDS service
will be offline. Here we make sure WDS and the Node are up before
sending a qrtr-service-added message. Similarly
qrtr-service-removed messages are sent when WDS service goes offline.
These messages are used to start/stop qc-netmgr.

BUG=b:159860147, b:172173518
TEST=cros deploy ${DUT} power_manager && reboot && diag-route && send_data 75
37 03 00 00

Change-Id: I7cd99cb5f8b6738bca10e9a1962bcb200d10be4d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2582515
Tested-by: Madhav . <madhavadas@google.com>
Commit-Queue: Madhav . <madhavadas@google.com>
Reviewed-by: Eric Caruso <ejcaruso@chromium.org>
Reviewed-by: Madhav . <madhavadas@google.com>
(cherry picked from commit c5195993feea7953b391f363b99c807679fa3708)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2634244
Reviewed-by: Pavan Holla <pholla@google.com>
Reviewed-by: Andrew Lassalle <andrewlassalle@chromium.org>
diff --git a/power_manager/BUILD.gn b/power_manager/BUILD.gn
index 7c7816c..be7264b 100644
--- a/power_manager/BUILD.gn
+++ b/power_manager/BUILD.gn
@@ -51,7 +51,18 @@
     ]
   }
   if (use.trogdor_sar_hack) {
-    deps += [ ":set_cellular_transmit_power_trogdor" ]
+    deps += [
+      ":set_cellular_transmit_power_trogdor",
+      ":upstart_proxies",
+    ]
+  }
+}
+
+if (use.trogdor_sar_hack) {
+  generate_dbus_proxies("upstart_proxies") {
+    upstart_in_dir = "${sysroot}/usr/share/dbus-1/interfaces/"
+    proxy_output_file = "include/upstart/dbus-proxies.h"
+    sources = [ "${upstart_in_dir}/com.ubuntu.Upstart.xml" ]
   }
 }
 
@@ -210,6 +221,8 @@
   ]
   if (use.trogdor_sar_hack) {
     sources += [ "powerd/policy/cellular_controller_trogdor.cc" ]
+
+    deps = [ ":upstart_proxies" ]
   }
   libs = [ "m" ]
 }
diff --git a/power_manager/dbus/org.chromium.PowerManager.conf b/power_manager/dbus/org.chromium.PowerManager.conf
index d7ab603..29e4701 100644
--- a/power_manager/dbus/org.chromium.PowerManager.conf
+++ b/power_manager/dbus/org.chromium.PowerManager.conf
@@ -8,6 +8,9 @@
 
   <policy user="power">
     <allow own="org.chromium.PowerManager" />
+    <allow send_destination="com.ubuntu.Upstart"
+           send_interface="com.ubuntu.Upstart0_6"
+           send_type="method_call" send_member="EmitEvent" />
   </policy>
 
   <limit name="max_replies_per_connection">512</limit>
diff --git a/power_manager/powerd/policy/cellular_controller_trogdor.cc b/power_manager/powerd/policy/cellular_controller_trogdor.cc
index de8323f..044c445 100644
--- a/power_manager/powerd/policy/cellular_controller_trogdor.cc
+++ b/power_manager/powerd/policy/cellular_controller_trogdor.cc
@@ -16,6 +16,11 @@
 #define TROGDOR_MODEM_NODE_ID (0x0)
 #define TROGDOR_WDS_SERVICE_ID (0x1)
 
+namespace {
+const char kUpstartServiceName[] = "com.ubuntu.Upstart";
+const char kNodeAddedEvent[] = "qrtr-service-added";
+const char kNodeRemovedEvent[] = "qrtr-service-removed";
+}  // namespace
 namespace power_manager {
 namespace policy {
 
@@ -50,6 +55,14 @@
     CHECK(InitQrtrSocket());
 }
 
+void CellularControllerTrogdor::EmitEvent(const char* event) {
+  brillo::ErrorPtr error;
+  LOG(INFO) << "In EmitEvent sending = " << event;
+  if (!upstart_proxy_->EmitEvent(event, {}, false /* wait */, &error)) {
+    LOG(ERROR) << "Could not emit upstart event: " << error->GetMessage();
+  }
+}
+
 void CellularControllerTrogdor::ProximitySensorDetected(UserProximity value) {
   if (set_transmit_power_for_proximity_) {
     if (set_transmit_power_for_tablet_mode_) {
@@ -179,6 +192,7 @@
               << " port = " << pkt.port << " service = " << pkt.service;
       if (pkt.node == TROGDOR_MODEM_NODE_ID &&
           pkt.service == TROGDOR_WDS_SERVICE_ID) {
+        EmitEvent(kNodeAddedEvent);
         HandleModemStateChange(ModemState::ONLINE);
       }
       break;
@@ -187,6 +201,7 @@
               << " port = " << pkt.port << " service = " << pkt.service;
       if (pkt.node == TROGDOR_MODEM_NODE_ID &&
           pkt.service == TROGDOR_WDS_SERVICE_ID) {
+        EmitEvent(kNodeRemovedEvent);
         HandleModemStateChange(ModemState::OFFLINE);
       }
       break;
@@ -242,6 +257,13 @@
 
 bool CellularControllerTrogdor::InitQrtrSocket() {
   uint8_t kQrtrPort = 0;
+  dbus::Bus::Options options;
+  options.bus_type = dbus::Bus::SYSTEM;
+  scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
+  CHECK(bus->Connect());
+  upstart_proxy_ =
+      std::make_unique<com::ubuntu::Upstart0_6Proxy>(bus, kUpstartServiceName);
+
   socket_.reset(qrtr_open(kQrtrPort));
   if (!socket_.is_valid()) {
     LOG(ERROR) << "Failed to open QRTR socket with port " << kQrtrPort;
diff --git a/power_manager/powerd/policy/cellular_controller_trogdor.h b/power_manager/powerd/policy/cellular_controller_trogdor.h
index cfef9ce..d34ffe5 100644
--- a/power_manager/powerd/policy/cellular_controller_trogdor.h
+++ b/power_manager/powerd/policy/cellular_controller_trogdor.h
@@ -12,6 +12,8 @@
 #include <base/macros.h>
 #include <base/files/file_descriptor_watcher_posix.h>
 #include <base/files/scoped_file.h>
+#include <brillo/daemons/dbus_daemon.h>
+#include <upstart/dbus-proxies.h>
 
 #include "power_manager/common/power_constants.h"
 #include "power_manager/powerd/policy/user_proximity_handler.h"
@@ -54,6 +56,7 @@
   // Called when the tablet mode changes.
   void HandleTabletModeChange(TabletMode mode);
   void HandleModemStateChange(ModemState state);
+  void EmitEvent(const char* event);
   // UserProximityHandler::Delegate overrides:
   void ProximitySensorDetected(UserProximity proximity) override;
   void HandleProximityChange(UserProximity proximity) override;
@@ -92,6 +95,7 @@
   base::ScopedFD socket_;
   std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_;
   std::vector<uint8_t> buffer_;
+  std::unique_ptr<com::ubuntu::Upstart0_6Proxy> upstart_proxy_;
 
   DISALLOW_COPY_AND_ASSIGN(CellularControllerTrogdor);
 };