OPAL  Version 3.18.8
processor.h
Go to the documentation of this file.
1 /*
2  *
3  * Inter Asterisk Exchange 2
4  *
5  * The core routine which determines the processing of packets for one call.
6  *
7  * Open Phone Abstraction Library (OPAL)
8  *
9  * Copyright (c) 2005 Indranet Technologies Ltd.
10  *
11  * The contents of this file are subject to the Mozilla Public License
12  * Version 1.0 (the "License"); you may not use this file except in
13  * compliance with the License. You may obtain a copy of the License at
14  * http://www.mozilla.org/MPL/
15  *
16  * Software distributed under the License is distributed on an "AS IS"
17  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
18  * the License for the specific language governing rights and limitations
19  * under the License.
20  *
21  * The Original Code is Open Phone Abstraction Library.
22  *
23  * The Initial Developer of the Original Code is Indranet Technologies Ltd.
24  *
25  * The author of this code is Derek J Smithies
26  */
27 
28 #ifndef OPAL_IAX2_PROCESSOR_H
29 #define OPAL_IAX2_PROCESSOR_H
30 
31 #ifndef _PTLIB_H
32 #include <ptlib.h>
33 #endif
34 
35 #include <opal_config.h>
36 
37 #if OPAL_IAX2
38 
39 #include <opal/connection.h>
40 
41 #include <iax2/frame.h>
42 #include <iax2/iedata.h>
43 #include <iax2/remote.h>
44 #include <iax2/safestrings.h>
45 #include <iax2/sound.h>
46 
47 class IAX2EndPoint;
48 class IAX2Connection;
49 class IAX2ThreadHelper;
50 
52 
73 class IAX2WaitingForAck : public PObject
74 {
75  PCLASSINFO(IAX2WaitingForAck, PObject);
76 
77  public:
84  };
85 
88 
90  void Assign(IAX2FullFrame *f, ResponseToAck _response);
91 
93  PBoolean MatchingAckPacket(IAX2FullFrame *f);
94 
96  ResponseToAck GetResponse() { return response; }
97 
99  PString GetResponseAsString() const;
100 
102  virtual void PrintOn(ostream & strm) const;
103 
105  void ZeroValues();
106 
107  private:
109  DWORD timeStamp;
110 
112  PINDEX seqNo;
113 
115  ResponseToAck response;
116 };
117 
119 
132 class IAX2Processor : public PThread
133 {
134  PCLASSINFO(IAX2Processor, PObject);
135 
136  public:
139 
141  virtual ~IAX2Processor();
142 
145 
148 
150  void IncomingEthernetFrame (IAX2Frame *frame);
151 
154  virtual void PrintOn(ostream & strm) const = 0;
155 
158 
168  void SetCallToken(const PString & newToken);
169 
171  PString GetCallToken();
172 
175 
177  const PTimeInterval & GetCallStartTick() { return callStartTick; }
178 
182  void Main();
183 
186  PBoolean IsStatusQueryEthernetFrame(IAX2Frame *frame);
187 
190  void SetSpecialPackets(PBoolean newValue) { specialPackets = newValue; }
191 
193  void Terminate();
194 
199  void Activate();
200 
207  virtual PBoolean IncomingMessageOutOfOrder(IAX2FullFrame *ff)= 0;
208 
210  void ReportLists(PString & answer);
211 
212  protected:
213 
216 
220  PTimeInterval callStartTick;
221 
224 
227  void StartNoResponseTimer(PINDEX msToWait = 60000);
228 
231 
234 
236  void CleanPendingLists() { activate.Signal(); }
237 
241 
243  PSyncPoint activate;
244 
246  PBoolean endThread;
247 
250 
253 
256 
260 
262  virtual void OnNoResponseTimeout() = 0;
263 
268  };
269 
273  PBoolean IsHandlingSpecialPackets() { return specialPackets; };
274 
277  PBoolean specialPackets;
278 
281  virtual void ProcessLists() = 0;
282 
285  virtual void ProcessFullFrame(IAX2FullFrame & fullFrame) = 0;
286 
289  virtual void ProcessIaxCmdLagRq(IAX2FullFrameProtocol *src);
290 
293  virtual void ProcessIaxCmdLagRp(IAX2FullFrameProtocol *src);
294 
297  virtual void ProcessIaxCmdVnak(IAX2FullFrameProtocol *src);
298 
301  virtual void ProcessIaxCmdPing(IAX2FullFrameProtocol *src);
302 
305  virtual void ProcessIaxCmdPong(IAX2FullFrameProtocol *src);
306 
311 
313  atomic<uint32_t> controlFramesSent;
314 
316  atomic<uint32_t> controlFramesRcvd;
317 
320 
323 
326  virtual void ProcessNetworkFrame(IAX2MiniFrame * src) = 0;
327 
328  /* A frame of FullFrameProtocol type is labelled as AST_FRAME_IAX in the
329  asterisk souces, It will contain 0, 1, 2 or more Information Elements
330  (Ie) in the data section. This processor is used to do things that are
331  common to registration and call handling.
332 
333  This method will eat/delete the supplied frame. Return true on success,
334  false on failure.*/
335  virtual PBoolean ProcessNetworkFrame(IAX2FullFrameProtocol * src);
336 
341 
349  );
350 
354  void TransmitFrameNow(IAX2Frame *src);
355 
358 
361  PBoolean Authenticate(IAX2FullFrameProtocol *reply,
362  PString & password
363  );
364 
367 
370  void SendAckFrame(IAX2FullFrame *inReplyTo);
371 
375  void SendVnakFrame(IAX2FullFrame *inReplyTo);
376 
378  void SendUnsupportedFrame(IAX2FullFrame *inReplyTo);
379 
380  private:
381 #ifdef DOC_PLUS_PLUS
382 
389  void OnNoResponseTimeoutStart(PTimer &, INT);
390 #else
391  PDECLARE_NOTIFIER(PTimer, IAX2Processor, OnNoResponseTimeoutStart);
392 #endif
393 
394  protected:
402 };
403 
404 
405 #endif // OPAL_IAX2
406 
407 #endif // OPAL_IAX2_PROCESSOR_H
virtual PBoolean IncomingMessageOutOfOrder(IAX2FullFrame *ff)=0
virtual void ProcessIaxCmdPong(IAX2FullFrameProtocol *src)
Definition: remote.h:223
void IncomingEthernetFrame(IAX2Frame *frame)
void CleanPendingLists()
Definition: processor.h:236
ResponseToAck GetResponse()
Definition: processor.h:96
void Assign(IAX2FullFrame *f, ResponseToAck _response)
PString GetCallToken()
virtual void ProcessIaxCmdLagRp(IAX2FullFrameProtocol *src)
SafeString callToken
Definition: processor.h:259
void TransmitFrameToRemoteEndpoint(IAX2Frame *src)
Definition: iax2ep.h:100
ResponseToAck
Definition: processor.h:79
Definition: remote.h:52
virtual void PrintOn(ostream &strm) const =0
virtual ~IAX2Processor()
Definition: iax2con.h:59
void SendAckFrame(IAX2FullFrame *inReplyTo)
void StartNoResponseTimer(PINDEX msToWait=60000)
Definition: processor.h:83
Definition: frame.h:365
IAX2Encryption & GetEncryptionInfo()
Definition: processor.h:147
virtual void ProcessNetworkFrame(IAX2MiniFrame *src)=0
PBoolean Authenticate(IAX2FullFrameProtocol *reply, PString &password)
Definition: safestrings.h:103
Definition: frame.h:303
IAX2SequenceNumbers sequence
Definition: processor.h:252
virtual void OnNoResponseTimeout()=0
DefinedNoResponseTimePeriod
Definition: processor.h:266
virtual void ProcessIaxCmdPing(IAX2FullFrameProtocol *src)
IAX2Remote remote
Definition: processor.h:223
void StopNoResponseTimer()
Definition: processor.h:230
void SendUnsupportedFrame(IAX2FullFrame *inReplyTo)
DWORD currentSoundTimeStamp
Definition: processor.h:401
IAX2EndPoint & GetEndPoint()
Definition: processor.h:157
void Terminate()
const PTimeInterval & GetCallStartTick()
Definition: processor.h:177
Definition: iedata.h:51
virtual void ProcessLists()=0
Definition: frame.h:872
Definition: processor.h:80
virtual void ProcessIaxCmdVnak(IAX2FullFrameProtocol *src)
IAX2EndPoint & endpoint
Definition: processor.h:215
IAX2Remote & GetRemoteInfo()
Definition: processor.h:174
void SetSpecialPackets(PBoolean newValue)
Definition: processor.h:190
atomic< uint32_t > controlFramesSent
Definition: processor.h:313
atomic< uint32_t > controlFramesRcvd
Definition: processor.h:316
Definition: remote.h:338
PBoolean specialPackets
Definition: processor.h:273
PTimeInterval callStartTick
Definition: processor.h:220
void IncControlFramesRcvd()
Definition: processor.h:322
PTimer noResponseTimer
Definition: processor.h:233
Definition: frame.h:1192
PBoolean IsHandlingSpecialPackets()
Definition: processor.h:273
Definition: processor.h:132
void ReportLists(PString &answer)
void TransmitFrameNow(IAX2Frame *src)
PString GetResponseAsString() const
Definition: processor.h:267
Definition: processor.h:82
IAX2Encryption encryption
Definition: processor.h:249
PBoolean MatchingAckPacket(IAX2FullFrame *f)
void SetCallToken(const PString &newToken)
void IncControlFramesSent()
Definition: processor.h:319
IAX2SequenceNumbers & GetSequenceInfo()
Definition: processor.h:144
virtual void ProcessFullFrame(IAX2FullFrame &fullFrame)=0
PBoolean ProcessOneIncomingEthernetFrame()
void SendVnakFrame(IAX2FullFrame *inReplyTo)
Definition: frame.h:71
virtual void PrintOn(ostream &strm) const
IAX2IeData ieData
Definition: processor.h:366
PBoolean endThread
Definition: processor.h:246
IAX2Processor(IAX2EndPoint &ep)
IAX2WaitingForAck nextTask
Definition: processor.h:240
Definition: processor.h:81
IAX2ActiveFrameList frameList
Definition: processor.h:255
PSyncPoint activate
Definition: processor.h:243
PBoolean IsStatusQueryEthernetFrame(IAX2Frame *frame)
Definition: processor.h:73
virtual void ProcessIaxCmdLagRq(IAX2FullFrameProtocol *src)