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