OPAL  Version 3.18.8
gkclient.h
Go to the documentation of this file.
1 /*
2  * gkclient.h
3  *
4  * Gatekeeper client protocol handler
5  *
6  * Open H323 Library
7  *
8  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Open H323 Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Portions of this code were written with the assisance of funding from
25  * iFace, Inc. http://www.iface.com
26  *
27  * Contributor(s): ______________________________________.
28  */
29 
30 #ifndef OPAL_H323_GKCLIENT_H
31 #define OPAL_H323_GKCLIENT_H
32 
33 #ifdef P_USE_PRAGMA
34 #pragma interface
35 #endif
36 
37 #include <opal_config.h>
38 
39 #if OPAL_H323
40 
41 #include <opal/mediafmt.h>
42 #include <h323/h225ras.h>
43 #include <h323/h235auth.h>
44 #include <h460/h460.h>
45 
46 class H323Connection;
47 class H225_ArrayOf_AliasAddress;
48 class H225_H323_UU_PDU;
49 class H225_AlternateGK;
50 class H225_ArrayOf_AlternateGK;
51 class H225_ArrayOf_ServiceControlSession;
52 class H225_FeatureSet;
53 class H460_FeatureSet;
54 
55 
57 
60 class H323Gatekeeper : public H225_RAS
61 {
62  PCLASSINFO(H323Gatekeeper, H225_RAS);
63  public:
69  H323EndPoint & endpoint,
70  H323Transport * transport
71  );
72 
77 
83  virtual void StopChannel();
84 
85  virtual PBoolean WriteTo(
86  H323TransactionPDU & pdu,
87  const H323TransportAddressArray & addresses,
88  PBoolean callback = true
89  );
91 
94  PBoolean OnReceiveGatekeeperConfirm(const H225_GatekeeperConfirm & gcf);
95  PBoolean OnReceiveGatekeeperReject(const H225_GatekeeperReject & grj);
96  PBoolean OnReceiveRegistrationConfirm(const H225_RegistrationConfirm & rcf);
97  PBoolean OnReceiveRegistrationReject(const H225_RegistrationReject & rrj);
98  PBoolean OnReceiveUnregistrationRequest(const H225_UnregistrationRequest & urq);
99  PBoolean OnReceiveUnregistrationConfirm(const H225_UnregistrationConfirm & ucf);
100  PBoolean OnReceiveUnregistrationReject(const H225_UnregistrationReject & urj);
101  PBoolean OnReceiveAdmissionConfirm(const H225_AdmissionConfirm & acf);
102  PBoolean OnReceiveAdmissionReject(const H225_AdmissionReject & arj);
103  PBoolean OnReceiveDisengageRequest(const H225_DisengageRequest & drq);
104  PBoolean OnReceiveDisengageReject(const H323RasPDU &, const H225_DisengageReject &);
105  PBoolean OnReceiveBandwidthConfirm(const H225_BandwidthConfirm & bcf);
106  PBoolean OnReceiveBandwidthRequest(const H225_BandwidthRequest & brq);
107  PBoolean OnReceiveInfoRequest(const H225_InfoRequest & irq);
108  PBoolean OnReceiveInfoRequestResponse(const H225_InfoRequestResponse & irr);
109  PBoolean OnReceiveServiceControlIndication(const H225_ServiceControlIndication &);
110  PBoolean OnReceiveNonStandardMessage(const H225_NonStandardMessage &);
111  void OnSendGatekeeperRequest(H225_GatekeeperRequest & grq);
112  void OnSendAdmissionRequest(H225_AdmissionRequest & arq);
113 #if OPAL_H460
114  PBoolean OnSendFeatureSet(H460_MessageType pduType, H225_FeatureSet & features) const;
115  void OnReceiveFeatureSet(H460_MessageType pduType, const H225_FeatureSet & features) const;
116 #endif
117 
118 
123  PBoolean DiscoverAny();
124 
129  PBoolean DiscoverByName(
130  const PString & identifier
131  );
132 
137  PBoolean DiscoverByAddress(
138  const H323TransportAddress & address
139  );
140 
144  PBoolean DiscoverByNameAndAddress(
145  const PString & identifier,
146  const H323TransportAddress & address
147  );
148 
151  bool RegistrationRequest(
152  bool autoReregister = true,
153  bool didGkDiscovery = false,
154  bool lightweight = true
155  );
156 
159  PBoolean UnregistrationRequest(
160  int reason
161  );
162 
165  PBoolean LocationRequest(
166  const PString & alias,
167  H323TransportAddress & address
168  );
169 
172  PBoolean LocationRequest(
173  const PStringList & aliases,
174  H323TransportAddress & address
175  );
176 
179 
180  unsigned rejectReason;
181 
182  PBoolean gatekeeperRouted;
183  PINDEX endpointCount;
185  PBYTEArray * accessTokenData;
186 
187  H225_ArrayOf_AliasAddress * aliasAddresses;
188  H225_ArrayOf_AliasAddress * destExtraCallInfo;
189  };
190 
193  PBoolean AdmissionRequest(
194  H323Connection & connection,
195  AdmissionResponse & response,
196  PBoolean ignorePreGrantedARQ = false
197  );
198 
201  PBoolean DisengageRequest(
202  H323Connection & connection,
203  unsigned reason
204  );
205 
208  PBoolean BandwidthRequest(
209  H323Connection & connection,
210  OpalBandwidth requestedBandwidth
211  );
212 
215  void InfoRequestResponse();
216 
219  void InfoRequestResponse(
220  const H323Connection & connection
221  );
222 
225  void InfoRequestResponse(
226  const H323Connection & connection,
227  const H225_H323_UU_PDU & pdu,
228  PBoolean sent
229  );
230 
233  bool NonStandardMessage(
234  const PString & identifer,
235  const PBYTEArray & outData,
236  PBYTEArray & replyData
237  );
239  const PString & identifer,
240  const void * outDataPtr,
241  PINDEX outDataSize,
242  PBYTEArray & replyData
243  ) { return NonStandardMessage(identifer, PBYTEArray((const BYTE *)outDataPtr, outDataSize), replyData); }
244 
248  const PString & identifer,
249  const PBYTEArray & outData
250  );
251 
254  virtual void OnServiceControlSessions(
255  const H225_ArrayOf_ServiceControlSession & serviceControl,
256  H323Connection * connection
257  );
258 
261  virtual void OnTerminalAliasChanged();
263 
268  PBoolean IsDiscoveryComplete() const { return discoveryComplete; }
269 
273 
288  };
290  friend ostream & operator<<(ostream & strm, RegistrationFailReasons reason) { return strm << GetRegistrationFailReasonString(reason); }
291 
295 
304  PString GetName() const;
305 
308  PString GetEndpointIdentifier() const;
309  void GetEndpointIdentifier(PASN_BMPString & id) const { id.SetValueRaw(m_endpointIdentifier); }
310 
315  void SetPassword(
316  const PString & password,
317  const PString & username = PString()
318  );
319 
322  PStringList GetAliases() const;
323 
324  /*
325  * Return the call signalling address for the gatekeeper (if present)
326  */
328  { return gkRouteAddress; }
330 
331 #if OPAL_H460
333 #endif
334 
335  void ReRegisterNow();
336 
337  protected:
338  bool StartGatekeeper(const H323TransportAddress & address);
339  virtual bool DiscoverGatekeeper();
340  unsigned SetupGatekeeperRequest(H323RasPDU & request);
341 
342  void Connect(const H323TransportAddress & address, const PString & gatekeeperIdentifier);
343  void ClearAllCalls();
344 
345  void SetInfoRequestRate(
346  const PTimeInterval & rate
347  );
348  void ClearInfoRequestRate();
349  H225_InfoRequestResponse & BuildInfoRequestResponse(
350  H323RasPDU & response,
351  unsigned seqNum
352  );
353  PBoolean SendUnsolicitedIRR(
354  H225_InfoRequestResponse & irr,
355  H323RasPDU & response
356  );
357 
358  void SetAlternates(
359  const H225_ArrayOf_AlternateGK & alts,
360  bool permanent
361  );
362 
363  virtual PBoolean MakeRequest(
364  Request & request
365  );
366  PBoolean MakeRequestWithReregister(
367  Request & request,
368  unsigned unregisteredTag
369  );
370 
371  virtual H323Transport * CreateTransport(PIPSocket::Address bindng = PIPSocket::GetDefaultIpAny(), WORD port = 0, PBoolean reuseAddr = false);
372 
373  // Handling interface changes
374  void OnAddInterface(const PIPSocket::InterfaceEntry & entry, PINDEX priority);
375  void OnRemoveInterface(const PIPSocket::InterfaceEntry & entry, PINDEX priority);
376  bool SetListenerAddresses(H225_ArrayOf_TransportAddress & pdu);
377 
378  // Gatekeeper registration state variables
380  PStringList m_aliases;
381  PDECLARE_MUTEX( m_aliasMutex);
382  PWCharArray m_endpointIdentifier;
384  void SetRegistrationFailReason(unsigned reason, unsigned commandMask);
386 
387  PDECLARE_InterfaceNotifier(H323Gatekeeper, OnHighPriorityInterfaceChange);
388  PInterfaceMonitor::Notifier m_onHighPriorityInterfaceChange;
389  PDECLARE_InterfaceNotifier(H323Gatekeeper, OnLowPriorityInterfaceChange);
390  PInterfaceMonitor::Notifier m_onLowPriorityInterfaceChange;
391 
392  class AlternateInfo : public PObject {
393  PCLASSINFO(AlternateInfo, PObject);
394  public:
395  AlternateInfo(H225_AlternateGK & alt);
396  ~AlternateInfo();
397  Comparison Compare(const PObject & obj) const;
398  void PrintOn(ostream & strm) const;
399 
402  unsigned priority;
403  enum {
409 
410  private:
411  // Disable copy constructor and assignment
412  AlternateInfo(const AlternateInfo &other): PObject(other) { }
413  AlternateInfo & operator=(const AlternateInfo &) { return *this; }
414  };
415  typedef PSortedList<AlternateInfo> AlternateList;
418 
419  PDECLARE_MUTEX( m_requestMutex);
420  H235Authenticators m_authenticators;
421 
422 #if OPAL_H460
424 #endif
425 
426  enum {
432 
433  PDictionary<POrdinalKey, H323ServiceControlSession> serviceControlSessions;
434 
435  // Gatekeeper operation variables
438  PTimeInterval m_currentTimeToLive;
440  PTimeInterval m_infoRequestTime;
442  PThread * m_monitorThread;
444  PSyncPoint m_monitorTickle;
445  void Monitor();
446  PTimeInterval InternalRegister();
447 
448  std::set< PSafePtr<H323Connection> > m_activeConnections;
449 
450  friend class H323EndPoint;
451 };
452 
453 
454 PLIST(H323GatekeeperList, H323Gatekeeper);
455 
456 
457 #endif // OPAL_H323
458 
459 #endif // OPAL_H323_GKCLIENT_H
460 
461 
Definition: h4601.h:636
PBYTEArray * accessTokenData
Transport address or remote endpoint.
Definition: gkclient.h:185
PBoolean MakeRequestWithReregister(Request &request, unsigned unregisteredTag)
AlternateList m_alternates
Definition: gkclient.h:416
Definition: h225ras.h:93
Definition: gkclient.h:429
PSyncPoint m_monitorTickle
Definition: gkclient.h:444
enum H323Gatekeeper::AlternateInfo::@15 registrationState
Definition: gkclient.h:177
PWCharArray m_endpointIdentifier
Definition: gkclient.h:382
PInterfaceMonitor::Notifier m_onHighPriorityInterfaceChange
Definition: gkclient.h:388
virtual PBoolean MakeRequest(Request &request)
virtual void OnTerminalAliasChanged()
void SetAlternates(const H225_ArrayOf_AlternateGK &alts, bool permanent)
bool discoveryComplete
Definition: gkclient.h:379
PBoolean OnSendFeatureSet(H460_MessageType pduType, H225_FeatureSet &features) const
PBoolean gatekeeperRouted
Reject reason if returns false.
Definition: gkclient.h:182
PBoolean OnReceiveRegistrationReject(const H225_RegistrationReject &rrj)
bool m_alternateTemporary
Definition: gkclient.h:417
PDECLARE_InterfaceNotifier(H323Gatekeeper, OnHighPriorityInterfaceChange)
static PString GetRegistrationFailReasonString(RegistrationFailReasons reason)
PBoolean OnReceiveServiceControlIndication(const H225_ServiceControlIndication &)
PBoolean DiscoverByName(const PString &identifier)
PStringList GetAliases() const
bool RegistrationRequest(bool autoReregister=true, bool didGkDiscovery=false, bool lightweight=true)
void Connect(const H323TransportAddress &address, const PString &gatekeeperIdentifier)
Comparison Compare(const PObject &obj) const
H225_InfoRequestResponse & BuildInfoRequestResponse(H323RasPDU &response, unsigned seqNum)
enum H323Gatekeeper::@14 pregrantAnswerCall
void ReRegisterNow()
PBoolean OnReceiveNonStandardMessage(const H225_NonStandardMessage &)
bool m_willRespondToIRR
Definition: gkclient.h:441
H225_ArrayOf_AliasAddress * aliasAddresses
iNow Gatekeeper Access Token data
Definition: gkclient.h:187
PBoolean OnReceiveDisengageRequest(const H225_DisengageRequest &drq)
PBoolean OnReceiveGatekeeperConfirm(const H225_GatekeeperConfirm &gcf)
Definition: transports.h:788
void OnAddInterface(const PIPSocket::InterfaceEntry &entry, PINDEX priority)
PTimeInterval m_infoRequestTime
Definition: gkclient.h:440
PBoolean DiscoverAny()
PBoolean IsDiscoveryComplete() const
Definition: gkclient.h:268
PBoolean OnReceiveUnregistrationReject(const H225_UnregistrationReject &urj)
PTimeInterval m_currentTimeToLive
Definition: gkclient.h:438
friend ostream & operator<<(ostream &strm, RegistrationFailReasons reason)
Definition: gkclient.h:290
void OnSendGatekeeperRequest(H225_GatekeeperRequest &grq)
H323TransportAddress GetGatekeeperRouteAddress() const
Definition: gkclient.h:327
RegistrationFailReasons
Definition: gkclient.h:274
Definition: gkclient.h:276
H323TransportAddress * transportAddress
Number of endpoints that can be returned.
Definition: gkclient.h:184
PThread * m_monitorThread
Definition: gkclient.h:442
PInterfaceMonitor::Notifier m_onLowPriorityInterfaceChange
Definition: gkclient.h:390
void SetPassword(const PString &password, const PString &username=PString())
PBoolean OnReceiveBandwidthConfirm(const H225_BandwidthConfirm &bcf)
bool NonStandardMessage(const PString &identifer, const PBYTEArray &outData, PBYTEArray &replyData)
virtual void StopChannel()
PString gatekeeperIdentifier
Definition: gkclient.h:401
void OnRemoveInterface(const PIPSocket::InterfaceEntry &entry, PINDEX priority)
Definition: transaddr.h:91
unsigned SetupGatekeeperRequest(H323RasPDU &request)
Definition: gkclient.h:280
Definition: mediafmt.h:60
PString GetEndpointIdentifier() const
Definition: gkclient.h:428
virtual bool DiscoverGatekeeper()
Definition: gkclient.h:282
PBoolean UnregistrationRequest(int reason)
bool SetListenerAddresses(H225_ArrayOf_TransportAddress &pdu)
enum H323Gatekeeper::@14 pregrantMakeCall
PBoolean OnReceiveInfoRequestResponse(const H225_InfoRequestResponse &irr)
Definition: gkclient.h:281
bool m_monitorRunning
Definition: gkclient.h:443
bool m_forceRegister
Definition: gkclient.h:437
AlternateInfo(H225_AlternateGK &alt)
void ClearAllCalls()
void ClearInfoRequestRate()
H460_FeatureSet * m_features
Definition: gkclient.h:423
Definition: h323pdu.h:397
PLIST(H323LogicalChannelList, H323Channel)
Definition: h323con.h:137
PBoolean IsRegistered() const
Definition: gkclient.h:272
Definition: h460.h:53
void InfoRequestResponse()
void GetEndpointIdentifier(PASN_BMPString &id) const
Definition: gkclient.h:309
PBoolean LocationRequest(const PString &alias, H323TransportAddress &address)
PBoolean BandwidthRequest(H323Connection &connection, OpalBandwidth requestedBandwidth)
PBoolean OnReceiveInfoRequest(const H225_InfoRequest &irq)
H323TransportAddress gkRouteAddress
Definition: gkclient.h:431
PBoolean OnReceiveUnregistrationConfirm(const H225_UnregistrationConfirm &ucf)
H225_ArrayOf_AliasAddress * destExtraCallInfo
DestinationInfo to use in SETUP if not empty.
Definition: gkclient.h:188
PBoolean OnReceiveUnregistrationRequest(const H225_UnregistrationRequest &urq)
PBoolean OnReceiveAdmissionConfirm(const H225_AdmissionConfirm &acf)
PDECLARE_MUTEX(m_aliasMutex)
Definition: h323trans.h:47
PBoolean DisengageRequest(H323Connection &connection, unsigned reason)
PBoolean AdmissionRequest(H323Connection &connection, AdmissionResponse &response, PBoolean ignorePreGrantedARQ=false)
PString GetName() const
Definition: gkclient.h:392
bool NonStandardMessage(const PString &identifer, const void *outDataPtr, PINDEX outDataSize, PBYTEArray &replyData)
Definition: gkclient.h:238
PTimeInterval InternalRegister()
PBoolean OnReceiveAdmissionReject(const H225_AdmissionReject &arj)
void SetInfoRequestRate(const PTimeInterval &rate)
bool m_requiresDiscovery
Definition: gkclient.h:439
PBoolean OnReceiveBandwidthRequest(const H225_BandwidthRequest &brq)
Definition: gkclient.h:275
PStringList m_aliases
Definition: gkclient.h:380
bool SendNonStandardMessage(const PString &identifer, const PBYTEArray &outData)
PBoolean SendUnsolicitedIRR(H225_InfoRequestResponse &irr, H323RasPDU &response)
PDictionary< POrdinalKey, H323ServiceControlSession > serviceControlSessions
Definition: gkclient.h:433
RegistrationFailReasons GetRegistrationFailReason() const
Definition: gkclient.h:294
H460_FeatureSet * GetFeatures()
Definition: gkclient.h:332
virtual H323Transport * CreateTransport(PIPSocket::Address bindng=PIPSocket::GetDefaultIpAny(), WORD port=0, PBoolean reuseAddr=false)
Definition: gkclient.h:60
PBoolean OnReceiveDisengageReject(const H323RasPDU &, const H225_DisengageReject &)
H323TransportAddress rasAddress
Definition: gkclient.h:400
Definition: gkclient.h:283
void OnSendAdmissionRequest(H225_AdmissionRequest &arq)
Definition: gkclient.h:427
unsigned priority
Definition: gkclient.h:402
PBoolean OnReceiveRegistrationConfirm(const H225_RegistrationConfirm &rcf)
void PrintOn(ostream &strm) const
H235Authenticators m_authenticators
Definition: gkclient.h:420
void OnReceiveFeatureSet(H460_MessageType pduType, const H225_FeatureSet &features) const
PString gatekeeperIdentifier
Definition: h225ras.h:319
virtual PBoolean WriteTo(H323TransactionPDU &pdu, const H323TransportAddressArray &addresses, PBoolean callback=true)
Definition: gkclient.h:279
Definition: h323ep.h:82
PSortedList< AlternateInfo > AlternateList
Definition: gkclient.h:415
Definition: transaddr.h:62
H323Gatekeeper(H323EndPoint &endpoint, H323Transport *transport)
void SetRegistrationFailReason(unsigned reason, unsigned commandMask)
PBoolean DiscoverByNameAndAddress(const PString &identifier, const H323TransportAddress &address)
PINDEX endpointCount
Flag for call is through gk.
Definition: gkclient.h:183
std::set< PSafePtr< H323Connection > > m_activeConnections
Definition: gkclient.h:448
PBoolean OnReceiveGatekeeperReject(const H225_GatekeeperReject &grj)
bool m_autoReregister
Definition: gkclient.h:436
PBoolean DiscoverByAddress(const H323TransportAddress &address)
virtual void OnServiceControlSessions(const H225_ArrayOf_ServiceControlSession &serviceControl, H323Connection *connection)
RegistrationFailReasons m_registrationFailReason
Definition: gkclient.h:383
bool StartGatekeeper(const H323TransportAddress &address)
unsigned rejectReason
Definition: gkclient.h:180