Current File : //usr/include/liblldp.h
/*
 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _LIBLLDP_H
#define	_LIBLLDP_H

#ifdef __cplusplus
extern "C" {
#endif

#include <libdladm.h>
#include <libnvpair.h>
#include <lldp.h>
#include <sys/types.h>

/*
 * WARNING
 *
 * The interfaces defined in this file are private to the implementation
 * of Solaris and are subject to change at any time without notice.
 * Applications using these interfaces may fail to run on future releases.
 */

#define	LLDP_ALLSTR		"all"
#define	LLDP_NONESTR		"none"
#define	LLDP_MAXPROPNAMELEN	128
#define	LLDP_MAXPROPVALLEN	512

typedef enum lldp_propclass_e {
	LLDP_PROPCLASS_NONE		= 0x00,
	LLDP_PROPCLASS_AGENT		= 0x01,
	LLDP_PROPCLASS_SYSCAPAB_TLV	= 0x02,
	LLDP_PROPCLASS_MGMTADDR_TLV	= 0x04,
	LLDP_PROPCLASS_PFC_TLV		= 0x08,
	LLDP_PROPCLASS_APPLN_TLV	= 0x10,
	LLDP_PROPCLASS_EVB_TLV		= 0x20,
	LLDP_PROPCLASS_ETSCFG_TLV	= 0x40
} lldp_propclass_t;

#define	LLDP_PROPCLASS_AGENT_TLVS	\
	(LLDP_PROPCLASS_PFC_TLV | LLDP_PROPCLASS_APPLN_TLV |	\
	LLDP_PROPCLASS_EVB_TLV| LLDP_PROPCLASS_ETSCFG_TLV)

#define	LLDP_PROPCLASS_GLOBAL_TLVS	\
	(LLDP_PROPCLASS_SYSCAPAB_TLV | LLDP_PROPCLASS_MGMTADDR_TLV)

/*
 * one per LLDP agent and it records the count of significant events
 * in the transmit and recieve state machines.
 */
typedef struct lldp_stats_s {
	uint32_t	ls_stats_AgeoutsTotal;
	uint32_t	ls_stats_FramesDiscardedTotal;
	uint32_t	ls_stats_FramesInErrorsTotal;
	uint32_t	ls_stats_FramesInTotal;
	uint32_t	ls_stats_FramesOutTotal;
	uint32_t	ls_stats_TLVSDiscardedTotal;
	uint32_t	ls_stats_TLVSUnrecognizedTotal;
	uint32_t	ls_stats_lldpduLengthErrors;
} lldp_stats_t;

/*
 * captures inserts/deletes/drops/ageouts/modified time for
 * remote systems table. This stats table is shared by all
 * lldp agents running on the system.
 */
typedef struct lldp_remtable_stats_s {
	uint32_t	lrs_stats_RemTablesLastChangeTime;
	uint32_t	lrs_stats_RemTablesInserts;
	uint32_t	lrs_stats_RemTablesDeletes;
	uint32_t	lrs_stats_RemTablesDrops;
	uint32_t	lrs_stats_RemTablesAgeouts;
	uint32_t	__padding;
} lldp_remtable_stats_t;

/* Unknown LLDP TLV */
typedef struct lldp_unknowntlv_s {
	uint32_t	lu_type;
	uint32_t	lu_len;
	uint8_t		lu_value[512];	/* raw bytes */
} lldp_unknowntlv_t;

/* Unrecognized Organization specific TLV */
typedef struct lldp_unrec_orginfo_s {
	uint8_t		lo_oui[3];
	uint8_t		lo_subtype;
	uint32_t	lo_index;
	uint32_t	lo_len;
	uint8_t		lo_value[508];
} lldp_unrec_orginfo_t;

typedef struct lldp_desc_s {
	uchar_t 	*ld_desclen;
	uint_t  	ld_desc;
} lldp_desc_t;

