From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1Vce9u-0005B1-Ky for mharc-grub-devel@gnu.org; Sat, 02 Nov 2013 12:34:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58799) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vce9k-00059e-5k for grub-devel@gnu.org; Sat, 02 Nov 2013 12:34:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Vce9Y-0008Cf-MD for grub-devel@gnu.org; Sat, 02 Nov 2013 12:34:36 -0400 Received: from mail-ea0-x229.google.com ([2a00:1450:4013:c01::229]:46232) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vce9Y-0008C3-9z for grub-devel@gnu.org; Sat, 02 Nov 2013 12:34:24 -0400 Received: by mail-ea0-f169.google.com with SMTP id k11so2632081eaj.0 for ; Sat, 02 Nov 2013 09:34:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type; bh=s6JP6qL1E3cR9vskpyYCcGcTeSxFhM2xQ1qOYKgnNdw=; b=ZKXMbqHDQiSwlG09hhkyq/5oTCtFe0RFhEj7gR/+iyzLQy57la7QRb1OSCaSui2GBg TgwHGMpJJVH0NOtZpCbH1TbzlO0VFsLPYdjZITjF9Bkz0I8adui1/hy66cc4k5vYiNbZ FC9PFg3Gx8Qs7wGqEEzhUPPV7po9J5uWNyrfvuVKax6u6QhzoxIuQlUYaRE3r4QGmrf1 eLtLtQkTXVBDiE37LX6mPaj7wqOZWE8+JDt4pwYwY78q3S5H4STs1nXBDALo+doOIUOk hXVc0t2h9fQyf0jS+3+Ztvr+Fupv6IDslqNBtGoy9lYaqBo5tgJG3ruZBu8dwkOcIySq Ns/g== X-Received: by 10.15.53.68 with SMTP id q44mr388797eew.70.1383410063418; Sat, 02 Nov 2013 09:34:23 -0700 (PDT) Received: from [192.168.1.16] (31-249.1-85.cust.bluewin.ch. [85.1.249.31]) by mx.google.com with ESMTPSA id h45sm22427864eeg.5.2013.11.02.09.34.21 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 02 Nov 2013 09:34:22 -0700 (PDT) Message-ID: <5275298D.1050604@gmail.com> Date: Sat, 02 Nov 2013 17:34:21 +0100 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131005 Icedove/17.0.9 MIME-Version: 1.0 To: The development of GNU GRUB Subject: Re: [PATCH] Issue separate DNS queries for ipv4 and ipv6 References: <507E01FB.4050303@linux.vnet.ibm.com> In-Reply-To: <507E01FB.4050303@linux.vnet.ibm.com> X-Enigmail-Version: 1.5.1 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="----enig2XDUXXJWXDKAMRSUHWNUO" X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4013:c01::229 Cc: Gustavo Luiz Duarte X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Nov 2013 16:34:45 -0000 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) ------enig2XDUXXJWXDKAMRSUHWNUO Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 17.10.2012 02:55, Gustavo Luiz Duarte wrote: >=20 > Adding multiple questions on a single DNS query is not supportted by > most DNS servers. This patch issues two separate DNS queries > sequentially for ipv4 and then for ipv6. >=20 > There are 4 possible config options: > DNS_OPTION_IPV4: issue only one ipv4 query > DNS_OPTION_IPV6: issue only one ipv6 query > DNS_OPTION_PREFER_IPV4: issue the ipv4 query first and fallback to ipv= 6 > DNS_OPTION_PREFER_IPV6: issue the ipv6 query first and fallback to ipv= 4 > However, there is no code yet to set such config option. The default is= > DNS_OPTION_PREFER_IPV4. >=20 > Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=3D860829 > --- > grub-core/net/dns.c | 99 ++++++++++++++++++++++++++++++++++++---------= -------- > include/grub/net.h | 9 +++++ > 2 files changed, 76 insertions(+), 32 deletions(-) >=20 > diff --git a/grub-core/net/dns.c b/grub-core/net/dns.c > index 3381ea7..725725c 100644 > --- a/grub-core/net/dns.c > +++ b/grub-core/net/dns.c > @@ -34,6 +34,14 @@ struct dns_cache_element > #define DNS_CACHE_SIZE 1021 > #define DNS_HASH_BASE 423 > =20 > +typedef enum grub_dns_qtype_id > + { > + GRUB_DNS_QTYPE_A =3D 1, > + GRUB_DNS_QTYPE_AAAA =3D 28 > + } grub_dns_qtype_id_t; > + > +static grub_dns_option_t dns_type_option =3D DNS_OPTION_PREFER_IPV4; > + > static struct dns_cache_element dns_cache[DNS_CACHE_SIZE]; > static struct grub_net_network_level_address *dns_servers; > static grub_size_t dns_nservers, dns_servers_alloc; > @@ -410,13 +418,13 @@ recv_hook (grub_net_udp_socket_t sock __attribute= __ ((unused)), > return GRUB_ERR_NONE; > } > =20 > -grub_err_t > -grub_net_dns_lookup (const char *name, > +static grub_err_t > +grub_net_dns_lookup_qtype (const char *name, > const struct grub_net_network_level_address *servers, > grub_size_t n_servers, > grub_size_t *naddresses, > struct grub_net_network_level_address **addresses, > - int cache) > + int cache, grub_dns_qtype_id_t qtype) > { > grub_size_t send_servers =3D 0; > grub_size_t i, j; > @@ -471,8 +479,7 @@ grub_net_dns_lookup (const char *name, > + GRUB_NET_MAX_LINK_HEADER_SIZE > + GRUB_NET_UDP_HEADER_SIZE > + sizeof (struct dns_header) > - + grub_strlen (name) + 2 + 4 > - + 2 + 4); > + + grub_strlen (name) + 2 + 4); > if (!nb) > { > grub_free (data.name); > @@ -482,7 +489,7 @@ grub_net_dns_lookup (const char *name, > + GRUB_NET_MAX_LINK_HEADER_SIZE > + GRUB_NET_UDP_HEADER_SIZE); > grub_netbuff_put (nb, sizeof (struct dns_header) > - + grub_strlen (name) + 2 + 4 + 2 + 4); > + + grub_strlen (name) + 2 + 4); > head =3D (struct dns_header *) nb->data; > optr =3D (grub_uint8_t *) (head + 1); > for (iptr =3D name; *iptr; ) > @@ -509,18 +516,7 @@ grub_net_dns_lookup (const char *name, > =20 > /* Type: A. */ > *optr++ =3D 0; > - *optr++ =3D 1; > - > - /* Class. */ > - *optr++ =3D 0; > - *optr++ =3D 1; > - > - /* Compressed name. */ > - *optr++ =3D 0xc0; > - *optr++ =3D 0x0c; > - /* Type: AAAA. */ > - *optr++ =3D 0; > - *optr++ =3D 28; > + *optr++ =3D qtype; > =20 > /* Class. */ > *optr++ =3D 0; > @@ -529,7 +525,7 @@ grub_net_dns_lookup (const char *name, > head->id =3D data.id; > head->flags =3D FLAGS_RD; > head->ra_z_r_code =3D 0; > - head->qdcount =3D grub_cpu_to_be16_compile_time (2); > + head->qdcount =3D grub_cpu_to_be16_compile_time (1); > head->ancount =3D grub_cpu_to_be16_compile_time (0); > head->nscount =3D grub_cpu_to_be16_compile_time (0); > head->arcount =3D grub_cpu_to_be16_compile_time (0); > @@ -587,16 +583,47 @@ grub_net_dns_lookup (const char *name, > if (*data.naddresses) > return GRUB_ERR_NONE; > if (data.dns_err) > - return grub_error (GRUB_ERR_NET_NO_DOMAIN, > - N_("no DNS record found")); > - =20 > + { > + grub_dprintf ("dns", "%s. QTYPE: %u QNAME: %s\n", > + N_("no DNS record found"), qtype, name); > + return GRUB_ERR_NET_NO_DOMAIN; > + } > if (err) > { > grub_errno =3D err; > return err; > } > - return grub_error (GRUB_ERR_TIMEOUT, > - N_("no DNS reply received")); > + grub_dprintf ("dns", "%s. QTYPE: %u QNAME: %s\n", > + N_("no DNS reply received"), qtype, name); > + return GRUB_ERR_TIMEOUT; > +} > + > +grub_err_t > +grub_net_dns_lookup (const char *name, > + const struct grub_net_network_level_address *servers, > + grub_size_t n_servers, > + grub_size_t *naddresses, > + struct grub_net_network_level_address **addresses, > + int cache) > +{ > + if (dns_type_option =3D=3D DNS_OPTION_IPV6 || dns_type_option =3D=3D= DNS_OPTION_PREFER_IPV6) > + grub_net_dns_lookup_qtype (name, servers, n_servers, naddresses,= > + addresses, cache, GRUB_DNS_QTYPE_AAAA= ); > + else > + grub_net_dns_lookup_qtype (name, servers, n_servers, naddresses,= > + addresses, cache, GRUB_DNS_QTYPE_A); Here you don't handle error conditions in called functions. > + if (!*naddresses) > + { > + if (dns_type_option =3D=3D DNS_OPTION_PREFER_IPV4) > + grub_net_dns_lookup_qtype (name, servers, n_servers, naddres= ses, > + addresses, cache, GRUB_DNS_QTYPE_= AAAA); > + else if (dns_type_option =3D=3D DNS_OPTION_PREFER_IPV6) > + grub_net_dns_lookup_qtype (name, servers, n_servers, naddres= ses, > + addresses, cache, GRUB_DNS_QTYPE_= A); > + } > + if (!*naddresses) > + return GRUB_ERR_NET_NO_DOMAIN; In this and many other places in this patch you return error value without using grub_error. > + return GRUB_ERR_NONE; > } > =20 > static grub_err_t > @@ -604,22 +631,28 @@ grub_cmd_nslookup (struct grub_command *cmd __att= ribute__ ((unused)), > int argc, char **args) > { > grub_err_t err; > - grub_size_t naddresses, i; > + struct grub_net_network_level_address cmd_server; > + struct grub_net_network_level_address *servers; > + grub_size_t nservers, i, naddresses =3D 0; > struct grub_net_network_level_address *addresses =3D 0; > if (argc !=3D 2 && argc !=3D 1) > return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expect= ed")); > if (argc =3D=3D 2) > { > - struct grub_net_network_level_address server; > - err =3D grub_net_resolve_address (args[1], &server); > + err =3D grub_net_resolve_address (args[1], &cmd_server); > if (err) > return err; > - err =3D grub_net_dns_lookup (args[0], &server, 1, &naddresses, > - &addresses, 0); > + servers =3D &cmd_server; > + nservers =3D 1; > } > else > - err =3D grub_net_dns_lookup (args[0], dns_servers, dns_nservers, &= naddresses, > - &addresses, 0); > + { > + servers =3D dns_servers; > + nservers =3D dns_nservers; > + } > + > + grub_net_dns_lookup (args[0], servers, nservers, &naddresses, > + &addresses, 0); > =20 > for (i =3D 0; i < naddresses; i++) > { > @@ -628,7 +661,9 @@ grub_cmd_nslookup (struct grub_command *cmd __attri= bute__ ((unused)), > grub_printf ("%s\n", buf); > } > grub_free (addresses); > - return GRUB_ERR_NONE; > + if (naddresses) > + return GRUB_ERR_NONE; > + return grub_error (GRUB_ERR_NET_NO_DOMAIN, N_("no DNS record found")= ); > } > =20 > static grub_err_t > diff --git a/include/grub/net.h b/include/grub/net.h > index 3877451..a7e5b2c 100644 > --- a/include/grub/net.h > +++ b/include/grub/net.h > @@ -505,6 +505,15 @@ grub_err_t > grub_net_link_layer_resolve (struct grub_net_network_level_interface *= inf, > const grub_net_network_level_address_t *proto_addr, > grub_net_link_level_address_t *hw_addr); > + > +typedef enum > + { > + DNS_OPTION_IPV4, > + DNS_OPTION_IPV6, > + DNS_OPTION_PREFER_IPV4, > + DNS_OPTION_PREFER_IPV6 > + } grub_dns_option_t; > + > grub_err_t > grub_net_dns_lookup (const char *name, > const struct grub_net_network_level_address *servers, >=20 ------enig2XDUXXJWXDKAMRSUHWNUO Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.15 (GNU/Linux) Comment: Using GnuPG with Icedove - http://www.enigmail.net/ iF4EAREKAAYFAlJ1KY0ACgkQNak7dOguQgl1egD5AY/LmNCIq5DSQx8waIU4NMip nxMRd47vOV/OgL70f5kA/j/+b7Zry+Nn7xpMGqnDGGmCXhz35f2c/m6+bOdh3cH6 =h0mM -----END PGP SIGNATURE----- ------enig2XDUXXJWXDKAMRSUHWNUO--