From 9bffdda7f9b8a7e3e36c07f31fae227e2d8a7570 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 2 May 2011 23:35:06 +0200 Subject: [PATCH] s3: Tune broadcast namequeries for unique names If we get a unique name via a broadcast query, there's no point in waiting the full timeout. A unique name is just what its name says: unique. No point in waiting longer. Autobuild-User: Volker Lendecke Autobuild-Date: Tue May 3 00:57:24 CEST 2011 on sn-devel-104 (cherry picked from commit 8da8c36b53cc115f0d446b666fc24fc9423d808e) --- source3/libsmb/namequery.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index bd7b5563be9..6d8f15846e3 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -1253,6 +1253,7 @@ static bool name_query_validator(struct packet_struct *p, void *private_data) private_data, struct name_query_state); struct nmb_packet *nmb = &p->packet.nmb; struct sockaddr_storage *tmp_addrs; + bool got_unique_netbios_name = false; int i; debug_nmb_packet(p); @@ -1327,7 +1328,12 @@ static bool name_query_validator(struct packet_struct *p, void *private_data) "from %s ( ", inet_ntoa(p->ip))); for (i=0; ianswers->rdlength/6; i++) { + uint16_t flags; struct in_addr ip; + + flags = RSVAL(&nmb->answers->rdata[i*6], 0); + got_unique_netbios_name |= ((flags & 0x8000) == 0); + putip((char *)&ip,&nmb->answers->rdata[2+i*6]); in_addr_to_sockaddr_storage( &state->addrs[state->num_addrs], ip); @@ -1352,10 +1358,10 @@ static bool name_query_validator(struct packet_struct *p, void *private_data) if (state->bcast) { /* - * We have to collect all entries coming in from - * broadcast queries + * We have to collect all entries coming in from broadcast + * queries. If we got a unique name, we're done. */ - return false; + return got_unique_netbios_name; } /* * WINS responses are accepted when they are received -- 2.34.1