typedef enum {
	LLDP_STATUS_OK = 0,
	LLDP_STATUS_EXIST,
	LLDP_STATUS_BADARG,
	LLDP_STATUS_FAILED,
	LLDP_STATUS_TOOSMALL,
	LLDP_STATUS_NOTSUP,
	LLDP_STATUS_PROPUNKNOWN,
	LLDP_STATUS_BADVAL,
	LLDP_STATUS_NOMEM,
	LLDP_STATUS_LINKINVAL,
	LLDP_STATUS_LINKBUSY,
	LLDP_STATUS_PERSISTERR,
	LLDP_STATUS_BADRANGE,
	LLDP_STATUS_DISABLED,
	LLDP_STATUS_TEMPONLY,
	LLDP_STATUS_NOTDEFINED,
	LLDP_STATUS_NOTFOUND,
	LLDP_STATUS_UNKNOWN,
	LLDP_STATUS_PERMDENIED
} lldp_status_t;

/* DCBX Control TLV */
typedef struct dcbx_ctl_tlv_s {
	uint8_t		dct_overs;	/* Operating Version */
	uint8_t		dct_mvers;	/* Max supported Version */
	uint32_t	dct_seqno;	/* Sequence number */
	uint32_t	dct_ackno;	/* Acknowledgement number */
} dcbx_ctl_tlv_t;

/* DCBX Feature header */
typedef struct dcbx_feature_tlv_s {
	uint8_t		dft_overs;		/* Operating Version */
	uint8_t		dft_mvers;		/* Max supported version */
	uint8_t		dft_flags_n_reserved;	/* Flags and reserved bits */
	uint8_t		dft_fsubtype;		/* Feature sub-type */
	uint_t		dft_nvals;		/* For application TLV */
	void		*dft_fcfg;		/* Feature Config */
} dcbx_feature_tlv_t;

/* PFC local/configured parameters */
typedef	struct dcbx_pfc_s {
	uint8_t 	dp_map;	/* 8-bit PFC map */
	uint8_t 	dp_ntcs; /* Number of Traffic Class (TC) supported */
	/* LocalParamAdvertise ? */
} dcbx_pfc_t;

/*
 * following are the link properties that determine the TLV's
 * that a lldp agent can advertise.
 */
#define	LLDP_BASICTLV_GRPNAME		"basic-tlv"
#define	LLDP_8021TLV_GRPNAME		"dot1-tlv"
#define	LLDP_8023TLV_GRPNAME		"dot3-tlv"
#define	LLDP_VIRTTLV_GRPNAME		"virt-tlv"

/* numerical equivalent of above groups */
#define	LLDP_BASIC_TLVGRP		0x01
#define	LLDP_8021_TLVGRP		0x02
#define	LLDP_8023_TLVGRP		0x04
#define	LLDP_VIRT_TLVGRP		0x08

/* various possible values in 'basic-tlv' group */
#define	LLDP_BASIC_NONE_TLVNAME		LLDP_NONESTR
#define	LLDP_BASIC_PORTDESC_TLVNAME	"portdesc"
#define	LLDP_BASIC_SYSNAME_TLVNAME	"sysname"
#define	LLDP_BASIC_SYSDESC_TLVNAME	"sysdesc"
#define	LLDP_BASIC_SYSCAPAB_TLVNAME	"syscapab"
#define	LLDP_BASIC_MGMTADDR_TLVNAME	"mgmtaddr"
#define	LLDP_BASIC_ALL_TLVNAME		LLDP_ALLSTR

/* numerical equivalent of the above 'basic-tlv' values */
#define	LLDP_BASIC_NONE_TLV		0x00
#define	LLDP_BASIC_PORTDESC_TLV		0x01
#define	LLDP_BASIC_SYSNAME_TLV		0x02
#define	LLDP_BASIC_SYSDESC_TLV		0x04
#define	LLDP_BASIC_SYSCAPAB_TLV		0x08
#define	LLDP_BASIC_MGMTADDR_TLV		0x10
				/* following are the tlv's we support */
#define	LLDP_BASIC_ALL_TLV		\
	(LLDP_BASIC_PORTDESC_TLV | LLDP_BASIC_SYSNAME_TLV |\
	LLDP_BASIC_SYSDESC_TLV|LLDP_BASIC_SYSCAPAB_TLV|\
	LLDP_BASIC_MGMTADDR_TLV)

