Blame port.h

Packit Service d8d8ac
/**
Packit Service d8d8ac
 * @file port.h
Packit Service d8d8ac
 * @note Copyright (C) 2011 Richard Cochran <richardcochran@gmail.com>
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This program is free software; you can redistribute it and/or modify
Packit Service d8d8ac
 * it under the terms of the GNU General Public License as published by
Packit Service d8d8ac
 * the Free Software Foundation; either version 2 of the License, or
Packit Service d8d8ac
 * (at your option) any later version.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This program is distributed in the hope that it will be useful,
Packit Service d8d8ac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d8d8ac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d8d8ac
 * GNU General Public License for more details.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * You should have received a copy of the GNU General Public License along
Packit Service d8d8ac
 * with this program; if not, write to the Free Software Foundation, Inc.,
Packit Service d8d8ac
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service d8d8ac
 */
Packit Service d8d8ac
#ifndef HAVE_PORT_H
Packit Service d8d8ac
#define HAVE_PORT_H
Packit Service d8d8ac
Packit Service d8d8ac
#include "dm.h"
Packit Service d8d8ac
#include "fd.h"
Packit Service d8d8ac
#include "foreign.h"
Packit Service d8d8ac
#include "fsm.h"
Packit Service d8d8ac
#include "notification.h"
Packit Service d8d8ac
#include "transport.h"
Packit Service d8d8ac
Packit Service d8d8ac
/* forward declarations */
Packit Service d8d8ac
struct interface;
Packit Service d8d8ac
struct clock;
Packit Service d8d8ac
Packit Service d8d8ac
/** Opaque type. */
Packit Service d8d8ac
struct port;
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Returns the dataset from a port's best foreign clock record, if any
Packit Service d8d8ac
 * has yet been discovered. This function does not bring the returned
Packit Service d8d8ac
 * dataset up to date, so the caller should invoke port_compute_best()
