nemora-postd: import from gBMC
This is the POST code portion of nemorad.
Signed-off-by: Nan Zhou <nanzhoumails@gmail.com>
Google-Bug-Id: 179618653
Change-Id: Icf68fe8adf62c646238cf8235918a13effa857f8
diff --git a/subprojects/nemora-postd/src/nemora.hpp b/subprojects/nemora-postd/src/nemora.hpp
new file mode 100644
index 0000000..fe5799e
--- /dev/null
+++ b/subprojects/nemora-postd/src/nemora.hpp
@@ -0,0 +1,92 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include "host_manager.hpp"
+#include "socket_manager.hpp"
+
+#include <cstdint>
+#include <mutex>
+#include <string>
+#include <thread>
+
+class Nemora
+{
+ public:
+ /**
+ * Constructs a Nemora object.
+ * - iface_name: The networking interface to use (eg. eth0)
+ * - ipv4: Target IPv4 address for UDP communication, i.e., POST streaming.
+ * - ipv6: Target IPv6 address for UDP communication, i.e., POST streaming.
+ */
+ Nemora(const std::string& iface_name, const in_addr ipv4,
+ const in6_addr ipv6);
+
+ /**
+ * Construct uninitialized Nemora object
+ */
+ Nemora();
+
+ /**
+ * Cancels polling threads and destructs Nemora object.
+ */
+ ~Nemora() = default;
+
+ /**
+ * Loops collecting the current state of event_data_ and sending via UDP.
+ */
+ void UdpPoll();
+
+ private:
+ /**
+ * Initialize event_data_ with default values.
+ * This is used by constructors.
+ */
+ void InitEventData();
+
+ /**
+ * Fetches MAC from host
+ * - mac: out-parameter for host mac address
+ * - iface_path: DBus path to network interface, typically
+ * IFACE_ROOT + iface_path_.
+ *
+ * - returns: true if address was populated correctly, false if error
+ */
+ bool GetMacAddr(MacAddr* mac, const std::string& iface_path);
+
+ /**
+ * Converts from string to struct
+ * - mac_addr: string of format MAC_FORMAT
+ * - mac: out-parameter with MAC from mac_addr populated. must be allocated
+ * by caller
+ *
+ * - returns: true if mac_addr was correct format, false otherwise
+ */
+ bool ParseMac(const std::string& mac_addr, MacAddr* mac);
+
+ /**
+ * Update event_data_ from host.
+ * - postcodes: list of postcodes polled.
+ * Forced to bind to temporary to avoid copying.
+ */
+ void UpdateEventData(std::vector<uint64_t>&& postcodes);
+
+ NemoraEvent event_data_ = {};
+ std::mutex event_data_mutex_;
+
+ SocketManager socketManager_;
+ HostManager hostManager_;
+ const std::string iface_path_;
+};