/* various possible values in 'dot1-tlv' group */
#define	LLDP_8021_NONE_TLVNAME		LLDP_NONESTR
#define	LLDP_8021_VLAN_NAME_TLVNAME	"vlanname"
#define	LLDP_8021_PVID_TLVNAME		"pvid"
#define	LLDP_8021_LINK_AGGR_TLVNAME	"linkaggr"
#define	LLDP_8021_PFC_TLVNAME		"pfc"
#define	LLDP_8021_APPLN_TLVNAME		"appln"
#define	LLDP_8021_EVB_TLVNAME		"evb"
#define	LLDP_8021_ETSCFG_TLVNAME	"etscfg"
#define	LLDP_8021_ETSRECO_TLVNAME	"etsreco"
#define	LLDP_8021_ALL_TLVNAME		LLDP_ALLSTR

/* numerical equivalent of the above '8021-tlv' values */
#define	LLDP_8021_NONE_TLV		0x0000
#define	LLDP_8021_VLAN_NAME_TLV		0x0001
#define	LLDP_8021_PVID_TLV		0x0002
#define	LLDP_8021_LINK_AGGR_TLV		0x0004
#define	LLDP_8021_PFC_TLV		0x0008
#define	LLDP_8021_APPLN_TLV		0x0010
#define	LLDP_8021_EVB_TLV		0x0020
#define	LLDP_8021_ETSCFG_TLV		0x0040
#define	LLDP_8021_ETSRECO_TLV		0x0080

					/* following are the tlv's we support */
#define	LLDP_8021_ALL_TLV		(LLDP_8021_VLAN_NAME_TLV |\
					LLDP_8021_PVID_TLV | \
					LLDP_8021_LINK_AGGR_TLV | \
					LLDP_8021_PFC_TLV | \
					LLDP_8021_ETSCFG_TLV | \
					LLDP_8021_ETSRECO_TLV | \
					LLDP_8021_APPLN_TLV | \
					LLDP_8021_EVB_TLV)

/* various possible values in 'dot3-tlv' group */
#define	LLDP_8023_NONE_TLVNAME		LLDP_NONESTR
#define	LLDP_8023_MAXFRAMESZ_TLVNAME	"max-framesize"
#define	LLDP_8023_MACPHY_TLVNAME	"macphy"
#define	LLDP_8023_POWERMDI_TLVNAME	"powermdi"
#define	LLDP_8023_ALL_TLVNAME		LLDP_ALLSTR

/* numerical equivalent of the above '8023-tlv' values */
#define	LLDP_8023_NONE_TLV		0x00
#define	LLDP_8023_MAXFRAMESZ_TLV	0x01
#define	LLDP_8023_MACPHY_TLV		0x02
#define	LLDP_8023_POWERMDI_TLV		0x04
					/* following are the tlv's we support */
#define	LLDP_8023_ALL_TLV		LLDP_8023_MAXFRAMESZ_TLV

/* various possible values in 'virt-tlv' group */
#define	LLDP_VIRT_NONE_TLVNAME		LLDP_NONESTR
#define	LLDP_VIRT_VNIC_TLVNAME		"vnic"
#define	LLDP_VIRT_ALL_TLVNAME		LLDP_ALLSTR

/* numerical equivalent of the above 'virt-tlv' values */
#define	LLDP_VIRT_NONE_TLV		0x00
#define	LLDP_VIRT_VNIC_TLV		0x01
#define	LLDP_VIRT_ALL_TLV		LLDP_VIRT_VNIC_TLV

/*
 * System capability properties.
 *
 * We do not have LLDP_ALLSTR because it's an invalid value. A system that has
 * 'station' capability cannot have any other capability at the same time.
 *
 * We do not have LLDP_NONESTR because a system should support atleast one of
 * capability below.
 */
