Hi Yuriy, your diff shows my changes to tighten the checks on the RTCP reports GnuGk receives (between Feb 13th and 15th UTC). In your traces of failing T.38 calls, to do you see any error messages about rejected RTCP packets ? Thanks for testing! Regards, Jan Georgiewskiy Yuriy wrote: > On 2011-03-16 23:01 +0300, Georgiewskiy Yuriy wrote GNU Gatekeeper Users: > > Seems i miss here, there is two commits to ProxyChannel.cxx at this date, i check it > separately a bit later. > > GY>On 2011-03-04 16:03 +0100, Jan Willamowius wrote openh323gk-users@xxxxxxxxxxxx: > GY> > GY>JW>Georgiewskiy Yuriy wrote: > GY>JW>> JW>can you pinpoint when T38 fax stopped working for you ? between the > GY>JW>> JW>2.3.4 release and the current CVS ? Or between 2.3.3 and 2.3.4 ? > GY>JW>> > GY>JW>> Hi, no, T38 works on latest stable, and don't works on current cvs only. > GY>JW> > GY>JW>There haven't been too many changes since the last release. Can you > GY>JW>check which one broke T38 ? > GY> > GY>Hi, it seems it is a commit from 2011-02-15 on ProxyChannel.cxx, i make a diff, after > GY>this changes faxes other t38 don't work. > GY> > GY>--- /home/src/gnugk/openh323gk/ProxyChannel.cxx 2011-03-16 22:35:18.000000000 +0300 > GY>+++ /tmp/openh323gk/ProxyChannel.cxx 2011-03-16 22:43:24.000000000 +0300 > GY>@@ -304,10 +304,10 @@ > GY> bool isMute() { return mute; } > GY> void SetMute(bool toMute) { mute = toMute; } > GY> void OnHandlerSwapped() { std::swap(fnat, rnat); } > GY>+ void SetRTPSessionID(WORD id) { m_sessionID = id; } > GY> #ifdef HAS_H46018 > GY> void SetUsesH46019fc(bool fc) { m_h46019fc = fc; } > GY> void SetH46019Direction(int dir) { m_h46019dir = dir; } > GY>- void SetH46024SessionID(WORD id) { m_sessionID = id; } > GY> void SetH46019UniDirectional(bool val) { m_h46019uni = val; } > GY> // disabled for now, until we handle 2 payload types per UDPProxy > GY> // void SetKeepAlivePayloadType(int pt) { m_keepAlivePayloadType = pt; } > GY>@@ -337,6 +337,7 @@ > GY> bool mute; > GY> bool m_dontQueueRTP; > GY> bool m_EnableRTCPStats; > GY>+ WORD m_sessionID; > GY> #ifdef HAS_H46018 > GY> // also used as indicator whether H.460.19 should be used > GY> // int m_keepAlivePayloadType; > GY>@@ -350,7 +351,6 @@ > GY> int m_h46019olc; > GY> int m_h46019dir; > GY> bool m_h46019uni; > GY>- WORD m_sessionID; > GY> H323TransportAddress m_h46019fwd; > GY> H323TransportAddress m_h46019rev; > GY> bool m_OLCrev; > GY>@@ -427,7 +427,7 @@ > GY> void SetUsesH46019fc(bool); > GY> void SetH46019Direction(int dir); > GY> void SetH46019UniDirectional(bool uni); > GY>- void SetH46024SessionID(WORD id); > GY>+ void SetRTPSessionID(WORD id); > GY> > GY> private: > GY> void SetNAT(bool); > GY>@@ -5360,12 +5360,12 @@ > GY> #endif > GY> > GY> // class UDPProxySocket > GY>-UDPProxySocket::UDPProxySocket(const char *t) > GY>+UDPProxySocket::UDPProxySocket(const char *t) > GY> : ProxySocket(this, t), > GY> fSrcIP(0), fDestIP(0), rSrcIP(0), rDestIP(0), > GY>- fSrcPort(0), fDestPort(0), rSrcPort(0), rDestPort(0) > GY>+ fSrcPort(0), fDestPort(0), rSrcPort(0), rDestPort(0), m_sessionID(0) > GY> #ifdef HAS_H46018 > GY>- , m_h46019fc(false), m_h46019olc(H46019_NONE), m_h46019dir(H46019_NONE), m_h46019uni(false), m_sessionID(0), m_OLCrev(false) > GY>+ , m_h46019fc(false), m_h46019olc(H46019_NONE), m_h46019dir(H46019_NONE), m_h46019uni(false), m_OLCrev(false) > GY> //, m_keepAlivePayloadType(H46019_UNDEFINED_PAYLOAD_TYPE), m_keepAliveTypeSet(false) > GY> #endif > GY> { > GY>@@ -5503,6 +5503,14 @@ > GY> WORD fromPort; > GY> GetLastReceiveAddress(fromIP, fromPort); > GY> buflen = (WORD)GetLastReadCount(); > GY>+ // verify packet > GY>+ unsigned int version = 0; > GY>+ if (buflen >= 1) > GY>+ version = (((int)wbuffer[0] & 0xc0) >> 6); > GY>+ if (version != 2) { > GY>+ PTRACE(1, "RTP\tInvalid RTP/RTCP packet: version=" << version); > GY>+ return NoData; > GY>+ } > GY> #ifdef HAS_H46018 > GY> int payloadType = H46019_UNDEFINED_PAYLOAD_TYPE; > GY> if (buflen >= 2) > GY>@@ -5707,23 +5715,27 @@ > GY> bool direct = ((*m_call)->GetSRC_media_control_IP() == fromIP.AsString()); > GY> PIPSocket::Address addr = (DWORD)0; > GY> (*m_call)->GetMediaOriginatingIp(addr); > GY>+ if (buflen < 4) { > GY>+ PTRACE(1, "RTCP\tInvalid RTCP frame"); > GY>+ return NoData; > GY>+ } > 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(1, "RTCP\tSession invalid frame"); > GY>- // TODO: return NoData; ? > GY>- break; > GY>+ if ((payload == NULL) || (size == 0) > GY>+ || (frame.GetVersion() != 2) > GY>+ || ((payload + size) > (frame.GetPointer() + frame.GetSize()))) { > GY>+ // TODO: test for a maximum size ? what is the max size ? > GY>+ PTRACE(1, "RTCP\tInvalid RTCP frame"); > GY>+ return NoData; > 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>+ if (size >= (sizeof(PUInt32b)+sizeof(RTP_ControlFrame::SenderReport) + frame.GetCount() * sizeof(RTP_ControlFrame::ReceiverReport))) { > GY> const RTP_ControlFrame::SenderReport & sr = *(const RTP_ControlFrame::SenderReport *)(payload); > GY> if (direct) { > GY> if (m_sessionID == RTP_Session::DefaultAudioSessionID) { > GY>@@ -5751,7 +5763,7 @@ > GY> break; > GY> case RTP_ControlFrame::e_ReceiverReport: > GY> PTRACE(5, "RTCP\tSession ReceiverReport packet"); > GY>- if (size >= 4) { > GY>+ if (size >= (sizeof(PUInt32b)+frame.GetCount()*sizeof(RTP_ControlFrame::ReceiverReport))) { > GY> BuildReceiverReport(frame, sizeof(PUInt32b), direct); > GY> } else { > GY> PTRACE(5, "RTP\tSession ReceiverReport packet truncated"); > GY>@@ -5760,7 +5772,7 @@ > 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>+ if (size >= (frame.GetCount()*sizeof(RTP_ControlFrame::SourceDescription))) { > GY> const RTP_ControlFrame::SourceDescription * sdes = (const RTP_ControlFrame::SourceDescription *)payload; > GY> for (PINDEX srcIdx = 0; srcIdx < (PINDEX)frame.GetCount(); srcIdx++) { > GY> const RTP_ControlFrame::SourceDescription::Item * item = sdes->item; > GY>@@ -6129,16 +6141,15 @@ > GY> rtcp->SetH46019UniDirectional(true); > GY> } > GY> } > GY>+#endif > GY> > GY>- > GY>-void RTPLogicalChannel::SetH46024SessionID(WORD id) > GY>+void RTPLogicalChannel::SetRTPSessionID(WORD id) > GY> { > GY> if (rtp) > GY>- rtp->SetH46024SessionID(id); > GY>+ rtp->SetRTPSessionID(id); > GY> if (rtcp) > GY>- rtcp->SetH46024SessionID(id); > GY>+ rtcp->SetRTPSessionID(id); > GY> } > GY>-#endif > GY> > GY> void RTPLogicalChannel::SetMediaControlChannelSource(const H245_UnicastAddress_iPAddress & addr) > GY> { > GY>@@ -6442,8 +6453,8 @@ > GY> > GY> #ifdef HAS_H46018 > GY> lc->SetH46019Direction(m_H46019dir); > GY>- lc->SetH46024SessionID((WORD)h225Params->m_sessionID); > GY> #endif > GY>+ lc->SetRTPSessionID((WORD)h225Params->m_sessionID); > GY> > GY> H245_UnicastAddress_iPAddress *addr; > GY> bool changed = false; > GY>@@ -6598,7 +6609,7 @@ > GY> ((RTPLogicalChannel*)lc)->SetUsesH46019fc(UsesH46019fc()); > GY> ((RTPLogicalChannel*)lc)->SetH46019Direction(GetH46019Direction()); > GY> ((RTPLogicalChannel*)lc)->SetH46019UniDirectional(m_h46019uni); > GY>- ((RTPLogicalChannel*)lc)->SetH46024SessionID((WORD)h225Params->m_sessionID); > GY>+ ((RTPLogicalChannel*)lc)->SetRTPSessionID((WORD)h225Params->m_sessionID); > GY> } else { > GY> PTRACE(1, "Can't find RTP port for logical channel " << flcn); > GY> } -- Jan Willamowius, jan@xxxxxxxxxxxxxx, http://www.gnugk.org/ ------------------------------------------------------------------------------ Colocation vs. Managed Hosting A question and answer guide to determining the best fit for your organization - today and in the future. http://p.sf.net/sfu/internap-sfd2d _______________________________________________________ Posting: mailto:Openh323gk-users@xxxxxxxxxxxxxxxxxxxxx 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/