DHCPv4 client

Browse source code on GitHub

Overview

This application starts a DHCPv4 client, gets an IPv4 address from the DHCPv4 server, and prints address, lease time, netmask and router information to a serial console.

Requirements

Building and Running

Running DHCPv4 client in Linux Host

These are instructions for how to use this sample application using QEMU on a Linux host to negotiate IP address from DHCPv4 server (kea) running on Linux host.

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

Here’s a sample server configuration file ‘/etc/kea/kea-dhcp4.conf’ used to configure the DHCPv4 server:

{
    "Dhcp4": {
        "interfaces-config": {
            "interfaces": [ "tap0" ],
            "dhcp-socket-type": "raw"
        },

        "valid-lifetime": 7200,

        "subnet4": [
            {
                "id": 1,
                "subnet": "192.0.2.0/24",
                "pools": [ { "pool": "192.0.2.10 - 192.0.2.100" } ],
                "option-data": [
                    {
                        "name": "routers",
                        "data": "192.0.2.2"
                    },
                    {
                        "name": "domain-name-servers",
                        "data": "8.8.8.8"
                    }
                ]
            }
        ]
    }
}

Use another terminal window to start up a DHCPv4 server on the Linux host, using this conf file:

$ sudo kea-dhcp4 -c /etc/kea/kea-dhcp4.conf

Run Zephyr samples/net/dhcpv4_client application in QEMU:

west build -b qemu_x86 samples/net/dhcpv4_client
west build -t run

Once DHCPv4 client address negotiation completed with server, details are shown like this:

[00:00:00.000,000] <inf> net_dhcpv4_client_sample: Run dhcpv4 client
[00:00:00.000,000] <inf> net_dhcpv4_client_sample: Start on slip: index=1
[00:00:07.080,000] <inf> net_dhcpv4: Received: 192.0.2.10
[00:00:07.080,000] <inf> net_dhcpv4_client_sample:    Address[1]: 192.0.2.10
[00:00:07.080,000] <inf> net_dhcpv4_client_sample:     Subnet[1]: 255.255.255.0
[00:00:07.080,000] <inf> net_dhcpv4_client_sample:     Router[1]: 192.0.2.2
[00:00:07.080,000] <inf> net_dhcpv4_client_sample: Lease time[1]: 7200 seconds

To verify the Zephyr application client is running and has received an ip address by typing:

$ ping -I tap0 192.0.2.10

FRDM_K64F

These are instructions for how to use this sample application running on FRDM-K64F board to negotiate IP address from DHCPv4 server (kea) running on Linux host.

Connect ethernet cable from Freedom-K64F board to Linux host machine and check for new interfaces:

$ ifconfig

Add ip address and routing information to interface:

$ sudo ip addr add 192.0.2.2 dev eth1
$ sudo ip route add 192.0.2.0/24 dev eth1

Here’s a sample server configuration file ‘/etc/kea/kea-dhcp4.conf’ used to configure the DHCPv4 server:

{
    "Dhcp4": {
        "interfaces-config": {
            "interfaces": [ "eth1" ],
            "dhcp-socket-type": "raw"
        },

        "valid-lifetime": 7200,

        "subnet4": [
            {
                "id": 1,
                "subnet": "192.0.2.0/24",
                "pools": [ { "pool": "192.0.2.10 - 192.0.2.100" } ],
                "option-data": [
                    {
                        "name": "routers",
                        "data": "192.0.2.2"
                    },
                    {
                        "name": "domain-name-servers",
                        "data": "8.8.8.8"
                    }
                ]
            }
        ]
    }
}

Use another terminal window to start up a DHCPv4 server on the Linux host, using this conf file:

$ sudo kea-dhcp4 -c /etc/kea/kea-dhcp4.conf

Build Zephyr samples/net/dhcpv4_client application:

west build -b frdm_k64f samples/net/dhcpv4_client
west flash

Once DHCPv4 client address negotiation completed with server, details are shown like this:

$ sudo screen /dev/ttyACM0 115200
[00:00:00.000,000] <inf> net_dhcpv4_client_sample: Run dhcpv4 client
[00:00:00.000,000] <inf> net_dhcpv4_client_sample: Start on ethernet: index=1
[00:00:07.080,000] <inf> net_dhcpv4: Received: 192.0.2.10
[00:00:07.080,000] <inf> net_dhcpv4_client_sample:    Address[1]: 192.0.2.10
[00:00:07.080,000] <inf> net_dhcpv4_client_sample:     Subnet[1]: 255.255.255.0
[00:00:07.080,000] <inf> net_dhcpv4_client_sample:     Router[1]: 192.0.2.2
[00:00:07.080,000] <inf> net_dhcpv4_client_sample: Lease time[1]: 7200 seconds

To verify the Zephyr application client is running and has received an ip address by typing:

$ ping -I eth1 192.0.2.10

Arm FVP

This sample application running on Arm FVP board can negotiate IP address from DHCPv4 server running on Arm FVP, so there is no extra configuration that needed to do. It can be built and run directly.

Build Zephyr samples/net/dhcpv4_client application:

west build -b fvp_baser_aemv8r samples/net/dhcpv4_client
west build -t run

Once DHCPv4 client address negotiation completed with server, details are shown like this:

uart:~$
[00:00:00.060,000] <inf> phy_mii: PHY (0) ID 16F840

[00:00:00.170,000] <inf> phy_mii: PHY (0) Link speed 10 Mb, half duplex

[00:00:00.170,000] <inf> eth_smsc91x: MAC 00:02:f7:ef:37:16
*** Booting Zephyr OS build zephyr-v3.2.0-4300-g3e6505dba29e ***
[00:00:00.170,000] <inf> net_dhcpv4_client_sample: Run dhcpv4 client
[00:00:00.180,000] <inf> net_dhcpv4_client_sample: Start on ethernet@9a000000: index=1
[00:00:07.180,000] <inf> net_dhcpv4: Received: 172.20.51.1
[00:00:07.180,000] <inf> net_dhcpv4_client_sample:    Address[1]: 172.20.51.1
[00:00:07.180,000] <inf> net_dhcpv4_client_sample:     Subnet[1]: 255.255.255.0
[00:00:07.180,000] <inf> net_dhcpv4_client_sample:     Router[1]: 172.20.51.254
[00:00:07.180,000] <inf> net_dhcpv4_client_sample: Lease time[1]: 86400 seconds

See also

DHCPv4
Network Management