#define	LLDP_SYSCAPAB_OTHER_NAME	"other"
#define	LLDP_SYSCAPAB_REPEATER_NAME	"repeater"
#define	LLDP_SYSCAPAB_MACBRIDGE_NAME	"bridge"
#define	LLDP_SYSCAPAB_WLAN_AP_NAME	"wlan-ap"
#define	LLDP_SYSCAPAB_ROUTER_NAME	"router"
#define	LLDP_SYSCAPAB_TELEPHONE_NAME	"telephone"
#define	LLDP_SYSCAPAB_DOCSIS_CD_NAME	"docsis-cd"
#define	LLDP_SYSCAPAB_STATION_NAME	"station"
#define	LLDP_SYSCAPAB_CVLAN_NAME	"cvlan"
#define	LLDP_SYSCAPAB_SVLAN_NAME	"svlan"
#define	LLDP_SYSCAPAB_TPMR_NAME		"tpmr"

/*
 * option flags passed to liblldp functions
 *
 *  - LLDP_OPT_ACTIVE:
 *	indicates the current value of a property
 *
 *  - LLDP_OPT_DEFAULT:
 *	indicatest the default value of a property
 *
 *  - LLDP_OPT_PERM
 *	indicates the permission of a property
 *
 *  - LLDP_OPT_POSSIBLE
 *	indicates range of values for a given property
 *
 *  - LLDP_OPT_APPEND
 *	for multi-valued properties, append a new value.
 *
 *  - LLDP_OPT_REMOVE
 *	for multi-valued properties, remove the specified value
 *
 *  - LLDP_OPT_AUTO
 *	indicates that the TLV is begin modified by the daemon itself.
 *
 *  - LLDP_OPT_EFFECTIVE
 *	indicates operating value for a given property
 *
 */
#define	LLDP_OPT_ACTIVE		0x00000001
#define	LLDP_OPT_DEFAULT	0x00000002
#define	LLDP_OPT_PERM		0x00000004
#define	LLDP_OPT_POSSIBLE	0x00000008
#define	LLDP_OPT_APPEND		0x00000010
#define	LLDP_OPT_REMOVE		0x00000020
#define	LLDP_OPT_AUTO		0x00000040
#define	LLDP_OPT_EFFECTIVE	0x00000080

#define	LLDP_NVP_LOCAL_CFG	"localcfg"
#define	LLDP_NVP_OPER_CFG	"opercfg"
#define	DCBX_NVP_PENDING	"pending"

#define	DCBX_MAPSIZE		15
#define	DCBX_MAX_PFC_TCS	8
#define	DCBX_MIN_PFC_TCS	0
#define	DCBX_MAX_MAP		255
#define	DCBX_MIN_MAP		0
#define	DCBX_MAX_APPLN_PRI	7
#define	DCBX_MIN_APPLN_PRI	0

/* DCBX CEE (Intel OUI) subtype */
#define	LLDP_INTELOUI_DCBX_SUBTYPE	0x2

#define	DCBX_FEATURE_SUBTYPE_NONE	0

/* Application FCoE subtype */
#define	DCBX_APPLICATION_SUBTYPE_FCOE	0

/* Application TLVs */
#define	DCBX_APPLN_OUI		LLDP_INTEL_OUI
#define	DCBX_TLVHDR_SZ		6

/*
 * maximum number of application protocol that can be in one
 * application tlv.
 */
#define	DCBX_APPLICATION_PROTOCOL_SIZE	6

/* Selector Field */
#define	DCBX_APPLICATION_SF(ouisf)		(((ouisf)) & 0x3)
#define	DCBX_APPLICATION_OUI(ouimap)		\
		(ntohl(*(uint32_t *)(void *)(ouimap)) >> 8)
/* Lower 16 bits */
#define	DCBX_APPLICATION_LOUI(oui)		((oui) & 0xFFFF)
#define	DCBX_APPLICATION_UOUI(oui)		(((oui) >> 16) & 0xFF)
#define	DCBX_APPLICATION_GENERATE_OUI(uouisf, loui)	\
		((((uouisf) >> 2) << 16) | (loui))
#define	DCBX_APPLICATION_PMAP(ouimap)	\
		(ntohl(*(uint32_t *)(void *)(ouimap)) & 0x000000FF)

