			     ===================
			     DNS Resolver Module
			     ===================

Contents:

 - Overview.
 - Compilation.
 - Setting up.
 - Usage.
 - Mechanism.
 - Debugging.


========
OVERVIEW
========

The DNS resolver module provides a way for kernel services to make DNS queries
by way of requesting a key of key type dns_resolver.  These queries are
upcalled to userspace through /sbin/request-key.

These routines must be supported by userspace tools dns.upcall, cifs.upcall and
request-key.  It is under development and does not yet provide the full feature
set.  The features it does support include:

 (*) Implements the dns_resolver key_type to contact userspace.

It does not yet support the following AFS features:

 (*) Dns query support for AFSDB resource record.

This code is extracted from the CIFS filesystem.


===========
COMPILATION
===========

The module should be enabled by turning on the kernel configuration options:

	CONFIG_DNS_RESOLVER	- tristate "DNS Resolver support"


==========
SETTING UP
==========

To set up this facility, the /etc/request-key.conf file must be altered so that
/sbin/request-key can appropriately direct the upcalls.  For example, to handle
basic dname to IPv4/IPv6 address resolution, the following line should be
added:

	#OP	TYPE		DESC	CO-INFO	PROGRAM ARG1 ARG2 ARG3 ...
	#======	============	=======	=======	==========================
	create	dns_resolver  	*	*	/usr/sbin/cifs.upcall %k

To direct a query for query type 'foo', a line of the following should be added
before the more general line given above as the first match is the one taken.

	create	dns_resolver  	foo:*	*	/usr/sbin/dns.foo %k



=====
USAGE
=====

To make use of this facility, one of the following functions that are
implemented in the module can be called after doing:

	#include <linux/dns_resolver.h>

 (1) int dns_query(const char *type, const char *name, size_t namelen,
		   const char *options, char **_result, time_t *_expiry);

     This is the basic access function.  It looks for a cached DNS query and if
     it doesn't find it, it upcalls to userspace to make a new DNS query, which
     may then be cached.  The key description is constructed as a string of the
     form:

		[<type>:]<name>

     where <type> optionally specifies the particular upcall program to invoke,
     and thus the type of query to do, and <name> specifies the string to be
     looked up.  The default query type is a straight hostname to IP address
     set lookup.

     The name parameter is not required to be a NUL-terminated string, and its
     length should be given by the namelen argument.

     The options parameter may be NULL or it may be a set of options
     appropriate to the query type.

     The return value is a string appropriate to the query type.  For instance,
     for the default query type it is just a list of comma-separated IPv4 and
     IPv6 addresses.  The caller must free the result.

     The length of the result string is returned on success, and a negative
     error code is returned otherwise.  -EKEYREJECTED will be returned if the
     DNS lookup failed.

     If _expiry is non-NULL, the expiry time (TTL) of the result will be
     returned also.


=========
MECHANISM
=========

The dnsresolver module registers a key type called "dns_resolver".  Keys of
this type are used to transport and cache DNS lookup results from userspace.

When dns_query() is invoked, it calls request_key() to search the local
keyrings for a cached DNS result.  If that fails to find one, it upcalls to
userspace to get a new result.

Upcalls to userspace are made through the request_key() upcall vector, and are
directed by means of configuration lines in /etc/request-key.conf that tell
/sbin/request-key what program to run to instantiate the key.

The upcall handler program is responsible for querying the DNS, processing the
result into a form suitable for passing to the keyctl_instantiate_key()
routine.  This then passes the data to dns_resolver_instantiate() which strips
off and processes any options included in the data, and then attaches the
remainder of the string to the key as its payload.

The upcall handler program should set the expiry time on the key to that of the
lowest TTL of all the records it has extracted a result from.  This means that
the key will be discarded and recreated when the data it holds has expired.

dns_query() returns a copy of the value attached to the key, or an error if
that is indicated instead.

See <file:Documentation/keys-request-key.txt> for further information about
request-key function.


=========
DEBUGGING
=========

Debugging messages can be turned on dynamically by writing a 1 into the
following file:

        /sys/module/dnsresolver/parameters/debug
