1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "spunge_app.h"
17 #include "spunge.h"
18 #include "socket_common.h"
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
SpungeInitSocket(struct FtSocket * sock)24 static FILLP_INT SpungeInitSocket(struct FtSocket *sock)
25 {
26 FILLP_INT i;
27 sock->netconn = FILLP_NULL_PTR;
28 (void)memset_s(sock->coreErrType, sizeof(sock->coreErrType), 0, sizeof(sock->coreErrType));
29
30 sock->listenBacklog = 0;
31 sock->acceptBox = FILLP_NULL_PTR;
32 sock->listenNode.next = FILLP_NULL_PTR;
33 sock->listenNode.pprev = FILLP_NULL_PTR;
34
35 sock->recvPktBuf = FILLP_NULL_PTR;
36 sock->inst = &g_spunge->instPool[0]; /* Alloc should be always in the first instance */
37 sock->traceHandle = FILLP_NULL_PTR;
38
39 (void)SYS_ARCH_ATOMIC_SET(&sock->rcvEvent, 0);
40 (void)SYS_ARCH_ATOMIC_SET(&sock->epollWaiting, 0);
41
42 /* If socket added to epoll without connect, should report out|err|hup */
43 (void)SYS_ARCH_ATOMIC_SET(&sock->sendEvent, 1);
44 (void)SYS_ARCH_ATOMIC_SET(&sock->sendEventCount, 1);
45 sock->errEvent = SPUNGE_EPOLLHUP;
46
47 sock->eventEpoll = FILLP_NULL_PTR;
48
49 sock->associatedEpollInstanceIdx = 0;
50 HLIST_INIT(&sock->epTaskList);
51 /* Scan the epoll instance list to which this ft_socket is associated with */
52 for (i = 0; i < FILLP_NUM_OF_EPOLL_INSTANCE_SUPPORTED; i++) {
53 sock->associatedEpollInstanceArr[i] = FILLP_INVALID_INT;
54 }
55
56 sock->offset = 0;
57
58 sock->dataOptionFlag = 0;
59 if (g_appResource.common.enableDateOptTimestamp) {
60 (void)SockUpdatePktDataOpt(sock, (FILLP_UINT16)FILLP_OPT_FLAG_TIMESTAMP, 0);
61 }
62 sock->transmit = 0;
63 sock->jitter = 0;
64 sock->sockAddrType = AF_INET;
65 sock->flags = 0;
66
67 sock->isListenSock = FILLP_FALSE;
68 sock->traceFlag = FILLP_FALSE;
69 sock->isSockBind = FILLP_FALSE;
70 SockSetNonblocking(sock, FILLP_FALSE);
71 sock->freeTimeCount = FILLP_NULL_NUM;
72 (void)memcpy_s(&sock->resConf, sizeof(struct GlobalAppResource), &g_appResource, sizeof(struct GlobalAppResource));
73 (void)memset_s(&sock->fillpLinger, sizeof(sock->fillpLinger), 0, sizeof(sock->fillpLinger));
74 sock->directlySend = 0;
75
76 /* post here, so that now sock close can acquire lock */
77 if (SYS_ARCH_SEM_POST(&sock->sockCloseProtect) != ERR_OK) {
78 return ERR_FAILURE;
79 }
80
81 return ERR_OK;
82 }
83
SpungeAllocSock(FILLP_INT allocType)84 struct FtSocket *SpungeAllocSock(FILLP_INT allocType)
85 {
86 struct FtSocket *sock = FILLP_NULL_PTR;
87
88 if ((g_spunge == FILLP_NULL_PTR) || (!g_spunge->hasInited) || (g_spunge->sockTable == FILLP_NULL_PTR)) {
89 FILLP_LOGERR("FILLP Not yet Initialized");
90
91 return FILLP_NULL_PTR;
92 }
93
94 if (allocType != SOCK_ALLOC_STATE_COMM && allocType != SOCK_ALLOC_STATE_EPOLL) {
95 FILLP_LOGERR("Wrong Socket Alloc Type");
96 return FILLP_NULL_PTR;
97 }
98
99 sock = SockAllocSocket();
100 if (sock == FILLP_NULL_PTR) {
101 FILLP_LOGERR("sockets not available from the sockTable->freeQueqe");
102 return FILLP_NULL_PTR;
103 }
104
105 if (SpungeInitSocket(sock) != ERR_OK) {
106 SockFreeSocket(sock);
107 return FILLP_NULL_PTR;
108 }
109
110 sock->allocState = allocType;
111
112 return sock;
113 }
114
SpungeDelEpInstFromFtSocket(struct FtSocket * sock,FILLP_INT epFd)115 void SpungeDelEpInstFromFtSocket(struct FtSocket *sock, FILLP_INT epFd)
116 {
117 FILLP_INT i;
118 FILLP_INT j;
119 FILLP_INT next;
120
121 for (i = 0; i < FILLP_NUM_OF_EPOLL_INSTANCE_SUPPORTED; i++) {
122 if (sock->associatedEpollInstanceArr[i] == epFd) {
123 break;
124 }
125 }
126
127 for (j = i; j < FILLP_NUM_OF_EPOLL_INSTANCE_SUPPORTED; j++) {
128 if (j == (FILLP_NUM_OF_EPOLL_INSTANCE_SUPPORTED - 1)) {
129 sock->associatedEpollInstanceArr[j] = FILLP_INVALID_INT;
130 break;
131 }
132 next = j + 1;
133 sock->associatedEpollInstanceArr[j] = sock->associatedEpollInstanceArr[next];
134 }
135
136 if (sock->associatedEpollInstanceIdx > 0) {
137 sock->associatedEpollInstanceIdx--;
138 }
139
140 return;
141 }
142
143 #ifdef __cplusplus
144 }
145 #endif
146