#define	DCBX_MAX_VERSION	1
#define	DCBX_TLV_MAXLEN		512

#define	DCBX_FEATURE_TLVHDR_SIZE	0x06
#define	DCBX_ENABLED_FLAG		0x80
#define	DCBX_WILLING_FLAG		0x40
#define	DCBX_ERROR_FLAG			0x20
#define	DCBX_RESVERROR_FLAG		0x10

#define	DCBX_FEATURE_ENABLED(fnr)	(((fnr) & DCBX_ENABLED_FLAG) != 0)
#define	DCBX_FEATURE_WILLING(fnr)	(((fnr) & DCBX_WILLING_FLAG) != 0)
#define	DCBX_FEATURE_ERROR(fnr)		(((fnr) & DCBX_ERROR_FLAG) != 0)
#define	DCBX_FEATURE_RESVERROR(fnr)	(((fnr) & DCBX_RESVERROR_FLAG) != 0)


#define	LLDP_INTEL_OUI_LIST		"intelOUI"

#define	PFC_NVP_PFCMAP			"pfcmap"
#define	PFC_NVP_PFCNTCS			"pfcntcs"

#define	DCBX_NVP_CONTROL		"dcbx_control"

extern const char	*lldp_status2str(lldp_status_t, char *);
extern lldp_status_t    lldp_errno2status(int);

/*
 * Property management functions
 */
typedef boolean_t	lldp_prop_wfunc_t(const char *, const char *, void *);
extern lldp_status_t	lldp_walk_prop(lldp_prop_wfunc_t *, void *,
			    lldp_propclass_t);

extern lldp_status_t	lldp_get_agent_info(const char *, boolean_t,
			    nvlist_t **);
extern lldp_status_t	lldp_get_agentinfo_pfc(const char *, boolean_t,
			    lldp_pfc_t *);
extern lldp_status_t	lldp_get_agent_stats(const char *, lldp_stats_t *,
			    uint32_t);

extern int		lldp_str2nvlist(const char *, nvlist_t **, boolean_t);
extern lldp_status_t	lldp_get_agentprop(const char *, const char *, char *,
			    uint_t *, uint_t);
extern lldp_status_t	lldp_get_agent_tlvprop(const char *, const char *,
			    const char *, char *, uint_t *, uint_t);
extern lldp_status_t	lldp_get_global_tlvprop(const char *, const char *,
			    char *, uint_t *, uint_t);
extern lldp_status_t	lldp_set_agentprop(const char *, const char *, char *,
			    uint_t);
extern lldp_status_t	lldp_set_global_tlvprop(const char *, const char *,
			    char *, uint_t);
extern lldp_status_t	lldp_set_agent_tlvprop(const char *, const char *,
			    const char *, char *, uint_t);

extern char 		*lldp_portID2str(lldp_portid_t *, char *, size_t);
extern char		*lldp_chassisID2str(lldp_chassisid_t *, char *, size_t);
extern char		*lldp_port_subtype2str(uint8_t);
extern char		*lldp_maddr_subtype2str(uint8_t);
extern char		*lldp_maddr_ifsubtype2str(uint8_t);
extern char		*lldp_chassis_subtype2str(uint8_t);
extern void		lldp_syscapab2str(uint16_t, char *, size_t);
extern lldp_status_t	lldp_str2syscapab(const char *, uint16_t *);
extern void		lldp_mgmtaddr2str(lldp_mgmtaddr_t *, char *, size_t);
extern lldp_status_t	lldp_str2mask(const char *, char *, uint32_t *);
extern lldp_status_t	lldp_mask2str(const char *, uint32_t, char *,
			    uint_t *, boolean_t);
extern const char	*lldp_mode2str(lldp_admin_status_t);
extern const char	*lldp_dcbmode2str(lldp_dcbmode_status_t);
extern void		lldp_bitmap2str(uint8_t, char *, uint_t);
extern int		lldp_arr2str(uint8_t *, uint_t, char *, uint_t);
extern int		lldp_str2arr(char *, uint8_t *, uint_t);

extern	boolean_t	lldp_is_enabled(const char *);

