Blame tlv.h

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