1*ded66d0fSJason Ling #pragma once
2*ded66d0fSJason Ling 
3*ded66d0fSJason Ling #include "data_handler.hpp"
4*ded66d0fSJason Ling 
5*ded66d0fSJason Ling #include <unistd.h>
6*ded66d0fSJason Ling 
7*ded66d0fSJason Ling #include <stdplus/handle/managed.hpp>
8*ded66d0fSJason Ling 
9*ded66d0fSJason Ling #include <cstdint>
10*ded66d0fSJason Ling #include <optional>
11*ded66d0fSJason Ling #include <vector>
12*ded66d0fSJason Ling 
13*ded66d0fSJason Ling namespace ipmi_flash
14*ded66d0fSJason Ling {
15*ded66d0fSJason Ling 
16*ded66d0fSJason Ling /**
17*ded66d0fSJason Ling  * Data Handler for receiving the image over a network port
18*ded66d0fSJason Ling  */
19*ded66d0fSJason Ling class NetDataHandler : public DataInterface
20*ded66d0fSJason Ling {
21*ded66d0fSJason Ling   public:
22*ded66d0fSJason Ling     NetDataHandler() : listenFd(std::nullopt), connFd(std::nullopt)
23*ded66d0fSJason Ling     {}
24*ded66d0fSJason Ling 
25*ded66d0fSJason Ling     bool open() override;
26*ded66d0fSJason Ling     bool close() override;
27*ded66d0fSJason Ling     std::vector<std::uint8_t> copyFrom(std::uint32_t length) override;
28*ded66d0fSJason Ling     bool writeMeta(const std::vector<std::uint8_t>& configuration) override;
29*ded66d0fSJason Ling     std::vector<std::uint8_t> readMeta() override;
30*ded66d0fSJason Ling 
31*ded66d0fSJason Ling     static constexpr std::uint16_t listenPort = 623;
32*ded66d0fSJason Ling     static constexpr int timeoutS = 5;
33*ded66d0fSJason Ling 
34*ded66d0fSJason Ling   private:
35*ded66d0fSJason Ling     static void closefd(int&& fd)
36*ded66d0fSJason Ling     {
37*ded66d0fSJason Ling         ::close(fd);
38*ded66d0fSJason Ling     }
39*ded66d0fSJason Ling     using Fd = stdplus::Managed<int>::Handle<closefd>;
40*ded66d0fSJason Ling 
41*ded66d0fSJason Ling     Fd listenFd;
42*ded66d0fSJason Ling     Fd connFd;
43*ded66d0fSJason Ling };
44*ded66d0fSJason Ling 
45*ded66d0fSJason Ling } // namespace ipmi_flash
46