/** @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_ */
