1e08bbd543
Add basic socket-based implementation of DHCPv4 sever. Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
119 lines
3 KiB
C
119 lines
3 KiB
C
/** @file
|
|
* @brief DHCPv4 Server API
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2024 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_NET_DHCPV4_SERVER_H_
|
|
#define ZEPHYR_INCLUDE_NET_DHCPV4_SERVER_H_
|
|
|
|
#include <zephyr/net/net_ip.h>
|
|
#include <zephyr/sys_clock.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief DHCPv4 server
|
|
* @defgroup dhcpv4_server DHCPv4 server
|
|
* @ingroup networking
|
|
* @{
|
|
*/
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
|
|
struct net_if;
|
|
|
|
#define DHCPV4_CLIENT_ID_MAX_SIZE 20
|
|
|
|
enum dhcpv4_server_addr_state {
|
|
DHCPV4_SERVER_ADDR_FREE,
|
|
DHCPV4_SERVER_ADDR_RESERVED,
|
|
DHCPV4_SERVER_ADDR_ALLOCATED,
|
|
DHCPV4_SERVER_ADDR_DECLINED,
|
|
};
|
|
|
|
struct dhcpv4_client_id {
|
|
uint8_t buf[DHCPV4_CLIENT_ID_MAX_SIZE];
|
|
uint8_t len;
|
|
};
|
|
|
|
struct dhcpv4_addr_slot {
|
|
enum dhcpv4_server_addr_state state;
|
|
struct dhcpv4_client_id client_id;
|
|
struct in_addr addr;
|
|
uint32_t lease_time;
|
|
k_timepoint_t expiry;
|
|
};
|
|
|
|
/** @endcond */
|
|
|
|
/**
|
|
* @brief Start DHCPv4 server instance on an iface
|
|
*
|
|
* @details Start DHCPv4 server on a given interface. The server will start
|
|
* listening for DHCPv4 Discover/Request messages on the interface and assign
|
|
* IPv4 addresses from the configured address pool accordingly.
|
|
*
|
|
* @param iface A valid pointer on an interface
|
|
* @param base_addr First IPv4 address from the DHCPv4 address pool. The number
|
|
* of addresses in the pool is configured statically with Kconfig
|
|
* (CONFIG_NET_DHCPV4_SERVER_ADDR_COUNT).
|
|
*
|
|
* @return 0 on success, a negative error code otherwise.
|
|
*/
|
|
int net_dhcpv4_server_start(struct net_if *iface, struct in_addr *base_addr);
|
|
|
|
/**
|
|
* @brief Stop DHCPv4 server instance on an iface
|
|
*
|
|
* @details Stop DHCPv4 server on a given interface. DHCPv4 requests will no
|
|
* longer be handled on the interface, and all of the allocations are cleared.
|
|
*
|
|
* @param iface A valid pointer on an interface
|
|
*
|
|
* @return 0 on success, a negative error code otherwise.
|
|
*/
|
|
int net_dhcpv4_server_stop(struct net_if *iface);
|
|
|
|
/**
|
|
* @typedef net_dhcpv4_lease_cb_t
|
|
* @brief Callback used while iterating over active DHCPv4 address leases
|
|
*
|
|
* @param iface Pointer to the network interface
|
|
* @param lease Pointer to the DHPCv4 address lease slot
|
|
* @param user_data A valid pointer to user data or NULL
|
|
*/
|
|
typedef void (*net_dhcpv4_lease_cb_t)(struct net_if *iface,
|
|
struct dhcpv4_addr_slot *lease,
|
|
void *user_data);
|
|
|
|
/**
|
|
* @brief Iterate over all DHCPv4 address leases on a given network interface
|
|
* and call callback for each lease. In case no network interface is provided
|
|
* (NULL interface pointer), will iterate over all interfaces running DHCPv4
|
|
* server instance.
|
|
*
|
|
* @param iface Pointer to the network interface, can be NULL
|
|
* @param cb User-supplied callback function to call
|
|
* @param user_data User specified data
|
|
*/
|
|
int net_dhcpv4_server_foreach_lease(struct net_if *iface,
|
|
net_dhcpv4_lease_cb_t cb,
|
|
void *user_data);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_NET_DHCPV4_SERVER_H_ */
|