On 2009-06-19 12:57 +0400, Georgiewskiy Yuriy wrote GNU Gatekeeper Users:

Now i test it, work fine.

GY>On 2009-06-16 19:47 +0200, Jan Willamowius wrote 
openh323gk-us...@lists.sou...:
GY>
GY>
GY>Hi, patch against current cvs version, untested, but builds fine and should 
work, i test it tomorrow.
GY>
GY>diff -ruN openh323gk/ProxyChannel.cxx openh323gk-new/ProxyChannel.cxx
GY>--- openh323gk/ProxyChannel.cxx      2009-06-14 13:04:00.000000000 +0400
GY>+++ openh323gk-new/ProxyChannel.cxx  2009-06-19 12:19:39.000000000 +0400
GY>@@ -287,10 +287,10 @@
GY> 
GY>     UDPProxySocket(const char *);
GY> 
GY>-    void SetDestination(H245_UnicastAddress_iPAddress &);
GY>-    void SetForwardDestination(const Address &, WORD, const 
H245_UnicastAddress_iPAddress &);
GY>-    void SetReverseDestination(const Address &, WORD, const 
H245_UnicastAddress_iPAddress &);
GY>-    typedef void (UDPProxySocket::*pMem)(const Address &, WORD, const 
H245_UnicastAddress_iPAddress &);
GY>+    void SetDestination(H245_UnicastAddress_iPAddress &,callptr &);
GY>+    void SetForwardDestination(const Address &, WORD, const 
H245_UnicastAddress_iPAddress &, callptr &);
GY>+    void SetReverseDestination(const Address &, WORD, const 
H245_UnicastAddress_iPAddress &, callptr &);
GY>+    typedef void (UDPProxySocket::*pMem)(const Address &, WORD, const 
H245_UnicastAddress_iPAddress &, callptr &);
GY> 
GY>     bool Bind(WORD pt);
GY>     bool Bind(const Address &localAddr, WORD pt);
GY>@@ -310,6 +310,10 @@
GY>     virtual bool Flush();
GY>     virtual bool ErrorHandler(PSocket::ErrorGroup);
GY> 
GY>+    //RTCP handler
GY>+    void BuildReceiverReport(const RTP_ControlFrame & frame, PINDEX offset, 
bool direct);
GY>+
GY>+    callptr *  m_call;
GY> private:
GY>     UDPProxySocket();
GY>     UDPProxySocket(const UDPProxySocket&);
GY>@@ -362,7 +366,7 @@
GY>     WORD GetChannelNumber() const { return channelNumber; }
GY>     void SetChannelNumber(WORD cn) { channelNumber = cn; }
GY> 
GY>-    virtual bool SetDestination(H245_OpenLogicalChannelAck &, H245Handler 
*) = 0;
GY>+    virtual bool SetDestination(H245_OpenLogicalChannelAck &, H245Handler 
*,callptr &) = 0;
GY>     virtual void StartReading(ProxyHandler *) = 0;
GY>     virtual void SetRTPMute(bool toMute) = 0;
GY> 
GY>@@ -381,11 +385,11 @@
GY>     void SetMediaChannelSource(const H245_UnicastAddress_iPAddress &);
GY>     void SetMediaControlChannelSource(const H245_UnicastAddress_iPAddress 
&);
GY>     PIPSocket::Address GetSourceIP() const;
GY>-    void HandleMediaChannel(H245_UnicastAddress_iPAddress *, 
H245_UnicastAddress_iPAddress *, const PIPSocket::Address &, bool);
GY>-    bool OnLogicalChannelParameters(H245_H2250LogicalChannelParameters &, 
const PIPSocket::Address &, bool);
GY>+    void HandleMediaChannel(H245_UnicastAddress_iPAddress *, 
H245_UnicastAddress_iPAddress *, const PIPSocket::Address &, bool, callptr &);
GY>+    bool OnLogicalChannelParameters(H245_H2250LogicalChannelParameters &, 
const PIPSocket::Address &, bool, callptr &);
GY> 
GY>     // override from class LogicalChannel
GY>-    virtual bool SetDestination(H245_OpenLogicalChannelAck &, H245Handler 
*);
GY>+    virtual bool SetDestination(H245_OpenLogicalChannelAck &, H245Handler 
*,callptr &);
GY>     virtual void StartReading(ProxyHandler *);
GY>     virtual void SetRTPMute(bool toMute);
GY> 
GY>@@ -413,7 +417,7 @@
GY>     virtual ~T120LogicalChannel();
GY> 
GY>     // override from class LogicalChannel
GY>-    virtual bool SetDestination(H245_OpenLogicalChannelAck &, H245Handler 
*);
GY>+    virtual bool SetDestination(H245_OpenLogicalChannelAck &, H245Handler 
*,callptr &);
GY>     virtual void StartReading(ProxyHandler *);
GY>     virtual void SetRTPMute(bool /*toMute*/) {};   /// We do not Mute T.120 
Channels
GY> 
GY>@@ -463,10 +467,10 @@
GY>     virtual ~H245Handler();
GY> 
GY>     virtual void OnH245Address(H225_TransportAddress &);
GY>-    virtual bool HandleMesg(H245_MultimediaSystemControlMessage &, bool & 
suppress);
GY>-    virtual bool HandleFastStartSetup(H245_OpenLogicalChannel &);
GY>-    virtual bool HandleFastStartResponse(H245_OpenLogicalChannel &);
GY>-    typedef bool (H245Handler::*pMem)(H245_OpenLogicalChannel &);
GY>+    virtual bool HandleMesg(H245_MultimediaSystemControlMessage &, bool & 
suppress, callptr & mcall);
GY>+    virtual bool HandleFastStartSetup(H245_OpenLogicalChannel &, callptr &);
GY>+    virtual bool HandleFastStartResponse(H245_OpenLogicalChannel &, callptr 
&);
GY>+    typedef bool (H245Handler::*pMem)(H245_OpenLogicalChannel &,callptr &);
GY> 
GY>     PIPSocket::Address GetLocalAddr() const { return localAddr; }
GY>     PIPSocket::Address GetRemoteAddr() const { return remoteAddr; }
GY>@@ -477,7 +481,7 @@
GY> 
GY> protected:
GY>     virtual bool HandleRequest(H245_RequestMessage &);
GY>-    virtual bool HandleResponse(H245_ResponseMessage &);
GY>+    virtual bool HandleResponse(H245_ResponseMessage &,callptr &);
GY>     virtual bool HandleCommand(H245_CommandMessage &);
GY>     virtual bool HandleIndication(H245_IndicationMessage &, bool & 
suppress);
GY> 
GY>@@ -499,8 +503,8 @@
GY>     virtual ~H245ProxyHandler();
GY> 
GY>     // override from class H245Handler
GY>-    virtual bool HandleFastStartSetup(H245_OpenLogicalChannel &);
GY>-    virtual bool HandleFastStartResponse(H245_OpenLogicalChannel &);
GY>+    virtual bool HandleFastStartSetup(H245_OpenLogicalChannel &,callptr &);
GY>+    virtual bool HandleFastStartResponse(H245_OpenLogicalChannel &,callptr 
&);
GY> 
GY>     void SetHandler(ProxyHandler *);
GY>     LogicalChannel *FindLogicalChannel(WORD);
GY>@@ -511,12 +515,12 @@
GY> private:
GY>     // override from class H245Handler
GY>     virtual bool HandleRequest(H245_RequestMessage &);
GY>-    virtual bool HandleResponse(H245_ResponseMessage &);
GY>+    virtual bool HandleResponse(H245_ResponseMessage &, callptr &);
GY>     virtual bool HandleIndication(H245_IndicationMessage &, bool & 
suppress);
GY> 
GY>     bool OnLogicalChannelParameters(H245_H2250LogicalChannelParameters *, 
WORD);
GY>     bool HandleOpenLogicalChannel(H245_OpenLogicalChannel &);
GY>-    bool HandleOpenLogicalChannelAck(H245_OpenLogicalChannelAck &);
GY>+    bool HandleOpenLogicalChannelAck(H245_OpenLogicalChannelAck &, callptr 
&);
GY>     bool HandleOpenLogicalChannelReject(H245_OpenLogicalChannelReject &);
GY>     bool HandleCloseLogicalChannel(H245_CloseLogicalChannel &);
GY>     void HandleMuteRTPChannel();
GY>@@ -1296,7 +1300,7 @@
GY>             }
GY>     }
GY> 
GY>-    if ((!m_h245handler || !m_h245handler->HandleMesg(h245msg, suppress)) 
&& !changed)
GY>+    if ((!m_h245handler || !m_h245handler->HandleMesg(h245msg, suppress, 
m_call)) && !changed)
GY>             return false;
GY> 
GY>     strm.BeginEncoding();
GY>@@ -3023,10 +3027,9 @@
GY>             } else 
GY>                     PTRACE(5, "Q931\tFailover inactive for call " << 
m_call->GetCallNumber() << ", Q931 cause " << cause);
GY>     }
GY>-    
GY>+
GY>     if (m_call)
GY>             CallTable::Instance()->RemoveCall(m_call);
GY>-            
GY>     m_result = Closing;
GY> }
GY> 
GY>@@ -3361,7 +3364,7 @@
GY>             }
GY> 
GY>             H245Handler::pMem handlefs = (fromCaller) ? 
&H245Handler::HandleFastStartSetup : &H245Handler::HandleFastStartResponse;
GY>-            if ((m_h245handler->*handlefs)(olc)) {
GY>+            if ((m_h245handler->*handlefs)(olc, m_call)) {
GY>                     PPER_Stream wtstrm;
GY>                     olc.Encode(wtstrm);
GY>                     wtstrm.CompleteEncoding();
GY>@@ -4111,7 +4114,7 @@
GY>             hnat->TranslateH245Address(addr);
GY> }
GY> 
GY>-bool H245Handler::HandleMesg(H245_MultimediaSystemControlMessage & h245msg, 
bool & suppress)
GY>+bool H245Handler::HandleMesg(H245_MultimediaSystemControlMessage & h245msg, 
bool & suppress, callptr & mcall)
GY> {
GY>     bool changed = false;
GY> 
GY>@@ -4121,7 +4124,7 @@
GY>                     changed = HandleRequest(h245msg);
GY>                     break;
GY>             case H245_MultimediaSystemControlMessage::e_response:
GY>-                    changed = HandleResponse(h245msg);
GY>+                    changed = HandleResponse(h245msg, mcall);
GY>                     break;
GY>             case H245_MultimediaSystemControlMessage::e_command:
GY>                     changed = HandleCommand(h245msg);
GY>@@ -4136,12 +4139,12 @@
GY>     return changed;
GY> }
GY> 
GY>-bool H245Handler::HandleFastStartSetup(H245_OpenLogicalChannel & olc)
GY>+bool H245Handler::HandleFastStartSetup(H245_OpenLogicalChannel & 
olc,callptr & mcall)
GY> {
GY>     return hnat ? hnat->HandleOpenLogicalChannel(olc) : false;
GY> }
GY> 
GY>-bool H245Handler::HandleFastStartResponse(H245_OpenLogicalChannel & olc)
GY>+bool H245Handler::HandleFastStartResponse(H245_OpenLogicalChannel & olc, 
callptr & mcall)
GY> {
GY>     return hnat ? hnat->HandleOpenLogicalChannel(olc) : false;
GY> }
GY>@@ -4158,7 +4161,7 @@
GY>     }
GY> }
GY> 
GY>-bool H245Handler::HandleResponse(H245_ResponseMessage & Response)
GY>+bool H245Handler::HandleResponse(H245_ResponseMessage & Response, callptr & 
mcall)
GY> {
GY>     PTRACE(4, "H245\tResponse: " << Response.GetTagName());
GY>     if (hnat && Response.GetTag() == 
H245_ResponseMessage::e_openLogicalChannelAck)
GY>@@ -4576,7 +4579,7 @@
GY>     PTRACE(5, Type() << "\tfnat=" << fnat << " rnat=" << rnat);
GY> }
GY> 
GY>-void UDPProxySocket::SetForwardDestination(const Address & srcIP, WORD 
srcPort, const H245_UnicastAddress_iPAddress & addr)
GY>+void UDPProxySocket::SetForwardDestination(const Address & srcIP, WORD 
srcPort, const H245_UnicastAddress_iPAddress & addr, callptr & mcall)
GY> {
GY>     if ((DWORD)srcIP != 0)
GY>             fSrcIP = srcIP, fSrcPort = srcPort;
GY>@@ -4593,17 +4596,38 @@
GY>             << " to " << fDestIP << ':' << fDestPort
GY>             );
GY>     SetConnected(true);
GY>+
GY>+    if (Type() == "RTCP"){
GY>+        mcall->SetSRC_media_control_IP(fDestIP.AsString());
GY>+        mcall->SetDST_media_control_IP(srcIP.AsString());
GY>+    }
GY>+    if (Type() == "RTP"){
GY>+        mcall->SetSRC_media_IP(fDestIP.AsString());
GY>+        mcall->SetDST_media_IP(srcIP.AsString());
GY>+    }
GY>+    
GY>+    m_call = &mcall;                
GY> }
GY> 
GY>-void UDPProxySocket::SetReverseDestination(const Address & srcIP, WORD 
srcPort, const H245_UnicastAddress_iPAddress & addr)
GY>+void UDPProxySocket::SetReverseDestination(const Address & srcIP, WORD 
srcPort, const H245_UnicastAddress_iPAddress & addr, callptr & mcall)
GY> {
GY>     if( (DWORD)srcIP != 0 )
GY>             rSrcIP = srcIP, rSrcPort = srcPort;
GY> 
GY>     addr >> rDestIP >> rDestPort;
GY>-
GY>+    
GY>     PTRACE(5, Type() << "\tReverse " << srcIP << ':' << srcPort << " to " 
<< rDestIP << ':' << rDestPort);
GY>     SetConnected(true);
GY>+    if (Type() == "RTCP"){
GY>+        mcall->SetSRC_media_control_IP(srcIP.AsString());
GY>+        mcall->SetDST_media_control_IP(rDestIP.AsString());
GY>+    }
GY>+    if (Type() == "RTP"){
GY>+        mcall->SetSRC_media_IP(srcIP.AsString());
GY>+        mcall->SetDST_media_IP(rDestIP.AsString());
GY>+    }
GY>+    m_call = &mcall;
GY>+
GY> }
GY> 
GY> ProxySocket::Result UDPProxySocket::ReceiveData()
GY>@@ -4681,9 +4705,168 @@
GY>             if (fnat)
GY>                     fDestIP = fromIP, fDestPort = fromPort;
GY>     }
GY>+    if (Type() == "RTCP"){
GY>+    bool direct = true;
GY>+    
GY>+    if ((*m_call)->GetSRC_media_control_IP() == fromIP.AsString()){
GY>+        direct = true;
GY>+    }else {
GY>+        direct = false;
GY>+    }
GY>+
GY>+    PIPSocket::Address addr = (DWORD)0; 
GY>+    (*m_call)->GetMediaOriginatingIp(addr);
GY>+    
GY>+    RTP_ControlFrame frame(2048);
GY>+    frame.Attach(wbuffer,buflen);
GY>+    do {
GY>+        BYTE * payload = frame.GetPayloadPtr();
GY>+        unsigned size = frame.GetPayloadSize(); 
GY>+        if ((payload == NULL) || (size == 0) || ((payload + size) > 
(frame.GetPointer() + frame.GetSize()))){
GY>+            /* TODO: 1.shall we test for a maximum size ? Indeed but what's 
the value ? *
GY>+                     2. what's the correct exit status ? */
GY>+//          PTRACE(2, "RTCP\tSession invalid frame");
GY>+    
GY>+            break;
GY>+        }
GY>+        switch (frame.GetPayloadType()) {
GY>+            case RTP_ControlFrame::e_SenderReport :
GY>+                PTRACE(5, "RTCP\tSession SenderReport packet");
GY>+                if (size >= sizeof(RTP_ControlFrame::SenderReport)) {
GY>+                    const RTP_ControlFrame::SenderReport & sr = *(const 
RTP_ControlFrame::SenderReport *)(payload);
GY>+                    if (direct){
GY>+                        (*m_call)->SetRTCP_DST_packet_count(sr.psent);
GY>+                        PTRACE(5, "RTCP\tSession 
SetRTCP_DST_packet_count:"<<sr.psent);
GY>+                    }else{
GY>+                        (*m_call)->SetRTCP_SRC_packet_count(sr.psent);
GY>+                        PTRACE(5, "RTCP\tSession 
SetRTCP_SRC_packet_count:"<<sr.psent);
GY>+                    }       
GY>+                    BuildReceiverReport(frame, 
sizeof(RTP_ControlFrame::SenderReport),direct);
GY>+                }else {
GY>+                    PTRACE(5, "RTCP\tSession  SenderReport packet 
truncated");
GY>+                }
GY>+                break;
GY>+            case RTP_ControlFrame::e_ReceiverReport :
GY>+                PTRACE(5, "RTCP\tSession ReceiverReport packet");
GY>+                if (size >= 4)
GY>+                    BuildReceiverReport(frame, sizeof(PUInt32b),direct);
GY>+                        else {
GY>+                    PTRACE(5, "RTP\tSession ReceiverReport packet 
truncated");
GY>+                }
GY>+                break;
GY>+            case RTP_ControlFrame::e_SourceDescription :
GY>+                PTRACE(5, "RTCP\tSession SourceDescription packet");        
            
GY>+                if 
((!(*m_call)->GetRTCP_SRC_sdes_flag()&&direct)||(!(*m_call)->GetRTCP_DST_sdes_flag()&&!direct))
GY>+                if (size >= 
frame.GetCount()*sizeof(RTP_ControlFrame::SourceDescription)) {
GY>+                    const RTP_ControlFrame::SourceDescription * sdes = 
(const RTP_ControlFrame::SourceDescription *)payload;
GY>+                    PINDEX srcIdx;
GY>+                    for (srcIdx = 0; srcIdx < (PINDEX)frame.GetCount(); 
srcIdx++){
GY>+                        const RTP_ControlFrame::SourceDescription::Item * 
item = sdes->item;
GY>+                        while ((item != NULL) && (item->type != 
RTP_ControlFrame::e_END)){
GY>+                            if (item->length != NULL && item->length != 0){
GY>+                                switch (item->type){
GY>+                                    case RTP_ControlFrame::e_CNAME:
GY>+                                        if (!direct){
GY>+                                            
(*m_call)->SetRTCP_DST_sdes("cname="+((PString)(item->data)).Left(item->length));
GY>+                                        }else{
GY>+                                            
(*m_call)->SetRTCP_SRC_sdes("cname="+((PString)(item->data)).Left(item->length));
GY>+                                        }
GY>+                                        break;
GY>+                                    case RTP_ControlFrame::e_NAME:
GY>+                                        if (!direct){
GY>+                                            
(*m_call)->SetRTCP_DST_sdes("name="+((PString)(item->data)).Left(item->length));
GY>+                                        }else{
GY>+                                            
(*m_call)->SetRTCP_SRC_sdes("name="+((PString)(item->data)).Left(item->length));
GY>+                                        }
GY>+                                        break;
GY>+                                    case RTP_ControlFrame::e_EMAIL:
GY>+                                        if (!direct){
GY>+                                            
(*m_call)->SetRTCP_DST_sdes("email="+((PString)(item->data)).Left(item->length));
GY>+                                        }else{
GY>+                                            
(*m_call)->SetRTCP_SRC_sdes("email="+((PString)(item->data)).Left(item->length));
GY>+                                        }
GY>+                                        break;
GY>+                                    case RTP_ControlFrame::e_PHONE:
GY>+                                        if (!direct){
GY>+                                            
(*m_call)->SetRTCP_DST_sdes("phone="+((PString)(item->data)).Left(item->length));
GY>+                                        }else{
GY>+                                            
(*m_call)->SetRTCP_SRC_sdes("phone="+((PString)(item->data)).Left(item->length));
GY>+                                        }
GY>+                                        break;
GY>+                                    case RTP_ControlFrame::e_LOC:
GY>+                                        if (!direct){
GY>+                                            
(*m_call)->SetRTCP_DST_sdes("loc="+((PString)(item->data)).Left(item->length));
GY>+                                        }else{
GY>+                                            
(*m_call)->SetRTCP_SRC_sdes("loc="+((PString)(item->data)).Left(item->length));
GY>+                                        }
GY>+                                        break;
GY>+                                    case RTP_ControlFrame::e_TOOL:
GY>+                                        if (!direct){
GY>+                                            
(*m_call)->SetRTCP_DST_sdes("tool="+((PString)(item->data)).Left(item->length));
GY>+                                        }else{
GY>+                                            
(*m_call)->SetRTCP_SRC_sdes("tool="+((PString)(item->data)).Left(item->length));
GY>+                                        }
GY>+                                        break;
GY>+                                    case RTP_ControlFrame::e_NOTE:
GY>+                                        if (!direct){
GY>+                                            
(*m_call)->SetRTCP_DST_sdes("note="+((PString)(item->data)).Left(item->length));
GY>+                                        }else{
GY>+                                            
(*m_call)->SetRTCP_SRC_sdes("note="+((PString)(item->data)).Left(item->length));
GY>+                                        }
GY>+                                        break;
GY>+                                    default :
GY>+                                        PTRACE(5,"RTCP\tSession  
SourceDescription bad item");
GY>+                                        break;
GY>+                                }
GY>+                            }    
GY>+                            item = item->GetNextItem();
GY>+                        }
GY>+                        /* RTP_ControlFrame::e_END doesn't have a length 
field, so do NOT call item->GetNextItem()
GY>+                            otherwise it reads over the buffer */
GY>+                        if((item == NULL) || 
GY>+                            (item->type == RTP_ControlFrame::e_END) || 
GY>+                            ((sdes = (const 
RTP_ControlFrame::SourceDescription *)item->GetNextItem()) == NULL)){
GY>+                            break;
GY>+                        }
GY>+                    }
GY>+                }
GY>+                break;
GY>+            case RTP_ControlFrame::e_Goodbye :
GY>+                PTRACE(5, "RTCP\tSession Goodbye packet");
GY>+                break;
GY>+            case RTP_ControlFrame::e_ApplDefined :
GY>+                PTRACE(5, "RTCP\tSession ApplDefined packet");
GY>+                break;
GY>+            default :
GY>+                PTRACE(5, "RTCP\tSession  Unknown control payload type: " 
<< frame.GetPayloadType());
GY>+                break;
GY>+        }
GY>+    } while (frame.ReadNextCompound());
GY>+    }       
GY>     return Forwarding;
GY> }
GY> 
GY>+void UDPProxySocket::BuildReceiverReport(const RTP_ControlFrame & frame, 
PINDEX offset, bool direct)
GY>+{
GY>+  const RTP_ControlFrame::ReceiverReport * rr = (const 
RTP_ControlFrame::ReceiverReport *)(frame.GetPayloadPtr()+offset);
GY>+  for (PINDEX repIdx = 0; repIdx < (PINDEX)frame.GetCount(); repIdx++) {
GY>+    RTP_Session::ReceiverReport * report = new RTP_Session::ReceiverReport;
GY>+    if (direct){
GY>+    (*m_call)->SetRTCP_DST_packet_lost(report->totalLost = 
rr->GetLostPackets());
GY>+    (*m_call)->SetRTCP_DST_jitter(rr->jitter);
GY>+    PTRACE(5, "RTCP\tSession 
SetRTCP_DST_packet_lost:"<<rr->GetLostPackets());
GY>+    PTRACE(5, "RTCP\tSession SetRTCP_DST_jitter:"<<rr->jitter);
GY>+    } else{
GY>+    (*m_call)->SetRTCP_SRC_packet_lost(report->totalLost = 
rr->GetLostPackets());
GY>+    (*m_call)->SetRTCP_SRC_jitter(rr->jitter);
GY>+    PTRACE(5, "RTCP\tSession 
SetRTCP_SRC_packet_lost:"<<rr->GetLostPackets());
GY>+    PTRACE(5, "RTCP\tSession SetRTCP_SRC_jitter:"<<rr->jitter);
GY>+    }
GY>+    rr++;
GY>+  }
GY>+}
GY>+
GY>+
GY> bool UDPProxySocket::WriteData(const BYTE *buffer, int len)
GY> {
GY>     if (!IsSocketOpen())
GY>@@ -4908,7 +5091,7 @@
GY>     addr >> SrcIP >> SrcPort;
GY> }
GY> 
GY>-void RTPLogicalChannel::HandleMediaChannel(H245_UnicastAddress_iPAddress 
*mediaControlChannel, H245_UnicastAddress_iPAddress *mediaChannel, const 
PIPSocket::Address & local, bool rev)
GY>+void RTPLogicalChannel::HandleMediaChannel(H245_UnicastAddress_iPAddress 
*mediaControlChannel, H245_UnicastAddress_iPAddress *mediaChannel, const 
PIPSocket::Address & local, bool rev, callptr & mcall)
GY> {
GY>     // mediaControlChannel should be non-zero.
GY>     H245_UnicastAddress_iPAddress tmp, tmpmedia, tmpmediacontrol, *dest = 
mediaControlChannel;
GY>@@ -4937,7 +5120,7 @@
GY>             }
GY>     }
GY>     UDPProxySocket::pMem SetDest = (reversed) ? 
&UDPProxySocket::SetReverseDestination : &UDPProxySocket::SetForwardDestination;
GY>-    (rtcp->*SetDest)(tmpSrcIP, tmpSrcPort, *dest);
GY>+    (rtcp->*SetDest)(tmpSrcIP, tmpSrcPort, *dest, mcall);
GY>     *mediaControlChannel << local << (port + 1);
GY> 
GY>     if (mediaChannel) {
GY>@@ -4946,7 +5129,7 @@
GY>             } else {
GY>                     dest = mediaChannel;
GY>             }
GY>-            (rtp->*SetDest)(tmpSrcIP, tmpSrcPort - 1, *dest);
GY>+            (rtp->*SetDest)(tmpSrcIP, tmpSrcPort - 1, *dest, mcall);
GY>             *mediaChannel << local << port;
GY>     }
GY> }
GY>@@ -4957,24 +5140,24 @@
GY>             rtp->SetMute(toMute);
GY> }
GY> 
GY>-bool 
RTPLogicalChannel::OnLogicalChannelParameters(H245_H2250LogicalChannelParameters
 & h225Params, const PIPSocket::Address & local, bool rev)
GY>+bool 
RTPLogicalChannel::OnLogicalChannelParameters(H245_H2250LogicalChannelParameters
 & h225Params, const PIPSocket::Address & local, bool rev, callptr & mcall)
GY> {
GY>     if 
(!h225Params.HasOptionalField(H245_H2250LogicalChannelParameters::e_mediaControlChannel))
GY>             return false;
GY>     H245_UnicastAddress_iPAddress *mediaControlChannel = 
GetH245UnicastAddress(h225Params.m_mediaControlChannel);
GY>     H245_UnicastAddress_iPAddress *mediaChannel = 
h225Params.HasOptionalField(H245_H2250LogicalChannelParameters::e_mediaChannel) 
? GetH245UnicastAddress(h225Params.m_mediaChannel) : 0;
GY>-    HandleMediaChannel(mediaControlChannel, mediaChannel, local, rev);
GY>+    HandleMediaChannel(mediaControlChannel, mediaChannel, local, rev,mcall);
GY>     return true;
GY> }
GY> 
GY>-bool RTPLogicalChannel::SetDestination(H245_OpenLogicalChannelAck & olca, 
H245Handler *handler)
GY>+bool RTPLogicalChannel::SetDestination(H245_OpenLogicalChannelAck & olca, 
H245Handler *handler, callptr & mcall)
GY> {
GY>     H245_UnicastAddress_iPAddress *mediaControlChannel, *mediaChannel;
GY>     GetChannelsFromOLCA(olca, mediaControlChannel, mediaChannel);
GY>     if (mediaControlChannel == NULL && mediaChannel == NULL) {
GY>             return false;
GY>     }
GY>-    HandleMediaChannel(mediaControlChannel, mediaChannel, 
handler->GetMasqAddr(), false);
GY>+    HandleMediaChannel(mediaControlChannel, mediaChannel, 
handler->GetMasqAddr(), false,mcall);
GY>     return true;
GY> }
GY> 
GY>@@ -5035,7 +5218,7 @@
GY>     PTRACE(4, "T120\tDelete logical channel " << channelNumber);
GY> }
GY> 
GY>-bool T120LogicalChannel::SetDestination(H245_OpenLogicalChannelAck & olca, 
H245Handler * _handler)
GY>+bool T120LogicalChannel::SetDestination(H245_OpenLogicalChannelAck & olca, 
H245Handler * _handler, callptr & mcall)
GY> {
GY>     return 
(olca.HasOptionalField(H245_OpenLogicalChannelAck::e_separateStack)) ?
GY>             OnSeparateStack(olca.m_separateStack, _handler) : false;
GY>@@ -5167,14 +5350,14 @@
GY>     return false;
GY> }
GY> 
GY>-bool H245ProxyHandler::HandleResponse(H245_ResponseMessage & Response)
GY>+bool H245ProxyHandler::HandleResponse(H245_ResponseMessage & Response, 
callptr & mcall)
GY> {
GY>     PTRACE(4, "H245\tResponse: " << Response.GetTagName());
GY>     if (peer)
GY>             switch (Response.GetTag())
GY>             {
GY>                     case H245_ResponseMessage::e_openLogicalChannelAck:
GY>-                            return HandleOpenLogicalChannelAck(Response);
GY>+                            return HandleOpenLogicalChannelAck(Response, 
mcall);
GY>                     case H245_ResponseMessage::e_openLogicalChannelReject:
GY>                             return HandleOpenLogicalChannelReject(Response);
GY>                     default:
GY>@@ -5293,7 +5476,7 @@
GY>     return false; // nothing changed :)
GY> }
GY> 
GY>-bool 
H245ProxyHandler::HandleOpenLogicalChannelAck(H245_OpenLogicalChannelAck & olca)
GY>+bool 
H245ProxyHandler::HandleOpenLogicalChannelAck(H245_OpenLogicalChannelAck & 
olca, callptr & mcall)
GY> {
GY>     if (hnat)
GY>             hnat->HandleOpenLogicalChannelAck(olca);
GY>@@ -5345,7 +5528,7 @@
GY>     }
GY> #endif
GY> 
GY>-    bool result = lc->SetDestination(olca, this);
GY>+    bool result = lc->SetDestination(olca, this, mcall);
GY>     if (result)
GY>             lc->StartReading(handler);
GY>     return result;
GY>@@ -5421,7 +5604,7 @@
GY>     return false; // nothing changed :)
GY> }
GY> 
GY>-bool H245ProxyHandler::HandleFastStartSetup(H245_OpenLogicalChannel & olc)
GY>+bool H245ProxyHandler::HandleFastStartSetup(H245_OpenLogicalChannel & 
olc,callptr & mcall)
GY> {
GY>     if (!peer)
GY>             return false;
GY>@@ -5447,7 +5630,7 @@
GY>     return ((h225Params) ? OnLogicalChannelParameters(h225Params, 0) : 
false) || changed;
GY> }
GY> 
GY>-bool H245ProxyHandler::HandleFastStartResponse(H245_OpenLogicalChannel & 
olc)
GY>+bool H245ProxyHandler::HandleFastStartResponse(H245_OpenLogicalChannel & 
olc,callptr & mcall)
GY> {
GY>     if (!peer)
GY>             return false;
GY>@@ -5495,7 +5678,7 @@
GY>                             peer->logicalChannels[flcn] = 
peer->sessionIDs[id] = lc = new RTPLogicalChannel(lc, flcn, hnat != 0);
GY>             }
GY>     }
GY>-    if (lc && (changed = lc->OnLogicalChannelParameters(*h225Params, 
GetMasqAddr(), isReverseLC)))
GY>+    if (lc && (changed = lc->OnLogicalChannelParameters(*h225Params, 
GetMasqAddr(), isReverseLC, mcall)))
GY>             lc->StartReading(handler);
GY>     return changed;
GY> }
GY>diff -ruN openh323gk/radacct.cxx openh323gk-new/radacct.cxx
GY>--- openh323gk/radacct.cxx   2009-05-25 09:10:00.000000000 +0400
GY>+++ openh323gk-new/radacct.cxx       2009-06-19 12:19:39.000000000 +0400
GY>@@ -320,6 +320,62 @@
GY>                             
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_release_source,call->GetReleaseSource());
GY>                             
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_preferred_codec,call->GetCodec());
GY>                             
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_rewritten_e164_num,call->GetCalledStationId());
GY>+                            //RTCP SOURCE REPORT
GY>+                            
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTP_source_IP=")+call->GetSRC_media_IP(),
GY>+                                        true
GY>+                            );
GY>+                            
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTP_destination_IP=")+call->GetDST_media_IP(),
GY>+                                        true
GY>+                            );
GY>+                            
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTCP_source_packet_count=")+PString(PString::Unsigned,call->GetRTCP_SRC_packet_count()),
GY>+                                        true
GY>+                            );
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTCP_source_packet_lost=")+PString(PString::Unsigned,call->GetRTCP_SRC_packet_lost()),
GY>+                                true
GY>+                            );
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTCP_source_jitter=")+PString(PString::Unsigned,call->GetRTCP_SRC_jitter_min())+PString("|")+PString(PString::Unsigned,call->GetRTCP_SRC_jitter_avg())+PString("|")+PString(PString::Unsigned,call->GetRTCP_SRC_jitter_max()),
GY>+                                true
GY>+                            );
GY>+                            
GY>+                            PINDEX i_sdes = 0;
GY>+                            PStringList sdes = call->GetRTCP_SRC_sdes();
GY>+                            while (i_sdes < sdes.GetSize()) {
GY>+                                
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                    
PString("RTCP_source_sdes_")+sdes[i_sdes],
GY>+                                    true
GY>+                                );
GY>+                                i_sdes ++;
GY>+                            }
GY>+                            //RTCP DESTINATION REPORT
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTCP_destination_packet_count=")+PString(PString::Unsigned,call->GetRTCP_DST_packet_count()),
GY>+                                true
GY>+                            );
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTCP_destination_packet_lost=")+PString(PString::Unsigned,call->GetRTCP_DST_packet_lost()),
GY>+                                true
GY>+                            );
GY>+                            
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                
PString("RTCP_destination_jitter=")+PString(PString::Unsigned,call->GetRTCP_DST_jitter_min())+PString("|")+PString(PString::Unsigned,call->GetRTCP_DST_jitter_avg())+PString("|")+PString(PString::Unsigned,call->GetRTCP_DST_jitter_max()),
GY>+                                true
GY>+                            );
GY>+                            i_sdes = 0;
GY>+                            sdes = call->GetRTCP_DST_sdes();
GY>+                            while (i_sdes < sdes.GetSize()) {
GY>+                                
pdu->AppendCiscoAttr(RadiusAttr::CiscoVSA_AV_Pair,
GY>+                                    
PString("RTCP_destination_sdes_")+sdes[i_sdes],
GY>+                                    true
GY>+                                );
GY>+                                i_sdes ++;
GY>+                            }
GY>                     }                                       
GY>                     
GY>                     if (call->GetDestSignalAddr(addr,port))
GY>@@ -332,6 +388,7 @@
GY>                                     + 
GetGUIDString(call->GetCallIdentifier().m_guid),
GY>                             true
GY>                             );
GY>+                    
GY>             }
GY>     
GY>             pdu->AppendAttr(RadiusAttr::AcctDelayTime, 0);
GY>diff -ruN openh323gk/RasTbl.cxx openh323gk-new/RasTbl.cxx
GY>--- openh323gk/RasTbl.cxx    2009-06-14 13:04:00.000000000 +0400
GY>+++ openh323gk-new/RasTbl.cxx        2009-06-19 12:19:39.000000000 +0400
GY>@@ -2347,6 +2347,134 @@
GY>     m_disabledcodecs = codecs.Trim();
GY> }
GY> 
GY>+void CallRec::SetSRC_media_control_IP(PString IP)
GY>+{
GY>+    m_src_media_control_IP = IP;
GY>+}
GY>+
GY>+
GY>+void CallRec::SetDST_media_control_IP(PString IP)
GY>+{
GY>+    m_dst_media_control_IP = IP;
GY>+}
GY>+
GY>+void CallRec::SetSRC_media_IP(PString IP)
GY>+{
GY>+    m_src_media_IP = IP;
GY>+}
GY>+
GY>+
GY>+void CallRec::SetDST_media_IP(PString IP)
GY>+{
GY>+    m_dst_media_IP = IP;
GY>+}
GY>+
GY>+
GY>+void CallRec::InitRTCP_report(){
GY>+    m_rtcp_source_packet_count = 0;
GY>+    m_rtcp_destination_packet_count = 0;
GY>+    m_rtcp_source_packet_lost = 0;
GY>+    m_rtcp_destination_packet_lost = 0;
GY>+    
GY>+    m_rtcp_source_jitter_max = 0;
GY>+    m_rtcp_source_jitter_min = 0;
GY>+    m_rtcp_source_jitter_avg = 0;
GY>+    m_rtcp_source_jitter_avg_count = 0;
GY>+    m_rtcp_source_jitter_avg_sum = 0;
GY>+    
GY>+    m_rtcp_destination_jitter_max = 0;
GY>+    m_rtcp_destination_jitter_min = 0;
GY>+    m_rtcp_destination_jitter_avg = 0;
GY>+    m_rtcp_destination_jitter_avg_count = 0;
GY>+    m_rtcp_destination_jitter_avg_sum = 0;
GY>+    
GY>+    m_src_media_IP = "0.0.0.0";
GY>+    m_dst_media_IP = "0.0.0.0";
GY>+    
GY>+    m_src_media_control_IP = "0.0.0.0";
GY>+    m_dst_media_control_IP = "0.0.0.0";
GY>+    
GY>+    m_rtcp_source_sdes_flag = false;
GY>+    m_rtcp_destination_sdes_flag = false;
GY>+}
GY>+
GY>+
GY>+void CallRec::SetRTCP_SRC_sdes(PString val)
GY>+{
GY>+    m_rtcp_source_sdes.AppendString(val);
GY>+    m_rtcp_source_sdes_flag = true;
GY>+}
GY>+
GY>+void CallRec::SetRTCP_DST_sdes(PString val)
GY>+{    
GY>+    m_rtcp_destination_sdes.AppendString(val);
GY>+    m_rtcp_destination_sdes_flag = true;    
GY>+}
GY>+
GY>+
GY>+void CallRec::SetRTCP_SRC_packet_count(long val)
GY>+{
GY>+    m_rtcp_source_packet_count = val;
GY>+}
GY>+
GY>+void CallRec::SetRTCP_DST_packet_count(long val)
GY>+{
GY>+    m_rtcp_destination_packet_count = val;
GY>+}
GY>+
GY>+void CallRec::SetRTCP_SRC_packet_lost(long val)
GY>+{
GY>+    m_rtcp_source_packet_lost = val;
GY>+}
GY>+
GY>+void CallRec::SetRTCP_DST_packet_lost(long val)
GY>+{
GY>+    m_rtcp_destination_packet_lost = val;
GY>+}
GY>+
GY>+void CallRec::SetRTCP_SRC_jitter(int val)
GY>+{   
GY>+    if (val > 0){
GY>+        if (m_rtcp_source_jitter_min == 0) {
GY>+        m_rtcp_source_jitter_min = val;
GY>+    }else if (m_rtcp_source_jitter_min > val) {
GY>+         m_rtcp_source_jitter_min = val;
GY>+    }
GY>+    if (m_rtcp_source_jitter_max == 0){
GY>+        m_rtcp_source_jitter_max = val;
GY>+    }else if (m_rtcp_source_jitter_max < val){
GY>+        m_rtcp_source_jitter_max =val;
GY>+    }
GY>+    m_rtcp_source_jitter_avg_count ++;
GY>+    m_rtcp_source_jitter_avg_sum +=val;
GY>+    m_rtcp_source_jitter_avg = 
(int)(m_rtcp_source_jitter_avg_sum/m_rtcp_source_jitter_avg_count);
GY>+    }else{
GY>+    m_rtcp_source_jitter_avg = 0;
GY>+    }
GY>+}
GY>+
GY>+void CallRec::SetRTCP_DST_jitter(int val)
GY>+{
GY>+    if (val > 0){
GY>+        if (m_rtcp_destination_jitter_min == 0){
GY>+        m_rtcp_destination_jitter_min = val;
GY>+    }else if (m_rtcp_destination_jitter_min > val){
GY>+        m_rtcp_destination_jitter_min =val;
GY>+    }
GY>+    if (m_rtcp_destination_jitter_max == 0){
GY>+        m_rtcp_destination_jitter_max = val;
GY>+    }else if (m_rtcp_destination_jitter_max < val){
GY>+        m_rtcp_destination_jitter_max =val;
GY>+    }
GY>+    m_rtcp_destination_jitter_avg_count ++;
GY>+    m_rtcp_destination_jitter_avg_sum +=val;
GY>+    m_rtcp_destination_jitter_avg = 
(int)(m_rtcp_destination_jitter_avg_sum/m_rtcp_destination_jitter_avg_count);
GY>+    }else{
GY>+    m_rtcp_destination_jitter_avg = 0;
GY>+    }
GY>+}
GY>+
GY>+
GY> void CallRec::InternalSetEP(endptr & ep, const endptr & nep)
GY> {
GY>     if (ep != nep) {
GY>@@ -3127,6 +3255,7 @@
GY>     }
GY>     CallList.push_back(NewRec);
GY>     ++m_activeCall;
GY>+    NewRec->InitRTCP_report();
GY>     PTRACE(2, "CallTable::Insert(CALL) Call No. " << 
NewRec->GetCallNumber() << ", total sessions : " << m_activeCall);
GY> }
GY> 
GY>diff -ruN openh323gk/RasTbl.h openh323gk-new/RasTbl.h
GY>--- openh323gk/RasTbl.h      2009-06-14 13:04:00.000000000 +0400
GY>+++ openh323gk-new/RasTbl.h  2009-06-19 12:33:45.000000000 +0400
GY>@@ -764,6 +764,63 @@
GY>             has not been yet received.
GY>             Meaningful only in GK routed mode.
GY>     */
GY>+
GY>+    PString GetSRC_media_control_IP() const;
GY>+        PString GetDST_media_control_IP() const;
GY>+    
GY>+        void SetSRC_media_control_IP(PString IP);
GY>+        void SetDST_media_control_IP(PString IP);
GY>+    
GY>+        PString GetSRC_media_IP() const; 
GY>+        PString GetDST_media_IP() const; 
GY>+                                             
GY>+        void SetSRC_media_IP(PString IP);
GY>+        void SetDST_media_IP(PString IP);
GY>+    
GY>+        void SetRTCP_SRC_sdes(PString val);
GY>+        void SetRTCP_DST_sdes(PString val);
GY>+    
GY>+        PStringList GetRTCP_SRC_sdes() const;
GY>+        PStringList GetRTCP_DST_sdes() const;
GY>+    
GY>+        bool GetRTCP_SRC_sdes_flag() const;
GY>+        bool GetRTCP_DST_sdes_flag() const;
GY>+    
GY>+        void InitRTCP_report();
GY>+    
GY>+        void SetRTCP_SRC_packet_count(long val);
GY>+        void SetRTCP_DST_packet_count(long val);
GY>+    
GY>+        void SetRTCP_SRC_packet_lost(long val);
GY>+        void SetRTCP_DST_packet_lost(long val);
GY>+    
GY>+        void SetRTCP_SRC_jitter(int val);
GY>+    
GY>+        void SetRTCP_DST_jitter(int val);
GY>+
GY>+        // Get RTCP source packet count
GY>+        long GetRTCP_SRC_packet_count() const;
GY>+        // Get RTCP destination packet count
GY>+        long GetRTCP_DST_packet_count() const;
GY>+    
GY>+        // Get RTCP source packet lost
GY>+        long GetRTCP_SRC_packet_lost() const;
GY>+        // Get RTCP destination packet lost
GY>+        long GetRTCP_DST_packet_lost() const;
GY>+    
GY>+        // Get RTCP source jitter max
GY>+        int GetRTCP_SRC_jitter_max() const;
GY>+        // Get RTCP source jitter min
GY>+        int GetRTCP_SRC_jitter_min() const;
GY>+        // Get RTCP source jitter avg
GY>+        int GetRTCP_SRC_jitter_avg() const;
GY>+    
GY>+        //Get RTCP destinaton jitter max
GY>+        int GetRTCP_DST_jitter_max() const;
GY>+        //Get RTCP destinaton jitter in
GY>+        int GetRTCP_DST_jitter_min() const;
GY>+        //Get RTCP destinaton jitter avg
GY>+        int GetRTCP_DST_jitter_avg() const;
GY>     time_t GetSetupTime() const;
GY> 
GY>     /** Set timestamp for a Setup message associated with this call. */
GY>@@ -1086,6 +1143,42 @@
GY>     
GY>     /// list of disabled codes
GY>     PString m_disabledcodecs;
GY>+    
GY>+    PString m_src_media_control_IP, m_dst_media_control_IP;
GY>+        PString m_src_media_IP, m_dst_media_IP;
GY>+    
GY>+        PStringList m_rtcp_source_sdes;
GY>+        bool m_rtcp_source_sdes_flag;
GY>+    
GY>+        PStringList m_rtcp_destination_sdes;  
GY>+        bool m_rtcp_destination_sdes_flag;
GY>+    
GY>+        // RTCP_source_packet_count
GY>+        long m_rtcp_source_packet_count;
GY>+        // RTCP_destination_packet_count    
GY>+        long m_rtcp_destination_packet_count;
GY>+    
GY>+        // RTCP_source_packet_lost
GY>+        long m_rtcp_source_packet_lost;
GY>+        // RTCP_destination_packet_lost
GY>+        long m_rtcp_destination_packet_lost;
GY>+    
GY>+        // RTCP_source_jitter
GY>+        int m_rtcp_source_jitter_min;
GY>+        int m_rtcp_source_jitter_max;
GY>+        int m_rtcp_source_jitter_avg;
GY>+    
GY>+        // RTCP_destination_jitter
GY>+        int m_rtcp_destination_jitter_min;
GY>+        int m_rtcp_destination_jitter_max;
GY>+        int m_rtcp_destination_jitter_avg;
GY>+
GY>+
GY>+        int m_rtcp_source_jitter_avg_count;
GY>+        long m_rtcp_source_jitter_avg_sum;
GY>+    
GY>+        int m_rtcp_destination_jitter_avg_count;
GY>+        long m_rtcp_destination_jitter_avg_sum;
GY> 
GY>     /// current timeout (or duration limit) for the call
GY>     time_t m_timeout;
GY>@@ -1566,6 +1659,96 @@
GY>             (m_Called && m_Called->GetCallSignalAddress() == *adr);
GY> }
GY> 
GY>+inline PString CallRec::GetSRC_media_control_IP() const
GY>+{
GY>+    return m_src_media_control_IP;
GY>+}
GY>+
GY>+inline PString CallRec::GetDST_media_control_IP() const
GY>+{
GY>+    return m_dst_media_control_IP;
GY>+}
GY>+
GY>+inline PString CallRec::GetSRC_media_IP() const
GY>+{
GY>+    return m_src_media_IP;
GY>+}
GY>+
GY>+inline PString CallRec::GetDST_media_IP() const
GY>+{
GY>+    return m_dst_media_IP;
GY>+}
GY>+
GY>+inline bool CallRec::GetRTCP_SRC_sdes_flag() const
GY>+{
GY>+    return m_rtcp_source_sdes_flag;
GY>+}
GY>+
GY>+inline bool CallRec::GetRTCP_DST_sdes_flag() const
GY>+{
GY>+    return m_rtcp_destination_sdes_flag;
GY>+}
GY>+
GY>+inline PStringList CallRec::GetRTCP_SRC_sdes() const
GY>+{
GY>+    return m_rtcp_source_sdes;
GY>+}
GY>+
GY>+inline PStringList CallRec::GetRTCP_DST_sdes() const
GY>+{
GY>+    return m_rtcp_destination_sdes;
GY>+}
GY>+
GY>+inline long CallRec::GetRTCP_SRC_packet_count() const
GY>+{
GY>+    return m_rtcp_source_packet_count;
GY>+}
GY>+
GY>+inline long CallRec::GetRTCP_DST_packet_count() const
GY>+{
GY>+    return m_rtcp_destination_packet_count;
GY>+}
GY>+
GY>+inline long CallRec::GetRTCP_SRC_packet_lost() const
GY>+{
GY>+    return m_rtcp_source_packet_lost;
GY>+}
GY>+
GY>+inline long CallRec::GetRTCP_DST_packet_lost() const
GY>+{
GY>+    return m_rtcp_destination_packet_lost;
GY>+}
GY>+
GY>+inline int CallRec::GetRTCP_SRC_jitter_max() const
GY>+{
GY>+    return m_rtcp_source_jitter_max;
GY>+}
GY>+
GY>+inline int CallRec::GetRTCP_SRC_jitter_min() const
GY>+{
GY>+    return m_rtcp_source_jitter_min;
GY>+}
GY>+
GY>+inline int CallRec::GetRTCP_SRC_jitter_avg() const
GY>+{
GY>+    return m_rtcp_source_jitter_avg;
GY>+}
GY>+
GY>+inline int CallRec::GetRTCP_DST_jitter_max() const
GY>+{
GY>+    return m_rtcp_destination_jitter_max;
GY>+}
GY>+
GY>+inline int CallRec::GetRTCP_DST_jitter_min() const
GY>+{
GY>+    return m_rtcp_destination_jitter_min;
GY>+}
GY>+
GY>+inline int CallRec::GetRTCP_DST_jitter_avg() const
GY>+{
GY>+    return m_rtcp_destination_jitter_avg;
GY>+}
GY>+
GY> inline time_t CallRec::GetSetupTime() const
GY> {
GY>     return m_setupTime;

C уважением                       With Best Regards
Георгиевский Юрий.                Georgiewskiy Yuriy
+7 4872 711666                    +7 4872 711666
факс +7 4872 711143               fax +7 4872 711143
Компания ООО "Ай Ти Сервис"       IT Service Ltd
http://nkoort.ru                  http://nkoort.ru
JID: ghh...@jabber.tula-ix.net.ru JID: ghh...@jabber.tula-ix.net.ru
YG129-RIPE                        YG129-RIPE
------------------------------------------------------------------------------
Are you an open source citizen? Join us for the Open Source Bridge conference!
Portland, OR, June 17-19. Two days of sessions, one day of unconference: $250.
Need another reason to go? 24-hour hacker lounge. Register today!
http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org
_______________________________________________________

Posting: mailto:Openh323gk-users@lists.sourceforge.net
Archive: 
http://sourceforge.net/mailarchive/forum.php?forum_name=openh323gk-users
Unsubscribe: http://lists.sourceforge.net/lists/listinfo/openh323gk-users
Homepage: http://www.gnugk.org/

Reply via email to