|
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
|