h46018_h225.h

Go to the documentation of this file.
00001 /*
00002  * h46018_h225.h
00003  *
00004  * H.460.18 H225 NAT Traversal class.
00005  *
00006  * h323plus library
00007  *
00008  * Copyright (c) 2008 ISVO (Asia) Pte. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.1 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Alternatively, the contents of this file may be used under the terms
00016  * of the General Public License (the  "GNU License"), in which case the
00017  * provisions of GNU License are applicable instead of those
00018  * above. If you wish to allow use of your version of this file only
00019  * under the terms of the GNU License and not to allow others to use
00020  * your version of this file under the MPL, indicate your decision by
00021  * deleting the provisions above and replace them with the notice and
00022  * other provisions required by the GNU License. If you do not delete
00023  * the provisions above, a recipient may use your version of this file
00024  * under either the MPL or the GNU License."
00025  *
00026  * Software distributed under the License is distributed on an "AS IS"
00027  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00028  * the License for the specific language governing rights and limitations
00029  * under the License.
00030  *
00031  *
00032  * The Initial Developer of the Original Code is ISVO (Asia) Pte. Ltd.
00033  *
00034  * Portions of this code were written with the assisance of funding from
00035  * triple-IT. http://www.triple-it.nl.
00036  *
00037  * Contributor(s): ______________________________________.
00038  *
00039  * $Revision: 28624 $
00040  * $Author: rjongbloed $
00041  * $Date: 2012-12-02 22:13:25 -0600 (Sun, 02 Dec 2012) $
00042  */
00043 
00044 #ifndef OPAL_H46018_H225
00045 #define OPAL_H46018_NAT
00046 
00047 #if _MSC_VER > 1000
00048 #pragma once
00049 #endif // _MSC_VER > 1000
00050 
00051 #if OPAL_H460_NAT
00052 
00053 #include <h323/h323pdu.h>
00054 
00055 
00056 class H46018SignalPDU  : public H323SignalPDU
00057 {
00058   public:
00066     H46018SignalPDU(const OpalGloballyUniqueID & callIdentifier);
00068 };
00069 
00070 
00071 class H323EndPoint;
00072 class H46018Handler;
00073 
00074 class H46018Transport  : public OpalTransportTCP
00075 {
00076     PCLASSINFO(H46018Transport, OpalTransportTCP);
00077 
00078   public:
00079     enum PDUType {
00080       e_raw,
00081     };
00082 
00087     H46018Transport(
00088       H323EndPoint & endpoint        
00089     );
00090 
00091     ~H46018Transport();
00093 
00101     virtual PBoolean WritePDU(
00102       const PBYTEArray & pdu  
00103     );
00104 
00110     virtual PBoolean ReadPDU(
00111       PBYTEArray & pdu  
00112     );
00114 
00120     PBoolean HandleH46018SignallingChannelPDU();
00121 
00125     PBoolean HandleH46018SignallingSocket(H323SignalPDU & pdu);
00126 
00130     PBoolean InitialPDU(const OpalGloballyUniqueID & callIdentifier);
00131 
00135     PBoolean isCall() { return isConnected; };
00136 
00140     void ConnectionLost(PBoolean established);
00141 
00145     PBoolean IsConnectionLost();
00147 
00148     // Overrides
00151     virtual PBoolean Connect(const OpalGloballyUniqueID & callIdentifier);
00152 
00155     virtual PBoolean Close();
00156 
00157     virtual PBoolean IsListening() const;
00158 
00159     virtual PBoolean IsOpen () const;
00160 
00161     PBoolean CloseTransport() { return closeTransport; };
00162 
00163   protected:
00164      PMutex connectionsMutex;
00165      PMutex WriteMutex;
00166      PMutex IntMutex;
00167      PTimeInterval ReadTimeOut;
00168      PSyncPoint ReadMutex;
00169 
00170      H46018Handler * Feature;
00171 
00172      PBoolean   isConnected;
00173      PBoolean   remoteShutDown;
00174      PBoolean   closeTransport;
00175 };
00176 
00177 
00178 class H323EndPoint;
00179 class PNatMethod_H46019;
00180 
00181 class H46018Handler : public PObject  
00182 {
00183     PCLASSINFO(H46018Handler, PObject);
00184 
00185   public:
00186     H46018Handler(H323EndPoint * ep);
00187     ~H46018Handler();
00188 
00189     void Enable();
00190     PBoolean IsEnabled();
00191 
00192     H323EndPoint * GetEndPoint();
00193 
00194     PBoolean CreateH225Transport(const PASN_OctetString & information);
00195 
00196     void H46024ADirect(bool reply, const PString & token);
00197         
00198   protected:    
00199     H323EndPoint * EP;
00200     PNatMethod_H46019 * nat;
00201     PString lastCallIdentifer;
00202 
00203     PMutex m_h46024aMutex;
00204     bool   m_h46024a;
00205 
00206   private:
00207     H323TransportAddress m_address;
00208     OpalGloballyUniqueID m_callId;
00209     PThread * SocketCreateThread;
00210     PDECLARE_NOTIFIER(PThread, H46018Handler, SocketThread);
00211     PBoolean m_h46018inOperation;
00212 };
00213 
00214 
00215 class PNatMethod_H46019  : public PNatMethod
00216 {
00217     PCLASSINFO(PNatMethod_H46019,PNatMethod);
00218 
00219   public:
00224     PNatMethod_H46019();
00225 
00228     ~PNatMethod_H46019();
00230 
00236     static PString GetNatMethodName();
00237     virtual PString GetName() const;
00238 
00241     virtual PString GetServer() const;
00242 
00246     virtual PBoolean CreateSocketPair(
00247       PUDPSocket * & socket1,            
00248       PUDPSocket * & socket2,            
00249       const PIPSocket::Address & binding,  
00250       void * userData
00251     );
00252 
00261     virtual bool IsAvailable(const PIPSocket::Address & address);
00262 
00263     /* Set Available
00264         This will enable the natMethod to be enabled when opening the
00265         sockets
00266     */
00267     void SetAvailable();
00268 
00272     virtual void Activate(bool act)  { active = act; }
00273 
00277     PBoolean OpenSocket(PUDPSocket & socket, PortInfo & portInfo, const PIPSocket::Address & binding) const;
00279 
00285     void AttachHandler(H46018Handler * _handler);
00286 
00287   protected:
00288     virtual NatTypes InternalGetNatType(bool forced, const PTimeInterval & maxAge);
00289 
00290 #if OPAL_H460_NAT
00291 
00298     void SetConnectionSockets(
00299       PUDPSocket * data,            
00300       PUDPSocket * control,                        
00301       H323Connection::SessionInformation * info    
00302     );
00303 #endif
00304     
00305     PBoolean available;                    
00306     PBoolean active;                    
00307     H46018Handler * handler;            
00308 };
00309 
00310 #ifndef _WIN32_WCE
00311        PPLUGIN_STATIC_LOAD(H46019,PNatMethod);
00312 #endif
00313 
00314 
00315 class H46019UDPSocket : public PUDPSocket
00316 {
00317     PCLASSINFO(H46019UDPSocket, PUDPSocket);
00318   public:
00324     H46019UDPSocket(
00325       H46018Handler & _handler,
00326       H323Connection::SessionInformation * info,
00327       bool _rtpSocket
00328     );
00329 
00333     ~H46019UDPSocket();
00335 
00336     PBoolean GetLocalAddress(Address & addr, WORD & port);
00337 
00340 
00343     void Allocate(
00344       const H323TransportAddress & keepalive, 
00345       unsigned _payload, 
00346       unsigned _ttl,
00347       unsigned _muxId
00348     );
00349 
00352     void Activate();
00353 
00356     void Activate(const H323TransportAddress & keepalive,    
00357       unsigned _payload,            
00358       unsigned _ttl,                
00359       unsigned _muxId
00360     );
00361 
00364     unsigned GetPingPayload();
00365 
00368     void SetPingPayLoad(unsigned val);
00369 
00372     unsigned GetTTL();
00373 
00376     void SetTTL(unsigned val);
00377 
00381     virtual PBoolean ReadFrom(
00382       void * buf,     
00383       PINDEX len,     
00384       Address & addr, 
00385       WORD & port     
00386     );
00387 
00391     virtual PBoolean WriteTo(
00392       const void * buf,     
00393       PINDEX len,           
00394       const Address & addr, 
00395       WORD port             
00396     );
00397 
00398     enum  probe_state {
00399         e_notRequired,        
00400         e_initialising,       
00401         e_idle,               
00402         e_probing,            
00403         e_verify_receiver,    
00404         e_verify_sender,      
00405         e_wait,               
00406         e_direct              
00407     };
00408 
00409     struct probe_packet {
00410         PUInt16b    Length;   // Length
00411         PUInt32b    SSRC;     // Time Stamp
00412         BYTE        name[4];  // Name is limited to 32 (4 Bytes)
00413         BYTE        cui[20];  // SHA-1 is always 160 (20 Bytes)
00414     };
00415 
00418     virtual void SetAlternateAddresses(const H323TransportAddress & address, const PString & cui);
00419 
00422     virtual void GetAlternateAddresses(H323TransportAddress & address, PString & cui);
00423 
00426     virtual PBoolean IsAlternateAddress(
00427         const Address & address,    
00428         WORD port                    
00429         );
00432     void H46024Adirect(bool starter);
00433 
00436     void H46024Bdirect(const H323TransportAddress & address);
00438 
00439   protected:
00440 
00441     // H.460.19 Keepalives
00442     void InitialiseKeepAlive();    
00443     void SendRTPPing(const PIPSocket::Address & ip, const WORD & port);
00444     void SendRTCPPing();
00445     PBoolean SendRTCPFrame(RTP_ControlFrame & report, const PIPSocket::Address & ip, WORD port);
00446     PMutex PingMutex;
00447 
00448     // H46024 Annex A support
00449     PBoolean ReceivedProbePacket(const RTP_ControlFrame & frame, bool & probe, bool & success);
00450     void BuildProbe(RTP_ControlFrame & report, bool reply);
00451     void StartProbe();
00452     void ProbeReceived(bool probe, const PIPSocket::Address & addr, WORD & port);
00453     void SetProbeState(probe_state newstate);
00454     int GetProbeState() const;
00455     probe_state m_state;
00456     PMutex probeMutex;
00457 
00461     virtual PBoolean Internal_WriteTo(
00462       const Slice * slices, 
00463       size_t nSlices,       
00464       const Address & addr, 
00465       WORD port             
00466     );
00467   
00471     virtual PBoolean Internal_WriteTo(
00472       const void * buf,     
00473       PINDEX len,           
00474       const Address & addr, 
00475       WORD port             
00476     );
00477 
00478   private:
00479     H46018Handler & m_Handler;
00480     unsigned m_Session;             
00481     PString m_Token;                
00482     OpalGloballyUniqueID m_CallId;  
00483     PString m_CUI;                  
00484 
00485     // H.460.19 Keepalives
00486     PIPSocket::Address keepip;      
00487     WORD keepport;                  
00488     unsigned keeppayload;           
00489     unsigned keepTTL;               
00490     PUInt32b muxId;                 
00491     WORD keepseqno;                 
00492     PTime * keepStartTime;          
00493 
00494     PDECLARE_NOTIFIER(PTimer, H46019UDPSocket, Ping);   
00495     PTimer    Keep;                                     
00496 
00497     // H46024 Annex A support
00498     PString m_CUIrem;                                   
00499     PIPSocket::Address m_locAddr;  WORD m_locPort;      
00500     PIPSocket::Address m_remAddr;  WORD m_remPort;      
00501     PIPSocket::Address m_detAddr;  WORD m_detPort;      
00502     PIPSocket::Address m_pendAddr;  WORD m_pendPort;    
00503     PDECLARE_NOTIFIER(PTimer, H46019UDPSocket, Probe);  
00504     PTimer m_Probe;                                     
00505     PINDEX m_probes;                                    
00506     DWORD SSRC;                                         
00507     PIPSocket::Address m_altAddr;  WORD m_altPort;      
00508     // H46024 Annex B support
00509     PBoolean    m_h46024b;
00510 
00511     bool rtpSocket;
00512 };
00513 
00514 #endif // OPAL_H460_NAT
00515 
00516 #endif // OPAL_H46018_H225

Generated on 21 Jun 2013 for OPAL by  doxygen 1.4.7