00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef OPAL_IAX2_REMOTE_H
00034 #define OPAL_IAX2_REMOTE_H
00035
00036 #ifndef _PTLIB_H
00037 #include <ptlib.h>
00038 #endif
00039
00040 #include <opal/buildopts.h>
00041
00042 #if OPAL_IAX2
00043
00044 #include <ptlib/sockets.h>
00045
00046 #if OPAL_PTLIB_SSL_AES
00047 #include <openssl/aes.h>
00048 #endif
00049
00050 #ifdef P_USE_PRAGMA
00051 #pragma interface
00052 #endif
00053
00054 class IAX2FullFrame;
00055
00056
00059 class IAX2Remote : public PObject
00060 {
00061 PCLASSINFO(IAX2Remote, PObject);
00062
00063 public:
00064
00066 IAX2Remote();
00067
00068 virtual ~IAX2Remote() { };
00069
00072 PINDEX DestCallNumber() { return destCallNumber; }
00073
00077 PINDEX SourceCallNumber() { return sourceCallNumber; }
00078
00080 virtual void PrintOn(ostream & strm) const;
00081
00083 enum {
00084 callNumberUndefined = 0xffff
00085 };
00086
00088 PIPSocket::Address RemoteAddress() { return remoteAddress; }
00089
00093 PString BuildConnectionTokenId();
00094
00096 PString BuildOurConnectionTokenId();
00097
00099 PINDEX RemotePort() { return remotePort; }
00100
00102 void Assign(IAX2Remote &);
00103
00105 void SetRemoteAddress(PIPSocket::Address &newVal) { remoteAddress = newVal; }
00106
00108 void SetRemoteAddress(int newVal) { remoteAddress = newVal; }
00109
00111 void SetRemotePort (PINDEX newVal) { remotePort = newVal; }
00112
00114 void SetSourceCallNumber(PINDEX newVal) { sourceCallNumber = newVal; }
00115
00117 void SetDestCallNumber(PINDEX newVal) { destCallNumber = newVal; }
00118
00122 PBoolean operator == (IAX2Remote & other);
00123
00126 PBoolean operator *= (IAX2Remote & other);
00127
00128
00130 PBoolean operator != (IAX2Remote & other);
00131
00132
00133 protected:
00135 PINDEX sourceCallNumber;
00136
00138 PINDEX destCallNumber;
00139
00141 PIPSocket::Address remoteAddress;
00142
00144 PINDEX remotePort;
00145
00146 };
00147
00149
00158 class IAX2FrameIdValue : public PObject
00159 {
00160 PCLASSINFO(IAX2FrameIdValue, PObject);
00161 public:
00163 IAX2FrameIdValue (PINDEX timeStamp, PINDEX seqVal);
00164
00166 IAX2FrameIdValue (PINDEX val);
00167
00169 PINDEX GetTimeStamp() const;
00170
00172 PINDEX GetSequenceVal() const;
00173
00177 PINDEX GetPlainSequence() const;
00178
00180 virtual void PrintOn(ostream & strm) const;
00181
00184 virtual Comparison Compare(const PObject & obj) const;
00185
00186 protected:
00187
00190 PUInt64 value;
00191 };
00192
00194
00199 PDECLARE_SORTED_LIST(IAX2PacketIdList, IAX2FrameIdValue)
00200 #ifdef DOC_PLUS_PLUS
00201 class IAX2PacketIdList : public PSortedList
00202 {
00203 #endif
00204
00207 PBoolean Contains(IAX2FrameIdValue &src);
00208
00211 PINDEX GetFirstValue();
00212
00214 void AppendNewFrame(IAX2FullFrame &src);
00215
00217 virtual void PrintOn(ostream & strm) const;
00218
00219 protected:
00225 void RemoveOldContiguousValues();
00226 };
00227
00229
00230 class IAX2SequenceNumbers
00231 {
00232 public:
00236 enum IncomingOrder {
00237 InSequence,
00238 SkippedFrame,
00239 RepeatedFrame
00240 };
00241
00242
00243
00245 IAX2SequenceNumbers()
00246 { ZeroAllValues(); };
00247
00249 virtual ~IAX2SequenceNumbers() { }
00250
00252 void ZeroAllValues();
00253
00255 PINDEX InSeqNo();
00256
00258 PINDEX OutSeqNo();
00259
00262 PBoolean IsFirstReplyFrame();
00263
00266 PBoolean IsSequenceNosZero();
00267
00269 void SetInSeqNo(PINDEX newVal);
00270
00272 void SetOutSeqNo(PINDEX newVal);
00273
00276 void SetInOutSeqNo(PINDEX inVal, PINDEX outVal);
00277
00280 void SetAckSequenceInfo(IAX2SequenceNumbers & other);
00281
00283 PBoolean operator !=(IAX2SequenceNumbers &other);
00284
00286 PBoolean operator ==(IAX2SequenceNumbers &other);
00287
00289 void MassageSequenceForSending(IAX2FullFrame &src
00290 );
00291
00295 void WrapAroundFrameSequence(IAX2SequenceNumbers & src);
00296
00300 IncomingOrder IncomingMessageInOrder
00301 (IAX2FullFrame &src );
00302
00304 void CopyContents(IAX2SequenceNumbers &src);
00305
00307 PString AsString() const;
00308
00310 virtual void PrintOn(ostream & strm) const;
00311
00314 PBoolean IsFirstReply() { return (inSeqNo == 1) && (outSeqNo == 0); }
00315
00317 void AddWrapAroundValue(PINDEX newOffset);
00318
00319
00320 protected:
00321
00323 enum sequenceDefines {
00324 minSpacing = 3
00325 };
00326
00328 PINDEX inSeqNo;
00329
00331 PINDEX outSeqNo;
00332
00334 PMutex mutex;
00335
00337 PINDEX lastSentTimeStamp;
00338
00340 IAX2PacketIdList receivedLog;
00341 };
00342
00344
00345 class IAX2Encryption : public PObject
00346 {
00347 PCLASSINFO(IAX2Encryption, PObject);
00348 public:
00350 IAX2Encryption();
00351
00353 void SetEncryptionOn (PBoolean newState = PTrue);
00354
00356 void SetEncryptionKey(PString & newKey);
00357
00359 void SetChallengeKey(PString & newKey);
00360
00362 const PString & EncryptionKey() const;
00363
00365 const PString & ChallengeKey() const;
00366
00368 PBoolean IsEncrypted() const;
00369
00370 #if OPAL_PTLIB_SSL_AES
00371
00372 AES_KEY *AesEncryptKey();
00373
00375 AES_KEY *AesDecryptKey();
00376 #endif
00377
00378 protected:
00381 void CalculateAesKeys();
00382
00384 PString encryptionKey;
00385
00387 PString challengeKey;
00388
00390 PBoolean encryptionEnabled;
00391
00392 #if OPAL_PTLIB_SSL_AES
00393
00394 AES_KEY aesEncryptKey;
00395
00397 AES_KEY aesDecryptKey;
00398 #endif
00399 };
00400
00402
00403
00404 #endif // OPAL_IAX2
00405
00406 #endif // OPAL_IAX2_REMOTE_H
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416