OPAL Version 3.10.2
|
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: 24178 $ 00030 * $Author: rjongbloed $ 00031 * $Date: 2010-04-05 19:10:56 -0500 (Mon, 05 Apr 2010) $ 00032 */ 00033 00034 #ifndef OPAL_H323_GKSERVER_H 00035 #define OPAL_H323_GKSERVER_H 00036 00037 #ifdef P_USE_PRAGMA 00038 #pragma interface 00039 #endif 00040 00041 #include <opal/buildopts.h> 00042 00043 #if OPAL_H323 00044 00045 #include <ptlib/safecoll.h> 00046 #include <opal/guid.h> 00047 #include <h323/h225ras.h> 00048 #include <h323/transaddr.h> 00049 #include <h323/h235auth.h> 00050 #include <h323/h323pdu.h> 00051 #include <h323/h323trans.h> 00052 00053 00054 class PASN_Sequence; 00055 class PASN_Choice; 00056 00057 class H225_AliasAddress; 00058 class H225_EndpointIdentifier; 00059 class H225_GatekeeperIdentifier; 00060 class H225_ArrayOf_TransportAddress; 00061 class H225_GatekeeperIdentifier; 00062 class H225_EndpointIdentifier; 00063 class H225_InfoRequestResponse_perCallInfo_subtype; 00064 class H225_RasUsageInformation; 00065 00066 class H323RegisteredEndPoint; 00067 class H323GatekeeperListener; 00068 class H323GatekeeperServer; 00069 class H323RasPDU; 00070 00071 #if OPAL_H501 00072 class H323PeerElement; 00073 #endif 00074 00075 class H323GatekeeperRequest : public H323Transaction 00076 { 00077 PCLASSINFO(H323GatekeeperRequest, H323Transaction); 00078 public: 00083 H323GatekeeperRequest( 00084 H323GatekeeperListener & rasChannel, 00085 const H323RasPDU & pdu 00086 ); 00088 00089 virtual H323TransactionPDU * CreateRIP( 00090 unsigned sequenceNumber, 00091 unsigned delay 00092 ) const; 00093 00094 virtual PBoolean WritePDU( 00095 H323TransactionPDU & pdu 00096 ); 00097 PBoolean CheckCryptoTokens(); 00098 PBoolean CheckGatekeeperIdentifier(); 00099 PBoolean GetRegisteredEndPoint(); 00100 00101 virtual PString GetGatekeeperIdentifier() const = 0; 00102 virtual unsigned GetGatekeeperRejectTag() const = 0; 00103 virtual PString GetEndpointIdentifier() const = 0; 00104 virtual unsigned GetRegisteredEndPointRejectTag() const = 0; 00105 virtual unsigned GetSecurityRejectTag() const = 0; 00106 00107 H323GatekeeperListener & GetRasChannel() const { return rasChannel; } 00108 00109 PSafePtr<H323RegisteredEndPoint> endpoint; 00110 00111 protected: 00112 H323GatekeeperListener & rasChannel; 00113 }; 00114 00115 00116 class H323GatekeeperGRQ : public H323GatekeeperRequest 00117 { 00118 PCLASSINFO(H323GatekeeperGRQ, H323GatekeeperRequest); 00119 public: 00120 H323GatekeeperGRQ( 00121 H323GatekeeperListener & listener, 00122 const H323RasPDU & pdu 00123 ); 00124 00125 #if PTRACING 00126 virtual const char * GetName() const; 00127 #endif 00128 virtual PString GetGatekeeperIdentifier() const; 00129 virtual unsigned GetGatekeeperRejectTag() const; 00130 virtual PString GetEndpointIdentifier() const; 00131 virtual unsigned GetRegisteredEndPointRejectTag() const; 00132 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00133 virtual unsigned GetSecurityRejectTag() const; 00134 virtual void SetRejectReason( 00135 unsigned reasonCode 00136 ); 00137 00138 H225_GatekeeperRequest & grq; 00139 H225_GatekeeperConfirm & gcf; 00140 H225_GatekeeperReject & grj; 00141 00142 protected: 00143 virtual Response OnHandlePDU(); 00144 }; 00145 00146 00147 class H323GatekeeperRRQ : public H323GatekeeperRequest 00148 { 00149 PCLASSINFO(H323GatekeeperRRQ, H323GatekeeperRequest); 00150 public: 00151 H323GatekeeperRRQ( 00152 H323GatekeeperListener & listener, 00153 const H323RasPDU & pdu 00154 ); 00155 00156 #if PTRACING 00157 virtual const char * GetName() const; 00158 #endif 00159 virtual PString GetGatekeeperIdentifier() const; 00160 virtual unsigned GetGatekeeperRejectTag() const; 00161 virtual PString GetEndpointIdentifier() const; 00162 virtual unsigned GetRegisteredEndPointRejectTag() const; 00163 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00164 virtual unsigned GetSecurityRejectTag() const; 00165 virtual void SetRejectReason( 00166 unsigned reasonCode 00167 ); 00168 00169 H225_RegistrationRequest & rrq; 00170 H225_RegistrationConfirm & rcf; 00171 H225_RegistrationReject & rrj; 00172 00173 protected: 00174 virtual Response OnHandlePDU(); 00175 }; 00176 00177 00178 class H323GatekeeperURQ : public H323GatekeeperRequest 00179 { 00180 PCLASSINFO(H323GatekeeperURQ, H323GatekeeperRequest); 00181 public: 00182 H323GatekeeperURQ( 00183 H323GatekeeperListener & listener, 00184 const H323RasPDU & pdu 00185 ); 00186 00187 #if PTRACING 00188 virtual const char * GetName() const; 00189 #endif 00190 virtual PString GetGatekeeperIdentifier() const; 00191 virtual unsigned GetGatekeeperRejectTag() const; 00192 virtual PString GetEndpointIdentifier() const; 00193 virtual unsigned GetRegisteredEndPointRejectTag() const; 00194 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00195 virtual unsigned GetSecurityRejectTag() const; 00196 virtual void SetRejectReason( 00197 unsigned reasonCode 00198 ); 00199 00200 H225_UnregistrationRequest & urq; 00201 H225_UnregistrationConfirm & ucf; 00202 H225_UnregistrationReject & urj; 00203 00204 protected: 00205 virtual Response OnHandlePDU(); 00206 }; 00207 00208 00209 class H323GatekeeperARQ : public H323GatekeeperRequest 00210 { 00211 PCLASSINFO(H323GatekeeperARQ, H323GatekeeperRequest); 00212 public: 00213 H323GatekeeperARQ( 00214 H323GatekeeperListener & listener, 00215 const H323RasPDU & pdu 00216 ); 00217 00218 #if PTRACING 00219 virtual const char * GetName() const; 00220 #endif 00221 virtual PString GetGatekeeperIdentifier() const; 00222 virtual unsigned GetGatekeeperRejectTag() const; 00223 virtual PString GetEndpointIdentifier() const; 00224 virtual unsigned GetRegisteredEndPointRejectTag() const; 00225 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00226 virtual unsigned GetSecurityRejectTag() const; 00227 virtual void SetRejectReason( 00228 unsigned reasonCode 00229 ); 00230 00231 H225_AdmissionRequest & arq; 00232 H225_AdmissionConfirm & acf; 00233 H225_AdmissionReject & arj; 00234 00235 PString alternateSecurityID; 00236 00237 protected: 00238 virtual Response OnHandlePDU(); 00239 }; 00240 00241 00242 class H323GatekeeperDRQ : public H323GatekeeperRequest 00243 { 00244 PCLASSINFO(H323GatekeeperDRQ, H323GatekeeperRequest); 00245 public: 00246 H323GatekeeperDRQ( 00247 H323GatekeeperListener & listener, 00248 const H323RasPDU & pdu 00249 ); 00250 00251 #if PTRACING 00252 virtual const char * GetName() const; 00253 #endif 00254 virtual PString GetGatekeeperIdentifier() const; 00255 virtual unsigned GetGatekeeperRejectTag() const; 00256 virtual PString GetEndpointIdentifier() const; 00257 virtual unsigned GetRegisteredEndPointRejectTag() const; 00258 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00259 virtual unsigned GetSecurityRejectTag() const; 00260 virtual void SetRejectReason( 00261 unsigned reasonCode 00262 ); 00263 00264 H225_DisengageRequest & drq; 00265 H225_DisengageConfirm & dcf; 00266 H225_DisengageReject & drj; 00267 00268 protected: 00269 virtual Response OnHandlePDU(); 00270 }; 00271 00272 00273 class H323GatekeeperBRQ : public H323GatekeeperRequest 00274 { 00275 PCLASSINFO(H323GatekeeperBRQ, H323GatekeeperRequest); 00276 public: 00277 H323GatekeeperBRQ( 00278 H323GatekeeperListener & listener, 00279 const H323RasPDU & pdu 00280 ); 00281 00282 #if PTRACING 00283 virtual const char * GetName() const; 00284 #endif 00285 virtual PString GetGatekeeperIdentifier() const; 00286 virtual unsigned GetGatekeeperRejectTag() const; 00287 virtual PString GetEndpointIdentifier() const; 00288 virtual unsigned GetRegisteredEndPointRejectTag() const; 00289 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00290 virtual unsigned GetSecurityRejectTag() const; 00291 virtual void SetRejectReason( 00292 unsigned reasonCode 00293 ); 00294 00295 H225_BandwidthRequest & brq; 00296 H225_BandwidthConfirm & bcf; 00297 H225_BandwidthReject & brj; 00298 00299 protected: 00300 virtual Response OnHandlePDU(); 00301 }; 00302 00303 00304 class H323GatekeeperLRQ : public H323GatekeeperRequest 00305 { 00306 PCLASSINFO(H323GatekeeperLRQ, H323GatekeeperRequest); 00307 public: 00308 H323GatekeeperLRQ( 00309 H323GatekeeperListener & listener, 00310 const H323RasPDU & pdu 00311 ); 00312 00313 #if PTRACING 00314 virtual const char * GetName() const; 00315 #endif 00316 virtual PString GetGatekeeperIdentifier() const; 00317 virtual unsigned GetGatekeeperRejectTag() const; 00318 virtual PString GetEndpointIdentifier() const; 00319 virtual unsigned GetRegisteredEndPointRejectTag() const; 00320 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00321 virtual unsigned GetSecurityRejectTag() const; 00322 virtual void SetRejectReason( 00323 unsigned reasonCode 00324 ); 00325 00326 H225_LocationRequest & lrq; 00327 H225_LocationConfirm & lcf; 00328 H225_LocationReject & lrj; 00329 00330 protected: 00331 virtual Response OnHandlePDU(); 00332 }; 00333 00334 00335 class H323GatekeeperIRR : public H323GatekeeperRequest 00336 { 00337 PCLASSINFO(H323GatekeeperIRR, H323GatekeeperRequest); 00338 public: 00339 H323GatekeeperIRR( 00340 H323GatekeeperListener & listener, 00341 const H323RasPDU & pdu 00342 ); 00343 00344 #if PTRACING 00345 virtual const char * GetName() const; 00346 #endif 00347 virtual PString GetGatekeeperIdentifier() const; 00348 virtual unsigned GetGatekeeperRejectTag() const; 00349 virtual PString GetEndpointIdentifier() const; 00350 virtual unsigned GetRegisteredEndPointRejectTag() const; 00351 virtual H235Authenticator::ValidationResult ValidatePDU() const; 00352 virtual unsigned GetSecurityRejectTag() const; 00353 virtual void SetRejectReason( 00354 unsigned reasonCode 00355 ); 00356 00357 H225_InfoRequestResponse & irr; 00358 H225_InfoRequestAck & iack; 00359 H225_InfoRequestNak & inak; 00360 00361 protected: 00362 virtual Response OnHandlePDU(); 00363 }; 00364 00365 00368 class H323GatekeeperCall : public PSafeObject 00369 { 00370 PCLASSINFO(H323GatekeeperCall, PSafeObject); 00371 public: 00374 enum Direction { 00375 AnsweringCall, 00376 OriginatingCall, 00377 UnknownDirection 00378 }; 00379 00382 H323GatekeeperCall( 00383 H323GatekeeperServer & server, 00384 const OpalGloballyUniqueID & callIdentifier, 00385 Direction direction 00386 ); 00387 00390 ~H323GatekeeperCall(); 00392 00397 Comparison Compare( 00398 const PObject & obj 00399 ) const; 00400 00403 void PrintOn( 00404 ostream & strm 00405 ) const; 00407 00415 virtual H323GatekeeperRequest::Response OnAdmission( 00416 H323GatekeeperARQ & request 00417 ); 00418 00422 virtual PBoolean Disengage( 00423 int reason = -1 00424 ); 00425 00429 virtual H323GatekeeperRequest::Response OnDisengage( 00430 H323GatekeeperDRQ & request 00431 ); 00432 00437 virtual H323GatekeeperRequest::Response OnBandwidth( 00438 H323GatekeeperBRQ & request 00439 ); 00440 00444 virtual H323GatekeeperRequest::Response OnInfoResponse( 00445 H323GatekeeperIRR & request, 00446 H225_InfoRequestResponse_perCallInfo_subtype & call 00447 ); 00448 00451 virtual void OnAlerting(); 00452 00455 virtual void OnConnected(); 00456 00467 virtual PBoolean OnHeartbeat(); 00468 00475 virtual PString GetCallCreditAmount() const; 00476 00483 virtual PBoolean GetCallCreditMode() const; 00484 00492 virtual unsigned GetDurationLimit() const; 00493 00498 virtual PBoolean SendCallCreditServiceControl(); 00499 00502 PBoolean AddCallCreditServiceControl( 00503 H225_ArrayOf_ServiceControlSession & serviceControl 00504 ) const; 00505 00510 virtual PBoolean SendServiceControlSession( 00511 const H323ServiceControlSession & session 00512 ); 00513 00519 virtual PBoolean TranslateAliasAddress( 00520 const H225_AliasAddress & alias, 00521 H225_ArrayOf_AliasAddress & aliases, 00522 H323TransportAddress & address, 00523 PBoolean & isGkRouted 00524 ); 00525 00527 00530 H323GatekeeperServer & GetGatekeeper() const { return gatekeeper; } 00531 H323RegisteredEndPoint & GetEndPoint() const { return *PAssertNULL(endpoint); } 00532 PBoolean IsAnsweringCall() const { return direction == AnsweringCall; } 00533 unsigned GetCallReference() const { return callReference; } 00534 const OpalGloballyUniqueID & GetCallIdentifier() const { return callIdentifier; } 00535 const OpalGloballyUniqueID & GetConferenceIdentifier() const { return conferenceIdentifier; } 00536 const PString & GetSourceNumber() const { return srcNumber; } 00537 const PStringArray & GetSourceAliases() const { return srcAliases; } 00538 const H323TransportAddress & GetSourceHost() const { return srcHost; } 00539 PString GetSourceAddress() const; 00540 const PString & GetDestinationNumber() const { return dstNumber; } 00541 const PStringArray & GetDestinationAliases() const { return dstAliases; } 00542 const H323TransportAddress & GetDestinationHost() const { return dstHost; } 00543 PString GetDestinationAddress() const; 00544 unsigned GetBandwidthUsed() const { return bandwidthUsed; } 00545 PBoolean SetBandwidthUsed(unsigned bandwidth); 00546 const PTime & GetLastInfoResponseTime() const { return lastInfoResponse; } 00547 const PTime & GetCallStartTime() const { return callStartTime; } 00548 const PTime & GetAlertingTime() const { return alertingTime; } 00549 const PTime & GetConnectedTime() const { return connectedTime; } 00550 const PTime & GetCallEndTime() const { return callEndTime; } 00551 H323Connection::CallEndReason GetCallEndReason() const { return callEndReason; } 00553 00554 protected: 00555 void SetUsageInfo(const H225_RasUsageInformation & usage); 00556 00557 H323GatekeeperServer & gatekeeper; 00558 H323RegisteredEndPoint * endpoint; 00559 H323GatekeeperListener * rasChannel; 00560 00561 Direction direction; 00562 unsigned callReference; 00563 OpalGloballyUniqueID callIdentifier; 00564 OpalGloballyUniqueID conferenceIdentifier; 00565 PString srcNumber; 00566 PStringArray srcAliases; 00567 H323TransportAddress srcHost; 00568 PString dstNumber; 00569 PStringArray dstAliases; 00570 H323TransportAddress dstHost; 00571 unsigned bandwidthUsed; 00572 unsigned infoResponseRate; 00573 PTime lastInfoResponse; 00574 00575 PBoolean drqReceived; 00576 PTime callStartTime; 00577 PTime alertingTime; 00578 PTime connectedTime; 00579 PTime callEndTime; 00580 H323Connection::CallEndReason callEndReason; 00581 }; 00582 00583 00589 class H323RegisteredEndPoint : public PSafeObject 00590 { 00591 PCLASSINFO(H323RegisteredEndPoint, PSafeObject); 00592 public: 00597 H323RegisteredEndPoint( 00598 H323GatekeeperServer & server, 00599 const PString & id 00600 ); 00602 00607 Comparison Compare( 00608 const PObject & obj 00609 ) const; 00610 00613 void PrintOn( 00614 ostream & strm 00615 ) const; 00617 00624 virtual void AddCall( 00625 H323GatekeeperCall * call 00626 ); 00627 00632 virtual PBoolean RemoveCall( 00633 H323GatekeeperCall * call 00634 ); 00635 00638 PINDEX GetCallCount() const { return activeCalls.GetSize(); } 00639 00642 H323GatekeeperCall & GetCall( 00643 PINDEX idx 00644 ) { return activeCalls[idx]; } 00646 00655 virtual H323GatekeeperRequest::Response OnRegistration( 00656 H323GatekeeperRRQ & request 00657 ); 00658 00668 virtual H323GatekeeperRequest::Response OnFullRegistration( 00669 H323GatekeeperRRQ & request 00670 ); 00671 00680 virtual H323GatekeeperRequest::Response OnSecureRegistration( 00681 H323GatekeeperRRQ & request 00682 ); 00683 00687 virtual H323GatekeeperRequest::Response OnUnregistration( 00688 H323GatekeeperURQ & request 00689 ); 00690 00694 virtual PBoolean Unregister( 00695 int reason = -1 00696 ); 00697 00702 virtual H323GatekeeperRequest::Response OnInfoResponse( 00703 H323GatekeeperIRR & request 00704 ); 00705 00716 virtual PBoolean OnTimeToLive(); 00717 00729 virtual PString GetCallCreditAmount() const; 00730 00738 virtual PBoolean GetCallCreditMode() const; 00739 00744 virtual PBoolean SendServiceControlSession( 00745 const H323ServiceControlSession & session 00746 ); 00747 00751 virtual PBoolean AddServiceControlSession( 00752 const H323ServiceControlSession & session, 00753 H225_ArrayOf_ServiceControlSession & serviceControl 00754 ); 00756 00761 virtual PBoolean SetPassword( 00762 const PString & password, 00763 const PString & username = PString::Empty() 00764 ); 00765 00768 const PString & GetIdentifier() const { return identifier; } 00769 00772 const OpalGloballyUniqueID & GetDescriptorID() const { return descriptorID; } 00773 00776 H323GatekeeperServer & GetGatekeeper() const { return gatekeeper; } 00777 00781 const H323TransportAddressArray & GetRASAddresses() const { return rasAddresses; } 00782 00786 PINDEX GetRASAddressCount() const { return rasAddresses.GetSize(); } 00787 00791 H323TransportAddress GetRASAddress( 00792 PINDEX idx 00793 ) const { return rasAddresses[idx]; } 00794 00798 const H323TransportAddressArray & GetSignalAddresses() const { return signalAddresses; } 00799 00803 PINDEX GetSignalAddressCount() const { return signalAddresses.GetSize(); } 00804 00808 H323TransportAddress GetSignalAddress( 00809 PINDEX idx 00810 ) const { return signalAddresses[idx]; } 00811 00814 const PStringArray & GetAliases() const { return aliases; } 00815 00818 PBoolean ContainsAlias( 00819 const PString & alias 00820 ) { return aliases.GetStringsIndex(alias) != P_MAX_INDEX; } 00821 00824 PINDEX GetAliasCount() const { return aliases.GetSize(); } 00825 00828 PString GetAlias( 00829 PINDEX idx 00830 ) const { if (idx < aliases.GetSize()) return aliases[idx]; return PString::Empty(); } 00831 00837 void RemoveAlias( 00838 const PString & alias 00839 ); 00840 00843 virtual const H235Authenticators & GetAuthenticators() const { return authenticators; } 00844 00847 PINDEX GetPrefixCount() const { return voicePrefixes.GetSize(); } 00848 00851 PString GetPrefix( 00852 PINDEX idx 00853 ) const { return voicePrefixes[idx]; } 00854 00857 PCaselessString GetApplicationInfo() const { return productInfo.AsString(); } 00858 00861 const OpalProductInfo & GetProductInfo() const { return productInfo; } 00862 00865 unsigned GetProtocolVersion() const { return protocolVersion; } 00866 00869 PBoolean IsBehindNAT() const { return isBehindNAT; } 00870 00873 PBoolean CanDisplayAmountString() const { return canDisplayAmountString; } 00874 00877 PBoolean CanEnforceDurationLimit() const { return canEnforceDurationLimit; } 00878 00881 PBoolean CanReceiveRIP() const; 00882 00885 PBoolean GetH225Version() const { return h225Version; } 00887 00897 virtual PBoolean OnSendDescriptorForEndpoint( 00898 H225_ArrayOf_AliasAddress & aliases, 00899 H225_EndpointType & terminalType, 00900 H225_ArrayOf_AliasAddress & transportAddresses 00901 ); 00903 00904 00905 protected: 00906 H323GatekeeperServer & gatekeeper; 00907 H323GatekeeperListener * rasChannel; 00908 00909 PString identifier; 00910 OpalGloballyUniqueID descriptorID; 00911 H323TransportAddressArray rasAddresses; 00912 H323TransportAddressArray signalAddresses; 00913 PStringArray aliases; 00914 PStringArray voicePrefixes; 00915 OpalProductInfo productInfo; 00916 unsigned protocolVersion; 00917 PBoolean isBehindNAT; 00918 PBoolean canDisplayAmountString; 00919 PBoolean canEnforceDurationLimit; 00920 unsigned h225Version; 00921 unsigned timeToLive; 00922 H235Authenticators authenticators; 00923 00924 PTime lastRegistration; 00925 PTime lastInfoResponse; 00926 00927 PSortedList<H323GatekeeperCall> activeCalls; 00928 POrdinalDictionary<PString> serviceControlSessions; 00929 }; 00930 00931 00937 class H323GatekeeperListener : public H225_RAS 00938 { 00939 PCLASSINFO(H323GatekeeperListener, H225_RAS); 00940 public: 00945 H323GatekeeperListener( 00946 H323EndPoint & endpoint, 00947 H323GatekeeperServer & server, 00948 const PString & gatekeeperIdentifier, 00949 H323Transport * transport = NULL 00950 ); 00951 00954 ~H323GatekeeperListener(); 00956 00961 PBoolean UnregistrationRequest( 00962 const H323RegisteredEndPoint & ep, 00963 unsigned reason 00964 ); 00965 00968 PBoolean DisengageRequest( 00969 const H323GatekeeperCall & call, 00970 unsigned reason 00971 ); 00972 00975 virtual PBoolean InfoRequest( 00976 H323RegisteredEndPoint & ep, 00977 H323GatekeeperCall * call = NULL 00978 ); 00979 00982 virtual PBoolean ServiceControlIndication( 00983 H323RegisteredEndPoint & ep, 00984 const H323ServiceControlSession & session, 00985 H323GatekeeperCall * call = NULL 00986 ); 00988 00995 virtual H323GatekeeperRequest::Response OnDiscovery( 00996 H323GatekeeperGRQ & request 00997 ); 00998 01003 virtual H323GatekeeperRequest::Response OnRegistration( 01004 H323GatekeeperRRQ & request 01005 ); 01006 01011 virtual H323GatekeeperRequest::Response OnUnregistration( 01012 H323GatekeeperURQ & request 01013 ); 01014 01019 virtual H323GatekeeperRequest::Response OnAdmission( 01020 H323GatekeeperARQ & request 01021 ); 01022 01027 virtual H323GatekeeperRequest::Response OnDisengage( 01028 H323GatekeeperDRQ & request 01029 ); 01030 01035 virtual H323GatekeeperRequest::Response OnBandwidth( 01036 H323GatekeeperBRQ & request 01037 ); 01038 01043 virtual H323GatekeeperRequest::Response OnLocation( 01044 H323GatekeeperLRQ & request 01045 ); 01046 01051 virtual H323GatekeeperRequest::Response OnInfoResponse( 01052 H323GatekeeperIRR & request 01053 ); 01055 01058 virtual PBoolean OnReceiveGatekeeperRequest(const H323RasPDU &, const H225_GatekeeperRequest &); 01059 virtual PBoolean OnReceiveRegistrationRequest(const H323RasPDU &, const H225_RegistrationRequest &); 01060 virtual PBoolean OnReceiveUnregistrationRequest(const H323RasPDU &, const H225_UnregistrationRequest &); 01061 virtual PBoolean OnReceiveUnregistrationConfirm(const H225_UnregistrationConfirm &); 01062 virtual PBoolean OnReceiveUnregistrationReject(const H225_UnregistrationReject &); 01063 virtual PBoolean OnReceiveAdmissionRequest(const H323RasPDU &, const H225_AdmissionRequest &); 01064 virtual PBoolean OnReceiveBandwidthRequest(const H323RasPDU &, const H225_BandwidthRequest &); 01065 virtual PBoolean OnReceiveBandwidthConfirm(const H225_BandwidthConfirm &); 01066 virtual PBoolean OnReceiveBandwidthReject(const H225_BandwidthReject &); 01067 virtual PBoolean OnReceiveDisengageRequest(const H323RasPDU &, const H225_DisengageRequest &); 01068 virtual PBoolean OnReceiveDisengageConfirm(const H225_DisengageConfirm &); 01069 virtual PBoolean OnReceiveDisengageReject(const H225_DisengageReject &); 01070 virtual PBoolean OnReceiveLocationRequest(const H323RasPDU &, const H225_LocationRequest &); 01071 virtual PBoolean OnReceiveInfoRequestResponse(const H323RasPDU &, const H225_InfoRequestResponse &); 01072 virtual PBoolean OnReceiveResourcesAvailableConfirm(const H225_ResourcesAvailableConfirm &); 01073 virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet & features) const; 01074 virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet & features) const; 01076 01079 H323GatekeeperServer & GetGatekeeper() const { return gatekeeper; } 01081 01082 01083 protected: 01084 H323GatekeeperServer & gatekeeper; 01085 }; 01086 01087 01098 class H323GatekeeperServer : public H323TransactionServer 01099 { 01100 PCLASSINFO(H323GatekeeperServer, H323TransactionServer); 01101 public: 01106 H323GatekeeperServer( 01107 H323EndPoint & endpoint 01108 ); 01109 01112 ~H323GatekeeperServer(); 01114 01115 WORD GetDefaultUdpPort() { return H225_RAS::DefaultRasUdpPort; } 01116 01127 virtual H323Transactor * CreateListener( 01128 H323Transport * transport 01129 ); 01130 01132 01138 virtual H323GatekeeperRequest::Response OnDiscovery( 01139 H323GatekeeperGRQ & request 01140 ); 01141 01149 virtual H323GatekeeperRequest::Response OnRegistration( 01150 H323GatekeeperRRQ & request 01151 ); 01152 01158 virtual H323GatekeeperRequest::Response OnUnregistration( 01159 H323GatekeeperURQ & request 01160 ); 01161 01166 virtual H323GatekeeperRequest::Response OnInfoResponse( 01167 H323GatekeeperIRR & request 01168 ); 01169 01180 virtual void AddEndPoint( 01181 H323RegisteredEndPoint * ep 01182 ); 01183 01186 virtual PBoolean RemoveEndPoint( 01187 H323RegisteredEndPoint * ep 01188 ); 01189 01198 virtual H323RegisteredEndPoint * CreateRegisteredEndPoint( 01199 H323GatekeeperRRQ & request 01200 ); 01201 01210 virtual PString CreateEndPointIdentifier(); 01211 01214 virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByIdentifier( 01215 const PString & identifier, 01216 PSafetyMode mode = PSafeReference 01217 ); 01218 01221 virtual PSafePtr<H323RegisteredEndPoint> FindEndPointBySignalAddresses( 01222 const H225_ArrayOf_TransportAddress & addresses, 01223 PSafetyMode mode = PSafeReference 01224 ); 01225 01228 virtual PSafePtr<H323RegisteredEndPoint> FindEndPointBySignalAddress( 01229 const H323TransportAddress & address, 01230 PSafetyMode mode = PSafeReference 01231 ); 01232 01235 virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByAliasAddress( 01236 const H225_AliasAddress & alias, 01237 PSafetyMode mode = PSafeReadWrite 01238 ); 01239 01242 virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByAliasString( 01243 const PString & alias, 01244 PSafetyMode mode = PSafeReference 01245 ); 01246 01249 virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByPartialAlias( 01250 const PString & alias, 01251 PSafetyMode mode = PSafeReference 01252 ); 01253 01256 virtual PSafePtr<H323RegisteredEndPoint> FindEndPointByPrefixString( 01257 const PString & prefix, 01258 PSafetyMode mode = PSafeReference 01259 ); 01260 01263 PSafePtr<H323RegisteredEndPoint> GetFirstEndPoint( 01264 PSafetyMode mode = PSafeReference 01265 ) { return PSafePtr<H323RegisteredEndPoint>(byIdentifier, mode); } 01267 01268 PSafePtr<H323RegisteredEndPoint> FindDestinationEndPoint( 01269 const OpalGloballyUniqueID & id, 01270 H323GatekeeperCall::Direction direction 01271 ); 01272 01280 virtual H323GatekeeperRequest::Response OnAdmission( 01281 H323GatekeeperARQ & request 01282 ); 01283 01288 virtual H323GatekeeperRequest::Response OnDisengage( 01289 H323GatekeeperDRQ & request 01290 ); 01291 01296 virtual H323GatekeeperRequest::Response OnBandwidth( 01297 H323GatekeeperBRQ & request 01298 ); 01299 01308 virtual H323GatekeeperCall * CreateCall( 01309 const OpalGloballyUniqueID & callIdentifier, 01310 H323GatekeeperCall::Direction direction 01311 ); 01312 01315 virtual void AddCall(H323GatekeeperCall *) 01316 { } 01317 01320 virtual void RemoveCall( 01321 H323GatekeeperCall * call 01322 ); 01323 01326 virtual PSafePtr<H323GatekeeperCall> FindCall( 01327 const PString & description, 01328 PSafetyMode mode = PSafeReference 01329 ); 01330 01333 virtual PSafePtr<H323GatekeeperCall> FindCall( 01334 const OpalGloballyUniqueID & callIdentifier, 01335 PBoolean answeringCall, 01336 PSafetyMode mode = PSafeReference 01337 ); 01338 01341 virtual PSafePtr<H323GatekeeperCall> FindCall( 01342 const OpalGloballyUniqueID & callIdentifier, 01343 H323GatekeeperCall::Direction direction, 01344 PSafetyMode mode = PSafeReference 01345 ); 01346 01349 PSafePtr<H323GatekeeperCall> GetFirstCall( 01350 PSafetyMode mode = PSafeReference 01351 ) { return PSafePtr<H323GatekeeperCall>(activeCalls, mode); } 01353 01363 virtual H323GatekeeperRequest::Response OnLocation( 01364 H323GatekeeperLRQ & request 01365 ); 01366 01378 virtual PBoolean TranslateAliasAddress( 01379 const H225_AliasAddress & alias, 01380 H225_ArrayOf_AliasAddress & aliases, 01381 H323TransportAddress & address, 01382 PBoolean & isGkRouted, 01383 H323GatekeeperCall * call 01384 ); 01385 01405 virtual PBoolean TranslateAliasAddressToSignalAddress( 01406 const H225_AliasAddress & alias, 01407 H323TransportAddress & address 01408 ); 01410 01422 virtual PBoolean CheckSignalAddressPolicy( 01423 const H323RegisteredEndPoint & ep, 01424 const H225_AdmissionRequest & arq, 01425 const H323TransportAddress & address 01426 ); 01427 01440 virtual PBoolean CheckAliasAddressPolicy( 01441 const H323RegisteredEndPoint & ep, 01442 const H225_AdmissionRequest & arq, 01443 const H225_AliasAddress & alias 01444 ); 01445 01458 virtual PBoolean CheckAliasStringPolicy( 01459 const H323RegisteredEndPoint & ep, 01460 const H225_AdmissionRequest & arq, 01461 const PString & alias 01462 ); 01463 01469 virtual unsigned AllocateBandwidth( 01470 unsigned newBandwidth, 01471 unsigned oldBandwidth = 0 01472 ); 01474 01486 virtual PBoolean GetAdmissionRequestAuthentication( 01487 H323GatekeeperARQ & info, 01488 H235Authenticators & authenticators 01489 ); 01490 01496 virtual PBoolean GetUsersPassword( 01497 const PString & alias, 01498 PString & password, 01499 H323RegisteredEndPoint & registeredEndpoint 01500 ) const; 01501 virtual PBoolean GetUsersPassword( 01502 const PString & alias, 01503 PString & password 01504 ) const; 01506 01507 #if OPAL_H501 01508 01512 H323PeerElement * GetPeerElement() const { return peerElement; } 01513 01517 void SetPeerElement( 01518 H323PeerElement * newPeerElement 01519 ); 01520 01526 void CreatePeerElement( 01527 const H323TransportAddress & h501Interface 01528 ); 01529 01535 PBoolean OpenPeerElement( 01536 const H323TransportAddress & remotePeer, 01537 PBoolean append = false, 01538 PBoolean keepTrying = true 01539 ); 01541 #endif 01542 01547 const PString & GetGatekeeperIdentifier() const { return gatekeeperIdentifier; } 01548 01554 void SetGatekeeperIdentifier( 01555 const PString & id, 01556 PBoolean adjustListeners = true 01557 ); 01558 01561 unsigned GetAvailableBandwidth() const { return totalBandwidth; } 01562 01565 void SetAvailableBandwidth(unsigned bps100) { totalBandwidth = bps100; } 01566 01569 unsigned GetUsedBandwidth() const { return usedBandwidth; } 01570 01573 unsigned GetDefaultBandwidth() const { return defaultBandwidth; } 01574 01577 unsigned GetTimeToLive() const { return defaultTimeToLive; } 01578 01581 void SetTimeToLive(unsigned seconds) { defaultTimeToLive = seconds; } 01582 01585 unsigned GetInfoResponseRate() const { return defaultInfoResponseRate; } 01586 01589 void SetInfoResponseRate(unsigned seconds) { defaultInfoResponseRate = seconds; } 01590 01593 PBoolean IsGatekeeperRouted() const { return isGatekeeperRouted; } 01594 01597 PBoolean IsRequiredH235() const { return requireH235; } 01598 01601 unsigned GetActiveRegistrations() const { return byIdentifier.GetSize(); } 01602 01605 unsigned GetPeakRegistrations() const { return peakRegistrations; } 01606 01609 unsigned GetTotalRegistrations() const { return totalRegistrations; } 01610 01613 unsigned GetRejectedRegistrations() const { return rejectedRegistrations; } 01614 01617 unsigned GetActiveCalls() const { return activeCalls.GetSize(); } 01618 01621 unsigned GetPeakCalls() const { return peakCalls; } 01622 01625 unsigned GetTotalCalls() const { return totalCalls; } 01626 01629 unsigned GetRejectedCalls() const { return rejectedCalls; } 01631 01632 // Remove an alias from the server database. 01633 void RemoveAlias( 01634 H323RegisteredEndPoint & ep, 01635 const PString & alias 01636 ); 01637 01638 // called when an endpoint needs to send a descriptor to the H.501 peer element 01639 virtual PBoolean OnSendDescriptorForEndpoint( 01640 H323RegisteredEndPoint & /*ep*/, 01641 H225_ArrayOf_AliasAddress & /*aliases*/, 01642 H225_EndpointType & /*terminalType*/, 01643 H225_ArrayOf_AliasAddress & /*transportAddresses*/ 01644 ) 01645 { return true; } 01646 01647 virtual PBoolean AllowDuplicateAlias(const H225_ArrayOf_AliasAddress & /*aliases*/) 01648 { return canHaveDuplicateAlias; } 01649 01650 virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet & features) const; 01651 virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet & features) const; 01652 01653 protected: 01654 01655 PDECLARE_NOTIFIER(PThread, H323GatekeeperServer, MonitorMain); 01656 01657 // Configuration & policy variables 01658 PString gatekeeperIdentifier; 01659 unsigned totalBandwidth; 01660 unsigned usedBandwidth; 01661 unsigned defaultBandwidth; 01662 unsigned maximumBandwidth; 01663 unsigned defaultTimeToLive; 01664 unsigned defaultInfoResponseRate; 01665 PBoolean overwriteOnSameSignalAddress; 01666 PBoolean canHaveDuplicateAlias; 01667 PBoolean canHaveDuplicatePrefix; 01668 PBoolean canOnlyCallRegisteredEP; 01669 PBoolean canOnlyAnswerRegisteredEP; 01670 PBoolean answerCallPreGrantedARQ; 01671 PBoolean makeCallPreGrantedARQ; 01672 PBoolean isGatekeeperRouted; 01673 PBoolean aliasCanBeHostName; 01674 PBoolean requireH235; 01675 PBoolean disengageOnHearbeatFail; 01676 01677 PStringToString passwords; 01678 01679 // Dynamic variables 01680 PMutex mutex; 01681 time_t identifierBase; 01682 unsigned nextIdentifier; 01683 PThread * monitorThread; 01684 PSyncPoint monitorExit; 01685 01686 PLIST(ListenerList, H323GatekeeperListener); 01687 ListenerList listeners; 01688 01689 #if OPAL_H501 01690 H323PeerElement * peerElement; 01691 #endif 01692 01693 PSafeDictionary<PString, H323RegisteredEndPoint> byIdentifier; 01694 01695 class StringMap : public PString { 01696 PCLASSINFO(StringMap, PString); 01697 public: 01698 StringMap(const PString & from, const PString & id) 01699 : PString(from), identifier(id) { } 01700 PString identifier; 01701 }; 01702 PSortedStringList byAddress; 01703 PSortedStringList byAlias; 01704 PSortedStringList byVoicePrefix; 01705 01706 PSafeSortedList<H323GatekeeperCall> activeCalls; 01707 01708 PINDEX peakRegistrations; 01709 PINDEX totalRegistrations; 01710 PINDEX rejectedRegistrations; 01711 PINDEX peakCalls; 01712 PINDEX totalCalls; 01713 PINDEX rejectedCalls; 01714 01715 friend class H323GatekeeperRRQ; 01716 friend class H323GatekeeperARQ; 01717 }; 01718 01719 01720 #endif // OPAL_H323 01721 01722 #endif // OPAL_H323_GKSERVER_H 01723 01724 01726