DNS Resolve Application

Overview

This application will setup IP address for the device, and then try to resolve various hostnames according to how the user has configured the system.

  • If IPv4 is enabled, then A record for www.zephyrproject.org is resolved.
  • If IPv6 is enabled, then AAAA record for www.zephyrproject.org is resolved.
  • If mDNS is enabled, then zephyr.local name is resolved.

Requirements

  • Networking with the host system
  • 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:
dnsmasq -v
Dnsmasq version 2.76  Copyright (c) 2000-2016 Simon Kelley

Building and Running

Network Configuration

Open the project configuration file for your platform, for example: prj_frdm_k64f.conf is the configuration file for the NXP FRDM-K64F board.

In this sample application, both static or DHCPv4 IP addresses are supported. Static IP addresses are specified in the project configuration file, for example:

CONFIG_NET_CONFIG_MY_IPV6_ADDR="2001:db8::1"
CONFIG_NET_CONFIG_PEER_IPV6_ADDR="2001:db8::2"

are the IPv6 addresses for the DNS client running Zephyr and the DNS server, respectively.

DNS server

The dnsmasq tool may be used for testing purposes. Sample dnsmasq start script can be downloaded from the zephyrproject-rtos/net-tools project area: https://github.com/zephyrproject-rtos/net-tools

Open a terminal window and type:

$ cd net-tools
$ sudo ./dnsmasq.sh

The default project configurations settings for this sample uses the public Google DNS servers. In order to use the local dnsmasq server, please edit the appropriate ‘prj.conf’ file and update the DNS server addresses. For instance, if using the usual IP addresses assigned to testing, update them to the following values:

CONFIG_DNS_SERVER1="192.0.2.2:5353"
CONFIG_DNS_SERVER2="[2001:db8::2]:5353"

Note

DNS uses port 53 by default, but the dnsmasq.conf file provided by net-tools uses port 5353 to allow executing the daemon without superuser privileges.

If dnsmasq fails to start with an error like this:

dnsmasq: failed to create listening socket for port 5353: Address already in use

Open a terminal window and type:

$ killall -s KILL dnsmasq

Try to launch the dnsmasq application again.

For testing mDNS, use Avahi script in net-tools project:

$ cd net-tools
$ ./avahi-daemon.sh

LLMNR Responder

If you want Zephyr to respond to a LLMNR DNS request that Windows host is sending, then following config options could be set:

CONFIG_NET_HOSTNAME_ENABLE=y
CONFIG_NET_HOSTNAME="zephyr-device"
CONFIG_DNS_RESOLVER=y
CONFIG_LLMNR_RESPONDER=y

A Zephyr host needs a hostname assigned to it so that it can respond to a DNS query. Note that the hostname should not have any dots in it.

QEMU x86

To use QEMU for testing, follow the Networking with QEMU guide.

FRDM K64F

Open a terminal window and type:

# On Linux/macOS
cd $ZEPHYR_BASE/samples/net/dns_resolve
mkdir build && cd build
# On Windows
cd %ZEPHYR_BASE%\samples\net\dns_resolve
mkdir build & cd build
cmake -GNinja -DBOARD=frdm_k64f ..
ninja
ninja flash

See Freedom-K64F board documentation for more information about this board.

Open a terminal window and type:

$ 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:

# On Linux/macOS
cd $ZEPHYR_BASE/samples/net/dns_resolve
mkdir build && cd build
# On Windows
cd %ZEPHYR_BASE%\samples\net\dns_resolve
mkdir build & cd build
cmake -GNinja -DBOARD=arduino_101 ..
ninja

To load the binary in the development board follow the steps in Arduino/Genuino 101.

Open a terminal window and type:

$ 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.

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)