gkserver.h

Go to the documentation of this file.
00001 /*
00002  * gkserver.h
00003  *
00004  * H225 Registration Admission and Security protocol handler
00005  *
00006  * Open H323 Library
00007  *
00008  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (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  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open H323 Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * This code was based on original code from OpenGate of Egoboo Ltd. thanks
00025  * to Ashley Unitt for his efforts.
00026  *
00027  * Contributor(s): ______________________________________.
00028  *
00029  * $Revision: 21004 $
00030  * $Author: rjongbloed $
00031  * $Date: 2008-09-16 07:08:56 +0000 (Tue, 16 Sep 2008) $
00032  */
00033 
00034 #ifndef __OPAL_GKSERVER_H
00035 #define __OPAL_GKSERVER_H
00036 
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040 
00041 #include <opal/buildopts.h>
00042 
00043 #include <ptlib/safecoll.h>
00044 #include <opal/guid.h>
00045 #include <h323/h225ras.h>
00046 #include <h323/transaddr.h>
00047 #include <h323/h235auth.h>
00048 #include <h323/h323pdu.h>
00049 #include <h323/h323trans.h>
00050 
00051 
00052 class PASN_Sequence;
00053 class PASN_Choice;
00054 
00055 class H225_AliasAddress;
00056 class H225_EndpointIdentifier;
00057 class H225_GatekeeperIdentifier;
00058 class H225_ArrayOf_TransportAddress;
00059 class H225_GatekeeperIdentifier;
00060 class H225_EndpointIdentifier;
00061 class H225_InfoRequestResponse_perCallInfo_subtype;
00062 class H225_RasUsageInformation;
00063 
00064 class H323RegisteredEndPoint;
00065 class H323GatekeeperListener;
00066 class H323GatekeeperServer;
00067 class H323RasPDU;
00068 class H323PeerElement;
00069 
00070 
00071 class H323GatekeeperRequest : public H323Transaction
00072 {
00073     PCLASSINFO(H323GatekeeperRequest, H323Transaction);
00074   public:
00079     H323GatekeeperRequest(
00080       H323GatekeeperListener & rasChannel,
00081       const H323RasPDU & pdu
00082     );
00084 
00085     virtual H323TransactionPDU * CreateRIP(
00086       unsigned sequenceNumber,
00087       unsigned delay
00088     ) const;
00089 
00090     virtual PBoolean WritePDU(
00091       H323TransactionPDU & pdu
00092     );
00093     PBoolean CheckCryptoTokens();
00094     PBoolean CheckGatekeeperIdentifier();
00095     PBoolean GetRegisteredEndPoint();
00096 
00097     virtual PString GetGatekeeperIdentifier() const = 0;
00098     virtual unsigned GetGatekeeperRejectTag() const = 0;
00099     virtual PString GetEndpointIdentifier() const = 0;
00100     virtual unsigned GetRegisteredEndPointRejectTag() const = 0;
00101     virtual unsigned GetSecurityRejectTag() const = 0;
00102 
00103     H323GatekeeperListener & GetRasChannel() const { return rasChannel; }
00104 
00105     PSafePtr<H323RegisteredEndPoint> endpoint;
00106 
00107   protected:
00108     H323GatekeeperListener & rasChannel;
00109 };
00110 
00111 
00112 class H323GatekeeperGRQ : public H323GatekeeperRequest
00113 {
00114     PCLASSINFO(H323GatekeeperGRQ, H323GatekeeperRequest);
00115   public:
00116     H323GatekeeperGRQ(
00117       H323GatekeeperListener & listener,
00118       const H323RasPDU & pdu
00119     );
00120 
00121 #if PTRACING
00122     virtual const char * GetName() const;
00123 #endif
00124     virtual PString GetGatekeeperIdentifier() const;
00125     virtual unsigned GetGatekeeperRejectTag() const;
00126     virtual PString GetEndpointIdentifier() const;
00127     virtual unsigned GetRegisteredEndPointRejectTag() const;
00128     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00129     virtual unsigned GetSecurityRejectTag() const;
00130     virtual void SetRejectReason(
00131       unsigned reasonCode
00132     );
00133 
00134     H225_GatekeeperRequest & grq;
00135     H225_GatekeeperConfirm & gcf;
00136     H225_GatekeeperReject  & grj;
00137 
00138   protected:
00139     virtual Response OnHandlePDU();
00140 };
00141 
00142 
00143 class H323GatekeeperRRQ : public H323GatekeeperRequest
00144 {
00145     PCLASSINFO(H323GatekeeperRRQ, H323GatekeeperRequest);
00146   public:
00147     H323GatekeeperRRQ(
00148       H323GatekeeperListener & listener,
00149       const H323RasPDU & pdu
00150     );
00151 
00152 #if PTRACING
00153     virtual const char * GetName() const;
00154 #endif
00155     virtual PString GetGatekeeperIdentifier() const;
00156     virtual unsigned GetGatekeeperRejectTag() const;
00157     virtual PString GetEndpointIdentifier() const;
00158     virtual unsigned GetRegisteredEndPointRejectTag() const;
00159     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00160     virtual unsigned GetSecurityRejectTag() const;
00161     virtual void SetRejectReason(
00162       unsigned reasonCode
00163     );
00164 
00165     H225_RegistrationRequest & rrq;
00166     H225_RegistrationConfirm & rcf;
00167     H225_RegistrationReject  & rrj;
00168 
00169   protected:
00170     virtual Response OnHandlePDU();
00171 };
00172 
00173 
00174 class H323GatekeeperURQ : public H323GatekeeperRequest
00175 {
00176     PCLASSINFO(H323GatekeeperURQ, H323GatekeeperRequest);
00177   public:
00178     H323GatekeeperURQ(
00179       H323GatekeeperListener & listener,
00180       const H323RasPDU & pdu
00181     );
00182 
00183 #if PTRACING
00184     virtual const char * GetName() const;
00185 #endif
00186     virtual PString GetGatekeeperIdentifier() const;
00187     virtual unsigned GetGatekeeperRejectTag() const;
00188     virtual PString GetEndpointIdentifier() const;
00189     virtual unsigned GetRegisteredEndPointRejectTag() const;
00190     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00191     virtual unsigned GetSecurityRejectTag() const;
00192     virtual void SetRejectReason(
00193       unsigned reasonCode
00194     );
00195 
00196     H225_UnregistrationRequest & urq;
00197     H225_UnregistrationConfirm & ucf;
00198     H225_UnregistrationReject  & urj;
00199 
00200   protected:
00201     virtual Response OnHandlePDU();
00202 };
00203 
00204 
00205 class H323GatekeeperARQ : public H323GatekeeperRequest
00206 {
00207     PCLASSINFO(H323GatekeeperARQ, H323GatekeeperRequest);
00208   public:
00209     H323GatekeeperARQ(
00210       H323GatekeeperListener & listener,
00211       const H323RasPDU & pdu
00212     );
00213 
00214 #if PTRACING
00215     virtual const char * GetName() const;
00216 #endif
00217     virtual PString GetGatekeeperIdentifier() const;
00218     virtual unsigned GetGatekeeperRejectTag() const;
00219     virtual PString GetEndpointIdentifier() const;
00220     virtual unsigned GetRegisteredEndPointRejectTag() const;
00221     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00222     virtual unsigned GetSecurityRejectTag() const;
00223     virtual void SetRejectReason(
00224       unsigned reasonCode
00225     );
00226 
00227     H225_AdmissionRequest & arq;
00228     H225_AdmissionConfirm & acf;
00229     H225_AdmissionReject  & arj;
00230 
00231     PString alternateSecurityID;
00232 
00233   protected:
00234     virtual Response OnHandlePDU();
00235 };
00236 
00237 
00238 class H323GatekeeperDRQ : public H323GatekeeperRequest
00239 {
00240     PCLASSINFO(H323GatekeeperDRQ, H323GatekeeperRequest);
00241   public:
00242     H323GatekeeperDRQ(
00243       H323GatekeeperListener & listener,
00244       const H323RasPDU & pdu
00245     );
00246 
00247 #if PTRACING
00248     virtual const char * GetName() const;
00249 #endif
00250     virtual PString GetGatekeeperIdentifier() const;
00251     virtual unsigned GetGatekeeperRejectTag() const;
00252     virtual PString GetEndpointIdentifier() const;
00253     virtual unsigned GetRegisteredEndPointRejectTag() const;
00254     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00255     virtual unsigned GetSecurityRejectTag() const;
00256     virtual void SetRejectReason(
00257       unsigned reasonCode
00258     );
00259 
00260     H225_DisengageRequest & drq;
00261     H225_DisengageConfirm & dcf;
00262     H225_DisengageReject  & drj;
00263 
00264   protected:
00265     virtual Response OnHandlePDU();
00266 };
00267 
00268 
00269 class H323GatekeeperBRQ : public H323GatekeeperRequest
00270 {
00271     PCLASSINFO(H323GatekeeperBRQ, H323GatekeeperRequest);
00272   public:
00273     H323GatekeeperBRQ(
00274       H323GatekeeperListener & listener,
00275       const H323RasPDU & pdu
00276     );
00277 
00278 #if PTRACING
00279     virtual const char * GetName() const;
00280 #endif
00281     virtual PString GetGatekeeperIdentifier() const;
00282     virtual unsigned GetGatekeeperRejectTag() const;
00283     virtual PString GetEndpointIdentifier() const;
00284     virtual unsigned GetRegisteredEndPointRejectTag() const;
00285     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00286     virtual unsigned GetSecurityRejectTag() const;
00287     virtual void SetRejectReason(
00288       unsigned reasonCode
00289     );
00290 
00291     H225_BandwidthRequest & brq;
00292     H225_BandwidthConfirm & bcf;
00293     H225_BandwidthReject  & brj;
00294 
00295   protected:
00296     virtual Response OnHandlePDU();
00297 };
00298 
00299 
00300 class H323GatekeeperLRQ : public H323GatekeeperRequest
00301 {
00302     PCLASSINFO(H323GatekeeperLRQ, H323GatekeeperRequest);
00303   public:
00304     H323GatekeeperLRQ(
00305       H323GatekeeperListener & listener,
00306       const H323RasPDU & pdu
00307     );
00308 
00309 #if PTRACING
00310     virtual const char * GetName() const;
00311 #endif
00312     virtual PString GetGatekeeperIdentifier() const;
00313     virtual unsigned GetGatekeeperRejectTag() const;
00314     virtual PString GetEndpointIdentifier() const;
00315     virtual unsigned GetRegisteredEndPointRejectTag() const;
00316     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00317     virtual unsigned GetSecurityRejectTag() const;
00318     virtual void SetRejectReason(
00319       unsigned reasonCode
00320     );
00321 
00322     H225_LocationRequest & lrq;
00323     H225_LocationConfirm & lcf;
00324     H225_LocationReject  & lrj;
00325 
00326   protected:
00327     virtual Response OnHandlePDU();
00328 };
00329 
00330 
00331 class H323GatekeeperIRR : public H323GatekeeperRequest
00332 {
00333     PCLASSINFO(H323GatekeeperIRR, H323GatekeeperRequest);
00334   public:
00335     H323GatekeeperIRR(
00336       H323GatekeeperListener & listener,
00337       const H323RasPDU & pdu
00338     );
00339 
00340 #if PTRACING
00341     virtual const char * GetName() const;
00342 #endif
00343     virtual PString GetGatekeeperIdentifier() const;
00344     virtual unsigned GetGatekeeperRejectTag() const;
00345     virtual PString GetEndpointIdentifier() const;
00346     virtual unsigned GetRegisteredEndPointRejectTag() const;
00347     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00348     virtual unsigned GetSecurityRejectTag() const;
00349     virtual void SetRejectReason(
00350       unsigned reasonCode
00351     );
00352 
00353     H225_InfoRequestResponse & irr;
00354     H225_InfoRequestAck      & iack;
00355     H225_InfoRequestNak      & inak;
00356 
00357   protected:
00358     virtual Response OnHandlePDU();
00359 };
00360 
00361 
00364 class H323GatekeeperCall : public PSafeObject
00365 {
00366     PCLASSINFO(H323GatekeeperCall, PSafeObject);
00367   public:
00370     enum Direction {
00371       AnsweringCall,
00372       OriginatingCall,
00373       UnknownDirection
00374     };
00375 
00378     H323GatekeeperCall(
00379       H323GatekeeperServer & server,               
00380       const OpalGloballyUniqueID & callIdentifier, 
00381       Direction direction                          
00382     );
00383 
00386     ~H323GatekeeperCall();
00388 
00393     Comparison Compare(
00394       const PObject & obj  
00395     ) const;
00396 
00399     void PrintOn(
00400       ostream & strm    
00401     ) const;
00403 
00411     virtual H323GatekeeperRequest::Response OnAdmission(
00412       H323GatekeeperARQ & request
00413     );
00414 
00418     virtual PBoolean Disengage(
00419       int reason = -1   
00420     );
00421 
00425     virtual H323GatekeeperRequest::Response OnDisengage(
00426       H323GatekeeperDRQ & request
00427     );
00428 
00433     virtual H323GatekeeperRequest::Response OnBandwidth(
00434       H323GatekeeperBRQ & request
00435     );
00436 
00440     virtual H323GatekeeperRequest::Response OnInfoResponse(
00441       H323GatekeeperIRR & request,
00442       H225_InfoRequestResponse_perCallInfo_subtype & call
00443     );
00444 
00447     virtual void OnAlerting();
00448 
00451     virtual void OnConnected();
00452 
00463     virtual PBoolean OnHeartbeat();
00464 
00471     virtual PString GetCallCreditAmount() const;
00472 
00479     virtual PBoolean GetCallCreditMode() const;
00480 
00488     virtual unsigned GetDurationLimit() const;
00489 
00494     virtual PBoolean SendCallCreditServiceControl();
00495 
00498     PBoolean AddCallCreditServiceControl(
00499       H225_ArrayOf_ServiceControlSession & serviceControl
00500     ) const;
00501 
00506     virtual PBoolean SendServiceControlSession(
00507       const H323ServiceControlSession & session
00508     );
00509 
00515     virtual PBoolean TranslateAliasAddress(
00516       const H225_AliasAddress & alias,
00517       H225_ArrayOf_AliasAddress & aliases,
00518       H323TransportAddress & address,
00519       PBoolean & isGkRouted
00520     );
00521 
00523 
00526     H323GatekeeperServer & GetGatekeeper() const { return gatekeeper; }
00527     H323RegisteredEndPoint & GetEndPoint() const { return *PAssertNULL(endpoint); }
00528     PBoolean IsAnsweringCall() const { return direction == AnsweringCall; }
00529     unsigned GetCallReference() const { return callReference; }
00530     const OpalGloballyUniqueID & GetCallIdentifier() const { return callIdentifier; }
00531     const OpalGloballyUniqueID & GetConferenceIdentifier() const { return conferenceIdentifier; }
00532     const PString & GetSourceNumber() const { return srcNumber; }
00533     const PStringArray & GetSourceAliases() const { return srcAliases; }
00534     const H323TransportAddress & GetSourceHost() const { return srcHost; }
00535     PString GetSourceAddress() const;
00536     const PString & GetDestinationNumber() const { return dstNumber; }
00537     const PStringArray & GetDestinationAliases() const { return dstAliases; }
00538     const H323TransportAddress & GetDestinationHost() const { return dstHost; }
00539     PString GetDestinationAddress() const;
00540     unsigned GetBandwidthUsed() const { return bandwidthUsed; }
00541     PBoolean SetBandwidthUsed(unsigned bandwidth);
00542     const PTime & GetLastInfoResponseTime() const { return lastInfoResponse; }
00543     const PTime & GetCallStartTime() const { return callStartTime; }
00544     const PTime & GetAlertingTime() const { return alertingTime; }
00545     const PTime & GetConnectedTime() const { return connectedTime; }
00546     const PTime & GetCallEndTime() const { return callEndTime; }
00547     H323Connection::CallEndReason GetCallEndReason() const { return callEndReason; }
00549 
00550   protected:
00551     void SetUsageInfo(const H225_RasUsageInformation & usage);
00552 
00553     H323GatekeeperServer   & gatekeeper;
00554     H323RegisteredEndPoint * endpoint;
00555     H323GatekeeperListener * rasChannel;
00556 
00557     Direction            direction;
00558     unsigned             callReference;
00559     OpalGloballyUniqueID callIdentifier;
00560     OpalGloballyUniqueID conferenceIdentifier;
00561     PString              srcNumber;
00562     PStringArray         srcAliases;
00563     H323TransportAddress srcHost;
00564     PString              dstNumber;
00565     PStringArray         dstAliases;
00566     H323TransportAddress dstHost;
00567     unsigned             bandwidthUsed;
00568     unsigned             infoResponseRate;
00569     PTime                lastInfoResponse;
00570 
00571     PBoolean                          drqReceived;
00572     PTime                         callStartTime;
00573     PTime                         alertingTime;
00574     PTime                         connectedTime;
00575     PTime                         callEndTime;
00576     H323Connection::CallEndReason callEndReason;
00577 };
00578 
00579 
00585 class H323RegisteredEndPoint : public PSafeObject
00586 {
00587     PCLASSINFO(H323RegisteredEndPoint, PSafeObject);
00588   public:
00593     H323RegisteredEndPoint(
00594       H323GatekeeperServer & server, 
00595       const PString & id             
00596     );
00598 
00603     Comparison Compare(
00604       const PObject & obj  
00605     ) const;
00606 
00609     void PrintOn(
00610       ostream & strm    
00611     ) const;
00613 
00620     virtual void AddCall(
00621       H323GatekeeperCall * call
00622     );
00623 
00628     virtual PBoolean RemoveCall(
00629       H323GatekeeperCall * call
00630     );
00631 
00634     PINDEX GetCallCount() const { return activeCalls.GetSize(); }
00635 
00638     H323GatekeeperCall & GetCall(
00639       PINDEX idx
00640     ) { return activeCalls[idx]; }
00642 
00651     virtual H323GatekeeperRequest::Response OnRegistration(
00652       H323GatekeeperRRQ & request
00653     );
00654 
00664     virtual H323GatekeeperRequest::Response OnFullRegistration(
00665       H323GatekeeperRRQ & request
00666     );
00667 
00676     virtual H323GatekeeperRequest::Response OnSecureRegistration(
00677       H323GatekeeperRRQ & request
00678     );
00679 
00683     virtual H323GatekeeperRequest::Response OnUnregistration(
00684       H323GatekeeperURQ & request
00685     );
00686 
00690     virtual PBoolean Unregister(
00691       int reason = -1   
00692     );
00693 
00698     virtual H323GatekeeperRequest::Response OnInfoResponse(
00699       H323GatekeeperIRR & request
00700     );
00701 
00712     virtual PBoolean OnTimeToLive();
00713 
00725     virtual PString GetCallCreditAmount() const;
00726 
00734     virtual PBoolean GetCallCreditMode() const;
00735 
00740     virtual PBoolean SendServiceControlSession(
00741       const H323ServiceControlSession & session
00742     );
00743 
00747     virtual PBoolean AddServiceControlSession(
00748       const H323ServiceControlSession & session,
00749       H225_ArrayOf_ServiceControlSession & serviceControl
00750     );
00752 
00757     virtual PBoolean SetPassword(
00758       const PString & password,
00759       const PString & username = PString::Empty()
00760     );
00761 
00764     const PString & GetIdentifier() const { return identifier; }
00765 
00768     const OpalGloballyUniqueID & GetDescriptorID() const { return descriptorID; }
00769 
00772     H323GatekeeperServer & GetGatekeeper() const { return gatekeeper; }
00773 
00777     const H323TransportAddressArray & GetRASAddresses() const { return rasAddresses; }
00778 
00782     PINDEX GetRASAddressCount() const { return rasAddresses.GetSize(); }
00783 
00787     H323TransportAddress GetRASAddress(
00788       PINDEX idx
00789     ) const { return rasAddresses[idx]; }
00790 
00794     const H323TransportAddressArray & GetSignalAddresses() const { return signalAddresses; }
00795 
00799     PINDEX GetSignalAddressCount() const { return signalAddresses.GetSize(); }
00800 
00804     H323TransportAddress GetSignalAddress(
00805       PINDEX idx
00806     ) const { return signalAddresses[idx]; }
00807 
00810     const PStringArray & GetAliases() const { return aliases; }
00811 
00814     PBoolean ContainsAlias(
00815       const PString & alias
00816       ) { return aliases.GetStringsIndex(alias) != P_MAX_INDEX; }
00817 
00820     PINDEX GetAliasCount() const { return aliases.GetSize(); }
00821 
00824     PString GetAlias(
00825       PINDEX idx
00826     ) const { if (idx < aliases.GetSize()) return aliases[idx]; return PString::Empty(); }
00827 
00833     void RemoveAlias(
00834       const PString & alias
00835     );
00836 
00839     virtual const H235Authenticators & GetAuthenticators() const { return authenticators; }
00840 
00843     PINDEX GetPrefixCount() const { return voicePrefixes.GetSize(); }
00844 
00847     PString GetPrefix(
00848       PINDEX idx
00849     ) const { return voicePrefixes[idx]; }
00850 
00853     PCaselessString GetApplicationInfo() const { return productInfo.AsString(); }
00854 
00857     const OpalProductInfo & GetProductInfo() const { return productInfo; }
00858 
00861     unsigned GetProtocolVersion() const { return protocolVersion; }
00862 
00865     PBoolean IsBehindNAT() const { return isBehindNAT; }
00866 
00869     PBoolean CanDisplayAmountString() const { return canDisplayAmountString; }
00870 
00873     PBoolean CanEnforceDurationLimit() const { return canEnforceDurationLimit; }
00874 
00877     PBoolean CanReceiveRIP() const;
00878 
00881     PBoolean GetH225Version() const { return h225Version; }
00883 
00893       virtual PBoolean OnSendDescriptorForEndpoint(
00894         H225_ArrayOf_AliasAddress & aliases,          
00895         H225_EndpointType & terminalType,             
00896         H225_ArrayOf_AliasAddress & transportAddresses  
00897       );
00899 
00900 
00901   protected:
00902     H323GatekeeperServer    & gatekeeper;
00903     H323GatekeeperListener  * rasChannel;
00904 
00905     PString                   identifier;
00906     OpalGloballyUniqueID      descriptorID;
00907     H323TransportAddressArray rasAddresses;
00908     H323TransportAddressArray signalAddresses;
00909     PStringArray              aliases;
00910     PStringArray              voicePrefixes;
00911     OpalProductInfo           productInfo;
00912     unsigned                  protocolVersion;
00913     PBoolean                      isBehindNAT;
00914     PBoolean                      canDisplayAmountString;
00915     PBoolean                      canEnforceDurationLimit;
00916     unsigned                  h225Version;
00917     unsigned                  timeToLive;
00918     H235Authenticators        authenticators;
00919 
00920     PTime lastRegistration;
00921     PTime lastInfoResponse;
00922 
00923     PSortedList<H323GatekeeperCall> activeCalls;
00924     POrdinalDictionary<PString>     serviceControlSessions;
00925 };
00926 
00927 
00933 class H323GatekeeperListener : public H225_RAS
00934 {
00935     PCLASSINFO(H323GatekeeperListener, H225_RAS);
00936   public:
00941     H323GatekeeperListener(
00942       H323EndPoint & endpoint,               
00943       H323GatekeeperServer & server,         
00944       const PString & gatekeeperIdentifier,  
00945       H323Transport * transport = NULL       
00946     );
00947 
00950     ~H323GatekeeperListener();
00952 
00957     PBoolean UnregistrationRequest(
00958       const H323RegisteredEndPoint & ep,
00959       unsigned reason
00960     );
00961 
00964     PBoolean DisengageRequest(
00965       const H323GatekeeperCall & call,
00966       unsigned reason
00967     );
00968 
00971     virtual PBoolean InfoRequest(
00972       H323RegisteredEndPoint & ep,
00973       H323GatekeeperCall * call = NULL
00974     );
00975 
00978     virtual PBoolean ServiceControlIndication(
00979       H323RegisteredEndPoint & ep,
00980       const H323ServiceControlSession & session,
00981       H323GatekeeperCall * call = NULL
00982     );
00984 
00991     virtual H323GatekeeperRequest::Response OnDiscovery(
00992       H323GatekeeperGRQ & request
00993     );
00994 
00999     virtual H323GatekeeperRequest::Response OnRegistration(
01000       H323GatekeeperRRQ & request
01001     );
01002 
01007     virtual H323GatekeeperRequest::Response OnUnregistration(
01008       H323GatekeeperURQ & request
01009     );
01010 
01015     virtual H323GatekeeperRequest::Response OnAdmission(
01016       H323GatekeeperARQ & request
01017     );
01018 
01023     virtual H323GatekeeperRequest::Response OnDisengage(
01024       H323GatekeeperDRQ & request
01025     );
01026 
01031     virtual H323GatekeeperRequest::Response OnBandwidth(
01032       H323GatekeeperBRQ & request
01033     );
01034 
01039     virtual H323GatekeeperRequest::Response OnLocation(
01040       H323GatekeeperLRQ & request
01041     );
01042 
01047     virtual H323GatekeeperRequest::Response OnInfoResponse(
01048       H323GatekeeperIRR & request
01049     );
01051 
01054     virtual PBoolean OnReceiveGatekeeperRequest(const H323RasPDU &, const H225_GatekeeperRequest &);
01055     virtual PBoolean OnReceiveRegistrationRequest(const H323RasPDU &, const H225_RegistrationRequest &);
01056     virtual PBoolean OnReceiveUnregistrationRequest(const H323RasPDU &, const H225_UnregistrationRequest &);
01057     virtual PBoolean OnReceiveUnregistrationConfirm(const H225_UnregistrationConfirm &);
01058     virtual PBoolean OnReceiveUnregistrationReject(const H225_UnregistrationReject &);
01059     virtual PBoolean OnReceiveAdmissionRequest(const H323RasPDU &, const H225_AdmissionRequest &);
01060     virtual PBoolean OnReceiveBandwidthRequest(const H323RasPDU &, const H225_BandwidthRequest &);
01061     virtual PBoolean OnReceiveBandwidthConfirm(const H225_BandwidthConfirm &);
01062     virtual PBoolean OnReceiveBandwidthReject(const H225_BandwidthReject &);
01063     virtual PBoolean OnReceiveDisengageRequest(const H323RasPDU &, const H225_DisengageRequest &);
01064     virtual PBoolean OnReceiveDisengageConfirm(const H225_DisengageConfirm &);
01065     virtual PBoolean OnReceiveDisengageReject(const H225_DisengageReject &);
01066     virtual PBoolean OnReceiveLocationRequest(const H323RasPDU &, const H225_LocationRequest &);
01067     virtual PBoolean OnReceiveInfoRequestResponse(const H323RasPDU &, const H225_InfoRequestResponse &);
01068     virtual PBoolean OnReceiveResourcesAvailableConfirm(const H225_ResourcesAvailableConfirm &);
01069     virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet & features) const;
01070     virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet & features) const;
01072 
01075     H323GatekeeperServer & GetGatekeeper() const { return gatekeeper; }
01077 
01078 
01079   protected:
01080     H323GatekeeperServer & gatekeeper;
01081 };
01082 
01083 
01094 class H323GatekeeperServer : public H323TransactionServer
01095 {
01096     PCLASSINFO(H323GatekeeperServer, H323TransactionServer);
01097   public:
01102     H323GatekeeperServer(
01103       H323EndPoint & endpoint
01104     );
01105 
01108     ~H323GatekeeperServer();
01110 
01111     WORD GetDefaultUdpPort() { return H225_RAS::DefaultRasUdpPort; }
01112 
01123     virtual H323Transactor * CreateListener(
01124       H323Transport * transport  
01125     );
01126 
01128 
01134     virtual H323GatekeeperRequest::Response OnDiscovery(
01135       H323GatekeeperGRQ & request
01136     );
01137 
01145     virtual H323GatekeeperRequest::Response OnRegistration(
01146       H323GatekeeperRRQ & request
01147     );
01148 
01154     virtual H323GatekeeperRequest::Response OnUnregistration(
01155       H323GatekeeperURQ & request
01156     );
01157 
01162     virtual H323GatekeeperRequest::Response OnInfoResponse(
01163       H323GatekeeperIRR & request
01164     );
01165 
01176     virtual void AddEndPoint(
01177       H323RegisteredEndPoint * ep
01178     );
01179 
01182     virtual PBoolean RemoveEndPoint(
01183       H323RegisteredEndPoint * ep
01184     );
01185 
01194     virtual H323RegisteredEndPoint * CreateRegisteredEndPoint(
01195       H323GatekeeperRRQ & request
01196     );
01197 
01206     virtual PString CreateEndPointIdentifier();
01207 
01210     virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByIdentifier(
01211       const PString & identifier,
01212       PSafetyMode mode = PSafeReference
01213     );
01214 
01217     virtual PSafePtr<H323RegisteredEndPoint> FindEndPointBySignalAddresses(
01218       const H225_ArrayOf_TransportAddress & addresses,
01219       PSafetyMode mode = PSafeReference
01220     );
01221 
01224     virtual PSafePtr<H323RegisteredEndPoint> FindEndPointBySignalAddress(
01225       const H323TransportAddress & address,
01226       PSafetyMode mode = PSafeReference
01227     );
01228 
01231     virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByAliasAddress(
01232       const H225_AliasAddress & alias,
01233       PSafetyMode mode = PSafeReadWrite
01234     );
01235 
01238     virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByAliasString(
01239       const PString & alias,
01240       PSafetyMode mode = PSafeReference
01241     );
01242 
01245     virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByPartialAlias(
01246       const PString & alias,
01247       PSafetyMode mode = PSafeReference
01248     );
01249 
01252     virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByPrefixString(
01253       const PString & prefix,
01254       PSafetyMode mode = PSafeReference
01255     );
01256 
01259     PSafePtr<H323RegisteredEndPoint> GetFirstEndPoint(
01260       PSafetyMode mode = PSafeReference
01261     ) { return PSafePtr<H323RegisteredEndPoint>(byIdentifier, mode); }
01263 
01264     PSafePtr<H323RegisteredEndPoint> FindDestinationEndPoint(
01265       const OpalGloballyUniqueID & id, 
01266       H323GatekeeperCall::Direction direction
01267     );
01268     
01276     virtual H323GatekeeperRequest::Response OnAdmission(
01277       H323GatekeeperARQ & request
01278     );
01279 
01284     virtual H323GatekeeperRequest::Response OnDisengage(
01285       H323GatekeeperDRQ & request
01286     );
01287 
01292     virtual H323GatekeeperRequest::Response OnBandwidth(
01293       H323GatekeeperBRQ & request
01294     );
01295 
01304     virtual H323GatekeeperCall * CreateCall(
01305       const OpalGloballyUniqueID & callIdentifier,
01306       H323GatekeeperCall::Direction direction
01307     );
01308 
01311     virtual void AddCall(H323GatekeeperCall *) 
01312     { }
01313 
01316     virtual void RemoveCall(
01317       H323GatekeeperCall * call
01318     );
01319 
01322     virtual PSafePtr<H323GatekeeperCall> FindCall(
01323       const PString & description,
01324       PSafetyMode mode = PSafeReference
01325     );
01326 
01329     virtual PSafePtr<H323GatekeeperCall> FindCall(
01330       const OpalGloballyUniqueID & callIdentifier,
01331       PBoolean answeringCall,
01332       PSafetyMode mode = PSafeReference
01333     );
01334 
01337     virtual PSafePtr<H323GatekeeperCall> FindCall(
01338       const OpalGloballyUniqueID & callIdentifier,
01339       H323GatekeeperCall::Direction direction,
01340       PSafetyMode mode = PSafeReference
01341     );
01342 
01345     PSafePtr<H323GatekeeperCall> GetFirstCall(
01346       PSafetyMode mode = PSafeReference
01347     ) { return PSafePtr<H323GatekeeperCall>(activeCalls, mode); }
01349 
01359     virtual H323GatekeeperRequest::Response OnLocation(
01360       H323GatekeeperLRQ & request
01361     );
01362 
01374     virtual PBoolean TranslateAliasAddress(
01375       const H225_AliasAddress & alias,
01376       H225_ArrayOf_AliasAddress & aliases,
01377       H323TransportAddress & address,
01378       PBoolean & isGkRouted,
01379       H323GatekeeperCall * call
01380     );
01381 
01401     virtual PBoolean TranslateAliasAddressToSignalAddress(
01402       const H225_AliasAddress & alias,
01403       H323TransportAddress & address
01404     );
01406 
01418     virtual PBoolean CheckSignalAddressPolicy(
01419       const H323RegisteredEndPoint & ep,
01420       const H225_AdmissionRequest & arq,
01421       const H323TransportAddress & address
01422     );
01423 
01436     virtual PBoolean CheckAliasAddressPolicy(
01437       const H323RegisteredEndPoint & ep,
01438       const H225_AdmissionRequest & arq,
01439       const H225_AliasAddress & alias
01440     );
01441 
01454     virtual PBoolean CheckAliasStringPolicy(
01455       const H323RegisteredEndPoint & ep,
01456       const H225_AdmissionRequest & arq,
01457       const PString & alias
01458     );
01459 
01465     virtual unsigned AllocateBandwidth(
01466       unsigned newBandwidth,
01467       unsigned oldBandwidth = 0
01468     );
01470 
01482     virtual PBoolean GetAdmissionRequestAuthentication(
01483       H323GatekeeperARQ & info,           
01484       H235Authenticators & authenticators 
01485     );
01486 
01492     virtual PBoolean GetUsersPassword(
01493       const PString & alias,
01494       PString & password,
01495       H323RegisteredEndPoint & registeredEndpoint
01496     ) const;
01497     virtual PBoolean GetUsersPassword(
01498       const PString & alias,
01499       PString & password
01500     ) const;
01502 
01507     H323PeerElement * GetPeerElement() const { return peerElement; }
01508 
01512     void SetPeerElement(
01513       H323PeerElement * newPeerElement
01514     );
01515 
01521     void CreatePeerElement(
01522       const H323TransportAddress & h501Interface
01523     );
01524 
01530     PBoolean OpenPeerElement(
01531       const H323TransportAddress & remotePeer,
01532       PBoolean append = PFalse,
01533       PBoolean keepTrying = PTrue
01534     );
01536 
01541     const PString & GetGatekeeperIdentifier() const { return gatekeeperIdentifier; }
01542 
01548     void SetGatekeeperIdentifier(
01549       const PString & id,
01550       PBoolean adjustListeners = PTrue
01551     );
01552 
01555     unsigned GetAvailableBandwidth() const { return totalBandwidth; }
01556 
01559     void SetAvailableBandwidth(unsigned bps100) { totalBandwidth = bps100; }
01560 
01563     unsigned GetUsedBandwidth() const { return usedBandwidth; }
01564 
01567     unsigned GetDefaultBandwidth() const { return defaultBandwidth; }
01568 
01571     unsigned GetTimeToLive() const { return defaultTimeToLive; }
01572 
01575     void SetTimeToLive(unsigned seconds) { defaultTimeToLive = seconds; }
01576 
01579     unsigned GetInfoResponseRate() const { return defaultInfoResponseRate; }
01580 
01583     void SetInfoResponseRate(unsigned seconds) { defaultInfoResponseRate = seconds; }
01584 
01587     PBoolean IsGatekeeperRouted() const { return isGatekeeperRouted; }
01588 
01591     PBoolean IsRequiredH235() const { return requireH235; }
01592 
01595     unsigned GetActiveRegistrations() const { return byIdentifier.GetSize(); }
01596 
01599     unsigned GetPeakRegistrations() const { return peakRegistrations; }
01600 
01603     unsigned GetTotalRegistrations() const { return totalRegistrations; }
01604 
01607     unsigned GetRejectedRegistrations() const { return rejectedRegistrations; }
01608 
01611     unsigned GetActiveCalls() const { return activeCalls.GetSize(); }
01612 
01615     unsigned GetPeakCalls() const { return peakCalls; }
01616 
01619     unsigned GetTotalCalls() const { return totalCalls; }
01620 
01623     unsigned GetRejectedCalls() const { return rejectedCalls; }
01625 
01626     // Remove an alias from the server database.
01627     void RemoveAlias(
01628       H323RegisteredEndPoint & ep,
01629       const PString & alias
01630     );
01631 
01632     // called when an endpoint needs to send a descriptor to the H.501 peer element
01633     virtual PBoolean OnSendDescriptorForEndpoint(
01634       H323RegisteredEndPoint & /*ep*/,                    
01635       H225_ArrayOf_AliasAddress & /*aliases*/,            
01636       H225_EndpointType & /*terminalType*/,               
01637       H225_ArrayOf_AliasAddress & /*transportAddresses*/  
01638     )
01639     { return PTrue; } 
01640 
01641     virtual PBoolean AllowDuplicateAlias(const H225_ArrayOf_AliasAddress & /*aliases*/)
01642     { return canHaveDuplicateAlias; }
01643 
01644     virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet & features) const;
01645     virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet & features) const;
01646 
01647   protected:
01648 
01649     PDECLARE_NOTIFIER(PThread, H323GatekeeperServer, MonitorMain);
01650 
01651     // Configuration & policy variables
01652     PString  gatekeeperIdentifier;
01653     unsigned totalBandwidth;
01654     unsigned usedBandwidth;
01655     unsigned defaultBandwidth;
01656     unsigned maximumBandwidth;
01657     unsigned defaultTimeToLive;
01658     unsigned defaultInfoResponseRate;
01659     PBoolean     overwriteOnSameSignalAddress;
01660     PBoolean     canHaveDuplicateAlias;
01661     PBoolean     canHaveDuplicatePrefix;
01662     PBoolean     canOnlyCallRegisteredEP;
01663     PBoolean     canOnlyAnswerRegisteredEP;
01664     PBoolean     answerCallPreGrantedARQ;
01665     PBoolean     makeCallPreGrantedARQ;
01666     PBoolean     isGatekeeperRouted;
01667     PBoolean     aliasCanBeHostName;
01668     PBoolean     requireH235;
01669     PBoolean     disengageOnHearbeatFail;
01670 
01671     PStringToString passwords;
01672 
01673     // Dynamic variables
01674     PMutex         mutex;
01675     time_t         identifierBase;
01676     unsigned       nextIdentifier;
01677     PThread      * monitorThread;
01678     PSyncPoint     monitorExit;
01679 
01680     PLIST(ListenerList, H323GatekeeperListener);
01681     ListenerList listeners;
01682 
01683     H323PeerElement * peerElement;
01684 
01685     PSafeDictionary<PString, H323RegisteredEndPoint> byIdentifier;
01686 
01687     class StringMap : public PString {
01688         PCLASSINFO(StringMap, PString);
01689       public:
01690         StringMap(const PString & from, const PString & id)
01691           : PString(from), identifier(id) { }
01692         PString identifier;
01693     };
01694     PSortedStringList byAddress;
01695     PSortedStringList byAlias;
01696     PSortedStringList byVoicePrefix;
01697 
01698     PSafeSortedList<H323GatekeeperCall> activeCalls;
01699 
01700     PINDEX peakRegistrations;
01701     PINDEX totalRegistrations;
01702     PINDEX rejectedRegistrations;
01703     PINDEX peakCalls;
01704     PINDEX totalCalls;
01705     PINDEX rejectedCalls;
01706 
01707   friend class H323GatekeeperRRQ;
01708   friend class H323GatekeeperARQ;
01709 };
01710 
01711 
01712 #endif // __OPAL_GKSERVER_H
01713 
01714 
01716 

Generated on Mon Sep 22 12:24:24 2008 for OPAL by  doxygen 1.5.1