xref: /aosp_15_r20/external/armnn/profiling/server/include/basePipeServer/BasePipeServer.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #pragma once
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <common/include/NetworkSockets.hpp>
9*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Packet.hpp>
10*89c4ff92SAndroid Build Coastguard Worker #include <common/include/SocketConnectionException.hpp>
11*89c4ff92SAndroid Build Coastguard Worker #include <common/include/TargetEndianess.hpp>
12*89c4ff92SAndroid Build Coastguard Worker 
13*89c4ff92SAndroid Build Coastguard Worker #include <string>
14*89c4ff92SAndroid Build Coastguard Worker #include <atomic>
15*89c4ff92SAndroid Build Coastguard Worker 
16*89c4ff92SAndroid Build Coastguard Worker namespace arm
17*89c4ff92SAndroid Build Coastguard Worker {
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker namespace pipe
20*89c4ff92SAndroid Build Coastguard Worker {
21*89c4ff92SAndroid Build Coastguard Worker 
22*89c4ff92SAndroid Build Coastguard Worker enum class PacketDirection
23*89c4ff92SAndroid Build Coastguard Worker {
24*89c4ff92SAndroid Build Coastguard Worker     Sending,
25*89c4ff92SAndroid Build Coastguard Worker     ReceivedHeader,
26*89c4ff92SAndroid Build Coastguard Worker     ReceivedData
27*89c4ff92SAndroid Build Coastguard Worker };
28*89c4ff92SAndroid Build Coastguard Worker class ConnectionHandler;
29*89c4ff92SAndroid Build Coastguard Worker 
30*89c4ff92SAndroid Build Coastguard Worker class BasePipeServer
31*89c4ff92SAndroid Build Coastguard Worker {
32*89c4ff92SAndroid Build Coastguard Worker 
33*89c4ff92SAndroid Build Coastguard Worker public:
34*89c4ff92SAndroid Build Coastguard Worker 
BasePipeServer(arm::pipe::Socket clientConnection,bool echoPackets)35*89c4ff92SAndroid Build Coastguard Worker     BasePipeServer(arm::pipe::Socket clientConnection, bool echoPackets)
36*89c4ff92SAndroid Build Coastguard Worker             : m_ClientConnection(clientConnection)
37*89c4ff92SAndroid Build Coastguard Worker             , m_EchoPackets(echoPackets)
38*89c4ff92SAndroid Build Coastguard Worker             {}
39*89c4ff92SAndroid Build Coastguard Worker 
~BasePipeServer()40*89c4ff92SAndroid Build Coastguard Worker     ~BasePipeServer()
41*89c4ff92SAndroid Build Coastguard Worker     {
42*89c4ff92SAndroid Build Coastguard Worker         // We have set SOCK_CLOEXEC on this socket but we'll close it to be good citizens.
43*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::Close(m_ClientConnection);
44*89c4ff92SAndroid Build Coastguard Worker     }
45*89c4ff92SAndroid Build Coastguard Worker 
46*89c4ff92SAndroid Build Coastguard Worker     BasePipeServer(const BasePipeServer&) = delete;
47*89c4ff92SAndroid Build Coastguard Worker     BasePipeServer& operator=(const BasePipeServer&) = delete;
48*89c4ff92SAndroid Build Coastguard Worker 
49*89c4ff92SAndroid Build Coastguard Worker     BasePipeServer(BasePipeServer&&) = delete;
50*89c4ff92SAndroid Build Coastguard Worker     BasePipeServer& operator=(BasePipeServer&&) = delete;
51*89c4ff92SAndroid Build Coastguard Worker 
52*89c4ff92SAndroid Build Coastguard Worker     /// Close the client connection
53*89c4ff92SAndroid Build Coastguard Worker     /// @return 0 if successful
Close()54*89c4ff92SAndroid Build Coastguard Worker     int Close()
55*89c4ff92SAndroid Build Coastguard Worker     {
56*89c4ff92SAndroid Build Coastguard Worker         return arm::pipe::Close(m_ClientConnection);
57*89c4ff92SAndroid Build Coastguard Worker     }
58*89c4ff92SAndroid Build Coastguard Worker 
59*89c4ff92SAndroid Build Coastguard Worker     /// Send a packet to the client
60*89c4ff92SAndroid Build Coastguard Worker     /// @return true if a valid packet has been sent.
61*89c4ff92SAndroid Build Coastguard Worker     bool SendPacket(uint32_t packetFamily, uint32_t packetId, const uint8_t* data, uint32_t dataLength);
62*89c4ff92SAndroid Build Coastguard Worker 
63*89c4ff92SAndroid Build Coastguard Worker     /// Set the client socket to nonblocking
64*89c4ff92SAndroid Build Coastguard Worker     /// @return true if successful.
SetNonBlocking()65*89c4ff92SAndroid Build Coastguard Worker     bool SetNonBlocking()
66*89c4ff92SAndroid Build Coastguard Worker     {
67*89c4ff92SAndroid Build Coastguard Worker         return arm::pipe::SetNonBlocking(m_ClientConnection);
68*89c4ff92SAndroid Build Coastguard Worker     }
69*89c4ff92SAndroid Build Coastguard Worker 
70*89c4ff92SAndroid Build Coastguard Worker     /// Block on the client connection until a complete packet has been received.
71*89c4ff92SAndroid Build Coastguard Worker     /// @return true if a valid packet has been received.
72*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Packet WaitForPacket(uint32_t timeoutMs);
73*89c4ff92SAndroid Build Coastguard Worker 
74*89c4ff92SAndroid Build Coastguard Worker     /// Once the connection is open wait to receive the stream meta data packet from the client. Reading this
75*89c4ff92SAndroid Build Coastguard Worker     /// packet differs from others as we need to determine endianness.
76*89c4ff92SAndroid Build Coastguard Worker     /// @return true only if a valid stream meta data packet has been received.
77*89c4ff92SAndroid Build Coastguard Worker     bool WaitForStreamMetaData();
78*89c4ff92SAndroid Build Coastguard Worker 
GetStreamMetadataVersion()79*89c4ff92SAndroid Build Coastguard Worker     uint32_t GetStreamMetadataVersion()
80*89c4ff92SAndroid Build Coastguard Worker     {
81*89c4ff92SAndroid Build Coastguard Worker         return m_StreamMetaDataVersion;
82*89c4ff92SAndroid Build Coastguard Worker     }
83*89c4ff92SAndroid Build Coastguard Worker 
GetStreamMetadataMaxDataLen()84*89c4ff92SAndroid Build Coastguard Worker     uint32_t GetStreamMetadataMaxDataLen()
85*89c4ff92SAndroid Build Coastguard Worker     {
86*89c4ff92SAndroid Build Coastguard Worker         return m_StreamMetaDataMaxDataLen;
87*89c4ff92SAndroid Build Coastguard Worker     }
88*89c4ff92SAndroid Build Coastguard Worker 
GetStreamMetadataPid()89*89c4ff92SAndroid Build Coastguard Worker     uint32_t GetStreamMetadataPid()
90*89c4ff92SAndroid Build Coastguard Worker     {
91*89c4ff92SAndroid Build Coastguard Worker         return m_StreamMetaDataPid;
92*89c4ff92SAndroid Build Coastguard Worker     }
93*89c4ff92SAndroid Build Coastguard Worker 
94*89c4ff92SAndroid Build Coastguard Worker private:
95*89c4ff92SAndroid Build Coastguard Worker 
96*89c4ff92SAndroid Build Coastguard Worker     void EchoPacket(PacketDirection direction, uint8_t* packet, size_t lengthInBytes);
97*89c4ff92SAndroid Build Coastguard Worker     bool ReadFromSocket(uint8_t* packetData, uint32_t expectedLength);
98*89c4ff92SAndroid Build Coastguard Worker     bool ReadHeader(uint32_t headerAsWords[2]);
99*89c4ff92SAndroid Build Coastguard Worker 
100*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Packet ReceivePacket();
101*89c4ff92SAndroid Build Coastguard Worker 
102*89c4ff92SAndroid Build Coastguard Worker     uint32_t ToUint32(uint8_t* data, TargetEndianness endianness);
103*89c4ff92SAndroid Build Coastguard Worker     void InsertU32(uint32_t value, uint8_t* data, TargetEndianness endianness);
104*89c4ff92SAndroid Build Coastguard Worker 
105*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Socket m_ClientConnection;
106*89c4ff92SAndroid Build Coastguard Worker     bool m_EchoPackets;
107*89c4ff92SAndroid Build Coastguard Worker     TargetEndianness m_Endianness;
108*89c4ff92SAndroid Build Coastguard Worker 
109*89c4ff92SAndroid Build Coastguard Worker     uint32_t m_StreamMetaDataVersion;
110*89c4ff92SAndroid Build Coastguard Worker     uint32_t m_StreamMetaDataMaxDataLen;
111*89c4ff92SAndroid Build Coastguard Worker     uint32_t m_StreamMetaDataPid;
112*89c4ff92SAndroid Build Coastguard Worker };
113*89c4ff92SAndroid Build Coastguard Worker 
114*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
115*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
116