Em 11-04-2016 09:10, Marcelo Ricardo Leitner escreveu:
Em 10-04-2016 14:25, Volker escreveu:
On 09.04.2016 21:40, Marcelo Ricardo Leitner wrote:
Hi,
Em 07-04-2016 12:19, Volker escreveu:
Hi all.
I have a strange problem at hand regarding UDP fragmentation on
Centos7:
Applications are unable to receive UDP packets which have undergone
fragmentation UNLESS the netfilter modules are loaded.
The problem arose on a application which would run fine on OpenSuse but
does not work on Centos7. The application processes UDP data and on
Centos only small packets are received and processed, packets below the
fragmentation size limit of about 1500 bytes. UDP packets which have
undergone fragmentation are not received by the application.
The application in question uses Qt, which opens the UDP socket in
non-blocking mode - apparently that's an issue because reading from the
socket in blocking mode does not cause the problem.
By chance I hit on the fact that once the netfilter kernel-modules
(nf_nat, iptable_nat, nf_nat ...) are loaded the problem disappears and
UDP packets of all sizes are correctly delivered and processed.
NOTES:
- I'm not using netfilter. My iptables are empty, firewalld is not
running.
- Other networking applications -at least tcp- are working fine:
webbrowsing, ssh, nfs etc even DNS
- Does not happen on Opensuse regardless if netfilter modules are
loaded
or not.
- Does not happen on Opensuse on the same machine. Does happen on
different machines on Centos7. So it's not HW dependend
- There is AFAIK nothing special about my Centos7 installation. Out of
the box install, simple network config, latest updates applied.
Which kernel are you using?
And as you have trimmed it down to a reproducer, can you share it
please?
3.10.0-327.10.1.el7.x86_64
I have put the files on github
https://github.com/volkerp/qtudptest
Okay, you can't do that change I mentioned easily because the call is
made by Qt instead.
When testing with this app, on nstat I'm getting after 2 attempts:
UdpInErrors 2 0.0
UdpInCsumErrors 2 0.0
I tried removing the probe for more data, the while condition, but it
still peeked the socket. I think it's because of this Qt code:
qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxSize,
QHostAddress *address,
quint16 *port)
{
Q_D(QNativeSocketEngine);
Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::readDatagram(), -1);
Q_CHECK_TYPE(QNativeSocketEngine::readDatagram(),
QAbstractSocket::UdpSocket, false); <----
return d->nativeReceiveDatagram(data, maxSize, address, port);
}
http://code.qt.io/cgit/qt/qt.git/tree/src/network/socket/qnativesocketengine.cpp
FWIW
So I'm afraid there is no way around this issue with Qt.
Marcelo
_______________________________________________
CentOS mailing list
CentOS@xxxxxxxxxx
https://lists.centos.org/mailman/listinfo/centos