Packit Service d8d8ac
 * beforehand.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param port  A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @return      A pointer to a dataset, or NULL.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct dataset *port_best_foreign(struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Close a port and free its associated resources. After this call
Packit Service d8d8ac
 * returns, @a port is no longer a valid port instance.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param port A pointer previously obtained via port_open().
Packit Service d8d8ac
 */
Packit Service d8d8ac
void port_close(struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Computes the 'best' foreign master discovered on a port. This has
Packit Service d8d8ac
 * the side effect of updating the 'dataset' field of the returned
Packit Service d8d8ac
 * foreign master.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param port A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @return A pointer to the port's best foreign master, or NULL.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct foreign_clock *port_compute_best(struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Dispatch a port event. This may cause a state transition on the
Packit Service d8d8ac
 * port, with the associated side effect.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param port A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @param event One of the @a fsm_event codes.
Packit Service d8d8ac
 * @param mdiff Whether a new master has been selected.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void port_dispatch(struct port *p, enum fsm_event event, int mdiff);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Generates state machine events based on activity on a port's file
Packit Service d8d8ac
 * descriptors.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param port A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @param fd_index The index of the active file descriptor.
Packit Service d8d8ac
 * @return One of the @a fsm_event codes.
Packit Service d8d8ac
 */
Packit Service d8d8ac
enum fsm_event port_event(struct port *port, int fd_index);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Forward a message on a given port.
Packit Service d8d8ac
 * @param port    A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @param msg     The message to send. Must be in network byte order.
Packit Service d8d8ac
 * @return        Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_forward(struct port *p, struct ptp_message *msg);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Forward a message on a given port to the address stored in the message.
Packit Service d8d8ac
 * @param port    A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @param msg     The message to send. Must be in network byte order.
Packit Service d8d8ac
 * @return        Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_forward_to(struct port *p, struct ptp_message *msg);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Prepare message for transmission and send it to a given port. Note that
Packit Service d8d8ac
 * a single message cannot be sent several times using this function, that
Packit Service d8d8ac
 * would lead to corrupted data being sent. Use msg_pre_send and
Packit Service d8d8ac
 * port_forward if you need to send single message to several ports.
Packit Service d8d8ac
 * @param p        A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @param msg      The message to send.
Packit Service d8d8ac
 * @param event    One of the @ref transport_event enumeration values.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_prepare_and_send(struct port *p, struct ptp_message *msg,
Packit Service d8d8ac
			  enum transport_event event);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Obtain a port's identity.
Packit Service d8d8ac
 * @param p        A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @return         The port identity of 'p'.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct PortIdentity port_identity(struct port *p);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Obtain a port number.
Packit Service d8d8ac
 * @param p        A port instance.
Packit Service d8d8ac
 * @return         The port number of 'p'.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_number(struct port *p);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Obtain the link status of a port.
Packit Service d8d8ac
 * @param p        A port instance.
Packit Service d8d8ac
 * @return         One (1) if the link is up, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_link_status_get(struct port *p);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Manage a port according to a given message.
Packit Service d8d8ac
 * @param p        A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @param ingress  The port on which 'msg' was received.
Packit Service d8d8ac
 * @param msg      A management message.
Packit Service d8d8ac
 * @return         1 if the message was responded to, 0 if it did not apply
Packit Service d8d8ac
 *                 to the port, -1 if it was invalid.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_manage(struct port *p, struct port *ingress, struct ptp_message *msg);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Send a management error status message.
Packit Service d8d8ac
 * @param pid       The id of the responding port.
Packit Service d8d8ac
 * @param ingress   Port on which the 'req' was received.
Packit Service d8d8ac
 * @param req       The management message which triggered the error.
Packit Service d8d8ac
 * @param error_id  One of the management error ID values.
Packit Service d8d8ac
 * @return          Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_management_error(struct PortIdentity pid, struct port *ingress,
Packit Service d8d8ac
			  struct ptp_message *req, Enumeration16 error_id);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Allocate a reply to a management message.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * Messages are reference counted, and newly allocated messages have a
Packit Service d8d8ac
 * reference count of one. Allocated messages are freed using the
Packit Service d8d8ac
 * function @ref msg_put().
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param pid      The id of the responding port.
Packit Service d8d8ac
 * @param ingress  The port on which 'req' was received.
Packit Service d8d8ac
 * @param req      A management message.
Packit Service d8d8ac
 * @return         Pointer to a message on success, NULL otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct ptp_message *port_management_reply(struct PortIdentity pid,
Packit Service d8d8ac
					  struct port *ingress,
Packit Service d8d8ac
					  struct ptp_message *req);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Allocate a standalone reply management message.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * See note in @ref port_management_reply description about freeing the
Packit Service d8d8ac
 * message. Also note that the constructed message does not have
Packit Service d8d8ac
 * targetPortIdentity and sequenceId filled.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param pid      The id of the responding port.
Packit Service d8d8ac
 * @param port     The port to which the message will be sent.
Packit Service d8d8ac
 * @return         Pointer to a message on success, NULL otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct ptp_message *port_management_notify(struct PortIdentity pid,
Packit Service d8d8ac
					   struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Construct and send notification to subscribers about an event that
Packit Service d8d8ac
 * occured on the port.
Packit Service d8d8ac
 * @param p        The port.
Packit Service d8d8ac
 * @param event    The identification of the event.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void port_notify_event(struct port *p, enum notification event);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Open a network port.
Packit Service d8d8ac
 * @param phc_index     The PHC device index for the network device.
Packit Service d8d8ac
 * @param timestamping  The timestamping mode for this port.
Packit Service d8d8ac
 * @param number	An arbitrary number assigned to this port.
Packit Service d8d8ac
 * @param interface     The interface data
Packit Service d8d8ac
 * @param clock         A pointer to the system PTP clock.
Packit Service d8d8ac
 * @return A pointer to an open port on success, or NULL otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct port *port_open(int phc_index,
Packit Service d8d8ac
		       enum timestamp_type timestamping,
Packit Service d8d8ac
		       int number,
Packit Service d8d8ac
		       struct interface *interface,
Packit Service d8d8ac
		       struct clock *clock);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Returns a port's current state.
Packit Service d8d8ac
 * @param port  A port instance.
Packit Service d8d8ac
 * @return      One of the @ref port_state values.
Packit Service d8d8ac
 */
Packit Service d8d8ac
enum port_state port_state(struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Update a port's current state based on a given event.
Packit Service d8d8ac
 * @param p        A pointer previously obtained via port_open().
Packit Service d8d8ac
 * @param event    One of the @a fsm_event codes.
Packit Service d8d8ac
 * @param mdiff    Whether a new master has been selected.
Packit Service d8d8ac
 * @return         One (1) if the port state has changed, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_state_update(struct port *p, enum fsm_event event, int mdiff);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Return array of file descriptors for this port. The fault fd is not
Packit Service d8d8ac
 * included.
Packit Service d8d8ac
 * @param port	A port instance
Packit Service d8d8ac
 * @return	Array of file descriptors. Unused descriptors are guranteed
Packit Service d8d8ac
 *		to be set to -1.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct fdarray *port_fda(struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Return file descriptor of the port.
Packit Service d8d8ac
 * @param port	A port instance.
Packit Service d8d8ac
 * @return	File descriptor or -1 if not applicable.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_fault_fd(struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Utility function for setting or resetting a file descriptor timer.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This function sets the timer 'fd' to the value M(2^N), where M is
Packit Service d8d8ac
 * the value of the 'scale' parameter and N in the value of the
Packit Service d8d8ac
 * 'log_seconds' parameter.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * Passing both 'scale' and 'log_seconds' as zero disables the timer.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param fd A file descriptor previously opened with timerfd_create(2).
Packit Service d8d8ac
 * @param scale The multiplicative factor for the timer.
Packit Service d8d8ac
 * @param log_seconds The exponential factor for the timer.
Packit Service d8d8ac
 * @return Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int set_tmo_log(int fd, unsigned int scale, int log_seconds);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Utility function for setting a file descriptor timer.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This function sets the timer 'fd' to a random value between M * 2^N and
Packit Service d8d8ac
 * (M + S) * 2^N, where M is the value of the 'min' parameter, S is the value
Packit Service d8d8ac
 * of the 'span' parameter, and N in the value of the 'log_seconds' parameter.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param fd A file descriptor previously opened with timerfd_create(2).
Packit Service d8d8ac
 * @param min The minimum value for the timer.
Packit Service d8d8ac
 * @param span The span value for the timer. Must be a positive value.
Packit Service d8d8ac
 * @param log_seconds The exponential factor for the timer.
Packit Service d8d8ac
 * @return Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int set_tmo_random(int fd, int min, int span, int log_seconds);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Utility function for setting or resetting a file descriptor timer.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This function sets the timer 'fd' to the value of the 'seconds' parameter.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * Passing 'seconds' as zero disables the timer.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param fd A file descriptor previously opened with timerfd_create(2).
Packit Service d8d8ac
 * @param seconds The timeout value for the timer.
Packit Service d8d8ac
 * @return Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int set_tmo_lin(int fd, int seconds);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Sets port's fault file descriptor timer.
Packit Service d8d8ac
 * Passing both 'scale' and 'log_seconds' as zero disables the timer.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param fd		A port instance.
Packit Service d8d8ac
 * @param scale		The multiplicative factor for the timer.
Packit Service d8d8ac
 * @param log_seconds	The exponential factor for the timer.
Packit Service d8d8ac
 * @return		Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_set_fault_timer_log(struct port *port,
Packit Service d8d8ac
			     unsigned int scale, int log_seconds);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Sets port's fault file descriptor timer.
Packit Service d8d8ac
 * Passing 'seconds' as zero disables the timer.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param fd		A port instance.
Packit Service d8d8ac
 * @param seconds	The timeout value for the timer.
Packit Service d8d8ac
 * @return		Zero on success, non-zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int port_set_fault_timer_lin(struct port *port, int seconds);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Returns a port's last fault type.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param port  A port instance.
Packit Service d8d8ac
 * @return      One of the @ref fault_type values.
Packit Service d8d8ac
 */
Packit Service d8d8ac
enum fault_type last_fault_type(struct port *port);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Fills passed in struct fault_interval with the value associated to a
Packit Service d8d8ac
 * port and fault type.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param port        A port instance.
Packit Service d8d8ac
 * @param ft          Fault type.
Packit Service d8d8ac
 * @param i           Pointer to the struct which will be filled in.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void fault_interval(struct port *port, enum fault_type ft,
Packit Service d8d8ac
		    struct fault_interval *i);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Release all of the memory in the TC transmit descriptor cache.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void tc_cleanup(void);
Packit Service d8d8ac
Packit Service d8d8ac
#endif