xref: /f-stack/app/micro_thread/mt_net.h (revision 35a81399)
1a9643ea8Slogwang 
2a9643ea8Slogwang /**
3a9643ea8Slogwang  * Tencent is pleased to support the open source community by making MSEC available.
4a9643ea8Slogwang  *
5a9643ea8Slogwang  * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Licensed under the GNU General Public License, Version 2.0 (the "License");
8a9643ea8Slogwang  * you may not use this file except in compliance with the License. You may
9a9643ea8Slogwang  * obtain a copy of the License at
10a9643ea8Slogwang  *
11a9643ea8Slogwang  *     https://opensource.org/licenses/GPL-2.0
12a9643ea8Slogwang  *
13a9643ea8Slogwang  * Unless required by applicable law or agreed to in writing, software distributed under the
14a9643ea8Slogwang  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15a9643ea8Slogwang  * either express or implied. See the License for the specific language governing permissions
16a9643ea8Slogwang  * and limitations under the License.
17a9643ea8Slogwang  */
18a9643ea8Slogwang 
19a9643ea8Slogwang 
20a9643ea8Slogwang /**
21a9643ea8Slogwang  *  @file mt_net.h
22a9643ea8Slogwang  **/
23a9643ea8Slogwang 
24a9643ea8Slogwang #ifndef __MT_NET_H__
25a9643ea8Slogwang #define __MT_NET_H__
26a9643ea8Slogwang 
27a9643ea8Slogwang #include "micro_thread.h"
28a9643ea8Slogwang #include "hash_list.h"
29a9643ea8Slogwang #include "mt_api.h"
30a9643ea8Slogwang #include "mt_cache.h"
31a9643ea8Slogwang #include "mt_net_api.h"
32a9643ea8Slogwang 
33a9643ea8Slogwang namespace NS_MICRO_THREAD {
34a9643ea8Slogwang 
35a9643ea8Slogwang enum MT_CONN_TYPE
36a9643ea8Slogwang {
37a9643ea8Slogwang     TYPE_CONN_UNKNOWN   = 0,
38*35a81399Slogwang     TYPE_CONN_SHORT     = 0x1,
39*35a81399Slogwang     TYPE_CONN_POOL      = 0x2,
40*35a81399Slogwang     TYPE_CONN_SESSION   = 0x4,
41*35a81399Slogwang     TYPE_CONN_SENDONLY  = 0x8,
42a9643ea8Slogwang };
43a9643ea8Slogwang 
44a9643ea8Slogwang class CSockLink;
45a9643ea8Slogwang 
46a9643ea8Slogwang template <typename List, typename Type>
47a9643ea8Slogwang class CRecyclePool
48a9643ea8Slogwang {
49a9643ea8Slogwang public:
50a9643ea8Slogwang 
CRecyclePool()51a9643ea8Slogwang     CRecyclePool() {
52a9643ea8Slogwang         _expired = 60 * 1000;
53a9643ea8Slogwang         _count = 0;
54a9643ea8Slogwang         TAILQ_INIT(&_free_list);
55a9643ea8Slogwang     };
56a9643ea8Slogwang 
~CRecyclePool()57a9643ea8Slogwang     ~CRecyclePool() {
58a9643ea8Slogwang         Type* item = NULL;
59a9643ea8Slogwang         Type* tmp = NULL;
60a9643ea8Slogwang         TAILQ_FOREACH_SAFE(item, &_free_list, _link_entry, tmp)
61a9643ea8Slogwang         {
62a9643ea8Slogwang             TAILQ_REMOVE(&_free_list, item, _link_entry);
63a9643ea8Slogwang             delete item;
64a9643ea8Slogwang         }
65a9643ea8Slogwang         _count = 0;
66a9643ea8Slogwang     };
67a9643ea8Slogwang 
AllocItem()68a9643ea8Slogwang     Type* AllocItem() {
69a9643ea8Slogwang         Type* item = TAILQ_FIRST(&_free_list);
70a9643ea8Slogwang         if (item != NULL)
71a9643ea8Slogwang         {
72a9643ea8Slogwang             TAILQ_REMOVE(&_free_list, item, _link_entry);
73a9643ea8Slogwang             _count--;
74a9643ea8Slogwang             return item;
75a9643ea8Slogwang         }
76a9643ea8Slogwang 
77a9643ea8Slogwang         item = new Type();
78a9643ea8Slogwang         if (NULL == item)
79a9643ea8Slogwang         {
80a9643ea8Slogwang             return NULL;
81a9643ea8Slogwang         }
82a9643ea8Slogwang 
83a9643ea8Slogwang         return item;
84a9643ea8Slogwang     };
85a9643ea8Slogwang 
FreeItem(Type * obj)86a9643ea8Slogwang     void FreeItem(Type* obj) {
87a9643ea8Slogwang         //obj->Reset();
88a9643ea8Slogwang         TAILQ_INSERT_TAIL(&_free_list, obj, _link_entry);
89a9643ea8Slogwang         obj->_release_time = mt_time_ms();
90a9643ea8Slogwang         _count++;
91a9643ea8Slogwang     };
92a9643ea8Slogwang 
RecycleItem(uint64_t now)93a9643ea8Slogwang     void RecycleItem(uint64_t now) {
94a9643ea8Slogwang         Type* item = NULL;
95a9643ea8Slogwang         Type* tmp = NULL;
96a9643ea8Slogwang         TAILQ_FOREACH_SAFE(item, &_free_list, _link_entry, tmp)
97a9643ea8Slogwang         {
98a9643ea8Slogwang             if ((now - item->_release_time) < _expired) {
99a9643ea8Slogwang                 break;
100a9643ea8Slogwang             }
101a9643ea8Slogwang 
102a9643ea8Slogwang             TAILQ_REMOVE(&_free_list, item, _link_entry);
103a9643ea8Slogwang             delete item;
104a9643ea8Slogwang             _count--;
105a9643ea8Slogwang         }
106a9643ea8Slogwang     };
107a9643ea8Slogwang 
SetExpiredTime(uint64_t expired)108a9643ea8Slogwang     void SetExpiredTime(uint64_t expired) {
109a9643ea8Slogwang         _expired = expired;
110a9643ea8Slogwang     };
111a9643ea8Slogwang 
112a9643ea8Slogwang private:
113a9643ea8Slogwang 
114*35a81399Slogwang     List            _free_list;
115*35a81399Slogwang     uint64_t        _expired;
116*35a81399Slogwang     uint32_t        _count;
117a9643ea8Slogwang };
118a9643ea8Slogwang 
119a9643ea8Slogwang class CNetHandler : public HashKey
120a9643ea8Slogwang {
121a9643ea8Slogwang public:
122a9643ea8Slogwang 
123a9643ea8Slogwang     enum {
124a9643ea8Slogwang         STATE_IN_SESSION    = 0x1,
125a9643ea8Slogwang         STATE_IN_CONNECT    = 0x2,
126a9643ea8Slogwang         STATE_IN_SEND       = 0x4,
127a9643ea8Slogwang         STATE_IN_RECV       = 0x8,
128a9643ea8Slogwang         STATE_IN_IDLE       = 0x10,
129a9643ea8Slogwang     };
130a9643ea8Slogwang 
131a9643ea8Slogwang     virtual uint32_t HashValue();
132a9643ea8Slogwang 
133a9643ea8Slogwang     virtual int HashCmp(HashKey* rhs);
134a9643ea8Slogwang 
135a9643ea8Slogwang     int32_t SendRecv(void* data, uint32_t len, uint32_t timeout);
136a9643ea8Slogwang 
GetRspBuff()137a9643ea8Slogwang     void* GetRspBuff() {
138a9643ea8Slogwang         if (_rsp_buff != NULL) {
139a9643ea8Slogwang             return _rsp_buff->data;
140a9643ea8Slogwang         } else {
141a9643ea8Slogwang             return NULL;
142a9643ea8Slogwang         }
143a9643ea8Slogwang     };
144a9643ea8Slogwang 
GetRspLen()145a9643ea8Slogwang     uint32_t GetRspLen() {
146a9643ea8Slogwang         if (_rsp_buff != NULL) {
147a9643ea8Slogwang             return _rsp_buff->data_len;
148a9643ea8Slogwang         } else {
149a9643ea8Slogwang             return 0;
150a9643ea8Slogwang         }
151a9643ea8Slogwang     };
152a9643ea8Slogwang 
SetRespBuff(TSkBuffer * buff)153a9643ea8Slogwang     void SetRespBuff(TSkBuffer* buff) {
154a9643ea8Slogwang         if (_rsp_buff != NULL) {
155a9643ea8Slogwang             delete_sk_buffer(_rsp_buff);
156a9643ea8Slogwang             _rsp_buff = NULL;
157a9643ea8Slogwang         }
158a9643ea8Slogwang 
159a9643ea8Slogwang         _rsp_buff = buff;
160a9643ea8Slogwang     };
161a9643ea8Slogwang 
SetProtoType(MT_PROTO_TYPE type)162a9643ea8Slogwang     void SetProtoType(MT_PROTO_TYPE type) {
163a9643ea8Slogwang         _proto_type = type;
164a9643ea8Slogwang     };
165a9643ea8Slogwang 
SetConnType(MT_CONN_TYPE type)166a9643ea8Slogwang     void SetConnType(MT_CONN_TYPE type) {
167a9643ea8Slogwang         _conn_type = type;
168a9643ea8Slogwang     };
169a9643ea8Slogwang 
SetDestAddress(struct sockaddr_in * dst)170a9643ea8Slogwang 	void SetDestAddress(struct sockaddr_in* dst) {
171a9643ea8Slogwang         if (dst != NULL) {
172a9643ea8Slogwang             memcpy(&_dest_ipv4, dst, sizeof(*dst));
173a9643ea8Slogwang         }
174a9643ea8Slogwang 	};
175a9643ea8Slogwang 
SetSessionId(uint64_t sid)176a9643ea8Slogwang 	void SetSessionId(uint64_t sid) {
177a9643ea8Slogwang         _session_id = sid;
178a9643ea8Slogwang 	};
179a9643ea8Slogwang 
SetSessionCallback(CHECK_SESSION_CALLBACK function)180a9643ea8Slogwang     void SetSessionCallback(CHECK_SESSION_CALLBACK function) {
181a9643ea8Slogwang         _callback = function;
182a9643ea8Slogwang     };
183a9643ea8Slogwang 
GetSessionCallback()184a9643ea8Slogwang     CHECK_SESSION_CALLBACK GetSessionCallback() {
185a9643ea8Slogwang         return _callback;
186a9643ea8Slogwang     };
187a9643ea8Slogwang 
188a9643ea8Slogwang 
189a9643ea8Slogwang public:
190a9643ea8Slogwang 
191a9643ea8Slogwang     void Link(CSockLink* conn);
192a9643ea8Slogwang 
193a9643ea8Slogwang     void Unlink();
194a9643ea8Slogwang 
195a9643ea8Slogwang     int32_t CheckParams();
196a9643ea8Slogwang 
197a9643ea8Slogwang     int32_t GetConnLink();
198a9643ea8Slogwang 
199a9643ea8Slogwang     int32_t WaitConnect(uint64_t timeout);
200a9643ea8Slogwang 
201a9643ea8Slogwang     int32_t WaitSend(uint64_t timeout);
202a9643ea8Slogwang 
203a9643ea8Slogwang     int32_t WaitRecv(uint64_t timeout);
204a9643ea8Slogwang 
205a9643ea8Slogwang     void SwitchToConn();
206a9643ea8Slogwang 
207a9643ea8Slogwang     void SwitchToSend();
208a9643ea8Slogwang 
209a9643ea8Slogwang     void SwitchToRecv();
210a9643ea8Slogwang 
211a9643ea8Slogwang     void SwitchToIdle();
212a9643ea8Slogwang 
213a9643ea8Slogwang     void DetachConn();
214a9643ea8Slogwang 
215a9643ea8Slogwang     bool RegistSession();
216a9643ea8Slogwang 
217a9643ea8Slogwang     void UnRegistSession();
218a9643ea8Slogwang 
219a9643ea8Slogwang     uint32_t SkipSendPos(uint32_t len);
220a9643ea8Slogwang 
SetErrNo(int32_t err)221a9643ea8Slogwang     void SetErrNo(int32_t err) {
222a9643ea8Slogwang         _err_no = err;
223a9643ea8Slogwang     };
224a9643ea8Slogwang 
GetThread()225a9643ea8Slogwang     MicroThread* GetThread() {
226a9643ea8Slogwang         return _thread;
227a9643ea8Slogwang     };
228a9643ea8Slogwang 
GetSendData(void * & data,uint32_t & len)229a9643ea8Slogwang     void GetSendData(void*& data, uint32_t& len) {
230a9643ea8Slogwang         data = _req_data;
231a9643ea8Slogwang         len  = _req_len;
232a9643ea8Slogwang     };
233a9643ea8Slogwang 
234a9643ea8Slogwang     void Reset();
235a9643ea8Slogwang 
236a9643ea8Slogwang     CNetHandler();
237a9643ea8Slogwang     ~CNetHandler();
238a9643ea8Slogwang 
239a9643ea8Slogwang     TAILQ_ENTRY(CNetHandler)    _link_entry;
240a9643ea8Slogwang     uint64_t                    _release_time;
241a9643ea8Slogwang 
242a9643ea8Slogwang protected:
243a9643ea8Slogwang 
244*35a81399Slogwang     MicroThread*        _thread;
245*35a81399Slogwang     MT_PROTO_TYPE       _proto_type;
246*35a81399Slogwang     MT_CONN_TYPE        _conn_type;
247*35a81399Slogwang     struct sockaddr_in  _dest_ipv4;
248*35a81399Slogwang     uint64_t            _session_id;
249*35a81399Slogwang     CHECK_SESSION_CALLBACK _callback;
250*35a81399Slogwang     uint32_t            _state_flags;
251*35a81399Slogwang     int32_t             _err_no;
252*35a81399Slogwang     void*               _conn_ptr;
253*35a81399Slogwang     uint32_t            _send_pos;
254*35a81399Slogwang     uint32_t            _req_len;
255*35a81399Slogwang     void*               _req_data;
256*35a81399Slogwang     TSkBuffer*          _rsp_buff;
257a9643ea8Slogwang 
258a9643ea8Slogwang };
259*35a81399Slogwang typedef TAILQ_HEAD(__NetHandlerList, CNetHandler) TNetItemList;
260*35a81399Slogwang typedef CRecyclePool<TNetItemList, CNetHandler>   TNetItemPool;
261a9643ea8Slogwang 
262a9643ea8Slogwang class CSockLink : public KqueuerObj
263a9643ea8Slogwang {
264a9643ea8Slogwang public:
265a9643ea8Slogwang 
266a9643ea8Slogwang     enum {
267a9643ea8Slogwang         LINK_CONNECTING     = 0x1,
268a9643ea8Slogwang         LINK_CONNECTED      = 0x2,
269a9643ea8Slogwang     };
270a9643ea8Slogwang 
271a9643ea8Slogwang     enum {
272a9643ea8Slogwang         LINK_IDLE_LIST      = 1,
273a9643ea8Slogwang         LINK_CONN_LIST      = 2,
274a9643ea8Slogwang         LINK_SEND_LIST      = 3,
275a9643ea8Slogwang         LINK_RECV_LIST      = 4,
276a9643ea8Slogwang     };
277a9643ea8Slogwang 
278a9643ea8Slogwang     int32_t CreateSock();
279a9643ea8Slogwang 
280a9643ea8Slogwang     void Close();
281a9643ea8Slogwang 
282a9643ea8Slogwang     bool Connect();
Connected()283a9643ea8Slogwang     bool Connected() {
284a9643ea8Slogwang         return (_state & LINK_CONNECTED);
285a9643ea8Slogwang     }
286a9643ea8Slogwang 
287a9643ea8Slogwang     void Destroy();
288a9643ea8Slogwang 
289a9643ea8Slogwang     TNetItemList* GetItemList(int32_t type);
290a9643ea8Slogwang 
291a9643ea8Slogwang     void AppendToList(int32_t type, CNetHandler* item);
292a9643ea8Slogwang 
293a9643ea8Slogwang     void RemoveFromList(int32_t type, CNetHandler* item);
294a9643ea8Slogwang 
295a9643ea8Slogwang     struct sockaddr_in* GetDestAddr(struct sockaddr_in* addr);
296a9643ea8Slogwang 
297a9643ea8Slogwang     int32_t SendData(void* data, uint32_t len);
298a9643ea8Slogwang 
299a9643ea8Slogwang     int32_t SendCacheUdp(void* data, uint32_t len);
300a9643ea8Slogwang 
301a9643ea8Slogwang     int32_t SendCacheTcp(void* data, uint32_t len);
302a9643ea8Slogwang 
303a9643ea8Slogwang     void ExtendRecvRsp();
304a9643ea8Slogwang 
305a9643ea8Slogwang     int32_t RecvDispath();
306a9643ea8Slogwang 
307a9643ea8Slogwang     CHECK_SESSION_CALLBACK GetSessionCallback();
308a9643ea8Slogwang 
309a9643ea8Slogwang     int32_t DispathTcp();
310a9643ea8Slogwang 
311a9643ea8Slogwang     int32_t DispathUdp();
312a9643ea8Slogwang 
313a9643ea8Slogwang     CNetHandler* FindSession(uint64_t sid);
314a9643ea8Slogwang 
315a9643ea8Slogwang     virtual int InputNotify();
316a9643ea8Slogwang 
317a9643ea8Slogwang     virtual int OutputNotify();
318a9643ea8Slogwang 
319a9643ea8Slogwang     virtual int HangupNotify();
320a9643ea8Slogwang 
321a9643ea8Slogwang     CSockLink();
322a9643ea8Slogwang     ~CSockLink();
323a9643ea8Slogwang 
324a9643ea8Slogwang     void Reset();
325a9643ea8Slogwang 
326a9643ea8Slogwang     void NotifyThread(CNetHandler* item, int32_t result);
327a9643ea8Slogwang 
328a9643ea8Slogwang     void NotifyAll(int32_t result);
329a9643ea8Slogwang 
330a9643ea8Slogwang     void SetProtoType(MT_PROTO_TYPE type);
331a9643ea8Slogwang 
SetParentsPtr(void * ptr)332a9643ea8Slogwang     void SetParentsPtr(void* ptr) {
333a9643ea8Slogwang         _parents = ptr;
334a9643ea8Slogwang     };
335a9643ea8Slogwang 
GetParentsPtr()336a9643ea8Slogwang     void* GetParentsPtr() {
337a9643ea8Slogwang         return _parents;
338a9643ea8Slogwang     };
339a9643ea8Slogwang 
GetLastAccess()340a9643ea8Slogwang     uint64_t GetLastAccess() {
341a9643ea8Slogwang         return _last_access;
342a9643ea8Slogwang     };
343a9643ea8Slogwang 
344a9643ea8Slogwang public:
345a9643ea8Slogwang 
346a9643ea8Slogwang     TAILQ_ENTRY(CSockLink) _link_entry;
347a9643ea8Slogwang     uint64_t               _release_time;
348a9643ea8Slogwang 
349a9643ea8Slogwang private:
350a9643ea8Slogwang 
351a9643ea8Slogwang     TNetItemList        _wait_connect;
352a9643ea8Slogwang     TNetItemList        _wait_send;
353a9643ea8Slogwang     TNetItemList        _wait_recv;
354a9643ea8Slogwang     TNetItemList        _idle_list;
355a9643ea8Slogwang     MT_PROTO_TYPE       _proto_type;
356a9643ea8Slogwang     int32_t             _errno;
357a9643ea8Slogwang     uint32_t            _state;
358a9643ea8Slogwang     uint64_t            _last_access;
359a9643ea8Slogwang     TRWCache            _recv_cache;
360a9643ea8Slogwang     TSkBuffer*          _rsp_buff;
361a9643ea8Slogwang     void*               _parents;
362a9643ea8Slogwang };
363*35a81399Slogwang typedef TAILQ_HEAD(__SocklinkList, CSockLink) TLinkList;
364*35a81399Slogwang typedef CRecyclePool<TLinkList, CSockLink>    TLinkPool;
365a9643ea8Slogwang 
366a9643ea8Slogwang class CDestLinks : public CTimerNotify, public HashKey
367a9643ea8Slogwang {
368a9643ea8Slogwang public:
369a9643ea8Slogwang 
370a9643ea8Slogwang     CDestLinks();
371a9643ea8Slogwang     ~CDestLinks();
372a9643ea8Slogwang 
373a9643ea8Slogwang     void Reset();
374a9643ea8Slogwang 
375a9643ea8Slogwang     void StartTimer();
376a9643ea8Slogwang 
377a9643ea8Slogwang     CSockLink* GetSockLink();
378a9643ea8Slogwang 
379a9643ea8Slogwang     void FreeSockLink(CSockLink* sock);
380a9643ea8Slogwang 
GetProtoType()381a9643ea8Slogwang     MT_PROTO_TYPE GetProtoType() {
382a9643ea8Slogwang         return _proto_type;
383a9643ea8Slogwang     };
384a9643ea8Slogwang 
GetConnType()385a9643ea8Slogwang     MT_CONN_TYPE GetConnType() {
386a9643ea8Slogwang         return _conn_type;
387a9643ea8Slogwang     };
388a9643ea8Slogwang 
SetKeyInfo(uint32_t ipv4,uint16_t port,MT_PROTO_TYPE proto,MT_CONN_TYPE conn)389a9643ea8Slogwang     void SetKeyInfo(uint32_t ipv4, uint16_t port, MT_PROTO_TYPE proto, MT_CONN_TYPE conn) {
390a9643ea8Slogwang         _addr_ipv4  = ipv4;
391a9643ea8Slogwang         _net_port   = port;
392a9643ea8Slogwang         _proto_type = proto;
393a9643ea8Slogwang         _conn_type  = conn;
394a9643ea8Slogwang     };
395a9643ea8Slogwang 
CopyKeyInfo(CDestLinks * key)396a9643ea8Slogwang     void CopyKeyInfo(CDestLinks* key) {
397a9643ea8Slogwang         _addr_ipv4  = key->_addr_ipv4;
398a9643ea8Slogwang         _net_port   = key->_net_port;
399a9643ea8Slogwang         _proto_type = key->_proto_type;
400a9643ea8Slogwang         _conn_type  = key->_conn_type;
401a9643ea8Slogwang     };
402a9643ea8Slogwang 
GetDestIP(uint32_t & ip,uint16_t & port)403a9643ea8Slogwang     void GetDestIP(uint32_t& ip, uint16_t& port) {
404a9643ea8Slogwang         ip = _addr_ipv4;
405a9643ea8Slogwang         port = _net_port;
406a9643ea8Slogwang     };
407a9643ea8Slogwang 
408a9643ea8Slogwang     virtual void timer_notify();
409a9643ea8Slogwang 
HashValue()410a9643ea8Slogwang     virtual uint32_t HashValue() {
411a9643ea8Slogwang         return _addr_ipv4 ^ (((uint32_t)_net_port << 16) | (_proto_type << 8) | _conn_type);
412a9643ea8Slogwang     };
413a9643ea8Slogwang 
HashCmp(HashKey * rhs)414a9643ea8Slogwang     virtual int HashCmp(HashKey* rhs) {
415a9643ea8Slogwang         CDestLinks* data = (CDestLinks*)(rhs);
416a9643ea8Slogwang         if (!data) {
417a9643ea8Slogwang             return -1;
418a9643ea8Slogwang         }
419a9643ea8Slogwang         if (this->_addr_ipv4 != data->_addr_ipv4) {
420a9643ea8Slogwang             return (this->_addr_ipv4 > data->_addr_ipv4) ?  1 : -1;
421a9643ea8Slogwang         }
422a9643ea8Slogwang         if (this->_net_port != data->_net_port) {
423a9643ea8Slogwang             return (this->_net_port > data->_net_port) ? 1 : -1;
424a9643ea8Slogwang         }
425a9643ea8Slogwang         if (this->_proto_type != data->_proto_type) {
426a9643ea8Slogwang             return (this->_proto_type > data->_proto_type) ? 1 : -1;
427a9643ea8Slogwang         }
428a9643ea8Slogwang         if (this->_conn_type != data->_conn_type) {
429a9643ea8Slogwang             return (this->_conn_type > data->_conn_type) ? 1 : -1;
430a9643ea8Slogwang         }
431a9643ea8Slogwang 
432a9643ea8Slogwang         return 0;
433a9643ea8Slogwang     };
434a9643ea8Slogwang 
SetDefaultCallback(CHECK_SESSION_CALLBACK function)435a9643ea8Slogwang     void SetDefaultCallback(CHECK_SESSION_CALLBACK function) {
436a9643ea8Slogwang         _dflt_callback = function;
437a9643ea8Slogwang     };
438a9643ea8Slogwang 
GetDefaultCallback()439a9643ea8Slogwang     CHECK_SESSION_CALLBACK GetDefaultCallback() {
440a9643ea8Slogwang         return _dflt_callback;
441a9643ea8Slogwang     };
442a9643ea8Slogwang 
443a9643ea8Slogwang     TAILQ_ENTRY(CDestLinks) _link_entry;
444a9643ea8Slogwang     uint64_t                _release_time;
445a9643ea8Slogwang 
446a9643ea8Slogwang private:
447a9643ea8Slogwang 
448*35a81399Slogwang     uint32_t            _timeout;
449*35a81399Slogwang     uint32_t            _addr_ipv4;
450*35a81399Slogwang     uint16_t            _net_port;
451*35a81399Slogwang     MT_PROTO_TYPE       _proto_type;
452*35a81399Slogwang     MT_CONN_TYPE        _conn_type;
453a9643ea8Slogwang 
454*35a81399Slogwang     uint32_t            _max_links;
455*35a81399Slogwang     uint32_t            _curr_link;
456*35a81399Slogwang     TLinkList           _sock_list;
457*35a81399Slogwang     CHECK_SESSION_CALLBACK _dflt_callback;
458a9643ea8Slogwang 
459a9643ea8Slogwang };
460*35a81399Slogwang typedef TAILQ_HEAD(__DestlinkList, CDestLinks) TDestList;
461*35a81399Slogwang typedef CRecyclePool<TDestList, CDestLinks>    TDestPool;
462a9643ea8Slogwang 
463a9643ea8Slogwang class CNetMgr
464a9643ea8Slogwang {
465a9643ea8Slogwang public:
466a9643ea8Slogwang 
467a9643ea8Slogwang     static CNetMgr* Instance (void);
468a9643ea8Slogwang 
469a9643ea8Slogwang     static void Destroy(void);
470a9643ea8Slogwang 
471a9643ea8Slogwang     CNetHandler* FindNetItem(CNetHandler* key);
472a9643ea8Slogwang 
473a9643ea8Slogwang     void InsertNetItem(CNetHandler* item);
474a9643ea8Slogwang 
475a9643ea8Slogwang     void RemoveNetItem(CNetHandler* item);
476a9643ea8Slogwang 
477a9643ea8Slogwang     CDestLinks* FindCreateDest(CDestLinks* key);
478a9643ea8Slogwang 
479a9643ea8Slogwang     void DeleteDestLink(CDestLinks* dst);
480a9643ea8Slogwang 
481a9643ea8Slogwang     CDestLinks* FindDestLink(CDestLinks* key);
482a9643ea8Slogwang 
483a9643ea8Slogwang     void InsertDestLink(CDestLinks* item);
484a9643ea8Slogwang 
485a9643ea8Slogwang     void RemoveDestLink(CDestLinks* item);
486a9643ea8Slogwang 
487a9643ea8Slogwang     ~CNetMgr();
488a9643ea8Slogwang 
489a9643ea8Slogwang     void RecycleObjs(uint64_t now);
490a9643ea8Slogwang 
AllocNetItem()491a9643ea8Slogwang     CNetHandler* AllocNetItem() {
492a9643ea8Slogwang         return _net_item_pool.AllocItem();
493a9643ea8Slogwang     };
494a9643ea8Slogwang 
FreeNetItem(CNetHandler * item)495a9643ea8Slogwang     void FreeNetItem(CNetHandler* item) {
496a9643ea8Slogwang         return _net_item_pool.FreeItem(item);
497a9643ea8Slogwang     };
498a9643ea8Slogwang 
AllocSockLink()499a9643ea8Slogwang     CSockLink* AllocSockLink() {
500a9643ea8Slogwang         return _sock_link_pool.AllocItem();
501a9643ea8Slogwang     };
502a9643ea8Slogwang 
FreeSockLink(CSockLink * item)503a9643ea8Slogwang     void FreeSockLink(CSockLink* item) {
504a9643ea8Slogwang         return _sock_link_pool.FreeItem(item);
505a9643ea8Slogwang     };
506a9643ea8Slogwang 
AllocDestLink()507a9643ea8Slogwang     CDestLinks* AllocDestLink() {
508a9643ea8Slogwang         return _dest_ip_pool.AllocItem();
509a9643ea8Slogwang     };
510a9643ea8Slogwang 
FreeDestLink(CDestLinks * item)511a9643ea8Slogwang     void FreeDestLink(CDestLinks* item) {
512a9643ea8Slogwang         return _dest_ip_pool.FreeItem(item);
513a9643ea8Slogwang     };
514a9643ea8Slogwang 
GetSkBuffMng(MT_PROTO_TYPE type)515a9643ea8Slogwang     TSkBuffMng* GetSkBuffMng(MT_PROTO_TYPE type) {
516a9643ea8Slogwang         if (type == NET_PROTO_TCP) {
517a9643ea8Slogwang             return &_tcp_pool;
518a9643ea8Slogwang         } else {
519a9643ea8Slogwang             return &_udp_pool;
520a9643ea8Slogwang         }
521a9643ea8Slogwang     };
522a9643ea8Slogwang 
523a9643ea8Slogwang 
524a9643ea8Slogwang private:
525a9643ea8Slogwang     CNetMgr();
526a9643ea8Slogwang 
527*35a81399Slogwang     static CNetMgr *    _instance;
528*35a81399Slogwang     HashList*           _ip_hash;
529*35a81399Slogwang     HashList*           _session_hash;
530*35a81399Slogwang     TSkBuffMng          _udp_pool;
531*35a81399Slogwang     TSkBuffMng          _tcp_pool;
532*35a81399Slogwang     TDestPool           _dest_ip_pool;
533*35a81399Slogwang     TLinkPool           _sock_link_pool;
534*35a81399Slogwang     TNetItemPool        _net_item_pool;
535a9643ea8Slogwang };
536a9643ea8Slogwang 
537a9643ea8Slogwang }
538a9643ea8Slogwang 
539a9643ea8Slogwang #endif
540a9643ea8Slogwang 
541a9643ea8Slogwang 
542