244 lines
5.8 KiB
ReStructuredText
244 lines
5.8 KiB
ReStructuredText
DNS Client Application
|
|
######################
|
|
|
|
Overview
|
|
********
|
|
|
|
The DNS resolver or DNS client sample application implements a basic
|
|
DNS resolver according to RFC 1035. Supported DNS answers are:
|
|
IPv4/IPv6 addresses and CNAME.
|
|
|
|
If a CNAME is received, the DNS resolver will create another DNS query.
|
|
The number of additional queries is controlled by the
|
|
DNS_RESOLVER_ADDITIONAL_QUERIES Kconfig variable.
|
|
|
|
For more information about DNS configuration variables, see:
|
|
:file:`subsys/net/lib/dns/Kconfig`. The DNS resolver API can be found at
|
|
:file:`include/net/dns_client.h`. The sample code can be found at:
|
|
:file:`samples/net/dns_client`.
|
|
|
|
The return codes used by this sample application are described by the following table.
|
|
|
|
======= ===== ================================================
|
|
Macro Value Description
|
|
------- ----- ------------------------------------------------
|
|
-EINVAL -22 if an invalid parameter was detected
|
|
-EIO -5 network error
|
|
-ENOMEM -12 memory error, perhaps related to network buffers
|
|
======= ===== ================================================
|
|
|
|
A return code of 0 must be interpreted as success.
|
|
|
|
Requirements
|
|
************
|
|
|
|
- :ref:`networking with Qemu <networking_with_qemu>`
|
|
|
|
- screen terminal emulator or equivalent.
|
|
|
|
- For the Arduino 101 board, the ENC28J60 Ethernet module is required.
|
|
|
|
- dnsmasq application. The dnsmasq version used in this sample is:
|
|
|
|
.. code-block:: console
|
|
|
|
dnsmasq -v
|
|
Dnsmasq version 2.76 Copyright (c) 2000-2016 Simon Kelley
|
|
|
|
Wiring
|
|
******
|
|
|
|
The ENC28J60 module is an Ethernet device with SPI interface.
|
|
The following pins must be connected from the ENC28J60 device to the
|
|
Arduino 101 board:
|
|
|
|
=========== ===================================
|
|
Arduino 101 ENC28J60 (pin numbers on the board)
|
|
----------- -----------------------------------
|
|
D13 SCK (1)
|
|
D12 SO (3)
|
|
D11 SI (2)
|
|
D10 CS (7)
|
|
D04 INT (5)
|
|
3.3V VCC (10)
|
|
GDN GND (9)
|
|
=========== ===================================
|
|
|
|
|
|
Building and Running
|
|
********************
|
|
|
|
Network Configuration
|
|
=====================
|
|
|
|
Open the project configuration file for your platform, for example:
|
|
:file:`prj_frdm_k64f.conf` is the configuration file for the
|
|
:ref:`frdm_k64f` board. For IPv4 networks, set the following variables:
|
|
|
|
.. code-block:: console
|
|
|
|
CONFIG_NET_IPV4=y
|
|
CONFIG_NET_IPV6=n
|
|
|
|
IPv6 is the preferred routing technology for this sample application,
|
|
if CONFIG_NET_IPV6=y is set, the value of CONFIG_NET_IPV4 is ignored.
|
|
|
|
In this sample application, only static IP addresses are supported,
|
|
those addresses are specified in the project configuration file,
|
|
for example:
|
|
|
|
.. code-block:: console
|
|
|
|
CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8::1"
|
|
CONFIG_NET_APP_PEER_IPV6_ADDR="2001:db8::2"
|
|
|
|
are the IPv6 addresses for the DNS client running Zephyr and the
|
|
DNS server, respectively.
|
|
|
|
Alternatively, the IP addresses may be specified in the
|
|
:file:`samples/net/dns_client/src/config.h` file.
|
|
|
|
Open the :file:`samples/net/dns_client/src/config.h` file and set the
|
|
server port to match the DNS server setup, for example:
|
|
|
|
.. code-block:: c
|
|
|
|
#define REMOTE_PORT 5353
|
|
|
|
assumes that the DNS server is listening at UDP port 5353.
|
|
|
|
DNS server
|
|
==========
|
|
|
|
The dnsmasq tool may be used for testing purposes. Open a terminal
|
|
window and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ dnsmasq -p 5353 -d
|
|
|
|
NOTE: some systems may require root privileges to run dnsmaq, use sudo or su.
|
|
|
|
If dnsmasq fails to start with an error like this:
|
|
|
|
.. code-block:: console
|
|
|
|
dnsmasq: failed to create listening socket for port 5353: Address already in use
|
|
|
|
Open a terminal window and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ killall -s KILL dnsmasq
|
|
|
|
Try to launch the dnsmasq application again.
|
|
|
|
|
|
QEMU x86
|
|
========
|
|
|
|
Open a terminal window and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ make
|
|
|
|
|
|
Run 'loop_socat.sh' and 'loop-slip-tap.sh' as indicated at:
|
|
|
|
https://gerrit.zephyrproject.org/r/gitweb?p=net-tools.git;a=blob;f=README
|
|
|
|
Set the IPv4 ip address:
|
|
|
|
.. code-block:: console
|
|
|
|
$ ip addr add 192.0.2.2/24 dev tap0
|
|
|
|
Open a terminal where the project was build (i.e. :file:`samples/net/dns_client`) and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ make run
|
|
|
|
FRDM K64F
|
|
=========
|
|
|
|
Open a terminal window and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ make BOARD=frdm_k64f
|
|
|
|
|
|
The FRDM K64F board is detected as a USB storage device. The board
|
|
must be mounted (i.e. to /mnt) to 'flash' the binary:
|
|
|
|
.. code-block:: console
|
|
|
|
$ cp outdir/frdm_k64f/zephyr.bin /mnt
|
|
|
|
|
|
See :ref:`Freedom-K64F board documentation <frdm_k64f>` for more information
|
|
about this board.
|
|
|
|
Open a terminal window and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ screen /dev/ttyACM0 115200
|
|
|
|
|
|
Use 'dmesg' to find the right USB device.
|
|
|
|
Once the binary is loaded into the FRDM board, press the RESET button.
|
|
|
|
Arduino 101
|
|
===========
|
|
|
|
Open a terminal window and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ make BOARD=arduino_101
|
|
|
|
To load the binary in the development board follow the steps
|
|
in :ref:`arduino_101`.
|
|
|
|
Open a terminal window and type:
|
|
|
|
.. code-block:: console
|
|
|
|
$ screen /dev/ttyUSB0 115200
|
|
|
|
Use 'dmesg' to find the right USB device.
|
|
|
|
Once the binary is loaded into the Arduino 101 board, press the RESET button.
|
|
|
|
Sample Output
|
|
=============
|
|
|
|
IPv4 (CONFIG_NET_IPV6=n, CONFIG_NET_IPV4=y)
|
|
|
|
.. literalinclude:: sample_output_IPv4.txt
|
|
|
|
|
|
IPv6 (CONFIG_NET_IPV6=y, CONFIG_NET_IPV4=n)
|
|
|
|
.. literalinclude:: sample_output_IPv6.txt
|
|
|
|
|
|
Note: IPv6 addresses obtained via dnsmasq and :file:`/etc/hosts`.
|
|
|
|
Known Issues
|
|
============
|
|
|
|
- The above sample contains a rc: -22 (-EINVAL). This is the expected behavior
|
|
for that domain name.
|
|
|
|
- If a lot of rc: -5 (-EIO) errors are flooding the screen, increment
|
|
APP_SLEEP_MSECS to 500 or even 1000. See :file:`samples/net/dns_client/src/config.h`.
|
|
|
|
- IPv4: there is still an issue not yet isolated that causes the application
|
|
to fail during the first two queries. The issue lies between L2 (ARP) and
|
|
UDP and it only appears during application startup.
|