xref: /aosp_15_r20/external/deqp/framework/delibs/deutil/deSocket.h (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 #ifndef _DESOCKET_H
2 #define _DESOCKET_H
3 /*-------------------------------------------------------------------------
4  * drawElements Utility Library
5  * ----------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Socket abstraction.
24  *
25  * Socket API is thread-safe except to:
26  *  - listen()
27  *  - connect()
28  *  - destroy()
29  *//*--------------------------------------------------------------------*/
30 
31 #include "deDefs.h"
32 
33 DE_BEGIN_EXTERN_C
34 
35 /* Socket types. */
36 typedef struct deSocket_s deSocket;
37 typedef struct deSocketAddress_s deSocketAddress;
38 
39 typedef enum deSocketFamily_e
40 {
41     DE_SOCKETFAMILY_INET4 = 0,
42     DE_SOCKETFAMILY_INET6,
43 
44     DE_SOCKETFAMILY_LAST
45 } deSocketFamily;
46 
47 typedef enum deSocketType_e
48 {
49     DE_SOCKETTYPE_STREAM = 0,
50     DE_SOCKETTYPE_DATAGRAM,
51 
52     DE_SOCKETTYPE_LAST
53 } deSocketType;
54 
55 typedef enum deSocketProtocol_e
56 {
57     DE_SOCKETPROTOCOL_TCP = 0,
58     DE_SOCKETPROTOCOL_UDP,
59 
60     DE_SOCKETPROTOCOL_LAST
61 } deSocketProtocol;
62 
63 typedef enum deSocketFlag_e
64 {
65     DE_SOCKET_KEEPALIVE     = (1 << 0),
66     DE_SOCKET_NODELAY       = (1 << 1),
67     DE_SOCKET_NONBLOCKING   = (1 << 2),
68     DE_SOCKET_CLOSE_ON_EXEC = (1 << 3)
69 } deSocketFlag;
70 
71 /* \todo [2012-07-09 pyry] Separate closed bits for send and receive channels. */
72 
73 typedef enum deSocketState_e
74 {
75     DE_SOCKETSTATE_CLOSED       = 0,
76     DE_SOCKETSTATE_CONNECTED    = 1,
77     DE_SOCKETSTATE_LISTENING    = 2,
78     DE_SOCKETSTATE_DISCONNECTED = 3,
79 
80     DE_SOCKETSTATE_LAST
81 } deSocketState;
82 
83 typedef enum deSocketResult_e
84 {
85     DE_SOCKETRESULT_SUCCESS               = 0,
86     DE_SOCKETRESULT_WOULD_BLOCK           = 1,
87     DE_SOCKETRESULT_CONNECTION_CLOSED     = 2,
88     DE_SOCKETRESULT_CONNECTION_TERMINATED = 3,
89     DE_SOCKETRESULT_ERROR                 = 4,
90 
91     DE_SOCKETRESULT_LAST
92 } deSocketResult;
93 
94 typedef enum deSocketChannel_e
95 {
96     DE_SOCKETCHANNEL_RECEIVE = (1 << 0),
97     DE_SOCKETCHANNEL_SEND    = (1 << 1),
98 
99     DE_SOCKETCHANNEL_BOTH = DE_SOCKETCHANNEL_RECEIVE | DE_SOCKETCHANNEL_SEND
100 } deSocketChannel;
101 
102 /* Socket API, similar to Berkeley sockets. */
103 
104 deSocketAddress *deSocketAddress_create(void);
105 void deSocketAddress_destroy(deSocketAddress *address);
106 
107 bool deSocketAddress_setFamily(deSocketAddress *address, deSocketFamily family);
108 deSocketFamily deSocketAddress_getFamily(const deSocketAddress *address);
109 bool deSocketAddress_setType(deSocketAddress *address, deSocketType type);
110 deSocketType deSocketAddress_getType(const deSocketAddress *address);
111 bool deSocketAddress_setProtocol(deSocketAddress *address, deSocketProtocol protocol);
112 deSocketProtocol deSocketAddress_getProtocol(const deSocketAddress *address);
113 bool deSocketAddress_setPort(deSocketAddress *address, int port);
114 int deSocketAddress_getPort(const deSocketAddress *address);
115 bool deSocketAddress_setHost(deSocketAddress *address, const char *host);
116 const char *deSocketAddress_getHost(const deSocketAddress *address);
117 
118 deSocket *deSocket_create(void);
119 void deSocket_destroy(deSocket *socket);
120 
121 deSocketState deSocket_getState(const deSocket *socket);
122 uint32_t deSocket_getOpenChannels(const deSocket *socket);
123 
124 bool deSocket_setFlags(deSocket *socket, uint32_t flags);
125 
126 bool deSocket_listen(deSocket *socket, const deSocketAddress *address);
127 deSocket *deSocket_accept(deSocket *socket, deSocketAddress *clientAddress);
128 
129 bool deSocket_connect(deSocket *socket, const deSocketAddress *address);
130 
131 bool deSocket_shutdown(deSocket *socket, uint32_t channels);
132 bool deSocket_close(deSocket *socket);
133 
134 deSocketResult deSocket_send(deSocket *socket, const void *buf, size_t bufSize, size_t *numSent);
135 deSocketResult deSocket_receive(deSocket *socket, void *buf, size_t bufSize, size_t *numReceived);
136 
137 /* Utilities. */
138 
139 const char *deGetSocketFamilyName(deSocketFamily family);
140 const char *deGetSocketResultName(deSocketResult result);
141 
142 DE_END_EXTERN_C
143 
144 #endif /* _DESOCKET_H */
145