Re: UDP de-fragmentation problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



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);
}

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



[Index of Archives]     [CentOS]     [CentOS Announce]     [CentOS Development]     [CentOS ARM Devel]     [CentOS Docs]     [CentOS Virtualization]     [Carrier Grade Linux]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Linux USB]
  Powered by Linux