44 #ifndef OPAL_H46018_H225
45 #define OPAL_H46018_NAT
49 #endif // _MSC_VER > 1000
102 const PBYTEArray & pdu
120 PBoolean HandleH46018SignallingChannelPDU();
135 PBoolean isCall() {
return isConnected; };
140 void ConnectionLost(PBoolean established);
145 PBoolean IsConnectionLost();
155 virtual PBoolean
Close();
157 virtual PBoolean IsListening()
const;
159 virtual PBoolean
IsOpen ()
const;
161 PBoolean CloseTransport() {
return closeTransport; };
164 PMutex connectionsMutex;
167 PTimeInterval ReadTimeOut;
168 PSyncPoint ReadMutex;
170 H46018Handler * Feature;
172 PBoolean isConnected;
173 PBoolean remoteShutDown;
174 PBoolean closeTransport;
179 class PNatMethod_H46019;
181 class H46018Handler :
public PObject
183 PCLASSINFO(H46018Handler, PObject);
190 PBoolean IsEnabled();
194 PBoolean CreateH225Transport(
const PASN_OctetString & information);
196 void H46024ADirect(
bool reply,
const PString & token);
200 PNatMethod_H46019 * nat;
201 PString lastCallIdentifer;
203 PMutex m_h46024aMutex;
209 PThread * SocketCreateThread;
210 PDECLARE_NOTIFIER(PThread, H46018Handler, SocketThread);
211 PBoolean m_h46018inOperation;
215 class PNatMethod_H46019 :
public PNatMethod
217 PCLASSINFO(PNatMethod_H46019,PNatMethod);
228 ~PNatMethod_H46019();
236 static PString GetNatMethodName();
237 virtual PString GetName()
const;
241 virtual PString GetServer()
const;
246 virtual PBoolean CreateSocketPair(
247 PUDPSocket * & socket1,
248 PUDPSocket * & socket2,
249 const PIPSocket::Address & binding,
261 virtual bool IsAvailable(
const PIPSocket::Address & address);
272 virtual void Activate(
bool act) { active = act; }
277 PBoolean OpenSocket(PUDPSocket & socket, PortInfo & portInfo,
const PIPSocket::Address & binding)
const;
285 void AttachHandler(H46018Handler * _handler);
288 virtual NatTypes InternalGetNatType(
bool forced,
const PTimeInterval & maxAge);
298 void SetConnectionSockets(
300 PUDPSocket * control,
301 H323Connection::SessionInformation * info
307 H46018Handler * handler;
315 class H46019UDPSocket :
public PUDPSocket
317 PCLASSINFO(H46019UDPSocket, PUDPSocket);
325 H46018Handler & _handler,
326 H323Connection::SessionInformation * info,
336 PBoolean GetLocalAddress(Address & addr, WORD & port);
364 unsigned GetPingPayload();
368 void SetPingPayLoad(
unsigned val);
376 void SetTTL(
unsigned val);
381 virtual PBoolean ReadFrom(
391 virtual PBoolean WriteTo(
394 const Address & addr,
409 struct probe_packet {
426 virtual PBoolean IsAlternateAddress(
427 const Address & address,
432 void H46024Adirect(
bool starter);
442 void InitialiseKeepAlive();
443 void SendRTPPing(
const PIPSocket::Address & ip,
const WORD & port);
445 PBoolean SendRTCPFrame(
RTP_ControlFrame & report,
const PIPSocket::Address & ip, WORD port);
449 PBoolean ReceivedProbePacket(
const RTP_ControlFrame & frame,
bool & probe,
bool & success);
452 void ProbeReceived(
bool probe,
const PIPSocket::Address & addr, WORD & port);
453 void SetProbeState(probe_state newstate);
454 int GetProbeState()
const;
461 virtual PBoolean Internal_WriteTo(
462 const Slice * slices,
464 const Address & addr,
471 virtual PBoolean Internal_WriteTo(
474 const Address & addr,
479 H46018Handler & m_Handler;
486 PIPSocket::Address keepip;
488 unsigned keeppayload;
492 PTime * keepStartTime;
494 PDECLARE_NOTIFIER(PTimer, H46019UDPSocket, Ping);
499 PIPSocket::Address m_locAddr; WORD m_locPort;
500 PIPSocket::Address m_remAddr; WORD m_remPort;
501 PIPSocket::Address m_detAddr; WORD m_detPort;
502 PIPSocket::Address m_pendAddr; WORD m_pendPort;
503 PDECLARE_NOTIFIER(PTimer, H46019UDPSocket, Probe);
507 PIPSocket::Address m_altAddr; WORD m_altPort;
514 #endif // OPAL_H460_NAT
516 #endif // OPAL_H46018_H225