blob: 0117e62f9d3e3d49fa9a5224c50f1183b17d47e3 [file] [log] [blame]
/** @file
* @brief DHCPv4 Client Handler
*/
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_NET_DHCPV4_H_
#define ZEPHYR_INCLUDE_NET_DHCPV4_H_
#include <zephyr/sys/slist.h>
#include <zephyr/types.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief DHCPv4
* @defgroup dhcpv4 DHCPv4
* @ingroup networking
* @{
*/
/** @cond INTERNAL_HIDDEN */
/** Current state of DHCPv4 client address negotiation.
*
* Additions removals and reorders in this definition must be
* reflected within corresponding changes to net_dhcpv4_state_name.
*/
enum net_dhcpv4_state {
NET_DHCPV4_DISABLED,
NET_DHCPV4_INIT,
NET_DHCPV4_SELECTING,
NET_DHCPV4_REQUESTING,
NET_DHCPV4_RENEWING,
NET_DHCPV4_REBINDING,
NET_DHCPV4_BOUND,
} __packed;
/** @endcond */
/**
* @brief DHCPv4 message types
*
* These enumerations represent RFC2131 defined msy type codes, hence
* they should not be renumbered.
*
* Additions, removald and reorders in this definition must be reflected
* within corresponding changes to net_dhcpv4_msg_type_name.
*/
enum net_dhcpv4_msg_type {
NET_DHCPV4_MSG_TYPE_DISCOVER = 1,
NET_DHCPV4_MSG_TYPE_OFFER = 2,
NET_DHCPV4_MSG_TYPE_REQUEST = 3,
NET_DHCPV4_MSG_TYPE_DECLINE = 4,
NET_DHCPV4_MSG_TYPE_ACK = 5,
NET_DHCPV4_MSG_TYPE_NAK = 6,
NET_DHCPV4_MSG_TYPE_RELEASE = 7,
NET_DHCPV4_MSG_TYPE_INFORM = 8,
};
#ifdef CONFIG_NET_DHCPV4_OPTION_CALLBACKS
struct net_dhcpv4_option_callback;
/**
* @typedef net_dhcpv4_option_callback_handler_t
* @brief Define the application callback handler function signature
*
* @param cb Original struct net_dhcpv4_option_callback owning this handler
* @param length The length of data returned by the server. If this is
* greater than cb->max_length, only cb->max_length bytes
* will be available in cb->data
* @param msg_type Type of DHCP message that triggered the callback
* @param iface The interface on which the DHCP message was received
*
* Note: cb pointer can be used to retrieve private data through
* CONTAINER_OF() if original struct net_dhcpv4_option_callback is stored in
* another private structure.
*/
typedef void (*net_dhcpv4_option_callback_handler_t)(struct net_dhcpv4_option_callback *cb,
size_t length,
enum net_dhcpv4_msg_type msg_type,
struct net_if *iface);
/** @cond INTERNAL_HIDDEN */
/**
* @brief DHCP option callback structure
*
* Used to register a callback in the DHCPv4 client callback list.
* As many callbacks as needed can be added as long as each of them
* are unique pointers of struct net_dhcpv4_option_callback.
* Beware such structure should not be allocated on stack.
*
* Note: To help setting it, see net_dhcpv4_init_option_callback() below
*/
struct net_dhcpv4_option_callback {
/** This is meant to be used internally and the user should not
* mess with it.
*/
sys_snode_t node;
/** Actual callback function being called when relevant. */
net_dhcpv4_option_callback_handler_t handler;
/** The DHCP option this callback is attached to. */
uint8_t option;
/** Maximum length of data buffer. */
size_t max_length;
/** Pointer to a buffer of size max_length that is used to store the
* option data.
*/
void *data;
};
/** @endcond */
/**
* @brief Helper to initialize a struct net_dhcpv4_option_callback properly
* @param callback A valid Application's callback structure pointer.
* @param handler A valid handler function pointer.
* @param option The DHCP option the callback responds to.
* @param data A pointer to a buffer for max_length bytes.
* @param max_length The maximum length of the data returned.
*/
static inline void net_dhcpv4_init_option_callback(struct net_dhcpv4_option_callback *callback,
net_dhcpv4_option_callback_handler_t handler,
uint8_t option,
void *data,
size_t max_length)
{
__ASSERT(callback, "Callback pointer should not be NULL");
__ASSERT(handler, "Callback handler pointer should not be NULL");
__ASSERT(data, "Data pointer should not be NULL");
callback->handler = handler;
callback->option = option;
callback->data = data;
callback->max_length = max_length;
}
/**
* @brief Add an application callback.
* @param cb A valid application's callback structure pointer.
* @return 0 if successful, negative errno code on failure.
*/
int net_dhcpv4_add_option_callback(struct net_dhcpv4_option_callback *cb);
/**
* @brief Remove an application callback.
* @param cb A valid application's callback structure pointer.
* @return 0 if successful, negative errno code on failure.
*/
int net_dhcpv4_remove_option_callback(struct net_dhcpv4_option_callback *cb);
#endif /* CONFIG_NET_DHCPV4_OPTION_CALLBACKS */
/**
* @brief Start DHCPv4 client on an iface
*
* @details Start DHCPv4 client on a given interface. DHCPv4 client
* will start negotiation for IPv4 address. Once the negotiation is
* success IPv4 address details will be added to interface.
*
* @param iface A valid pointer on an interface
*/
void net_dhcpv4_start(struct net_if *iface);
/**
* @brief Stop DHCPv4 client on an iface
*
* @details Stop DHCPv4 client on a given interface. DHCPv4 client
* will remove all configuration obtained from a DHCP server from the
* interface and stop any further negotiation with the server.
*
* @param iface A valid pointer on an interface
*/
void net_dhcpv4_stop(struct net_if *iface);
/**
* @brief Restart DHCPv4 client on an iface
*
* @details Restart DHCPv4 client on a given interface. DHCPv4 client
* will restart the state machine without any of the initial delays
* used in start.
*
* @param iface A valid pointer on an interface
*/
void net_dhcpv4_restart(struct net_if *iface);
/** @cond INTERNAL_HIDDEN */
/**
* @brief DHCPv4 state name
*
* @internal
*/
const char *net_dhcpv4_state_name(enum net_dhcpv4_state state);
/** @endcond */
/**
* @brief Return a text representation of the msg_type
*
* @param msg_type The msg_type to be converted to text
* @return A text representation of msg_type
*/
const char *net_dhcpv4_msg_type_name(enum net_dhcpv4_msg_type msg_type);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_NET_DHCPV4_H_ */