1 /*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 * http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15
16 #include "hitls_build.h"
17
18 #if defined(HITLS_BSL_SAL_NET)
19 #include <stdint.h>
20 #include "bsl_sal.h"
21 #include "bsl_errno.h"
22 #include "sal_netimpl.h"
23
24 static BSL_SAL_NetCallback g_netCallback = {0};
25
SAL_NetCallback_Ctrl(BSL_SAL_CB_FUNC_TYPE type,void * funcCb)26 int32_t SAL_NetCallback_Ctrl(BSL_SAL_CB_FUNC_TYPE type, void *funcCb)
27 {
28 if (type > BSL_SAL_NET_SOCKGETLASTSOCKETERROR_CB_FUNC || type < BSL_SAL_NET_WRITE_CB_FUNC) {
29 return BSL_SAL_NET_NO_REG_FUNC;
30 }
31 uint32_t offset = (uint32_t)(type - BSL_SAL_NET_WRITE_CB_FUNC);
32 ((void **)&g_netCallback)[offset] = funcCb;
33 return BSL_SUCCESS;
34 }
35
SAL_Write(int32_t fd,const void * buf,uint32_t len,int32_t * err)36 int32_t SAL_Write(int32_t fd, const void *buf, uint32_t len, int32_t *err)
37 {
38 if (buf == NULL || len == 0 || err == NULL) {
39 return BSL_SAL_ERR_BAD_PARAM;
40 }
41 if (g_netCallback.pfWrite != NULL && g_netCallback.pfWrite != SAL_Write) {
42 return g_netCallback.pfWrite(fd, buf, len, err);
43 }
44 #ifdef HITLS_BSL_SAL_LINUX
45 return SAL_NET_Write(fd, buf, len, err);
46 #else
47 return BSL_SAL_NET_NO_REG_FUNC;
48 #endif
49 }
50
SAL_Read(int32_t fd,void * buf,uint32_t len,int32_t * err)51 int32_t SAL_Read(int32_t fd, void *buf, uint32_t len, int32_t *err)
52 {
53 if (buf == NULL || len == 0 || err == NULL) {
54 return BSL_SAL_ERR_BAD_PARAM;
55 }
56 if (g_netCallback.pfRead != NULL && g_netCallback.pfRead != SAL_Read) {
57 return g_netCallback.pfRead(fd, buf, len, err);
58 }
59 #ifdef HITLS_BSL_SAL_LINUX
60 return SAL_NET_Read(fd, buf, len, err);
61 #else
62 return BSL_SAL_NET_NO_REG_FUNC;
63 #endif
64 }
65
SAL_Sendto(int32_t sock,const void * buf,size_t len,int32_t flags,BSL_SAL_SockAddr address,int32_t addrLen,int32_t * err)66 int32_t SAL_Sendto(int32_t sock, const void *buf, size_t len, int32_t flags, BSL_SAL_SockAddr address,
67 int32_t addrLen, int32_t *err)
68 {
69 if (buf == NULL || len == 0 || address == NULL || addrLen == 0 || err == NULL) {
70 return BSL_SAL_ERR_BAD_PARAM;
71 }
72 if (g_netCallback.pfSendTo != NULL && g_netCallback.pfSendTo != SAL_Sendto) {
73 return g_netCallback.pfSendTo(sock, buf, len, flags, address, addrLen, err);
74 }
75 #ifdef HITLS_BSL_SAL_LINUX
76 return SAL_NET_Sendto(sock, buf, len, flags, address, addrLen, err);
77 #else
78 return BSL_SAL_NET_NO_REG_FUNC;
79 #endif
80 }
81
SAL_RecvFrom(int32_t sock,void * buf,size_t len,int32_t flags,BSL_SAL_SockAddr address,int32_t * addrLen,int32_t * err)82 int32_t SAL_RecvFrom(int32_t sock, void *buf, size_t len, int32_t flags, BSL_SAL_SockAddr address,
83 int32_t *addrLen, int32_t *err)
84 {
85 if (buf == NULL || len == 0 || err == NULL) {
86 return BSL_SAL_ERR_BAD_PARAM;
87 }
88 if (g_netCallback.pfRecvFrom != NULL && g_netCallback.pfRecvFrom != SAL_RecvFrom) {
89 return g_netCallback.pfRecvFrom(sock, buf, len, flags, address, addrLen, err);
90 }
91 #ifdef HITLS_BSL_SAL_LINUX
92 return SAL_NET_RecvFrom(sock, buf, len, flags, address, addrLen, err);
93 #else
94 return BSL_SAL_NET_NO_REG_FUNC;
95 #endif
96 }
97
SAL_SockAddrNew(BSL_SAL_SockAddr * sockAddr)98 int32_t SAL_SockAddrNew(BSL_SAL_SockAddr *sockAddr)
99 {
100 if (g_netCallback.pfSockAddrNew != NULL && g_netCallback.pfSockAddrNew != SAL_SockAddrNew) {
101 return g_netCallback.pfSockAddrNew(sockAddr);
102 }
103 #ifdef HITLS_BSL_SAL_LINUX
104 return SAL_NET_SockAddrNew(sockAddr);
105 #else
106 return BSL_SAL_NET_NO_REG_FUNC;
107 #endif
108 }
109
SAL_SockAddrFree(BSL_SAL_SockAddr sockAddr)110 void SAL_SockAddrFree(BSL_SAL_SockAddr sockAddr)
111 {
112 if (g_netCallback.pfSockAddrFree != NULL && g_netCallback.pfSockAddrFree != SAL_SockAddrFree) {
113 return g_netCallback.pfSockAddrFree(sockAddr);
114 }
115 #ifdef HITLS_BSL_SAL_LINUX
116 SAL_NET_SockAddrFree(sockAddr);
117 return;
118 #endif
119 }
120
SAL_SockAddrSize(const BSL_SAL_SockAddr sockAddr)121 uint32_t SAL_SockAddrSize(const BSL_SAL_SockAddr sockAddr)
122 {
123 if (g_netCallback.pfSockAddrSize != NULL && g_netCallback.pfSockAddrSize != SAL_SockAddrSize) {
124 return g_netCallback.pfSockAddrSize(sockAddr);
125 }
126 #ifdef HITLS_BSL_SAL_LINUX
127 return SAL_NET_SockAddrSize(sockAddr);
128 #else
129 return BSL_SAL_NET_NO_REG_FUNC;
130 #endif
131 }
132
SAL_SockAddrCopy(BSL_SAL_SockAddr dst,BSL_SAL_SockAddr src)133 void SAL_SockAddrCopy(BSL_SAL_SockAddr dst, BSL_SAL_SockAddr src)
134 {
135 if (g_netCallback.pfSockAddrCopy != NULL && g_netCallback.pfSockAddrCopy != SAL_SockAddrCopy) {
136 return g_netCallback.pfSockAddrCopy(src, dst);
137 }
138 #ifdef HITLS_BSL_SAL_LINUX
139 SAL_NET_SockAddrCopy(src, dst);
140 return;
141 #endif
142 }
143
BSL_SAL_Socket(int32_t af,int32_t type,int32_t protocol)144 int32_t BSL_SAL_Socket(int32_t af, int32_t type, int32_t protocol)
145 {
146 if (g_netCallback.pfSocket != NULL && g_netCallback.pfSocket != BSL_SAL_Socket) {
147 return g_netCallback.pfSocket(af, type, protocol);
148 }
149 #ifdef HITLS_BSL_SAL_LINUX
150 return SAL_Socket(af, type, protocol);
151 #else
152 return BSL_SAL_NET_NO_REG_FUNC;
153 #endif
154 }
155
BSL_SAL_SockClose(int32_t sockId)156 int32_t BSL_SAL_SockClose(int32_t sockId)
157 {
158 if (g_netCallback.pfSockClose != NULL && g_netCallback.pfSockClose != BSL_SAL_SockClose) {
159 return g_netCallback.pfSockClose(sockId);
160 }
161 #ifdef HITLS_BSL_SAL_LINUX
162 return SAL_SockClose(sockId);
163 #else
164 return BSL_SAL_NET_NO_REG_FUNC;
165 #endif
166 }
167
BSL_SAL_SetSockopt(int32_t sockId,int32_t level,int32_t name,const void * val,int32_t len)168 int32_t BSL_SAL_SetSockopt(int32_t sockId, int32_t level, int32_t name, const void *val, int32_t len)
169 {
170 if (g_netCallback.pfSetSockopt != NULL && g_netCallback.pfSetSockopt != BSL_SAL_SetSockopt) {
171 return g_netCallback.pfSetSockopt(sockId, level, name, val, len);
172 }
173 #ifdef HITLS_BSL_SAL_LINUX
174 return SAL_SetSockopt(sockId, level, name, val, len);
175 #else
176 return BSL_SAL_NET_NO_REG_FUNC;
177 #endif
178 }
179
BSL_SAL_GetSockopt(int32_t sockId,int32_t level,int32_t name,void * val,int32_t * len)180 int32_t BSL_SAL_GetSockopt(int32_t sockId, int32_t level, int32_t name, void *val, int32_t *len)
181 {
182 if (g_netCallback.pfGetSockopt != NULL && g_netCallback.pfGetSockopt != BSL_SAL_GetSockopt) {
183 return g_netCallback.pfGetSockopt(sockId, level, name, val, len);
184 }
185 #ifdef HITLS_BSL_SAL_LINUX
186 return SAL_GetSockopt(sockId, level, name, val, len);
187 #else
188 return BSL_SAL_NET_NO_REG_FUNC;
189 #endif
190 }
191
BSL_SAL_SockListen(int32_t sockId,int32_t backlog)192 int32_t BSL_SAL_SockListen(int32_t sockId, int32_t backlog)
193 {
194 if (g_netCallback.pfSockListen != NULL && g_netCallback.pfSockListen != BSL_SAL_SockListen) {
195 return g_netCallback.pfSockListen(sockId, backlog);
196 }
197 #ifdef HITLS_BSL_SAL_LINUX
198 return SAL_SockListen(sockId, backlog);
199 #else
200 return BSL_SAL_NET_NO_REG_FUNC;
201 #endif
202 }
203
BSL_SAL_SockBind(int32_t sockId,BSL_SAL_SockAddr addr,size_t len)204 int32_t BSL_SAL_SockBind(int32_t sockId, BSL_SAL_SockAddr addr, size_t len)
205 {
206 if (g_netCallback.pfSockBind != NULL && g_netCallback.pfSockBind != BSL_SAL_SockBind) {
207 return g_netCallback.pfSockBind(sockId, addr, len);
208 }
209 #ifdef HITLS_BSL_SAL_LINUX
210 return SAL_SockBind(sockId, addr, len);
211 #else
212 return BSL_SAL_NET_NO_REG_FUNC;
213 #endif
214 }
215
BSL_SAL_SockConnect(int32_t sockId,BSL_SAL_SockAddr addr,size_t len)216 int32_t BSL_SAL_SockConnect(int32_t sockId, BSL_SAL_SockAddr addr, size_t len)
217 {
218 if (g_netCallback.pfSockConnect != NULL && g_netCallback.pfSockConnect != BSL_SAL_SockConnect) {
219 return g_netCallback.pfSockConnect(sockId, addr, len);
220 }
221 #ifdef HITLS_BSL_SAL_LINUX
222 return SAL_SockConnect(sockId, addr, len);
223 #else
224 return BSL_SAL_NET_NO_REG_FUNC;
225 #endif
226 }
227
BSL_SAL_SockSend(int32_t sockId,const void * msg,size_t len,int32_t flags)228 int32_t BSL_SAL_SockSend(int32_t sockId, const void *msg, size_t len, int32_t flags)
229 {
230 if (g_netCallback.pfSockSend != NULL && g_netCallback.pfSockSend != BSL_SAL_SockSend) {
231 return g_netCallback.pfSockSend(sockId, msg, len, flags);
232 }
233 #ifdef HITLS_BSL_SAL_LINUX
234 return SAL_SockSend(sockId, msg, len, flags);
235 #else
236 return BSL_SAL_NET_NO_REG_FUNC;
237 #endif
238 }
239
BSL_SAL_SockRecv(int32_t sockfd,void * buff,size_t len,int32_t flags)240 int32_t BSL_SAL_SockRecv(int32_t sockfd, void *buff, size_t len, int32_t flags)
241 {
242 if (g_netCallback.pfSockRecv != NULL && g_netCallback.pfSockRecv != BSL_SAL_SockRecv) {
243 return g_netCallback.pfSockRecv(sockfd, buff, len, flags);
244 }
245 #ifdef HITLS_BSL_SAL_LINUX
246 return SAL_SockRecv(sockfd, buff, len, flags);
247 #else
248 return BSL_SAL_NET_NO_REG_FUNC;
249 #endif
250 }
251
BSL_SAL_Select(int32_t nfds,void * readfds,void * writefds,void * exceptfds,void * timeout)252 int32_t BSL_SAL_Select(int32_t nfds, void *readfds, void *writefds, void *exceptfds, void *timeout)
253 {
254 if (g_netCallback.pfSelect != NULL && g_netCallback.pfSelect != BSL_SAL_Select) {
255 return g_netCallback.pfSelect(nfds, readfds, writefds, exceptfds, timeout);
256 }
257 #ifdef HITLS_BSL_SAL_LINUX
258 return SAL_Select(nfds, readfds, writefds, exceptfds, timeout);
259 #else
260 return BSL_SAL_NET_NO_REG_FUNC;
261 #endif
262 }
263
BSL_SAL_Ioctlsocket(int32_t sockId,long cmd,unsigned long * arg)264 int32_t BSL_SAL_Ioctlsocket(int32_t sockId, long cmd, unsigned long *arg)
265 {
266 if (g_netCallback.pfIoctlsocket != NULL && g_netCallback.pfIoctlsocket != BSL_SAL_Ioctlsocket) {
267 return g_netCallback.pfIoctlsocket(sockId, cmd, arg);
268 }
269 #ifdef HITLS_BSL_SAL_LINUX
270 return SAL_Ioctlsocket(sockId, cmd, arg);
271 #else
272 return BSL_SAL_NET_NO_REG_FUNC;
273 #endif
274 }
275
BSL_SAL_SockGetLastSocketError(void)276 int32_t BSL_SAL_SockGetLastSocketError(void)
277 {
278 if (g_netCallback.pfSockGetLastSocketError != NULL &&
279 g_netCallback.pfSockGetLastSocketError != BSL_SAL_SockGetLastSocketError) {
280 return g_netCallback.pfSockGetLastSocketError();
281 }
282 #ifdef HITLS_BSL_SAL_LINUX
283 return SAL_SockGetLastSocketError();
284 #else
285 return BSL_SAL_NET_NO_REG_FUNC;
286 #endif
287 }
288
289 #endif
290