Blame tlv.h

Packit Service d8d8ac
/**
Packit Service d8d8ac
 * @file tlv.h
Packit Service d8d8ac
 * @brief Implements helper routines for processing Type Length Value fields.
Packit Service d8d8ac
 * @note Copyright (C) 2012 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_TLV_H
Packit Service d8d8ac
#define HAVE_TLV_H
Packit Service d8d8ac
Packit Service d8d8ac
#include <sys/queue.h>
Packit Service d8d8ac
Packit Service d8d8ac
#include "ddt.h"
Packit Service d8d8ac
#include "ds.h"
Packit Service d8d8ac
Packit Service d8d8ac
/* TLV types */
Packit Service d8d8ac
#define TLV_MANAGEMENT					0x0001
Packit Service d8d8ac
#define TLV_MANAGEMENT_ERROR_STATUS			0x0002
Packit Service d8d8ac
#define TLV_ORGANIZATION_EXTENSION			0x0003
Packit Service d8d8ac
#define TLV_REQUEST_UNICAST_TRANSMISSION		0x0004
Packit Service d8d8ac
#define TLV_GRANT_UNICAST_TRANSMISSION			0x0005
Packit Service d8d8ac
#define TLV_CANCEL_UNICAST_TRANSMISSION			0x0006
Packit Service d8d8ac
#define TLV_ACKNOWLEDGE_CANCEL_UNICAST_TRANSMISSION	0x0007
Packit Service d8d8ac
#define TLV_PATH_TRACE					0x0008
Packit Service d8d8ac
#define TLV_ALTERNATE_TIME_OFFSET_INDICATOR		0x0009
Packit Service d8d8ac
#define TLV_AUTHENTICATION				0x2000
Packit Service d8d8ac
#define TLV_AUTHENTICATION_CHALLENGE			0x2001
Packit Service d8d8ac
#define TLV_SECURITY_ASSOCIATION_UPDATE			0x2002
Packit Service d8d8ac
#define TLV_CUM_FREQ_SCALE_FACTOR_OFFSET		0x2003
Packit Service d8d8ac
#define TLV_PTPMON_REQ					0x21FE
Packit Service d8d8ac
#define TLV_PTPMON_RESP					0x21FF
Packit Service d8d8ac
Packit Service d8d8ac
enum management_action {
Packit Service d8d8ac
	GET,
Packit Service d8d8ac
	SET,
Packit Service d8d8ac
	RESPONSE,
Packit Service d8d8ac
	COMMAND,
Packit Service d8d8ac
	ACKNOWLEDGE,
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
/* Clock management ID values */
Packit Service d8d8ac
#define TLV_USER_DESCRIPTION				0x0002
Packit Service d8d8ac
#define TLV_SAVE_IN_NON_VOLATILE_STORAGE		0x0003
Packit Service d8d8ac
#define TLV_RESET_NON_VOLATILE_STORAGE			0x0004
Packit Service d8d8ac
#define TLV_INITIALIZE					0x0005
Packit Service d8d8ac
#define TLV_FAULT_LOG					0x0006
Packit Service d8d8ac
#define TLV_FAULT_LOG_RESET				0x0007
Packit Service d8d8ac
#define TLV_DEFAULT_DATA_SET				0x2000
Packit Service d8d8ac
#define TLV_CURRENT_DATA_SET				0x2001
Packit Service d8d8ac
#define TLV_PARENT_DATA_SET				0x2002
Packit Service d8d8ac
#define TLV_TIME_PROPERTIES_DATA_SET			0x2003
Packit Service d8d8ac
#define TLV_PRIORITY1					0x2005
Packit Service d8d8ac
#define TLV_PRIORITY2					0x2006
Packit Service d8d8ac
#define TLV_DOMAIN					0x2007
Packit Service d8d8ac
#define TLV_SLAVE_ONLY					0x2008
Packit Service d8d8ac
#define TLV_TIME					0x200F
Packit Service d8d8ac
#define TLV_CLOCK_ACCURACY				0x2010
Packit Service d8d8ac
#define TLV_UTC_PROPERTIES				0x2011
Packit Service d8d8ac
#define TLV_TRACEABILITY_PROPERTIES			0x2012
Packit Service d8d8ac
#define TLV_TIMESCALE_PROPERTIES			0x2013
Packit Service d8d8ac
#define TLV_PATH_TRACE_LIST				0x2015
Packit Service d8d8ac
#define TLV_PATH_TRACE_ENABLE				0x2016
Packit Service d8d8ac
#define TLV_GRANDMASTER_CLUSTER_TABLE			0x2017
Packit Service d8d8ac
#define TLV_ACCEPTABLE_MASTER_TABLE			0x201A
Packit Service d8d8ac
#define TLV_ACCEPTABLE_MASTER_MAX_TABLE_SIZE		0x201C
Packit Service d8d8ac
#define TLV_ALTERNATE_TIME_OFFSET_ENABLE		0x201E
Packit Service d8d8ac
#define TLV_ALTERNATE_TIME_OFFSET_NAME			0x201F
Packit Service d8d8ac
#define TLV_ALTERNATE_TIME_OFFSET_MAX_KEY		0x2020
Packit Service d8d8ac
#define TLV_ALTERNATE_TIME_OFFSET_PROPERTIES		0x2021
Packit Service d8d8ac
#define TLV_TRANSPARENT_CLOCK_DEFAULT_DATA_SET		0x4000
Packit Service d8d8ac
#define TLV_PRIMARY_DOMAIN				0x4002
Packit Service d8d8ac
#define TLV_TIME_STATUS_NP				0xC000
Packit Service d8d8ac
#define TLV_GRANDMASTER_SETTINGS_NP			0xC001
Packit Service d8d8ac
#define TLV_SUBSCRIBE_EVENTS_NP				0xC003
Packit Service d8d8ac
Packit Service d8d8ac
/* Port management ID values */
Packit Service d8d8ac
#define TLV_NULL_MANAGEMENT				0x0000
Packit Service d8d8ac
#define TLV_CLOCK_DESCRIPTION				0x0001
Packit Service d8d8ac
#define TLV_PORT_DATA_SET				0x2004
Packit Service d8d8ac
#define TLV_LOG_ANNOUNCE_INTERVAL			0x2009
Packit Service d8d8ac
#define TLV_ANNOUNCE_RECEIPT_TIMEOUT			0x200A
Packit Service d8d8ac
#define TLV_LOG_SYNC_INTERVAL				0x200B
Packit Service d8d8ac
#define TLV_VERSION_NUMBER				0x200C
Packit Service d8d8ac
#define TLV_ENABLE_PORT					0x200D
Packit Service d8d8ac
#define TLV_DISABLE_PORT				0x200E
Packit Service d8d8ac
#define TLV_UNICAST_NEGOTIATION_ENABLE			0x2014
Packit Service d8d8ac
#define TLV_UNICAST_MASTER_TABLE			0x2018
Packit Service d8d8ac
#define TLV_UNICAST_MASTER_MAX_TABLE_SIZE		0x2019
Packit Service d8d8ac
#define TLV_ACCEPTABLE_MASTER_TABLE_ENABLED		0x201B
Packit Service d8d8ac
#define TLV_ALTERNATE_MASTER				0x201D
Packit Service d8d8ac
#define TLV_TRANSPARENT_CLOCK_PORT_DATA_SET		0x4001
Packit Service d8d8ac
#define TLV_DELAY_MECHANISM				0x6000
Packit Service d8d8ac
#define TLV_LOG_MIN_PDELAY_REQ_INTERVAL			0x6001
Packit Service d8d8ac
#define TLV_PORT_DATA_SET_NP				0xC002
Packit Service d8d8ac
#define TLV_PORT_PROPERTIES_NP				0xC004
Packit Service d8d8ac
Packit Service d8d8ac
/* Management error ID values */
Packit Service d8d8ac
#define TLV_RESPONSE_TOO_BIG				0x0001
Packit Service d8d8ac
#define TLV_NO_SUCH_ID					0x0002
Packit Service d8d8ac
#define TLV_WRONG_LENGTH				0x0003
Packit Service d8d8ac
#define TLV_WRONG_VALUE					0x0004
Packit Service d8d8ac
#define TLV_NOT_SETABLE					0x0005
Packit Service d8d8ac
#define TLV_NOT_SUPPORTED				0x0006
Packit Service d8d8ac
#define TLV_GENERAL_ERROR				0xFFFE
Packit Service d8d8ac
Packit Service d8d8ac
#define CANCEL_UNICAST_MAINTAIN_REQUEST	(1 << 0)
Packit Service d8d8ac
#define CANCEL_UNICAST_MAINTAIN_GRANT	(1 << 1)
Packit Service d8d8ac
#define GRANT_UNICAST_RENEWAL_INVITED	(1 << 0)
Packit Service d8d8ac
Packit Service d8d8ac
struct ack_cancel_unicast_xmit_tlv {
Packit Service d8d8ac
	Enumeration16   type;
Packit Service d8d8ac
	UInteger16      length;
Packit Service d8d8ac
	uint8_t         message_type_flags;
Packit Service d8d8ac
	uint8_t         reserved;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct cancel_unicast_xmit_tlv {
Packit Service d8d8ac
	Enumeration16   type;
Packit Service d8d8ac
	UInteger16      length;
Packit Service d8d8ac
	uint8_t         message_type_flags;
Packit Service d8d8ac
	uint8_t         reserved;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct grant_unicast_xmit_tlv {
Packit Service d8d8ac
	Enumeration16   type;
Packit Service d8d8ac
	UInteger16      length;
Packit Service d8d8ac
	uint8_t         message_type;
Packit Service d8d8ac
	Integer8        logInterMessagePeriod;
Packit Service d8d8ac
	UInteger32      durationField;
Packit Service d8d8ac
	uint8_t         reserved;
Packit Service d8d8ac
	uint8_t         flags;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct management_tlv {
Packit Service d8d8ac
	Enumeration16 type;
Packit Service d8d8ac
	UInteger16    length;
Packit Service d8d8ac
	Enumeration16 id;
Packit Service d8d8ac
	Octet         data[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct management_tlv_datum {
Packit Service d8d8ac
	uint8_t val;
Packit Service d8d8ac
	uint8_t reserved;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct management_error_status {
Packit Service d8d8ac
	Enumeration16 type;
Packit Service d8d8ac
	UInteger16    length;
Packit Service d8d8ac
	Enumeration16 error;
Packit Service d8d8ac
	Enumeration16 id;
Packit Service d8d8ac
	Octet         reserved[4];
Packit Service d8d8ac
	Octet         data[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct nsm_resp_tlv_head {
Packit Service d8d8ac
	Enumeration16           type;
Packit Service d8d8ac
	UInteger16              length;
Packit Service d8d8ac
	uint8_t                 port_state;
Packit Service d8d8ac
	uint8_t                 reserved;
Packit Service d8d8ac
	struct PortAddress      parent_addr;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct nsm_resp_tlv_foot {
Packit Service d8d8ac
	struct parentDS         parent;
Packit Service d8d8ac
	struct currentDS        current;
Packit Service d8d8ac
	struct timePropertiesDS timeprop;
Packit Service d8d8ac
	struct Timestamp        lastsync;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
/* Organizationally Unique Identifiers */
Packit Service d8d8ac
#define IEEE_802_1_COMMITTEE 0x00, 0x80, 0xC2
Packit Service d8d8ac
extern uint8_t ieee8021_id[3];
Packit Service d8d8ac
Packit Service d8d8ac
struct organization_tlv {
Packit Service d8d8ac
	Enumeration16 type;
Packit Service d8d8ac
	UInteger16    length;
Packit Service d8d8ac
	Octet         id[3];
Packit Service d8d8ac
	Octet         subtype[3];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
#define PATH_TRACE_MAX \
Packit Service d8d8ac
	((sizeof(struct message_data) - sizeof(struct announce_msg) - sizeof(struct TLV)) / \
Packit Service d8d8ac
	 sizeof(struct ClockIdentity))
Packit Service d8d8ac
Packit Service d8d8ac
struct path_trace_tlv {
Packit Service d8d8ac
	Enumeration16 type;
Packit Service d8d8ac
	UInteger16    length;
Packit Service d8d8ac
	struct ClockIdentity cid[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct request_unicast_xmit_tlv {
Packit Service d8d8ac
	Enumeration16   type;
Packit Service d8d8ac
	UInteger16      length;
Packit Service d8d8ac
	uint8_t         message_type;
Packit Service d8d8ac
	Integer8        logInterMessagePeriod;
Packit Service d8d8ac
	UInteger32      durationField;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
static inline unsigned int path_length(struct path_trace_tlv *p)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return p->length / sizeof(struct ClockIdentity);
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
typedef struct Integer96 {
Packit Service d8d8ac
	uint16_t nanoseconds_msb;
Packit Service d8d8ac
	uint64_t nanoseconds_lsb;
Packit Service d8d8ac
	uint16_t fractional_nanoseconds;
Packit Service d8d8ac
} PACKED ScaledNs;
Packit Service d8d8ac
Packit Service d8d8ac
struct follow_up_info_tlv {
Packit Service d8d8ac
	Enumeration16 type;
Packit Service d8d8ac
	UInteger16    length;
Packit Service d8d8ac
	Octet         id[3];
Packit Service d8d8ac
	Octet         subtype[3];
Packit Service d8d8ac
	Integer32     cumulativeScaledRateOffset;
Packit Service d8d8ac
	UInteger16    gmTimeBaseIndicator;
Packit Service d8d8ac
	ScaledNs      lastGmPhaseChange;
Packit Service d8d8ac
	Integer32     scaledLastGmPhaseChange;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct time_status_np {
Packit Service d8d8ac
	int64_t       master_offset; /*nanoseconds*/
Packit Service d8d8ac
	int64_t       ingress_time;  /*nanoseconds*/
Packit Service d8d8ac
	Integer32     cumulativeScaledRateOffset;
Packit Service d8d8ac
	Integer32     scaledLastGmPhaseChange;
Packit Service d8d8ac
	UInteger16    gmTimeBaseIndicator;
Packit Service d8d8ac
	ScaledNs      lastGmPhaseChange;
Packit Service d8d8ac
	Integer32     gmPresent;
Packit Service d8d8ac
	struct ClockIdentity gmIdentity;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct grandmaster_settings_np {
Packit Service d8d8ac
	struct ClockQuality clockQuality;
Packit Service d8d8ac
	Integer16 utc_offset;
Packit Service d8d8ac
	UInteger8 time_flags;
Packit Service d8d8ac
	Enumeration8 time_source;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct port_ds_np {
Packit Service d8d8ac
	UInteger32    neighborPropDelayThresh; /*nanoseconds*/
Packit Service d8d8ac
	Integer32     asCapable;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
Packit Service d8d8ac
#define EVENT_BITMASK_CNT 64
Packit Service d8d8ac
Packit Service d8d8ac
struct subscribe_events_np {
Packit Service d8d8ac
	uint16_t      duration; /* seconds */
Packit Service d8d8ac
	uint8_t       bitmask[EVENT_BITMASK_CNT];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct port_properties_np {
Packit Service d8d8ac
	struct PortIdentity portIdentity;
Packit Service d8d8ac
	uint8_t port_state;
Packit Service d8d8ac
	uint8_t timestamping;
Packit Service d8d8ac
	struct PTPText interface;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
#define PROFILE_ID_LEN 6
Packit Service d8d8ac
Packit Service d8d8ac
struct mgmt_clock_description {
Packit Service d8d8ac
	UInteger16             *clockType;
Packit Service d8d8ac
	struct PTPText         *physicalLayerProtocol;
Packit Service d8d8ac
	struct PhysicalAddress *physicalAddress;
Packit Service d8d8ac
	struct PortAddress     *protocolAddress;
Packit Service d8d8ac
	Octet                  *manufacturerIdentity;
Packit Service d8d8ac
	struct PTPText         *productDescription;
Packit Service d8d8ac
	struct PTPText         *revisionData;
Packit Service d8d8ac
	struct PTPText         *userDescription;
Packit Service d8d8ac
	Octet                  *profileIdentity;
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
struct tlv_extra {
Packit Service d8d8ac
	TAILQ_ENTRY(tlv_extra) list;
Packit Service d8d8ac
	struct TLV *tlv;
Packit Service d8d8ac
	union {
Packit Service d8d8ac
		struct mgmt_clock_description cd;
Packit Service d8d8ac
		struct nsm_resp_tlv_foot *foot;
Packit Service d8d8ac
	};
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Allocates a new tlv_extra structure.
Packit Service d8d8ac
 * @return  Pointer to a new structure on success or NULL otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct tlv_extra *tlv_extra_alloc(void);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Release all of the memory in the tlv_extra cache.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void tlv_extra_cleanup(void);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Frees a tlv_extra structure.
Packit Service d8d8ac
 * @param extra  Pointer to the structure to free.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void tlv_extra_recycle(struct tlv_extra *extra);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Converts recognized value sub-fields into host byte order.
Packit Service d8d8ac
 * @param extra  TLV descriptor pointing to the protocol data.
Packit Service d8d8ac
 * @return Zero if successful, otherwise non-zero
Packit Service d8d8ac
 */
Packit Service d8d8ac
int tlv_post_recv(struct tlv_extra *extra);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Converts recognized value sub-fields into network byte order.
Packit Service d8d8ac
 * @param tlv Pointer to a Type Length Value field.
Packit Service d8d8ac
 * @param extra Additional struct containing tlv data to send, can be
Packit Service d8d8ac
 * NULL.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void tlv_pre_send(struct TLV *tlv, struct tlv_extra *extra);
Packit Service d8d8ac
Packit Service d8d8ac
#endif