summaryrefslogtreecommitdiff
path: root/source3/libsmb/namequery.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2011-05-02 23:35:06 +0200
committerVolker Lendecke <vlendec@samba.org>2011-05-03 00:57:24 +0200
commit8da8c36b53cc115f0d446b666fc24fc9423d808e (patch)
tree5712872d8b767bb835b33e29ce3e7a94f7ca801a /source3/libsmb/namequery.c
parent56cd3b3bbbb595cb0c98fa2dfa397c915fbf37d2 (diff)
downloadsamba-8da8c36b53cc115f0d446b666fc24fc9423d808e.tar.gz
samba-8da8c36b53cc115f0d446b666fc24fc9423d808e.tar.bz2
samba-8da8c36b53cc115f0d446b666fc24fc9423d808e.zip
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 <vlendec@samba.org> Autobuild-Date: Tue May 3 00:57:24 CEST 2011 on sn-devel-104
Diffstat (limited to 'source3/libsmb/namequery.c')
-rw-r--r--source3/libsmb/namequery.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index 49b2061c09..4ce56e684e 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; 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