xref: /aosp_15_r20/external/armnn/profiling/server/src/basePipeServer/ConnectionHandler.cpp (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 #include <server/include/basePipeServer/ConnectionHandler.hpp>
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <string>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker namespace arm
11*89c4ff92SAndroid Build Coastguard Worker {
12*89c4ff92SAndroid Build Coastguard Worker 
13*89c4ff92SAndroid Build Coastguard Worker namespace pipe
14*89c4ff92SAndroid Build Coastguard Worker {
15*89c4ff92SAndroid Build Coastguard Worker 
ConnectionHandler(const std::string & udsNamespace,const bool setNonBlocking)16*89c4ff92SAndroid Build Coastguard Worker ConnectionHandler::ConnectionHandler(const std::string& udsNamespace, const bool setNonBlocking)
17*89c4ff92SAndroid Build Coastguard Worker {
18*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Initialize();
19*89c4ff92SAndroid Build Coastguard Worker     m_ListeningSocket = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
20*89c4ff92SAndroid Build Coastguard Worker 
21*89c4ff92SAndroid Build Coastguard Worker     if (-1 == m_ListeningSocket)
22*89c4ff92SAndroid Build Coastguard Worker     {
23*89c4ff92SAndroid Build Coastguard Worker         throw SocketConnectionException(": Socket construction failed: ", 1, 1);
24*89c4ff92SAndroid Build Coastguard Worker     }
25*89c4ff92SAndroid Build Coastguard Worker 
26*89c4ff92SAndroid Build Coastguard Worker     sockaddr_un udsAddress;
27*89c4ff92SAndroid Build Coastguard Worker     memset(&udsAddress, 0, sizeof(sockaddr_un));
28*89c4ff92SAndroid Build Coastguard Worker     // We've set the first element of sun_path to be 0, skip over it and copy the namespace after it.
29*89c4ff92SAndroid Build Coastguard Worker     memcpy(udsAddress.sun_path + 1, udsNamespace.c_str(), strlen(udsNamespace.c_str()));
30*89c4ff92SAndroid Build Coastguard Worker     udsAddress.sun_family = AF_UNIX;
31*89c4ff92SAndroid Build Coastguard Worker 
32*89c4ff92SAndroid Build Coastguard Worker     // Bind the socket to the UDS namespace.
33*89c4ff92SAndroid Build Coastguard Worker     if (-1 == bind(m_ListeningSocket, reinterpret_cast<const sockaddr*>(&udsAddress), sizeof(sockaddr_un)))
34*89c4ff92SAndroid Build Coastguard Worker     {
35*89c4ff92SAndroid Build Coastguard Worker         throw SocketConnectionException(": Binding on socket failed: ", m_ListeningSocket, errno);
36*89c4ff92SAndroid Build Coastguard Worker     }
37*89c4ff92SAndroid Build Coastguard Worker     // Listen for connections.
38*89c4ff92SAndroid Build Coastguard Worker     if (-1 == listen(m_ListeningSocket, 1))
39*89c4ff92SAndroid Build Coastguard Worker     {
40*89c4ff92SAndroid Build Coastguard Worker         throw SocketConnectionException(": Listen call on socket failed: ", m_ListeningSocket, errno);
41*89c4ff92SAndroid Build Coastguard Worker     }
42*89c4ff92SAndroid Build Coastguard Worker 
43*89c4ff92SAndroid Build Coastguard Worker     if (setNonBlocking)
44*89c4ff92SAndroid Build Coastguard Worker     {
45*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::SetNonBlocking(m_ListeningSocket);
46*89c4ff92SAndroid Build Coastguard Worker     }
47*89c4ff92SAndroid Build Coastguard Worker }
48*89c4ff92SAndroid Build Coastguard Worker 
GetNewBasePipeServer(const bool echoPackets)49*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<BasePipeServer> ConnectionHandler::GetNewBasePipeServer(const bool echoPackets)
50*89c4ff92SAndroid Build Coastguard Worker {
51*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Socket clientConnection = arm::pipe::Accept(m_ListeningSocket, nullptr, nullptr, SOCK_CLOEXEC);
52*89c4ff92SAndroid Build Coastguard Worker     if (clientConnection < 1)
53*89c4ff92SAndroid Build Coastguard Worker     {
54*89c4ff92SAndroid Build Coastguard Worker         return nullptr;
55*89c4ff92SAndroid Build Coastguard Worker     }
56*89c4ff92SAndroid Build Coastguard Worker     return std::make_unique<BasePipeServer>(clientConnection, echoPackets);
57*89c4ff92SAndroid Build Coastguard Worker }
58*89c4ff92SAndroid Build Coastguard Worker 
59*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
60*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
61