mirror of https://github.com/ipxe/ipxe.git
Have DHCP set the nameserver, rather than DNS read the DHCP nameserver
value.pull/1/head
parent
c014f607a8
commit
075f8144ff
|
@ -109,6 +109,8 @@ struct dns_request {
|
||||||
struct retry_timer timer;
|
struct retry_timer timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct in_addr nameserver;
|
||||||
|
|
||||||
extern int dns_resolv ( const char *name, struct sockaddr *sa,
|
extern int dns_resolv ( const char *name, struct sockaddr *sa,
|
||||||
struct async *parent );
|
struct async *parent );
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
#include <gpxe/async.h>
|
#include <gpxe/async.h>
|
||||||
#include <gpxe/udp.h>
|
#include <gpxe/udp.h>
|
||||||
#include <gpxe/dhcp.h>
|
|
||||||
#include <gpxe/dns.h>
|
#include <gpxe/dns.h>
|
||||||
|
|
||||||
/** @file
|
/** @file
|
||||||
|
@ -35,6 +34,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* The DNS server */
|
||||||
|
struct in_addr nameserver = { INADDR_NONE };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare DNS reply name against the query name from the original request
|
* Compare DNS reply name against the query name from the original request
|
||||||
*
|
*
|
||||||
|
@ -402,16 +404,18 @@ static struct async_operations dns_async_operations = {
|
||||||
/**
|
/**
|
||||||
* Resolve name using DNS
|
* Resolve name using DNS
|
||||||
*
|
*
|
||||||
|
* @v name Host name to resolve
|
||||||
|
* @v sa Socket address to fill in
|
||||||
|
* @v parent Parent asynchronous operation
|
||||||
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
int dns_resolv ( const char *name, struct sockaddr *sa,
|
int dns_resolv ( const char *name, struct sockaddr *sa,
|
||||||
struct async *parent ) {
|
struct async *parent ) {
|
||||||
struct dns_request *dns;
|
struct dns_request *dns;
|
||||||
struct dhcp_option *option;
|
|
||||||
union {
|
union {
|
||||||
struct sockaddr_tcpip st;
|
struct sockaddr_tcpip st;
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
} nameserver;
|
} server;
|
||||||
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Allocate DNS structure */
|
/* Allocate DNS structure */
|
||||||
|
@ -435,20 +439,20 @@ int dns_resolv ( const char *name, struct sockaddr *sa,
|
||||||
dns->qinfo->qclass = htons ( DNS_CLASS_IN );
|
dns->qinfo->qclass = htons ( DNS_CLASS_IN );
|
||||||
|
|
||||||
/* Identify nameserver */
|
/* Identify nameserver */
|
||||||
memset ( &nameserver, 0, sizeof ( nameserver ) );
|
memset ( &server, 0, sizeof ( server ) );
|
||||||
nameserver.sin.sin_family = AF_INET;
|
server.sin.sin_family = AF_INET;
|
||||||
nameserver.sin.sin_port = htons ( DNS_PORT );
|
server.sin.sin_port = htons ( DNS_PORT );
|
||||||
if ( ! ( option = find_global_dhcp_option ( DHCP_DNS_SERVERS ) ) ) {
|
server.sin.sin_addr = nameserver;
|
||||||
|
if ( server.sin.sin_addr.s_addr == INADDR_NONE ) {
|
||||||
DBGC ( dns, "DNS %p no name servers\n", dns );
|
DBGC ( dns, "DNS %p no name servers\n", dns );
|
||||||
rc = -ENXIO;
|
rc = -ENXIO;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
dhcp_ipv4_option ( option, &nameserver.sin.sin_addr );
|
|
||||||
|
|
||||||
/* Open UDP connection */
|
/* Open UDP connection */
|
||||||
DBGC ( dns, "DNS %p using nameserver %s\n", dns,
|
DBGC ( dns, "DNS %p using nameserver %s\n", dns,
|
||||||
inet_ntoa ( nameserver.sin.sin_addr ) );
|
inet_ntoa ( server.sin.sin_addr ) );
|
||||||
udp_connect ( &dns->udp, &nameserver.st );
|
udp_connect ( &dns->udp, &server.st );
|
||||||
if ( ( rc = udp_open ( &dns->udp, 0 ) ) != 0 )
|
if ( ( rc = udp_open ( &dns->udp, 0 ) ) != 0 )
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue