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
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/qtudptestOkay, 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
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 >