extern int		lldp_nvlist2chassisid(nvlist_t *, lldp_chassisid_t *);
extern int		lldp_nvlist2portid(nvlist_t *, lldp_portid_t *);
extern int		lldp_nvlist2sysname(nvlist_t *, char **);
extern int		lldp_nvlist2sysdescr(nvlist_t *, char **);
extern int		lldp_nvlist2portdescr(nvlist_t *, char **);
extern int		lldp_nvlist2ttl(nvlist_t *, uint16_t *);
extern int		lldp_nvlist2syscapab(nvlist_t *, lldp_syscapab_t *);
extern int		lldp_nvlist2mgmtaddr(nvlist_t *, const char *,
			    lldp_mgmtaddr_t **, int *);
extern int		lldp_nvlist2maxfsz(nvlist_t *, uint16_t *);
extern int		lldp_nvlist2vlan(nvlist_t *, lldp_vlan_info_t **,
			    int *);
extern int		lldp_nvlist2vnic(nvlist_t *, lldp_vnic_info_t **,
			    int *);
extern int		lldp_nvlist2aggr(nvlist_t *, lldp_aggr_t *);
extern int		lldp_nvlist2pvid(nvlist_t *, uint16_t *);
extern int		lldp_nvlist2pfc(nvlist_t *, lldp_pfc_t *);
extern int		lldp_nvlist2pending(nvlist_t *, boolean_t *);
extern int		lldp_nvlist2ets(nvlist_t *, lldp_ets_t *, boolean_t);
extern int		lldp_nvlist2appln(nvlist_t *, lldp_appln_t **,
			    uint_t *);
extern int		lldp_nvlist2app(nvlist_t *, uint16_t, uint8_t,
			    lldp_appln_t *);
extern int		lldp_nvlist2evb(nvlist_t *, lldp_evb_t *);

extern int		lldp_nvlist2fcoepri(nvlist_t *, uint8_t *);
extern int		lldp_nvlist2unknowntlv(nvlist_t *, int,
			    lldp_unknowntlv_t **, uint_t *);
extern int		lldp_nvlist2unrec_orginfo(nvlist_t *, const char *,
			    lldp_unrec_orginfo_t **, uint_t *);
extern int		lldp_nvlist2infovalid(nvlist_t *, uint16_t *);
extern int		lldp_nvlist2nexttx(nvlist_t *, uint16_t *);

extern void		lldp_firsttlv(uint8_t *, int, lldp_tlv_t *);
extern void		lldp_nexttlv(uint8_t *, int, lldp_tlv_t *,
			    lldp_tlv_t *);
extern void		lldp_set_typelen(uint8_t *, uint8_t, uint16_t);

extern void		lldp_set_orgspecid_subtype(uint8_t *, uint8_t,
			    uint32_t, uint16_t);

extern int		lldp_tlv2chassisid(lldp_tlv_t *, lldp_chassisid_t *);
extern int		lldp_tlv2portid(lldp_tlv_t *, lldp_portid_t *);
extern int		lldp_tlv2ttl(lldp_tlv_t *, uint16_t *);
extern int		lldp_tlv2portdescr(lldp_tlv_t *, char *);
extern int		lldp_tlv2sysname(lldp_tlv_t *, char *);
extern int		lldp_tlv2sysdescr(lldp_tlv_t *, char *);
extern int		lldp_tlv2syscapab(lldp_tlv_t *, lldp_syscapab_t *);
extern int		lldp_tlv2mgmtaddr(lldp_tlv_t *, lldp_mgmtaddr_t *);
extern int		lldp_tlv2maxfsz(lldp_tlv_t *, uint16_t *);
extern int		lldp_tlv2aggr(lldp_tlv_t *, lldp_aggr_t *);
extern int		lldp_tlv2pvid(lldp_tlv_t *, uint16_t *);
extern int		lldp_tlv2vlan(lldp_tlv_t *, lldp_vlan_info_t *);
extern int		lldp_tlv2vnic(lldp_tlv_t *, lldp_vnic_info_t *);
extern int		lldp_tlv2pfc(lldp_tlv_t *, lldp_pfc_t *);
extern int		lldp_tlv2ets(lldp_tlv_t *, lldp_ets_t *, boolean_t);
extern int		lldp_tlv2appln(lldp_tlv_t *, lldp_appln_t **,
			    uint_t *);
