1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 #ifndef PVMF_SOCKET_NODE_H_INCLUDED 19 #define PVMF_SOCKET_NODE_H_INCLUDED 20 21 #ifndef OSCL_BASE_H_INCLUDED 22 #include "oscl_base.h" 23 #endif 24 #ifndef OSCLCONFIG_IO_H_INCLUDED 25 #include "osclconfig_io.h" 26 #endif 27 #ifndef OSCL_FILE_IO_H_INCLUDED 28 #include "oscl_file_io.h" 29 #endif 30 #ifndef OSCL_PRIQUEUE_H_INCLUDED 31 #include "oscl_priqueue.h" 32 #endif 33 #ifndef OSCL_SCHEDULER_AO_H_INCLUDED 34 #include "oscl_scheduler_ao.h" 35 #endif 36 #ifndef OSCL_SOCKET_TYPES_H_INCLUDED 37 #include "oscl_socket_types.h" 38 #endif 39 #ifndef OSCL_SOCKET_H_INCLUDED 40 #include "oscl_socket.h" 41 #endif 42 #ifndef OSCL_DNS_H_INCLUDED 43 #include "oscl_dns.h" 44 #endif 45 #include "oscl_tickcount.h" 46 #include "oscl_mem_mempool.h" 47 48 #ifndef PVMF_FORMAT_TYPE_H_INCLUDED 49 #include "pvmf_format_type.h" 50 #endif 51 #ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED 52 #include "pvmf_simple_media_buffer.h" 53 #endif 54 #ifndef PVMF_MEDIA_DATA_H_INCLUDED 55 #include "pvmf_media_data.h" 56 #endif 57 #ifndef PVMF_NODE_INTERFACE_H_INCLUDED 58 #include "pvmf_node_interface.h" 59 #endif 60 61 #ifndef PVMI_DATA_STREAM_INTERFACE_H_INCLUDED 62 #include "pvmi_data_stream_interface.h" 63 #endif 64 65 #include "pvmf_node_utils.h" 66 #include "pvmf_socket_port.h" 67 68 #ifndef PVMF_SOCKET_NODE_EXTENSION_INTERFACE_H_INCLUDED 69 #include "pvmf_socket_node_extension_interface.h" 70 #endif 71 72 #ifndef PVMF_SM_TUNABLES_H_INCLUDED 73 #include "pvmf_sm_tunables.h" 74 #endif 75 #ifndef PVMF_RESIZABLE_SIMPLE_MEDIAMSG_H_INCLUDED 76 #include "pvmf_resizable_simple_mediamsg.h" 77 #endif 78 #include "pvmf_socket_node_events.h" 79 #include "pvmf_media_frag_group.h" 80 81 //Enable socket node stats unless this is a release build. 82 #include "osclconfig.h" 83 #if(OSCL_RELEASE_BUILD) 84 #define ENABLE_SOCKET_NODE_STATS 0 85 #else 86 #define ENABLE_SOCKET_NODE_STATS 1 87 #endif 88 89 //Logger macros 90 #define PVMF_SOCKETNODE_LOGSTACKTRACE(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_STACK_TRACE,m); 91 #define PVMF_SOCKETNODE_LOGINFO(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_INFO,m); 92 #define PVMF_SOCKETNODE_LOGERROR(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_ERR,m); 93 #define PVMF_SOCKETNODE_LOGWARNING(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_WARNING,m); 94 #define PVMF_SOCKETNODE_LOGDATATRAFFIC_I(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iDataPathLogger,PVLOGMSG_INFO,m); 95 #define PVMF_SOCKETNODE_LOGDATATRAFFIC_E(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iDataPathLogger,PVLOGMSG_ERR,m); 96 #define PVMF_SOCKETNODE_LOGDATATRAFFIC_RTP(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iDataPathLoggerRTP,PVLOGMSG_INFO,m); 97 #define PVMF_SOCKETNODE_LOGDATATRAFFIC_RTCP(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iDataPathLoggerRTCP,PVLOGMSG_INFO,m); 98 99 //memory allocator type for this node. 100 typedef OsclMemAllocator PVMFSocketNodeAllocator; 101 102 //Node command type. 103 typedef PVMFGenericNodeCommand<PVMFSocketNodeAllocator> PVMFSocketNodeCommandBase; 104 class PVMFSocketNodeCommand: public PVMFSocketNodeCommandBase 105 { 106 public: 107 108 }; 109 110 //Default vector reserve size 111 #define PVMF_SOCKET_NODE_COMMAND_VECTOR_RESERVE 10 112 113 //Starting value for command IDs 114 #define PVMF_SOCKET_NODE_COMMAND_ID_START 6000 115 116 class PVLogger; 117 class PVMFSocketPort; 118 119 /** 120 * Mem pool class 121 */ 122 class PVMFSocketNodeMemPool 123 { 124 public: 125 PVMFSocketNodeMemPool(uint32 aMemPoolNumBufs = DEFAULT_NUM_MEDIA_MSGS_IN_JITTER_BUFFER); 126 ~PVMFSocketNodeMemPool()127 virtual ~PVMFSocketNodeMemPool() 128 { 129 if (iMediaDataMemPool != NULL) 130 { 131 iMediaDataMemPool->removeRef(); 132 iMediaDataMemPool = NULL; 133 } 134 }; 135 getMediaDataImpl(uint32 size)136 OsclSharedPtr<PVMFMediaDataImpl> getMediaDataImpl(uint32 size) 137 { 138 OsclSharedPtr<PVMFMediaDataImpl> mediaImpl = iMediaMsgAllocator->allocate(size); 139 return mediaImpl; 140 } 141 resizeSocketDataBuffer(OsclSharedPtr<PVMFMediaDataImpl> & aSharedBuffer)142 void resizeSocketDataBuffer(OsclSharedPtr<PVMFMediaDataImpl>& aSharedBuffer) 143 { 144 if (iMediaMsgAllocator != NULL) 145 { 146 iMediaMsgAllocator->ResizeMemoryFragment(aSharedBuffer); 147 } 148 } 149 150 void CreateAllocators(const OSCL_HeapString<OsclMemAllocator>& iMime, uint32 aSize, uint32 aExpectedNumberOfBlocksPerBuffer, uint32 aResizeSize, uint32 aMaxNumResizes); 151 OsclMemPoolResizableAllocator* CreateResizableDataBufferAllocator(const char* allocatorName); 152 void CreateDefaultDataBufferAllocator(const char* allocatorName); 153 void CreateUDPMultipleRecvAllocator(); 154 155 uint32 GetMaxSizeMediaMsgLen(); 156 157 void DestroyAllocators(); 158 void DestroyUDPMultipleRecvAllocator(); 159 160 class SharedDataBufferInfo 161 { 162 public: SharedDataBufferInfo()163 SharedDataBufferInfo(): iSize(0), iResizeSize(0), iMaxNumResizes(0), iExpectedNumberOfBlocksPerBuffer(0) {} Init(uint32 aSize,uint32 aExpectedNumberOfBlocksPerBuffer,uint32 aResizeSize,uint32 aMaxNumResizes)164 void Init(uint32 aSize, uint32 aExpectedNumberOfBlocksPerBuffer, uint32 aResizeSize, uint32 aMaxNumResizes) 165 { 166 iSize = aSize; 167 iResizeSize = aResizeSize; 168 iMaxNumResizes = aMaxNumResizes; 169 iExpectedNumberOfBlocksPerBuffer = aExpectedNumberOfBlocksPerBuffer; 170 } 171 uint32 iSize; 172 uint32 iResizeSize; 173 uint32 iMaxNumResizes; 174 uint32 iExpectedNumberOfBlocksPerBuffer; 175 }; 176 SharedDataBufferInfo iSharedDataBufferInfo; 177 // Memory pool for media data objects 178 OsclMemPoolFixedChunkAllocator* iMediaDataMemPool; 179 180 // Allocators for persisting the data received from the server (on all the ports) are created in respective SocketConfig. 181 //For UDP [RTSP Based Streaming], allocators will be created before connection of port to its peer completes. 182 //For TCP [MSHTTP Streaming], size of the memory pool for Data is determined only after receiving ASF header from the streaming server 183 //therefore, to persist the response of the Server before completion of receiving the ASF header, an internal shared buffer allocator is created. 184 PVMFResizableSimpleMediaMsgAlloc* iMediaMsgAllocator; 185 OsclMemPoolResizableAllocator* iSharedBufferAlloc; 186 OsclMemPoolResizableAllocator* iInternalAlloc;//[MSHTTP Streaming Specific specific] 187 188 // Allocator for multiple receives[ for UDP only, will be created and used only when SNODE_ENABLE_UDP_MULTI_PACKET is defined]. 189 PVMFMediaFragGroupCombinedAlloc<PVMFSocketNodeAllocator>* iMediaFragGroupAlloc; 190 OsclMemPoolFixedChunkAllocator* iMediaFragGroupAllocMempool; 191 192 int32 iPortTag; 193 }; 194 195 /* 196 ** Socket address structure 197 */ 198 199 enum PROTOCOL 200 { 201 INVALID_PROTOCOL, 202 INET_TCP, 203 INET_UDP 204 }; 205 206 struct SOCKET_ADDR 207 { 208 PROTOCOL iProtocol; 209 210 OsclNetworkAddress iLocalAdd; 211 OsclNetworkAddress iRemoteAdd; 212 213 OSCL_HeapString<PVMFSocketNodeAllocator> iRemoteHost; //could be either DNS or ip address 214 215 //each socket maps to a port, hence a port tag is needed for unique identification 216 int32 iTag; 217 }; 218 219 class PVMFSocketNode; 220 221 /* 222 ** Socket activity class is used to save Oscl socket or DNS results 223 */ 224 class PVMFSocketActivity 225 { 226 public: PVMFSocketActivity()227 PVMFSocketActivity(): iValid(false) 228 { 229 } PVMFSocketActivity(PVMFStatus aStatus,int32 aId,int32 aFxn,int32 aEvent,int32 aError)230 PVMFSocketActivity(PVMFStatus aStatus, int32 aId, int32 aFxn, int32 aEvent, int32 aError) 231 { 232 Set(aStatus, aId, aFxn, aEvent, aError); 233 } Set(PVMFStatus aStatus,int32 aId,int32 aFxn,int32 aEvent,int32 aError)234 void Set(PVMFStatus aStatus, int32 aId, int32 aFxn, int32 aEvent, int32 aError) 235 { 236 iValid = true; 237 iStatus = aStatus; 238 iId = aId; 239 iFxn = aFxn; 240 iEvent = aEvent; 241 iError = aError; 242 } 243 bool iValid; 244 PVMFStatus iStatus; 245 int32 iId; 246 int32 iFxn; 247 int32 iEvent; 248 int32 iError; 249 250 private: 251 252 }; 253 254 255 /* 256 ** The Socket port state keeps track of the Connect, Receive, and Send operations on 257 ** a port, including wait states. Note there may be simultaneous send & receive on 258 ** a port, so it is necessary to keep separate status. Connect operations cannot 259 ** be concurrent with either send or receive operations, but for simplicity, the 260 ** connect status is also maintained separately. 261 ** 262 ** The port state also contains information about sequences of operations. 263 */ 264 265 //Individual asynchronous operations and wait states that make up a connect or 266 //disconnect sequence. 267 enum TPVSocketPortConnectOperation 268 { 269 EPVSocketPortConnectOperation_None 270 , EPVSocketPortConnectOperation_GetHostByName 271 , EPVSocketPortConnectOperation_Connect 272 , EPVSocketPortConnectOperation_Shutdown 273 , EPVSocketPortConnectOperation_WaitOnConnectedPort //for sending EOS during disconnect. 274 , EPVSocketPortConnectOperation_WaitOnSendRecvIdle //for shutdown & cleanup. 275 , EPVSocketPortConnectOperation_Last 276 }; 277 278 //Individual asynchronous operations and wait states that make up a send sequence. 279 enum TPVSocketPortSendOperation 280 { 281 EPVSocketPortSendOperation_None 282 , EPVSocketPortSendOperation_Send 283 , EPVSocketPortSendOperation_SendTo 284 , EPVSocketPortSendOperation_Last 285 }; 286 287 //Individual asynchronous operations and wait states that make up a receive sequence. 288 enum TPVSocketPortRecvOperation 289 { 290 EPVSocketPortRecvOperation_None 291 , EPVSocketPortRecvOperation_Recv 292 , EPVSocketPortRecvOperation_RecvFrom 293 , EPVSocketPortRecvOperation_WaitOnConnectedPort 294 , EPVSocketPortRecvOperation_WaitOnMemory 295 , EPVSocketPortRecvOperation_Last 296 }; 297 298 //Sequences that may require multiple asynchronous operations 299 //and/or wait states. There can only be one of these sequences active 300 //on a port at a time. For definitions of the operations that make 301 //up these sequences, please see the comments in the StartSequence 302 //implementation. 303 enum TPVSocketPortSequence 304 { 305 EPVSocketPortSequence_None 306 , EPVSocketPortSequence_RequestPort 307 , EPVSocketPortSequence_InputConnectMsg 308 , EPVSocketPortSequence_InputDataMsg 309 , EPVSocketPortSequence_InputDisconnectMsg 310 , EPVSocketPortSequence_SocketCleanup 311 , EPVSocketPortSequence_Last 312 }; 313 314 class SocketNodePortStats; 315 316 class SocketPortState 317 { 318 public: SocketPortState()319 SocketPortState(): iSequence(EPVSocketPortSequence_None) 320 , iSequenceStatus(PVMFSuccess) 321 , iConnectOperation(EPVSocketPortConnectOperation_None) 322 , iConnectOperationStatus(PVMFSuccess) 323 , iConnectOperationCanceled(false) 324 , iSendOperation(EPVSocketPortSendOperation_None) 325 , iSendOperationStatus(PVMFSuccess) 326 , iSendOperationCanceled(false) 327 , iRecvOperation(EPVSocketPortRecvOperation_None) 328 , iRecvOperationStatus(PVMFSuccess) 329 , iRecvOperationCanceled(false) 330 {} 331 332 TPVSocketPortSequence iSequence; 333 PVMFStatus iSequenceStatus; 334 335 TPVSocketPortConnectOperation iConnectOperation; 336 PVMFStatus iConnectOperationStatus; 337 bool iConnectOperationCanceled; 338 339 TPVSocketPortSendOperation iSendOperation; 340 PVMFStatus iSendOperationStatus; 341 bool iSendOperationCanceled; 342 343 TPVSocketPortRecvOperation iRecvOperation; 344 PVMFStatus iRecvOperationStatus; 345 bool iRecvOperationCanceled; 346 }; 347 348 #if(ENABLE_SOCKET_NODE_STATS) 349 /* 350 ** SocketNodeStats and SocketNodePortStats are used for tracking performance 351 ** of socket node. 352 */ 353 354 //SocketNodePortStats contains all data that is maintained on a per-port basis. 355 class SocketNodePortStats 356 { 357 public: SocketNodePortStats()358 SocketNodePortStats() 359 { 360 oscl_memset(this, 0, sizeof(SocketNodePortStats)); 361 } 362 //port events. 363 uint32 iNumPortEventConnectedPortReady; 364 uint32 iNumPortEventConnect; 365 uint32 iNumPortEventIncomingMsg; 366 367 //incoming messages 368 uint32 iNumDequeueIncomingConnectMsg; 369 uint32 iNumDequeueIncomingDisconnectMsg; 370 uint32 iNumDequeueIncomingDataMsg; 371 372 //outgoing messages 373 uint32 iNumQueueOutgoingUDPMsg; 374 uint32 iNumQueueOutgoingTCPMsg; 375 uint32 iNumQueueOutgoingEOSMsg; 376 377 //socket receive results that had to be queued while 378 //waiting on connected port 379 uint32 iNumQueueSocketRecv; 380 381 //number of times wait states were entered. 382 uint32 iNumWaitOnMemory; 383 uint32 iNumWaitOnConnectedPort; 384 uint32 iNumWaitOnSendRecvIdle; 385 386 //memory pool callbacks. 387 uint32 iNumFreeChunkCallback; 388 389 //Oscl socket & OScl DNS callbacks 390 uint32 iNumSocketCallback; 391 uint32 iNumDNSCallback; 392 393 //number of Oscl socket and Oscl DNS calls. 394 uint32 iNumSend; 395 uint32 iNumSendTo; 396 uint32 iNumRecv; 397 uint32 iNumRecvFrom; 398 uint32 iNumRecvFromPackets; 399 uint32 iMaxRecvFromPackets; 400 uint32 iNumGetHostByName; 401 uint32 iNumConnect; 402 uint32 iNumShutdown; 403 404 //Latency times through this node. 405 uint32 iMaxConnectOperationTime[EPVSocketPortConnectOperation_Last]; 406 uint32 iMaxSendOperationTime[EPVSocketPortSendOperation_Last]; 407 uint32 iMaxRecvOperationTime[EPVSocketPortRecvOperation_Last]; 408 409 uint32 iConnectOperationTime[EPVSocketPortConnectOperation_Last]; 410 uint32 iSendOperationTime[EPVSocketPortSendOperation_Last]; 411 uint32 iRecvOperationTime[EPVSocketPortRecvOperation_Last]; 412 StartConnectTime(TPVSocketPortConnectOperation aOp)413 void StartConnectTime(TPVSocketPortConnectOperation aOp) 414 { 415 iConnectOperationTime[aOp] = OsclTickCount::TicksToMsec(OsclTickCount::TickCount()); 416 } EndConnectTime(TPVSocketPortConnectOperation aOp)417 void EndConnectTime(TPVSocketPortConnectOperation aOp) 418 { 419 uint32 delta = OsclTickCount::TicksToMsec(OsclTickCount::TickCount()) - iConnectOperationTime[aOp]; 420 if (delta > iMaxConnectOperationTime[aOp]) 421 iMaxConnectOperationTime[aOp] = delta; 422 } StartRecvTime(TPVSocketPortRecvOperation aOp)423 void StartRecvTime(TPVSocketPortRecvOperation aOp) 424 { 425 iRecvOperationTime[aOp] = OsclTickCount::TicksToMsec(OsclTickCount::TickCount()); 426 } EndRecvTime(TPVSocketPortRecvOperation aOp)427 void EndRecvTime(TPVSocketPortRecvOperation aOp) 428 { 429 uint32 delta = OsclTickCount::TicksToMsec(OsclTickCount::TickCount()) - iRecvOperationTime[aOp]; 430 if (delta > iMaxRecvOperationTime[aOp]) 431 iMaxRecvOperationTime[aOp] = delta; 432 } StartSendTime(TPVSocketPortSendOperation aOp)433 void StartSendTime(TPVSocketPortSendOperation aOp) 434 { 435 iSendOperationTime[aOp] = OsclTickCount::TicksToMsec(OsclTickCount::TickCount()); 436 } EndSendTime(TPVSocketPortSendOperation aOp)437 void EndSendTime(TPVSocketPortSendOperation aOp) 438 { 439 uint32 delta = OsclTickCount::TicksToMsec(OsclTickCount::TickCount()) - iSendOperationTime[aOp]; 440 if (delta > iMaxSendOperationTime[aOp]) 441 iMaxSendOperationTime[aOp] = delta; 442 } Log(PVLogger * iLogger,OSCL_String & aMime)443 void Log(PVLogger* iLogger, OSCL_String& aMime) 444 { 445 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 446 (0, "SocketNodeStats:PORT '%s'", aMime.get_cstr())); 447 448 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 449 (0, "SocketNodeStats: %8d Num PortEventConnectedPortReady", iNumPortEventConnectedPortReady)); 450 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 451 (0, "SocketNodeStats: %8d Num PortEventConnect", iNumPortEventConnect)); 452 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 453 (0, "SocketNodeStats: %8d Num PortEventIncomingMsg", iNumPortEventIncomingMsg)); 454 455 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 456 (0, "SocketNodeStats: %8d Num DequeueIncomingConnectMsg", iNumDequeueIncomingConnectMsg)); 457 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 458 (0, "SocketNodeStats: %8d Num DequeueIncomingDisconnectMsg", iNumDequeueIncomingDisconnectMsg)); 459 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 460 (0, "SocketNodeStats: %8d Num DequeueIncomingDataMsg", iNumDequeueIncomingDataMsg)); 461 462 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 463 (0, "SocketNodeStats: %8d Num QueueOutgoingUDPMsg", iNumQueueOutgoingUDPMsg)); 464 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 465 (0, "SocketNodeStats: %8d Num QueueOutgoingTCPMsg", iNumQueueOutgoingTCPMsg)); 466 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 467 (0, "SocketNodeStats: %8d Num QueueOutgoingEOSMsg", iNumQueueOutgoingEOSMsg)); 468 469 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 470 (0, "SocketNodeStats: %8d Num QueueSocketRecv", iNumQueueSocketRecv)); 471 472 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 473 (0, "SocketNodeStats: %8d Num WaitOnMemory", iNumWaitOnMemory)); 474 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 475 (0, "SocketNodeStats: %8d Num WaitOnConnectedPort", iNumWaitOnConnectedPort)); 476 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 477 (0, "SocketNodeStats: %8d Num WaitOnSendRecvIdle", iNumWaitOnSendRecvIdle)); 478 479 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 480 (0, "SocketNodeStats: %8d Num FreeChunkCallback", iNumFreeChunkCallback)); 481 482 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 483 (0, "SocketNodeStats: %8d Num SocketCallback", iNumSocketCallback)); 484 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 485 (0, "SocketNodeStats: %8d Num DNSCallback", iNumDNSCallback)); 486 487 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 488 (0, "SocketNodeStats: %8d Num Send", iNumSend)); 489 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 490 (0, "SocketNodeStats: %8d Num SendTo", iNumSendTo)); 491 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 492 (0, "SocketNodeStats: %8d Num Recv", iNumRecv)); 493 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 494 (0, "SocketNodeStats: %8d Num RecvFrom", iNumRecvFrom)); 495 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 496 (0, "SocketNodeStats: %8d Num RecvFrom Packets", iNumRecvFromPackets)); 497 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 498 (0, "SocketNodeStats: %8d Max RecvFrom Packets", iMaxRecvFromPackets)); 499 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 500 (0, "SocketNodeStats: %8d Num GetHostByName", iNumGetHostByName)); 501 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 502 (0, "SocketNodeStats: %8d Num Connect", iNumConnect)); 503 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 504 (0, "SocketNodeStats: %8d Num Shutdown", iNumShutdown)); 505 506 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 507 (0, "SocketNodeStats: %8d Max Connect GetHostByName Time (msec)", iMaxConnectOperationTime[EPVSocketPortConnectOperation_GetHostByName])); 508 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 509 (0, "SocketNodeStats: %8d Max Connect Time (msec)", iMaxConnectOperationTime[EPVSocketPortConnectOperation_Connect])); 510 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 511 (0, "SocketNodeStats: %8d Max Connect Shutdown Time (msec)", iMaxConnectOperationTime[EPVSocketPortConnectOperation_Shutdown])); 512 513 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 514 (0, "SocketNodeStats: %8d Max Send Time (msec)", iMaxSendOperationTime[EPVSocketPortSendOperation_Send])); 515 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 516 (0, "SocketNodeStats: %8d Max SendTo Time (msec)", iMaxSendOperationTime[EPVSocketPortSendOperation_SendTo])); 517 518 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 519 (0, "SocketNodeStats: %8d Max Recv Time (msec)", iMaxRecvOperationTime[EPVSocketPortRecvOperation_Recv])); 520 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 521 (0, "SocketNodeStats: %8d Max RecvFrom Time (msec)", iMaxRecvOperationTime[EPVSocketPortRecvOperation_RecvFrom])); 522 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 523 (0, "SocketNodeStats: %8d Max Recv Wait On Connected Port Time (msec)", iMaxRecvOperationTime[EPVSocketPortRecvOperation_WaitOnConnectedPort])); 524 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 525 (0, "SocketNodeStats: %8d Max Recv Wait On Memory Time (msec)", iMaxRecvOperationTime[EPVSocketPortRecvOperation_WaitOnMemory])); 526 527 PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_ERR, 528 (0, "SocketNodeStats:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")); 529 } 530 }; 531 532 //SocketNodeStats contains all data that is maintained on a per-node basis. 533 class SocketNodeStats 534 { 535 public: SocketNodeStats()536 SocketNodeStats() 537 { 538 oscl_memset(this, 0, sizeof(SocketNodeStats)); 539 } 540 541 PVLogger* iLogger; 542 bool iLogged; Init()543 void Init() 544 { 545 iLogged = false; 546 iLogger = PVLogger::GetLoggerObject("pvplayerdiagnostics.socketnode"); 547 } Logoff()548 void Logoff() 549 { 550 iLogger = NULL; 551 } 552 553 //Run calls 554 uint32 iNumRun; 555 556 //Node cmds. 557 uint32 iNumQueueNodeCmd; 558 559 //Number of UDP bind operations. 560 uint32 iNumBind; 561 562 void Log(PVMFPortVector<PVMFSocketPort, PVMFSocketNodeAllocator>& aPortVec); 563 }; 564 #endif 565 566 /* 567 ** SocketPortConfig contains all the information associated with a port including 568 ** the Oscl socket, memory pool, and status. 569 */ 570 class SocketPortConfig : public OsclMemPoolFixedChunkAllocatorObserver, public OsclMemPoolResizableAllocatorObserver 571 { 572 public: SocketPortConfig()573 SocketPortConfig() 574 { 575 iPVMFPort = NULL; 576 iSockId = 0; 577 iUDPSocket = NULL; 578 iTCPSocket = NULL; 579 iDNS = NULL; 580 iMemPool = NULL; 581 iContainer = NULL; 582 iTag = PVMF_SOCKET_NODE_PORT_TYPE_UNKNOWN; 583 iRTP = false; 584 iRTCP = false; 585 }; 586 void CleanupMemPools(Oscl_DefAlloc& aAlloc); 587 void CreateAllocators(uint32 aSize, uint32 aExpectedNumberOfBlocksPerBuffer, uint32 aResizeSize, uint32 aMaxNumResizes); 588 589 void freechunkavailable(OsclAny* aContextData); 590 void freeblockavailable(OsclAny* aContextData); 591 592 SocketPortState iState; 593 594 PVMFSocketPort *iPVMFPort; 595 SOCKET_ADDR iAddr; 596 uint32 iSockId; 597 OsclUDPSocket* iUDPSocket; 598 OsclTCPSocket* iTCPSocket; 599 OsclDNS *iDNS; 600 OsclNetworkAddress iSourceAddr;//arg for recv from calls. 601 Oscl_Vector<uint32, OsclMemAllocator> iRecvFromPacketLen;//arg for recv from calls. 602 603 //socket pending request and state 604 PVMFSharedMediaDataPtr iPendingRecvMediaData, iPendingSendMediaData; 605 606 //Fixed chunk memory pool for media messages 607 PVMFSocketNodeMemPool *iMemPool; 608 609 PVMFSocketNode* iContainer; 610 int32 iTag; 611 612 PVMFSocketActivity iSocketRecvActivity; 613 614 OSCL_HeapString<OsclMemAllocator> iMime; 615 bool iRTP; 616 bool iRTCP; 617 618 #if(ENABLE_SOCKET_NODE_STATS) 619 SocketNodePortStats iPortStats; 620 #endif 621 }; 622 623 /* 624 ** DnsCache is used to cache DNS lookup results to avoid unnecessary lookups of a previously 625 ** used host. 626 */ 627 class PVMFDnsCache 628 { 629 public: iNumOfRecords(aNumOfRecords)630 PVMFDnsCache(uint32 aNumOfRecords = 4): iNumOfRecords(aNumOfRecords), iAddrIP(NULL), iAddrDNS(NULL) 631 { 632 }; ~PVMFDnsCache()633 ~PVMFDnsCache() 634 { 635 for (uint32 i = 0; i < iNumOfRecords; i++) 636 { 637 if (iAddrDNS) 638 { 639 if (NULL != iAddrDNS[i]) 640 { 641 OSCL_ARRAY_DELETE(iAddrDNS[i]); 642 iAddrDNS[i] = NULL; 643 } 644 } 645 if (iAddrIP) 646 { 647 if (NULL != iAddrIP[i]) 648 { 649 OSCL_ARRAY_DELETE(iAddrIP[i]); 650 iAddrIP[i] = NULL; 651 } 652 } 653 } 654 OSCL_ARRAY_DELETE(iAddrIP); 655 OSCL_ARRAY_DELETE(iAddrDNS); 656 } NewL(void)657 void NewL(void) 658 { 659 iAddrIP = OSCL_ARRAY_NEW(char*, iNumOfRecords); 660 iAddrDNS = OSCL_ARRAY_NEW(char*, iNumOfRecords); 661 if ((NULL == iAddrIP) || (NULL == iAddrIP)) 662 { 663 OSCL_ARRAY_DELETE(iAddrIP); 664 OSCL_ARRAY_DELETE(iAddrDNS); 665 OSCL_LEAVE(OsclErrNoMemory); 666 } 667 for (uint32 i = 0; i < iNumOfRecords; i++) 668 iAddrDNS[i] = iAddrIP[i] = NULL; 669 }; 670 671 //if name is not in record, add one; if it does, update it UpdateCacheRecord(char * name,char * ipAddr)672 bool UpdateCacheRecord(char *name, char *ipAddr) 673 { 674 for (uint32 i = 0; i < iNumOfRecords; i++) 675 { 676 if (NULL == iAddrDNS[i]) 677 {//new record 678 int32 tmpLen = oscl_strlen(name); 679 iAddrDNS[i] = OSCL_ARRAY_NEW(char, tmpLen + 4); 680 oscl_strncpy(iAddrDNS[i], name, tmpLen + 2); 681 iAddrIP[i] = OSCL_ARRAY_NEW(char, 32); 682 oscl_strncpy(iAddrIP[i], ipAddr, 30); 683 return true; 684 } 685 if (0 == oscl_strcmp(iAddrDNS[i], name)) 686 {//update record 687 if (oscl_strlen(ipAddr) + 1 > 32) 688 { 689 return false; 690 } 691 oscl_strncpy(iAddrIP[i], ipAddr, 30); 692 return true; 693 } 694 } 695 return false; 696 } 697 //find the ip address corresponds to name. len is the size of ipAddr bufferr QueryGetHostByName(const char * name,char * ipAddr,const uint32 len)698 bool QueryGetHostByName(const char *name, char *ipAddr, const uint32 len) 699 { 700 for (uint32 i = 0; i < iNumOfRecords; i++) 701 { 702 if (NULL == iAddrDNS[i]) 703 return false; 704 if (0 == oscl_strcmp(iAddrDNS[i], name)) 705 { 706 if (oscl_strlen(iAddrIP[i]) + 1 > len) 707 { 708 return false; 709 } 710 oscl_strncpy(ipAddr, iAddrIP[i], 30); 711 return true; 712 } 713 } 714 return false; 715 } 716 private: 717 uint32 iNumOfRecords; 718 char** iAddrIP; 719 char** iAddrDNS; 720 }; 721 722 /* 723 ** Memory pool sizes. 724 */ 725 #define SIMPLE_MEDIA_BUF_CLASS_SIZE 128 /*oscl_mem_aligned_size(sizeof(PVMFSimpleMediaBuffer) + oscl_mem_aligned_size(sizeof(OsclRefCounterSA<SimpleMediaBufferCombinedCleanupSA>)*/ 726 #define MEDIA_DATA_CLASS_SIZE 128 /*oscl_mem_aligned_size(sizeof(PVMFMediaData)) + oscl_mem_aligned_size(sizeof(OsclRefCounterDA)) + oscl_mem_aligned_size(sizeof(MediaDataCleanupDA)) + sizeof(PVMFMediaMsgHeader))*/ 727 728 /* 729 ** The Socket Node 730 */ 731 class PVMFSocketNode 732 : public PVInterface 733 , public PVMFNodeInterface 734 , public OsclActiveObject 735 , public OsclSocketObserver 736 , public OsclDNSObserver 737 { 738 public: 739 OSCL_IMPORT_REF PVMFSocketNode(int32 aPriority); 740 OSCL_IMPORT_REF ~PVMFSocketNode(); 741 742 //************ begin OsclSocketObserver 743 OSCL_IMPORT_REF void HandleSocketEvent(int32 aId, TPVSocketFxn aFxn, TPVSocketEvent aEvent, int32 aError); 744 //************ end OsclSocketObserver 745 746 //************ begin OsclDNSObserver 747 OSCL_IMPORT_REF void HandleDNSEvent(int32 aId, TPVDNSFxn aFxn, TPVDNSEvent aEvent, int32 aError); 748 //************ end OsclDNSObserver 749 750 //from PVMFNodeInterface 751 OSCL_IMPORT_REF PVMFStatus ThreadLogon(); 752 OSCL_IMPORT_REF PVMFStatus ThreadLogoff(); 753 OSCL_IMPORT_REF PVMFStatus GetCapability(PVMFNodeCapability& aNodeCapability); 754 OSCL_IMPORT_REF PVMFPortIter* GetPorts(const PVMFPortFilter* aFilter = NULL); 755 OSCL_IMPORT_REF PVMFCommandId QueryUUID(PVMFSessionId, const PvmfMimeString& aMimeType, 756 Oscl_Vector<PVUuid, PVMFSocketNodeAllocator>& aUuids, 757 bool aExactUuidsOnly = false, 758 const OsclAny* aContext = NULL); 759 OSCL_IMPORT_REF PVMFCommandId QueryInterface(PVMFSessionId, const PVUuid& aUuid, 760 PVInterface*& aInterfacePtr, 761 const OsclAny* aContext = NULL); 762 763 OSCL_IMPORT_REF PVMFCommandId RequestPort(PVMFSessionId aSession 764 , int32 aPortTag 765 , const PvmfMimeString* aPortConfig = NULL 766 , const OsclAny* aContext = NULL); 767 768 OSCL_IMPORT_REF PVMFCommandId ReleasePort(PVMFSessionId, PVMFPortInterface& aPort, const OsclAny* aContext = NULL); 769 OSCL_IMPORT_REF PVMFCommandId Init(PVMFSessionId, const OsclAny* aContext = NULL); 770 OSCL_IMPORT_REF PVMFCommandId Prepare(PVMFSessionId, const OsclAny* aContext = NULL); 771 OSCL_IMPORT_REF PVMFCommandId Start(PVMFSessionId, const OsclAny* aContext = NULL); 772 OSCL_IMPORT_REF PVMFCommandId Stop(PVMFSessionId, const OsclAny* aContext = NULL); 773 OSCL_IMPORT_REF PVMFCommandId Flush(PVMFSessionId, const OsclAny* aContext = NULL); 774 OSCL_IMPORT_REF PVMFCommandId Pause(PVMFSessionId, const OsclAny* aContext = NULL); 775 OSCL_IMPORT_REF PVMFCommandId Reset(PVMFSessionId, const OsclAny* aContext = NULL); 776 OSCL_IMPORT_REF PVMFCommandId CancelAllCommands(PVMFSessionId, const OsclAny* aContextData = NULL); 777 OSCL_IMPORT_REF PVMFCommandId CancelCommand(PVMFSessionId, PVMFCommandId aCmdId, const OsclAny* aContextData = NULL); 778 779 //from PVMFPortActivityHandler 780 void HandlePortActivity(const PVMFPortActivity& aActivity); 781 782 //These are some extra APIs that are used by Streaming Manager and are unique to socket node. 783 OSCL_IMPORT_REF bool GetPortConfig(PVMFPortInterface &aPort, OsclNetworkAddress &aLocalAdd, OsclNetworkAddress &aRemoteAdd); 784 OSCL_IMPORT_REF bool SetPortConfig(PVMFPortInterface &aPort, OsclNetworkAddress aLocalAdd, OsclNetworkAddress aRemoteAdd); 785 addRef()786 virtual void addRef() 787 { 788 } 789 removeRef()790 virtual void removeRef() 791 { 792 } 793 794 virtual bool queryInterface(const PVUuid& uuid, PVInterface*& iface); 795 796 //**********begin PVMFSocketNodeExtensionInterface 797 PVMFStatus AllocateConsecutivePorts(PvmfMimeString* aPortConfig, 798 uint32& aLowerPortNum, 799 uint32& aHigherPortNum, uint32& aStartPortNum); 800 OSCL_IMPORT_REF PVMFStatus SetMaxTCPRecvBufferSize(uint32 aBufferSize); 801 OSCL_IMPORT_REF PVMFStatus GetMaxTCPRecvBufferSize(uint32& aSize); 802 OSCL_IMPORT_REF PVMFStatus SetMaxTCPRecvBufferCount(uint32 aBufferSize); 803 OSCL_IMPORT_REF PVMFStatus GetMaxTCPRecvBufferCount(uint32& aSize); 804 OsclMemPoolResizableAllocator* CreateSharedBuffer(const PVMFPortInterface* aPort , uint32 aBufferSize, uint32 aExpectedNumberOfBlocksPerBuffer, uint32 aResizeSize, uint32 aMaxNumResizes); 805 //**********end PVMFSocketNodeExtensionInterface 806 807 private: 808 friend class SocketPortConfig; 809 810 //from OsclActiveObject 811 void Run(); 812 813 /********************************************* 814 * Command Processing and Event Notification 815 **********************************************/ 816 //Command queue type 817 typedef PVMFNodeCommandQueue<PVMFSocketNodeCommand, PVMFSocketNodeAllocator> PVMFSocketNodeCmdQ; 818 819 PVMFSocketNodeCmdQ iPendingCmdQueue; 820 PVMFSocketNodeCmdQ iCurrentCmdQueue; 821 PVMFSocketNodeCmdQ iCancelCmdQueue; 822 823 void MoveCmdToCancelQueue(PVMFSocketNodeCommand& aCmd); 824 825 void CommandComplete(PVMFSocketNodeCmdQ&, 826 PVMFSocketNodeCommand&, 827 PVMFStatus, 828 OsclAny* aData = NULL, 829 PVUuid* aEventUUID = NULL, 830 int32* aEventCode = NULL); 831 832 void ReportErrorEvent(PVMFEventType aEventType, 833 OsclAny* aEventData = NULL, 834 PVUuid* aEventUUID = NULL, 835 int32* aEventCode = NULL); 836 837 void ReportInfoEvent(PVMFEventType aEventType, 838 OsclAny* aEventData = NULL, 839 PVUuid* aEventUUID = NULL, 840 int32* aEventCode = NULL); 841 842 PVMFCommandId QueueCommandL(PVMFSocketNodeCommand& aCmd); 843 844 bool CanProcessCommand(); 845 void ProcessCommand(PVMFSocketNodeCmdQ& aCmdQ, PVMFSocketNodeCommand&); 846 847 //Command handlers. 848 PVMFStatus DoRequestPort(PVMFSocketNodeCommand& aCmd, PVMFSocketPort* &port); 849 PVMFStatus DoReset(PVMFSocketNodeCommand&); 850 PVMFStatus DoQueryUuid(PVMFSocketNodeCommand&); 851 PVMFStatus DoQueryInterface(PVMFSocketNodeCommand&); 852 PVMFStatus DoReleasePort(PVMFSocketNodeCommand&); 853 PVMFStatus DoInit(PVMFSocketNodeCommand&); 854 PVMFStatus DoPrepare(PVMFSocketNodeCommand&); 855 PVMFStatus DoStart(PVMFSocketNodeCommand&); 856 PVMFStatus DoStop(PVMFSocketNodeCommand&); 857 PVMFStatus DoFlush(PVMFSocketNodeCommand&); 858 PVMFStatus DoPause(PVMFSocketNodeCommand&); 859 PVMFStatus DoCancelAllCommands(PVMFSocketNodeCommand&); 860 PVMFStatus DoCancelCommand(PVMFSocketNodeCommand&); 861 862 PVMFStatus DoCancelCurrentCommand(PVMFSocketNodeCmdQ& aCmdQ, PVMFSocketNodeCommand& aCmd); 863 PVMFStatus DoStopNodeActivity(); 864 int32 SocketPlacementNew(PVMFSocketNodeMemPool*&, OsclAny*, int32); 865 int32 CreateMediaData(SocketPortConfig&, OsclSharedPtr<PVMFMediaDataImpl>&); 866 int32 Allocate(SocketPortConfig&, OsclSharedPtr<PVMFMediaDataImpl>&); 867 int32 GetMediaDataImpl(SocketPortConfig&, OsclSharedPtr<PVMFMediaDataImpl>&, int32); 868 869 PVMFSocketPort* iRequestedPort; 870 871 //node state ChangeExternalState(TPVMFNodeInterfaceState aNewState)872 void ChangeExternalState(TPVMFNodeInterfaceState aNewState) 873 { 874 iInterfaceState = aNewState; 875 } 876 877 //node capability 878 PVMFNodeCapability iCapability; 879 880 //for error messages. 881 int32 iCommandErrorCode; 882 int32 iErrorEventErrorCode; ReportSocketNodeError(PVMFStatus aStatus,PVMFSocketNodeErrorEventType aEvent)883 void ReportSocketNodeError(PVMFStatus aStatus, PVMFSocketNodeErrorEventType aEvent) 884 { 885 PVUuid eventuuid = PVMFSocketNodeEventTypeUUID; 886 iErrorEventErrorCode = aEvent; 887 ReportErrorEvent(aStatus, NULL, &eventuuid, &iErrorEventErrorCode); 888 } 889 890 //Used to stop all port activity, this var counts down from N to 0, or 891 //has a value of (-1) to indicate it's inactive 892 int32 iNumStopPortActivityPending; 893 894 /********************************************* 895 * Oscl Socket Handling 896 **********************************************/ 897 898 void HandleRecvComplete(SocketPortConfig& tmpSockConfig, PVMFStatus, PVMFSocketActivity*, bool); 899 void HandleRecvFromComplete(SocketPortConfig& tmpSockConfig, PVMFStatus, PVMFSocketActivity*, bool); 900 901 OsclSocketServ *iSockServ; 902 903 const int TIMEOUT_CONNECT; 904 const int TIMEOUT_SEND; 905 const int TIMEOUT_SENDTO; 906 const int TIMEOUT_RECV; 907 const int TIMEOUT_RECVFROM; 908 const int TIMEOUT_SHUTDOWN; 909 const int UDP_PORT_RANGE; 910 const int MAX_UDP_PACKET_SIZE; 911 const int MIN_UDP_PACKET_SIZE; 912 913 int32 iMaxTcpRecvBufferSize; 914 int32 iMaxTcpRecvBufferCount; 915 916 /********************************************* 917 * Oscl DNS Handling 918 **********************************************/ 919 920 PVMFDnsCache iDnsCache; 921 922 /********************************************* 923 * Port Data Handling 924 **********************************************/ 925 926 bool CanProcessIncomingMsg(SocketPortConfig& aSockConfig); 927 928 void ProcessIncomingMsg(SocketPortConfig& aSockConfig); 929 930 bool ParseTransportConfig(OSCL_String *aPortConfig, 931 SOCKET_ADDR &aSockConfig, 932 OSCL_String& aMime); 933 bool ParseTransportConfig(char *aPortConfig, 934 int32 aLen, 935 SOCKET_ADDR &aSockConfig, 936 OSCL_String& aMime); 937 938 /********************************************* 939 * Port & Socket Creation 940 **********************************************/ 941 942 PVMFStatus AllocatePortMemPool(int32 tag, PVMFSocketNodeMemPool* & aMemPool); 943 PVMFStatus AddPort(int32 tag, PVMFSocketPort* &port); 944 void CleanupTCP(SocketPortConfig& tmpSockConfig); 945 void CleanupUDP(SocketPortConfig& tmpSockConfig); 946 void CleanupDNS(SocketPortConfig& tmpSockConfig); 947 void CleanupPorts(); 948 949 OsclAny* CreateOsclSocketAndBind(SOCKET_ADDR &, uint32); 950 951 uint32 iSocketID; 952 bool iInSocketCallback; 953 954 Oscl_Vector<OsclTCPSocket*, OsclMemAllocator> iClosedTCPSocketVector; 955 void CleanupClosedTCPSockets(); 956 Oscl_Vector<OsclUDPSocket*, OsclMemAllocator> iClosedUDPSocketVector; 957 void CleanupClosedUDPSockets(); 958 Oscl_Vector<OsclDNS*, OsclMemAllocator> iClosedDNSVector; 959 void CleanupClosedDNS(); 960 961 /********************************************* 962 * Port Data 963 **********************************************/ 964 965 PVMFPortVector<PVMFSocketPort, PVMFSocketNodeAllocator> iPortVector; 966 Oscl_Vector<SocketPortConfig*, PVMFSocketNodeAllocator> iAllocatedPortVector; 967 968 SocketPortConfig* FindSocketPortConfig(SOCKET_ADDR& aSockConfig); 969 bool MatchSocketAddr(SOCKET_ADDR& aSockAddr, SocketPortConfig& aSockConfig); 970 SocketPortConfig* FindSocketPortConfig(uint32 aId); 971 972 /********************************************* 973 * Operation and Sequence Handlers 974 **********************************************/ 975 976 PVMFStatus StartSequence(SocketPortConfig&, TPVSocketPortSequence, OsclAny* param = NULL); 977 void SequenceComplete(SocketPortConfig& tmpSockConfig, PVMFStatus); 978 979 bool CanReceive(SocketPortConfig& aConfig); 980 981 PVMFStatus StartConnectOperation(SocketPortConfig& aSockConfig, TPVSocketPortConnectOperation aOperation); 982 PVMFStatus StartRecvOperation(SocketPortConfig& aSockConfig); 983 PVMFStatus StartSendOperation(SocketPortConfig& aSockConfig, PVMFSharedMediaMsgPtr& aMsg); 984 void StartRecvWaitOnMemory(SocketPortConfig& aSockConfig, int32 aSize = 0); 985 void StartRecvWaitOnConnectedPort(SocketPortConfig& aSockConfig, PVMFSocketActivity& aSocketActivity); 986 987 PVMFStatus ConnectOperationComplete(SocketPortConfig& tmpSockConfig, PVMFStatus, PVMFSocketActivity*); 988 PVMFStatus SendOperationComplete(SocketPortConfig& tmpSockConfig, PVMFStatus, PVMFSocketActivity*); 989 PVMFStatus RecvOperationComplete(SocketPortConfig& tmpSockConfig, PVMFStatus, PVMFSocketActivity*); 990 991 PVMFStatus CancelSendOperation(SocketPortConfig& tmpSockConfig); 992 PVMFStatus CancelRecvOperation(SocketPortConfig& tmpSockConfig); 993 PVMFStatus CancelConnectOperation(SocketPortConfig& tmpSockConfig); 994 995 /********************************************* 996 * Loggers, Error Trap, Allocator 997 **********************************************/ 998 999 PVLogger *iLogger; 1000 PVLogger *iDataPathLogger; 1001 PVLogger *iDataPathLoggerRTP; 1002 PVLogger *iDataPathLoggerRTCP; 1003 1004 void LogRTPHeaderFields(SocketPortConfig& aSockConfig, 1005 OsclRefCounterMemFrag& memFragIn); 1006 1007 void LogRTCPHeaderFields(SocketPortConfig& aSockConfig, 1008 OsclRefCounterMemFrag& memFragIn); 1009 1010 OsclErrorTrapImp* iOsclErrorTrapImp; 1011 1012 PVMFSocketNodeAllocator iAlloc; 1013 PVMFSocketNodeExtensionInterface* iExtensionInterface; 1014 #if(ENABLE_SOCKET_NODE_STATS) 1015 SocketNodeStats iSocketNodeStats; 1016 #endif 1017 }; 1018 1019 class PVMFSocketNodeExtensionInterfaceImpl: public PVInterfaceImpl<PVMFSocketNodeAllocator>, public PVMFSocketNodeExtensionInterface 1020 { 1021 public: 1022 PVMFSocketNodeExtensionInterfaceImpl(PVMFSocketNode* iContainer); 1023 ~PVMFSocketNodeExtensionInterfaceImpl(); 1024 virtual void addRef(); 1025 virtual void removeRef(); 1026 virtual bool queryInterface(const PVUuid& uuid, PVInterface*& iface); //From PVInterface 1027 OSCL_IMPORT_REF virtual PVMFStatus AllocateConsecutivePorts(PvmfMimeString* aPortConfig, 1028 uint32& aLowerPortNum, 1029 uint32& aHigherPortNum, uint32& aStartPortNum); 1030 1031 OSCL_IMPORT_REF virtual PVMFStatus SetMaxTCPRecvBufferSize(uint32 aBufferSize); 1032 OSCL_IMPORT_REF virtual PVMFStatus GetMaxTCPRecvBufferSize(uint32& aSize); 1033 OSCL_IMPORT_REF virtual PVMFStatus SetMaxTCPRecvBufferCount(uint32 aCount); 1034 OSCL_IMPORT_REF virtual PVMFStatus GetMaxTCPRecvBufferCount(uint32& aCount); 1035 OSCL_IMPORT_REF virtual OsclMemPoolResizableAllocator* CreateSharedBuffer(const PVMFPortInterface* aPort , uint32 aBufferSize, uint32 aExpectedNumberOfBlocksPerBuffer, uint32 aResizeSize, uint32 aMaxNumResizes); 1036 private: 1037 PVMFSocketNode *iContainer; 1038 }; 1039 1040 #endif //PVMF_SOCKET_NODE_H_INCLUDED 1041 1042