/*
 * Copyright (c) 2017 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Private functions for the Precision Time Protocol Stack.
 *
 * This is not to be included by the application.
 */

#ifndef __GPTP_PRIVATE_H
#define __GPTP_PRIVATE_H

#include <zephyr/net/gptp.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Common defines for the gPTP stack. */
#define GPTP_THREAD_WAIT_TIMEOUT_MS 1
#define GPTP_MULTIPLE_PDELAY_RESP_WAIT (5 * 60 * MSEC_PER_SEC)

#if defined(CONFIG_NET_GPTP_STATISTICS)
#define GPTP_STATS_INC(port, var) (GPTP_PORT_PARAM_DS(port)->var++)
#else
#define GPTP_STATS_INC(port, var)
#endif

/**
 * @brief Is a slave acting as a slave.
 *
 * Utility to check if a port is configured as a slave.
 *
 * @param port Port to check.
 *
 * @return True if this is a slave port.
 */
bool gptp_is_slave_port(int port);

/**
 * @brief Convert the network interface to the correct port number.
 *
 * @param iface Network Interface acting as a ptp port.
 *
 * @return Number of the port if found, ENODEV otherwise.
 */
int gptp_get_port_number(struct net_if *iface);

/**
 * @brief Calculate a logInterval and store in Uscaled ns structure.
 *
 * @param interval Result of calculation.
 *
 * @param seconds Seconds of interval.
 *
 * @param log_msg_interval Logarithm 2 to apply to this interval.
 */
void gptp_set_time_itv(struct gptp_uscaled_ns *interval,
		       uint16_t seconds,
		       int8_t log_msg_interval);

/**
 * @brief Convert uscaled ns to ms for timer use.
 *
 * @param usns Pointer to uscaled nanoseconds to convert.
 *
 * @return INT32_MAX if value exceed timer max value, 0 if the result of the
 *	    conversion is less 1ms, the converted value otherwise.
 */
int32_t gptp_uscaled_ns_to_timer_ms(struct gptp_uscaled_ns *usns);

/**
 * @brief Update pDelay request interval and its timer.
 *
 * @param port Port number.
 *
 * @param log_val New logarithm 2 to apply to this interval.
 */
void gptp_update_pdelay_req_interval(int port, int8_t log_val);

/**
 * @brief Update sync interval and its timer.
 *
 * @param port Port number.
 *
 * @param log_val New logarithm 2 to apply to this interval.
 */
void gptp_update_sync_interval(int port, int8_t log_val);

/**
 * @brief Update announce interval and its timer.
 *
 * @param port Port number.
 *
 * @param log_val New logarithm 2 to apply to this interval.
 */

void gptp_update_announce_interval(int port, int8_t log_val);

/**
 * @brief Convert a ptp timestamp to nanoseconds.
 *
 * @param ts A PTP timestamp.
 *
 * @return Number of nanoseconds.
 */
static inline uint64_t gptp_timestamp_to_nsec(struct net_ptp_time *ts)
{
	if (!ts) {
		return 0;
	}

	return (ts->second * NSEC_PER_SEC) + ts->nanosecond;
}

/**
 * @brief Change the port state
 *
 * @param port Port number of the clock to use.
 * @param state New state
 */
#if CONFIG_NET_GPTP_LOG_LEVEL < LOG_LEVEL_DBG
void gptp_change_port_state(int port, enum gptp_port_state state);
#else
#define gptp_change_port_state(port, state)			\
	gptp_change_port_state_debug(port, state, __func__, __LINE__)

void gptp_change_port_state_debug(int port, enum gptp_port_state state,
				  const char *caller, int line);
#endif

#if CONFIG_NET_GPTP_LOG_LEVEL < LOG_LEVEL_DBG
void gptp_change_pa_info_state(
	int port,
	struct gptp_port_announce_information_state *pa_info_state,
	enum gptp_pa_info_states state);
#else
#define gptp_change_pa_info_state(port, pa_info_state, state)		\
	gptp_change_pa_info_state_debug(port, pa_info_state, state,	\
					__func__, __LINE__)

void gptp_change_pa_info_state_debug(
	int port,
	struct gptp_port_announce_information_state *pa_info_state,
	enum gptp_pa_info_states state,
	const char *caller, int line);
#endif

#ifdef __cplusplus
}
#endif

#endif /* __GPTP_PRIVATE_H */
