Socket Class to encapsulate the socket operations.
The operations provided are reading the UDP packet, writing the packet.
Change-Id: I087dcbdf715213edf787c3053be76813ce8d9802
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
diff --git a/sock_channel.hpp b/sock_channel.hpp
new file mode 100644
index 0000000..e992564
--- /dev/null
+++ b/sock_channel.hpp
@@ -0,0 +1,116 @@
+#pragma once
+
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#include <string>
+#include <tuple>
+#include <vector>
+
+namespace udpsocket
+{
+
+using buffer = std::vector<uint8_t>;
+/** @class Channel
+ *
+ * @brief Provides encapsulation for UDP socket operations like Read, Peek,
+ * Write, Remote peer's IP Address and Port.
+ */
+class Channel
+{
+ public:
+ struct SockAddr_t
+ {
+ union
+ {
+ sockaddr sockAddr;
+ sockaddr_in inAddr;
+ };
+ size_t addrSize;
+ };
+
+ /**
+ * @brief Constructor
+ *
+ * Initialize the IPMI socket object with the socket descriptor
+ *
+ * @param [in] File Descriptor for the socket
+ * @param [in] Timeout parameter for the select call
+ *
+ * @return None
+ */
+ Channel(int insockfd, timeval& inTimeout)
+ {
+ sockfd = insockfd;
+ timeout = inTimeout;
+ }
+
+ /**
+ * @brief Fetch the IP address of the remote peer
+ *
+ * Returns the IP address of the remote peer which is connected to this
+ * socket
+ *
+ * @return IP address of the remote peer
+ */
+ std::string getRemoteAddress() const;
+
+ /**
+ * @brief Fetch the port number of the remote peer
+ *
+ * Returns the port number of the remote peer
+ *
+ * @return Port number
+ *
+ */
+ auto getPort() const
+ {
+ return address.inAddr.sin_port;
+ }
+
+ /**
+ * @brief Read the incoming packet
+ *
+ * Reads the data available on the socket
+ *
+ * @return A tuple with return code and vector with the buffer
+ * In case of success, the vector is populated with the data
+ * available on the socket and return code is 0.
+ * In case of error, the return code is < 0 and vector is set
+ * to size 0.
+ */
+ std::tuple<int, buffer> read();
+
+ /**
+ * @brief Write the outgoing packet
+ *
+ * Writes the data in the vector to the socket
+ *
+ * @param [in] inBuffer
+ * The vector would be the buffer of data to write to the socket.
+ *
+ * @return In case of success the return code is 0 and return code is
+ * < 0 in case of failure.
+ */
+ int write(buffer& inBuffer);
+
+ ~Channel() = default;
+ Channel(const Channel& right) = delete;
+ Channel& operator=(const Channel& right) = delete;
+ Channel(Channel&&) = default;
+ Channel& operator=(Channel&&) = default;
+
+ private:
+ /*
+ * The socket descriptor is the UDP server socket for the IPMI port.
+ * The same socket descriptor is used for multiple ipmi clients and the
+ * life of the descriptor is lifetime of the net-ipmid server. So we
+ * do not need to close the socket descriptor in the cleanup of the
+ * udpsocket class.
+ */
+ int sockfd;
+ SockAddr_t address;
+ timeval timeout;
+};
+
+} // namespace udpsocket