extern int		lldp_tlv2evb(lldp_tlv_t *, lldp_evb_t *);
extern int		lldp_tlv2unknown(lldp_tlv_t *, char *, size_t);
extern void		lldp_get_ouistype(lldp_tlv_t *, uint32_t *, uint32_t *);

extern int		lldp_end2pdu(uint8_t *, size_t, size_t *);
extern int		lldp_chassisid2pdu(lldp_chassisid_t *, uint8_t *,
			    size_t, size_t *);
extern int		lldp_portid2pdu(lldp_portid_t *, uint8_t *, size_t,
			    size_t *);
extern int		lldp_ttl2pdu(uint16_t, uint8_t *, size_t, size_t *);
extern int		lldp_portdescr2pdu(const char *, uint8_t *, size_t,
			    size_t *);
extern int		lldp_sysname2pdu(const char *, uint8_t *, size_t,
			    size_t *);
extern int		lldp_sysdescr2pdu(const char *, uint8_t *, size_t,
			    size_t *);
extern int		lldp_syscapab2pdu(lldp_syscapab_t *, uint8_t *, size_t,
			    size_t *);
extern int		lldp_sysport_mgmtaddr2pdu(uint8_t *, size_t, uint32_t,
			    uint8_t *, size_t, size_t *);
extern int		lldp_mgmtaddr2pdu(lldp_mgmtaddr_t *, uint8_t *,
			    size_t, size_t *);
extern int		lldp_maxfsz2pdu(uint16_t, uint8_t *, size_t, size_t *);
extern int		lldp_aggr2pdu(lldp_aggr_t *, uint8_t *, size_t,
			    size_t *);
extern int		lldp_pvid2pdu(uint16_t, uint8_t *, size_t, size_t *);
extern int		lldp_vlan2pdu(lldp_vlan_info_t *, uint8_t *,
			    size_t, size_t *);
extern int		lldp_vnic2pdu(lldp_vnic_info_t *, uint8_t *,
			    size_t, size_t *);
extern int		lldp_pfc2pdu(lldp_pfc_t *, uint8_t *, size_t, size_t *);
extern int		lldp_ets2pdu(lldp_ets_t *, uint8_t *, size_t,
			    size_t *, boolean_t);
extern int		lldp_appln2pdu(lldp_appln_t *, uint_t, uint8_t *,
			    size_t, size_t *);
extern int		lldp_evb2pdu(lldp_evb_t *, uint8_t *, size_t, size_t *);

extern int		lldp_door_call(void *, size_t, void *, size_t);
extern int		lldp_door_dyncall(void *, size_t, void **, size_t);

extern lldp_status_t	lldp_notify_events(int, nvlist_t *);

extern char		*dcbx_appln_sel2str(int);
extern uint_t		lldp_tlvname2pclass(const char *);
extern char		*lldp_pclass2tlvname(lldp_propclass_t);

extern char		*lldp_evb_rrstat2str(uint8_t);
extern lldp_status_t	lldp_set_evb_state(const char *);
extern lldp_status_t	lldp_unset_evb_state(const char *);

extern int		dcbx_get_tlv(nvlist_t *, uint8_t, uint8_t, void *);
extern void		dcbx_byte2control_tlv(uint8_t *, uint_t,
			    dcbx_ctl_tlv_t *);
extern int		dcbx_byte2tlv(uint8_t *, uint8_t,
			    dcbx_feature_tlv_t *);
extern int		dcbx_byte2pfc_tlv(uint8_t *, uint8_t,
			    dcbx_feature_tlv_t *);
extern char		*dcbx_applncee_sf2str(int);
extern int		dcbx_byte2application_tlv(uint8_t *, uint8_t,
			    dcbx_feature_tlv_t *);

#ifdef __cplusplus
}
#endif

#endif /* _LIBLLDP_H */