sipxportlib  Version 3.3
OsNatAgentTask.h
Go to the documentation of this file.
1 //
2 // Copyright (C) 2006 SIPez LLC.
3 // Licensed to SIPfoundry under a Contributor Agreement.
4 //
5 // Copyright (C) 2004-2006 SIPfoundry Inc.
6 // Licensed by SIPfoundry under the LGPL license.
7 //
8 // Copyright (C) 2004-2006 Pingtel Corp. All rights reserved.
9 // Licensed to SIPfoundry under a Contributor Agreement.
10 //
11 // $$
13 
14 #ifndef _OsNatAgentTask_h_ /* [ */
15 #define _OsNatAgentTask_h_
16 
17 // SYSTEM INCLUDES
18 
19 // APPLICATION INCLUDES
20 #include "os/IStunSocket.h"
22 #include "os/OsServerTask.h"
23 #include "os/OsRpcMsg.h"
24 #include "os/OsEventMsg.h"
25 #include "utl/UtlHashMap.h"
26 #include "os/TurnMessage.h"
27 #include "os/StunMessage.h"
28 #include "os/NatMsg.h"
29 
30 // DEFINES
31 #define SYNC_MSG_TYPE (OsMsg::USER_START + 2)
33 #define NAT_INITIAL_ABORT_COUNT 4
34 #define NAT_PROBE_ABORT_COUNT 3
35 #define NAT_RESEND_ABORT_COUNT 75
36 #define NAT_RESPONSE_TIMEOUT_MS 300
38 #define NAT_FIND_BINDING_POOL_MS 50
39 #define NAT_BINDING_EXPIRATION_SECS 60
42 // MACROS
43 // EXTERNAL FUNCTIONS
44 // EXTERNAL VARIABLES
45 // CONSTANTS
46 // STRUCTS
47 // TYPEDEFS
48 typedef enum
49 {
56 
57 typedef enum
58 {
66 
67 
68 #define MAX_OLD_TRANSACTIONS 3
69 typedef struct
70 {
74  int serverPort ;
75  int options ;
82  int abortCount ;
85  int port ;
86  UtlString username ; // TURN_ALLOCATION only
87  UtlString password ; // TURN_ALLOCATION only
88  int priority ; // STUN_PROBE only
91 
92 
93 typedef struct
94 {
97  int remotePort ;
102 
103 
104 // FORWARD DECLARATIONS
105 
118 {
119 /* //////////////////////////// PUBLIC //////////////////////////////////// */
120 
121 /* ============================ CREATORS ================================== */
122 
123 private:
124 
128  OsNatAgentTask();
129 
133  virtual ~OsNatAgentTask();
134 
135 public:
139  static OsNatAgentTask* getInstance() ;
140 
145  static void releaseInstance() ;
146 
147 /* ============================ MANIPULATORS ============================== */
148 
153  virtual UtlBoolean handleMessage(OsMsg& rMsg) ;
154 
156  const UtlString& remoteAddress,
157  int remotePort,
158  int priority) ;
159 
161  const UtlString& stunServer,
162  int stunPort,
163  const int stunOptions,
164  int keepAlive) ;
165 
167 
169  const UtlString& turnServer,
170  int iTurnPort,
171  int keepAliveSecs,
172  const UtlString& username,
173  const UtlString& password) ;
174 
176  const char* szAddress,
177  int iPort ) ;
178 
180  const char* szAddress,
181  int iPort ) ;
182 
183  void disableTurn(IStunSocket* pSocket) ;
184 
186  const UtlString& remoteIp,
187  int remotePort,
188  int keepAliveSecs,
189  OsNatKeepaliveListener* pListener) ;
190 
192  const UtlString& serverIp,
193  int serverPort) ;
194 
196  const UtlString& remoteIp,
197  int remotePort,
198  int keepAliveSecs,
199  OsNatKeepaliveListener* pListener) ;
200 
202  const UtlString& serverIp,
203  int serverPort) ;
204 
206 
208 
214  void synchronize() ;
215 
219  UtlBoolean areProbesOutstanding(IStunSocket* pSocket, int priority) ;
220 
226  const UtlString& serverIp,
227  int serverPort) ;
228 
232  OsTimer* getTimer() ;
233 
234  /* ============================ ACCESSORS ================================= */
235 
240  UtlBoolean findContactAddress( const UtlString& destHost,
241  int destPort,
242  UtlString* pContactHost,
243  int* pContactPort,
244  int iTimeoutMs = 0) ;
245 
249  void addExternalBinding(OsSocket* pSocket,
250  UtlString remoteAddress,
251  int remotePort,
252  UtlString contactAddress,
253  int contactPort) ;
254 
255  void clearExternalBinding(OsSocket* pSocket,
256  UtlString remoteAddress,
257  int remotePort,
258  bool bOnlyIfEmpty = false) ;
259 
260 
265  UtlBoolean findExternalBinding(const UtlString& destHost,
266  int destPort,
267  UtlString* pContactHost,
268  int* pContactPort,
269  int iTimeoutMs = 0,
270  UtlBoolean* pTimedOut = NULL) ;
271 
272 /* ============================ INQUIRY =================================== */
273 
274 /* //////////////////////////// PROTECTED ///////////////////////////////// */
275 protected:
276 
277  virtual UtlBoolean handleTimerEvent(NAT_AGENT_CONTEXT* pContext) ;
278 
279  virtual void handleStunTimeout(NAT_AGENT_CONTEXT* pContext) ;
280 
281  virtual void handleTurnTimeout(NAT_AGENT_CONTEXT* pContext) ;
282 
284 
286 
292  virtual UtlBoolean handleStunMessage(NatMsg& rMsg) ;
293 
294 
300  virtual UtlBoolean handleTurnMessage(NatMsg& rMsg) ;
301 
302 
307  virtual UtlBoolean handleSynchronize(OsRpcMsg& rMsg) ;
308 
309 
310  virtual UtlBoolean sendMessage(StunMessage* pMsg,
311  IStunSocket* pSocket,
312  const UtlString& toAddress,
313  unsigned short toPort,
314  PacketType packetType = UNKNOWN_PACKET) ;
315 
317 
319 
321 
322  void destroyBinding(NAT_AGENT_CONTEXT* pBinding) ;
323 
324  void releaseTimer(OsTimer* pTimer) ;
325 
327 
329 
330  void markStunFailure(NAT_AGENT_CONTEXT* pBinding) ;
331 
332  void markStunSuccess(NAT_AGENT_CONTEXT* pBinding, const UtlString& mappedAddress, int mappedPort) ;
333 
334  void markTurnFailure(NAT_AGENT_CONTEXT* pBinding) ;
335 
336  void markTurnSuccess(NAT_AGENT_CONTEXT* pBinding, const UtlString& relayAddress, int relayPort) ;
337 
339 
340  void dumpContext(UtlString* pResults, NAT_AGENT_CONTEXT* pBinding) ;
341 
342 
343 /* //////////////////////////// PRIVATE /////////////////////////////////// */
344 private:
345  static OsNatAgentTask* spInstance ;
346  static OsMutex sLock ;
347  UtlSList mTimerPool;
348  UtlHashMap mContextMap ;
349  OsMutex mMapsLock ;
351  UtlSList mExternalBindingsList ;
352  OsRWMutex mExternalBindingMutex ;
353 
354 
356  OsNatAgentTask(const OsNatAgentTask& rOsNatAgentTask);
357 
359  OsNatAgentTask& operator=(const OsNatAgentTask& rhs);
360 
361 };
362 
363 /* ============================ INLINE METHODS ============================ */
364 
365 #endif /* _OsNatAgentTask_h_ ] */
OsNatKeepaliveListener * pKeepaliveListener
Definition: OsNatAgentTask.h:89
NAT_AGENT_BINDING_TYPE type
Definition: OsNatAgentTask.h:71
NAT_AGENT_STATUS status
Definition: OsNatAgentTask.h:72
static OsNatAgentTask * getInstance()
Definition: OsNatAgentTask.cpp:99
Definition: OsSocket.h:79
int refreshErrors
Definition: OsNatAgentTask.h:83
virtual UtlBoolean sendMessage(StunMessage *pMsg, IStunSocket *pSocket, const UtlString &toAddress, unsigned short toPort, PacketType packetType=UNKNOWN_PACKET)
Definition: OsNatAgentTask.cpp:1712
Definition: OsNatAgentTask.h:59
void synchronize()
Definition: OsNatAgentTask.cpp:1361
UtlString serverAddress
Definition: OsNatAgentTask.h:73
UtlBoolean removeKeepAlives(IStunSocket *pSocket)
Definition: OsNatAgentTask.cpp:1299
virtual UtlBoolean handleStunMessage(NatMsg &rMsg)
Definition: OsNatAgentTask.cpp:179
UtlBoolean sendStunProbe(IStunSocket *pSocket, const UtlString &remoteAddress, int remotePort, int priority)
Definition: OsNatAgentTask.cpp:664
int nOldTransactions
Definition: OsNatAgentTask.h:77
void markStunSuccess(NAT_AGENT_CONTEXT *pBinding, const UtlString &mappedAddress, int mappedPort)
Definition: OsNatAgentTask.cpp:1983
UtlString password
Definition: OsNatAgentTask.h:87
void markTurnSuccess(NAT_AGENT_CONTEXT *pBinding, const UtlString &relayAddress, int relayPort)
Definition: OsNatAgentTask.cpp:2108
Definition: IStunSocket.h:70
Definition: OsNatAgentTask.h:53
virtual UtlBoolean handleTurnMessage(NatMsg &rMsg)
Definition: OsNatAgentTask.cpp:321
NAT_AGENT_STATUS
Definition: OsNatAgentTask.h:57
UtlBoolean findExternalBinding(const UtlString &destHost, int destPort, UtlString *pContactHost, int *pContactPort, int iTimeoutMs=0, UtlBoolean *pTimedOut=NULL)
Definition: OsNatAgentTask.cpp:1631
virtual UtlBoolean handleStunKeepAlive(NAT_AGENT_CONTEXT *pContext)
Definition: OsNatAgentTask.cpp:643
void destroyBinding(NAT_AGENT_CONTEXT *pBinding)
Definition: OsNatAgentTask.cpp:1825
void clearExternalBinding(OsSocket *pSocket, UtlString remoteAddress, int remotePort, bool bOnlyIfEmpty=false)
Definition: OsNatAgentTask.cpp:1596
Definition: OsServerTask.h:34
void addExternalBinding(OsSocket *pSocket, UtlString remoteAddress, int remotePort, UtlString contactAddress, int contactPort)
Definition: OsNatAgentTask.cpp:1526
int serverPort
Definition: OsNatAgentTask.h:74
PacketType
Definition: IStunSocket.h:27
Definition: OsNatKeepaliveListener.h:42
#define NULL
Definition: UtlDefs.h:29
UtlBoolean findContactAddress(const UtlString &destHost, int destPort, UtlString *pContactHost, int *pContactPort, int iTimeoutMs=0)
Definition: OsNatAgentTask.cpp:1437
STUN_TRANSACTION_ID transactionId
Definition: OsNatAgentTask.h:76
virtual UtlBoolean handleCrLfKeepAlive(NAT_AGENT_CONTEXT *pContext)
Definition: OsNatAgentTask.cpp:620
Definition: OsNatAgentTask.h:64
#define MAX_OLD_TRANSACTIONS
Definition: OsNatAgentTask.h:68
Definition: OsNatAgentTask.h:117
void releaseTimer(OsTimer *pTimer)
Definition: OsNatAgentTask.cpp:1869
Definition: OsNatAgentTask.h:63
Definition: OsNatKeepaliveListener.h:97
UtlString remoteAddress
Definition: OsNatAgentTask.h:96
int remotePort
Definition: OsNatAgentTask.h:97
void dumpContext(UtlString *pResults, NAT_AGENT_CONTEXT *pBinding)
Definition: OsNatAgentTask.cpp:2197
UtlBoolean removeStunProbes(IStunSocket *pSocket)
Definition: OsNatAgentTask.cpp:1330
void disableTurn(IStunSocket *pSocket)
Definition: OsNatAgentTask.cpp:1010
UtlBoolean sendTurnRequest(NAT_AGENT_CONTEXT *pBinding)
Definition: OsNatAgentTask.cpp:1932
Definition: OsNatAgentTask.h:50
NAT_AGENT_BINDING_TYPE
Definition: OsNatAgentTask.h:48
int port
Definition: OsNatAgentTask.h:85
UtlBoolean addStunKeepAlive(IStunSocket *pSocket, const UtlString &remoteIp, int remotePort, int keepAliveSecs, OsNatKeepaliveListener *pListener)
Definition: OsNatAgentTask.cpp:1181
Definition: UtlString.h:48
UtlString address
Definition: OsNatAgentTask.h:84
void markStunFailure(NAT_AGENT_CONTEXT *pBinding)
Definition: OsNatAgentTask.cpp:2064
OsTime expiration
Definition: OsNatAgentTask.h:100
IStunSocket * pSocket
Definition: OsNatAgentTask.h:79
int contactPort
Definition: OsNatAgentTask.h:99
UtlBoolean doesBindingExist(IStunSocket *pSocket, NAT_AGENT_BINDING_TYPE type, const UtlString &serverIp, int serverPort)
Definition: OsNatAgentTask.cpp:1408
Definition: StunMessage.h:126
UtlBoolean disableStun(IStunSocket *pSocket)
Definition: OsNatAgentTask.cpp:822
Definition: OsNatAgentTask.h:69
UtlBoolean setTurnDestination(IStunSocket *pSocket, const char *szAddress, int iPort)
Definition: OsNatAgentTask.cpp:969
int options
Definition: OsNatAgentTask.h:75
UtlBoolean enableTurn(IStunSocket *pSocket, const UtlString &turnServer, int iTurnPort, int keepAliveSecs, const UtlString &username, const UtlString &password)
Definition: OsNatAgentTask.cpp:842
Definition: UtlSList.h:47
int abortCount
Definition: OsNatAgentTask.h:82
void markTurnFailure(NAT_AGENT_CONTEXT *pBinding)
Definition: OsNatAgentTask.cpp:2145
UtlBoolean enableStun(IStunSocket *pSocket, const UtlString &stunServer, int stunPort, const int stunOptions, int keepAlive)
Definition: OsNatAgentTask.cpp:742
Definition: OsNatAgentTask.h:61
NAT_AGENT_CONTEXT * getBinding(IStunSocket *pSocket, NAT_AGENT_BINDING_TYPE type)
Definition: OsNatAgentTask.cpp:1755
Definition: UtlHashMap.h:46
OsTimer * pTimer
Definition: OsNatAgentTask.h:80
UtlBoolean removeCrLfKeepAlive(IStunSocket *pSocket, const UtlString &serverIp, int serverPort)
Definition: OsNatAgentTask.cpp:1139
virtual UtlBoolean handleTimerEvent(NAT_AGENT_CONTEXT *pContext)
Definition: OsNatAgentTask.cpp:440
int keepAliveSecs
Definition: OsNatAgentTask.h:81
UtlString username
Definition: OsNatAgentTask.h:86
Definition: OsTime.h:37
UtlBoolean primeTurnReception(IStunSocket *pSocket, const char *szAddress, int iPort)
Definition: OsNatAgentTask.cpp:925
Definition: OsRpcMsg.h:42
Definition: OsTimer.h:105
int UtlBoolean
Definition: UtlDefs.h:41
Definition: OsNatAgentTask.h:93
virtual void handleStunTimeout(NAT_AGENT_CONTEXT *pContext)
Definition: OsNatAgentTask.cpp:472
Definition: OsNatAgentTask.h:54
Definition: OsMsg.h:36
Definition: OsNatAgentTask.h:60
UtlBoolean sendStunRequest(NAT_AGENT_CONTEXT *pBinding)
Definition: OsNatAgentTask.cpp:1880
UtlBoolean removeStunKeepAlive(IStunSocket *pSocket, const UtlString &serverIp, int serverPort)
Definition: OsNatAgentTask.cpp:1257
virtual UtlBoolean handleMessage(OsMsg &rMsg)
Definition: OsNatAgentTask.cpp:127
OsSocket * pSocket
Definition: OsNatAgentTask.h:95
static void releaseInstance()
Definition: OsNatAgentTask.cpp:114
Definition: OsNatAgentTask.h:51
OsNatKeepaliveEvent populateKeepaliveEvent(NAT_AGENT_CONTEXT *pContext)
Definition: OsNatAgentTask.cpp:2173
UtlString contactAddress
Definition: OsNatAgentTask.h:98
virtual UtlBoolean handleSynchronize(OsRpcMsg &rMsg)
Definition: OsNatAgentTask.cpp:431
OsTimer * getTimer()
Definition: OsNatAgentTask.cpp:1850
Definition: OsNatAgentTask.h:62
UtlBoolean areProbesOutstanding(IStunSocket *pSocket, int priority)
Definition: OsNatAgentTask.cpp:1379
Definition: OsNatAgentTask.h:52
Definition: StunMessage.h:211
Definition: NatMsg.h:16
int priority
Definition: OsNatAgentTask.h:88
UtlBoolean addCrLfKeepAlive(IStunSocket *pSocket, const UtlString &remoteIp, int remotePort, int keepAliveSecs, OsNatKeepaliveListener *pListener)
Definition: OsNatAgentTask.cpp:1065
virtual void handleTurnTimeout(NAT_AGENT_CONTEXT *pContext)
Definition: OsNatAgentTask.cpp:544
Definition: IStunSocket.h:29