From 9b356afcd024ceb6bfe1196a9654952f9027b6a8 Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Mon, 27 Mar 2006 07:31:01 +0000 Subject: [PATCH] make socket buffer raising report better errors blast packets back to back to pdns_recursor if available git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@635 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- pdns/pdns_recursor.cc | 83 ++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index d1864ff65..44653c456 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -184,9 +184,14 @@ int arecvfrom(char *data, int len, int flags, struct sockaddr *toaddr, Utility:: void setReceiveBuffer(int fd, uint32_t size) { - uint32_t psize; + uint32_t psize=0; socklen_t len=sizeof(psize); - getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&psize, &len); + + if(!getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&psize, &len) && psize > size) { + L<sendEvent(pident, &packet); + while((d_len=recvfrom(d_clientsock, data, sizeof(data), 0, (sockaddr *)&fromaddr, &addrlen)) >= 0) { + try { + DNSComboWriter dc(data, d_len, now); + dc.setRemote((struct sockaddr *)&fromaddr, addrlen); + + if(dc.d_mdp.d_header.qr) { + pident.remote=fromaddr; + pident.id=dc.d_mdp.d_header.id; + string packet; + packet.assign(data, d_len); + MT->sendEvent(pident, &packet); + } + else + L<::const_iterator i=d_udpserversocks.begin(); i!=d_udpserversocks.end(); ++i) { if(FD_ISSET(*i,&readfds)) { // do we have a new question on udp? - d_len=recvfrom(*i, data, sizeof(data), 0, (sockaddr *)&fromaddr, &addrlen); - if(d_len<0) - continue; - - g_stats.queryrate.pulse(now); + while((d_len=recvfrom(*i, data, sizeof(data), 0, (sockaddr *)&fromaddr, &addrlen)) >= 0) { + g_stats.queryrate.pulse(now); - try { - DNSComboWriter* dc = new DNSComboWriter(data, d_len, now); + try { + DNSComboWriter* dc = new DNSComboWriter(data, d_len, now); - dc->setRemote((struct sockaddr *)&fromaddr, addrlen); + dc->setRemote((struct sockaddr *)&fromaddr, addrlen); - if(dc->d_mdp.d_header.qr) - L<setSocket(*i); - dc->d_tcp=false; - MT->makeThread(startDoResolve, (void*) dc, "udp"); + if(dc->d_mdp.d_header.qr) + L<setSocket(*i); + dc->d_tcp=false; + MT->makeThread(startDoResolve, (void*) dc, "udp"); + } + } + catch(MOADNSException& mde) { + L<