s3: Tune broadcast namequeries for unique names
authorVolker Lendecke <vl@samba.org>
Mon, 2 May 2011 21:35:06 +0000 (23:35 +0200)
committerJeremy Allison <jra@samba.org>
Mon, 2 May 2011 23:43:36 +0000 (16:43 -0700)
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 <vlendec@samba.org>
Autobuild-Date: Tue May  3 00:57:24 CEST 2011 on sn-devel-104
(cherry picked from commit 8da8c36b53cc115f0d446b666fc24fc9423d808e)

source3/libsmb/namequery.c

index bd7b5563be9086e14cf505468d8084e048d1e40b..6d8f15846e3feba536ed37504becdb65e8afeb7f 100644 (file)
@@ -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; i<nmb->answers->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