Blame src/lldpd-structs.h

Packit e9ba0d
/* -*- mode: c; c-file-style: "openbsd" -*- */
Packit e9ba0d
/*
Packit e9ba0d
 * Copyright (c) 2008 Vincent Bernat <bernat@luffy.cx>
Packit e9ba0d
 *
Packit e9ba0d
 * Permission to use, copy, modify, and/or distribute this software for any
Packit e9ba0d
 * purpose with or without fee is hereby granted, provided that the above
Packit e9ba0d
 * copyright notice and this permission notice appear in all copies.
Packit e9ba0d
 *
Packit e9ba0d
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
Packit e9ba0d
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
Packit e9ba0d
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
Packit e9ba0d
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit e9ba0d
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
Packit e9ba0d
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Packit e9ba0d
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit e9ba0d
 */
Packit e9ba0d
Packit e9ba0d
#ifndef _LLDPD_STRUCTS_H
Packit e9ba0d
#define _LLDPD_STRUCTS_H
Packit e9ba0d
Packit e9ba0d
#if HAVE_CONFIG_H
Packit e9ba0d
#  include <config.h>
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
#include <sys/types.h>
Packit e9ba0d
#include <sys/socket.h>
Packit e9ba0d
Packit e9ba0d
/* This is not very convenient, but we need net/if.h for IFNAMSIZ and others but
Packit e9ba0d
 * we may also need linux/if.h in some modules. And they conflict each others.
Packit e9ba0d
 */
Packit e9ba0d
#ifdef HOST_OS_LINUX
Packit e9ba0d
# include <linux/if.h>
Packit e9ba0d
#else
Packit e9ba0d
# include <net/if.h>
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
#include <netinet/in.h>
Packit e9ba0d
#include <netinet/if_ether.h>
Packit e9ba0d
#include <sys/queue.h>
Packit e9ba0d
Packit e9ba0d
#include "compat/compat.h"
Packit e9ba0d
#include "marshal.h"
Packit e9ba0d
#include "lldp-const.h"
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_DOT1
Packit e9ba0d
struct lldpd_ppvid {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_ppvid) p_entries;
Packit e9ba0d
	u_int8_t		p_cap_status;
Packit e9ba0d
	u_int16_t		p_ppvid;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_ppvid)
Packit e9ba0d
MARSHAL_TQE(lldpd_ppvid, p_entries)
Packit e9ba0d
MARSHAL_END(lldpd_ppvid);
Packit e9ba0d
Packit e9ba0d
struct lldpd_vlan {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_vlan)  v_entries;
Packit e9ba0d
	char			*v_name;
Packit e9ba0d
	u_int16_t		 v_vid;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_vlan)
Packit e9ba0d
MARSHAL_TQE(lldpd_vlan, v_entries)
Packit e9ba0d
MARSHAL_STR(lldpd_vlan, v_name)
Packit e9ba0d
MARSHAL_END(lldpd_vlan);
Packit e9ba0d
Packit e9ba0d
struct lldpd_pi {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_pi)  p_entries;
Packit e9ba0d
	char			*p_pi;
Packit e9ba0d
	int			 p_pi_len;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_pi)
Packit e9ba0d
MARSHAL_TQE(lldpd_pi, p_entries)
Packit e9ba0d
MARSHAL_FSTR(lldpd_pi, p_pi, p_pi_len)
Packit e9ba0d
MARSHAL_END(lldpd_pi);
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
struct lldpd_med_policy {
Packit e9ba0d
	u_int8_t		 index; /* Not used. */
Packit e9ba0d
	u_int8_t		 type;
Packit e9ba0d
	u_int8_t		 unknown;
Packit e9ba0d
	u_int8_t		 tagged;
Packit e9ba0d
	u_int16_t		 vid;
Packit e9ba0d
	u_int8_t		 priority;
Packit e9ba0d
	u_int8_t		 dscp;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL(lldpd_med_policy);
Packit e9ba0d
Packit e9ba0d
struct lldpd_med_loc {
Packit e9ba0d
	u_int8_t		 index; /* Not used. */
Packit e9ba0d
	u_int8_t		 format;
Packit e9ba0d
	char			*data;
Packit e9ba0d
	int			 data_len;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_med_loc)
Packit e9ba0d
MARSHAL_FSTR(lldpd_med_loc, data, data_len)
Packit e9ba0d
MARSHAL_END(lldpd_med_loc);
Packit e9ba0d
Packit e9ba0d
struct lldpd_med_power {
Packit e9ba0d
	u_int8_t		 devicetype; /* PD or PSE */
Packit e9ba0d
	u_int8_t		 source;
Packit e9ba0d
	u_int8_t		 priority;
Packit e9ba0d
	u_int16_t		 val;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL(lldpd_med_power);
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_DOT3
Packit e9ba0d
struct lldpd_dot3_macphy {
Packit e9ba0d
	u_int8_t		 autoneg_support;
Packit e9ba0d
	u_int8_t		 autoneg_enabled;
Packit e9ba0d
	u_int16_t		 autoneg_advertised;
Packit e9ba0d
	u_int16_t		 mau_type;
Packit e9ba0d
};
Packit e9ba0d
Packit e9ba0d
struct lldpd_dot3_power {
Packit e9ba0d
	u_int8_t		devicetype;
Packit e9ba0d
	u_int8_t		supported;
Packit e9ba0d
	u_int8_t		enabled;
Packit e9ba0d
	u_int8_t		paircontrol;
Packit e9ba0d
	u_int8_t		pairs;
Packit e9ba0d
	u_int8_t		class;
Packit e9ba0d
	u_int8_t		powertype; /* If set to LLDP_DOT3_POWER_8023AT_OFF,
Packit e9ba0d
					      following fields have no meaning */
Packit e9ba0d
	u_int8_t		source;
Packit e9ba0d
	u_int8_t		priority;
Packit e9ba0d
	u_int16_t		requested;
Packit e9ba0d
	u_int16_t		allocated;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL(lldpd_dot3_power);
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
enum {
Packit e9ba0d
	LLDPD_AF_UNSPEC = 0,
Packit e9ba0d
	LLDPD_AF_IPV4,
Packit e9ba0d
	LLDPD_AF_IPV6,
Packit e9ba0d
	LLDPD_AF_LAST
Packit e9ba0d
};
Packit e9ba0d
Packit e9ba0d
inline static int
Packit e9ba0d
lldpd_af(int af)
Packit e9ba0d
{
Packit e9ba0d
	switch (af) {
Packit e9ba0d
	case LLDPD_AF_IPV4: return AF_INET;
Packit e9ba0d
	case LLDPD_AF_IPV6: return AF_INET6;
Packit e9ba0d
	case LLDPD_AF_LAST: return AF_MAX;
Packit e9ba0d
	default: return AF_UNSPEC;
Packit e9ba0d
	}
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
#define LLDPD_MGMT_MAXADDRSIZE	16 /* sizeof(struct in6_addr) */
Packit e9ba0d
union lldpd_address {
Packit e9ba0d
	struct in_addr		inet;
Packit e9ba0d
	struct in6_addr		inet6;
Packit e9ba0d
	u_int8_t		octets[LLDPD_MGMT_MAXADDRSIZE]; /* network byte order! */
Packit e9ba0d
};
Packit e9ba0d
struct lldpd_mgmt {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_mgmt) m_entries;
Packit e9ba0d
	int			m_family;
Packit e9ba0d
	union lldpd_address	m_addr;
Packit e9ba0d
	size_t 			m_addrsize;
Packit e9ba0d
	u_int32_t		m_iface;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_mgmt)
Packit e9ba0d
MARSHAL_TQE(lldpd_mgmt, m_entries)
Packit e9ba0d
MARSHAL_END(lldpd_mgmt);
Packit e9ba0d
Packit e9ba0d
struct lldpd_chassis {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_chassis) c_entries;
Packit e9ba0d
	u_int16_t		 c_refcount; /* Reference count by ports */
Packit e9ba0d
	u_int16_t		 c_index;    /* Monotonic index */
Packit e9ba0d
	u_int8_t		 c_protocol; /* Protocol used to get this chassis */
Packit e9ba0d
	u_int8_t	 	 c_id_subtype;
Packit e9ba0d
	char			*c_id;
Packit e9ba0d
	int			 c_id_len;
Packit e9ba0d
	char			*c_name;
Packit e9ba0d
	char			*c_descr;
Packit e9ba0d
Packit e9ba0d
	u_int16_t		 c_cap_available;
Packit e9ba0d
	u_int16_t		 c_cap_enabled;
Packit e9ba0d
Packit e9ba0d
	TAILQ_HEAD(, lldpd_mgmt) c_mgmt;
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
	u_int16_t		 c_med_cap_available;
Packit e9ba0d
	u_int8_t		 c_med_type;
Packit e9ba0d
	char			*c_med_hw;
Packit e9ba0d
	char			*c_med_fw;
Packit e9ba0d
	char			*c_med_sw;
Packit e9ba0d
	char			*c_med_sn;
Packit e9ba0d
	char			*c_med_manuf;
Packit e9ba0d
	char			*c_med_model;
Packit e9ba0d
	char			*c_med_asset;
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
};
Packit e9ba0d
/* WARNING: any change to this structure should also be reflected into
Packit e9ba0d
   `lldpd_copy_chassis()` which is not using marshaling. */
Packit e9ba0d
MARSHAL_BEGIN(lldpd_chassis)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_next)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_prev)
Packit e9ba0d
MARSHAL_FSTR(lldpd_chassis, c_id, c_id_len)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_name)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_descr)
Packit e9ba0d
MARSHAL_SUBTQ(lldpd_chassis, lldpd_mgmt, c_mgmt)
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_med_hw)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_med_fw)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_med_sw)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_med_sn)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_med_manuf)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_med_model)
Packit e9ba0d
MARSHAL_STR(lldpd_chassis, c_med_asset)
Packit e9ba0d
#endif
Packit e9ba0d
MARSHAL_END(lldpd_chassis);
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_CUSTOM
Packit e9ba0d
Packit e9ba0d
#define CUSTOM_TLV_ADD 		1
Packit e9ba0d
#define CUSTOM_TLV_REPLACE	2
Packit e9ba0d
#define CUSTOM_TLV_REMOVE	3
Packit e9ba0d
Packit e9ba0d
/* Custom TLV struct as defined on page 35 of IEEE 802.1AB-2005 */
Packit e9ba0d
struct lldpd_custom {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_custom)	next;	/* Pointer to next custom TLV */
Packit e9ba0d
Packit e9ba0d
	/* Organizationally Unique Identifier */
Packit e9ba0d
	u_int8_t		oui[LLDP_TLV_ORG_OUI_LEN];
Packit e9ba0d
	/* Organizationally Defined Subtype */
Packit e9ba0d
	u_int8_t		subtype;
Packit e9ba0d
	/* Organizationally Defined Information String */
Packit e9ba0d
	u_int8_t		*oui_info;
Packit e9ba0d
	/* Organizationally Defined Information String length */
Packit e9ba0d
	int			oui_info_len;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_custom)
Packit e9ba0d
MARSHAL_TQE(lldpd_custom, next)
Packit e9ba0d
MARSHAL_FSTR(lldpd_custom, oui_info, oui_info_len)
Packit e9ba0d
MARSHAL_END(lldpd_custom);
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
struct lldpd_port {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_port)	 p_entries;
Packit e9ba0d
	struct lldpd_chassis	*p_chassis;    /* Attached chassis */
Packit e9ba0d
	time_t			 p_lastchange; /* Time of last change of values */
Packit e9ba0d
	time_t			 p_lastupdate; /* Time of last update received */
Packit e9ba0d
	time_t			 p_lastremove;	/* Time of last removal of a remote port. Used for local ports only
Packit e9ba0d
						 * Used for deciding lldpStatsRemTablesLastChangeTime */
Packit e9ba0d
	struct lldpd_frame	*p_lastframe;  /* Frame received during last update */
Packit e9ba0d
	u_int8_t		 p_protocol;   /* Protocol used to get this port */
Packit e9ba0d
	u_int8_t		 p_hidden_in:1; /* Considered as hidden for reception */
Packit e9ba0d
	u_int8_t		 p_hidden_out:2; /* Considered as hidden for emission */
Packit e9ba0d
	u_int8_t		 p_disable_rx:3; /* Should RX be disabled for this port? */
Packit e9ba0d
	u_int8_t		 p_disable_tx:4; /* Should TX be disabled for this port? */
Packit e9ba0d
	/* Important: all fields that should be ignored to check if a port has
Packit e9ba0d
	 * been changed should be before this mark. */
Packit e9ba0d
#define LLDPD_PORT_START_MARKER (offsetof(struct lldpd_port, _p_hardware_flags))
Packit e9ba0d
	int			 _p_hardware_flags; /* This is a copy of hardware flags. Do not use it! */
Packit e9ba0d
	u_int8_t		 p_id_subtype;
Packit e9ba0d
	char			*p_id;
Packit e9ba0d
	int			 p_id_len;
Packit e9ba0d
	char			*p_descr;
Packit e9ba0d
	int			 p_descr_force; /* Description has been forced by user */
Packit e9ba0d
	u_int16_t		 p_mfs;
Packit e9ba0d
	u_int16_t		 p_ttl; /* TTL for remote port */
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_DOT3
Packit e9ba0d
	/* Dot3 stuff */
Packit e9ba0d
	u_int32_t		 p_aggregid;
Packit e9ba0d
	struct lldpd_dot3_macphy p_macphy;
Packit e9ba0d
	struct lldpd_dot3_power	 p_power;
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
	u_int16_t		 p_med_cap_enabled;
Packit e9ba0d
	struct lldpd_med_policy	 p_med_policy[LLDP_MED_APPTYPE_LAST];
Packit e9ba0d
	struct lldpd_med_loc	 p_med_location[LLDP_MED_LOCFORMAT_LAST];
Packit e9ba0d
	struct lldpd_med_power	 p_med_power;
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_DOT1
Packit e9ba0d
	u_int16_t		 p_pvid;
Packit e9ba0d
	TAILQ_HEAD(, lldpd_vlan) p_vlans;
Packit e9ba0d
	TAILQ_HEAD(, lldpd_ppvid) p_ppvids;
Packit e9ba0d
	TAILQ_HEAD(, lldpd_pi)	  p_pids;
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_CUSTOM
Packit e9ba0d
	TAILQ_HEAD(, lldpd_custom) p_custom_list;
Packit e9ba0d
#endif
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_port)
Packit e9ba0d
MARSHAL_TQE(lldpd_port, p_entries)
Packit e9ba0d
MARSHAL_POINTER(lldpd_port, lldpd_chassis, p_chassis)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_port, p_lastframe)
Packit e9ba0d
MARSHAL_FSTR(lldpd_port, p_id, p_id_len)
Packit e9ba0d
MARSHAL_STR(lldpd_port, p_descr)
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[0])
Packit e9ba0d
MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[1])
Packit e9ba0d
MARSHAL_SUBSTRUCT(lldpd_port, lldpd_med_loc, p_med_location[2])
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_DOT1
Packit e9ba0d
MARSHAL_SUBTQ(lldpd_port, lldpd_vlan, p_vlans)
Packit e9ba0d
MARSHAL_SUBTQ(lldpd_port, lldpd_ppvid, p_ppvids)
Packit e9ba0d
MARSHAL_SUBTQ(lldpd_port, lldpd_pi, p_pids)
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_CUSTOM
Packit e9ba0d
MARSHAL_SUBTQ(lldpd_port, lldpd_custom, p_custom_list)
Packit e9ba0d
#endif
Packit e9ba0d
MARSHAL_END(lldpd_port);
Packit e9ba0d
Packit e9ba0d
/* Used to modify some port related settings */
Packit e9ba0d
#define LLDPD_RXTX_UNCHANGED 0
Packit e9ba0d
#define LLDPD_RXTX_TXONLY 1
Packit e9ba0d
#define LLDPD_RXTX_RXONLY 2
Packit e9ba0d
#define LLDPD_RXTX_DISABLED 3
Packit e9ba0d
#define LLDPD_RXTX_BOTH 4
Packit e9ba0d
#define LLDPD_RXTX_FROM_PORT(p) (((p)->p_disable_rx && (p)->p_disable_tx)?LLDPD_RXTX_DISABLED: \
Packit e9ba0d
	    ((p)->p_disable_rx && !(p)->p_disable_tx)?LLDPD_RXTX_TXONLY:	\
Packit e9ba0d
	    (!(p)->p_disable_rx && (p)->p_disable_tx)?LLDPD_RXTX_RXONLY:	\
Packit e9ba0d
	    LLDPD_RXTX_BOTH)
Packit e9ba0d
#define LLDPD_RXTX_RXENABLED(v) ((v) == LLDPD_RXTX_RXONLY || (v) == LLDPD_RXTX_BOTH)
Packit e9ba0d
#define LLDPD_RXTX_TXENABLED(v) ((v) == LLDPD_RXTX_TXONLY || (v) == LLDPD_RXTX_BOTH)
Packit e9ba0d
struct lldpd_port_set {
Packit e9ba0d
	char *ifname;
Packit e9ba0d
	char *local_id;
Packit e9ba0d
	char *local_descr;
Packit e9ba0d
	int rxtx;
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
	struct lldpd_med_policy *med_policy;
Packit e9ba0d
	struct lldpd_med_loc    *med_location;
Packit e9ba0d
	struct lldpd_med_power  *med_power;
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_DOT3
Packit e9ba0d
	struct lldpd_dot3_power *dot3_power;
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_CUSTOM
Packit e9ba0d
	struct lldpd_custom     *custom;
Packit e9ba0d
	int custom_list_clear;
Packit e9ba0d
	int custom_tlv_op;
Packit e9ba0d
#endif
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_port_set)
Packit e9ba0d
MARSHAL_STR(lldpd_port_set, ifname)
Packit e9ba0d
MARSHAL_STR(lldpd_port_set, local_id)
Packit e9ba0d
MARSHAL_STR(lldpd_port_set, local_descr)
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
MARSHAL_POINTER(lldpd_port_set, lldpd_med_policy, med_policy)
Packit e9ba0d
MARSHAL_POINTER(lldpd_port_set, lldpd_med_loc,    med_location)
Packit e9ba0d
MARSHAL_POINTER(lldpd_port_set, lldpd_med_power,  med_power)
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_DOT3
Packit e9ba0d
MARSHAL_POINTER(lldpd_port_set, lldpd_dot3_power, dot3_power)
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_CUSTOM
Packit e9ba0d
MARSHAL_POINTER(lldpd_port_set, lldpd_custom,     custom)
Packit e9ba0d
#endif
Packit e9ba0d
MARSHAL_END(lldpd_port_set);
Packit e9ba0d
Packit e9ba0d
/* Smart mode / Hide mode */
Packit e9ba0d
#define SMART_INCOMING_FILTER		(1<<0) /* Incoming filtering enabled */
Packit e9ba0d
#define SMART_INCOMING_ONE_PROTO	(1<<1) /* On reception, keep only one proto */
Packit e9ba0d
#define SMART_INCOMING_ONE_NEIGH	(1<<2) /* On reception, keep only one neighbor */
Packit e9ba0d
#define SMART_OUTGOING_FILTER		(1<<3) /* Outgoing filtering enabled */
Packit e9ba0d
#define SMART_OUTGOING_ONE_PROTO	(1<<4) /* On emission, keep only one proto */
Packit e9ba0d
#define SMART_OUTGOING_ONE_NEIGH	(1<<5) /* On emission, consider only one neighbor */
Packit e9ba0d
#define SMART_INCOMING (SMART_INCOMING_FILTER |    \
Packit e9ba0d
			 SMART_INCOMING_ONE_PROTO | \
Packit e9ba0d
			 SMART_INCOMING_ONE_NEIGH)
Packit e9ba0d
#define SMART_OUTGOING (SMART_OUTGOING_FILTER |		\
Packit e9ba0d
			SMART_OUTGOING_ONE_PROTO |	\
Packit e9ba0d
			SMART_OUTGOING_ONE_NEIGH)
Packit e9ba0d
Packit e9ba0d
struct lldpd_config {
Packit e9ba0d
	int c_paused;	        /* lldpd is paused */
Packit e9ba0d
	int c_tx_interval;	/* Transmit interval */
Packit e9ba0d
	int c_ttl;		/* TTL */
Packit e9ba0d
	int c_smart;		/* Bitmask for smart configuration (see SMART_*) */
Packit e9ba0d
	int c_receiveonly;	/* Receive only mode */
Packit e9ba0d
	int c_max_neighbors;	/* Maximum number of neighbors (per protocol) */
Packit e9ba0d
Packit e9ba0d
	char *c_mgmt_pattern;	/* Pattern to match a management address */
Packit e9ba0d
	char *c_cid_pattern;	/* Pattern to match interfaces to use for chassis ID */
Packit e9ba0d
	char *c_cid_string;     /* User defined string for chassis ID */
Packit e9ba0d
	char *c_iface_pattern;	/* Pattern to match interfaces to use */
Packit e9ba0d
	char *c_perm_ifaces;	/* Pattern to match interfaces to keep */
Packit e9ba0d
Packit e9ba0d
	char *c_platform;	/* Override platform description (for CDP) */
Packit e9ba0d
	char *c_description;	/* Override chassis description */
Packit e9ba0d
	char *c_hostname;	/* Override system name */
Packit e9ba0d
	int c_advertise_version; /* Should the precise version be advertised? */
Packit e9ba0d
	int c_set_ifdescr;	 /* Set interface description */
Packit e9ba0d
	int c_promisc;		 /* Interfaces should be in promiscuous mode */
Packit e9ba0d
	int c_cap_advertise;	 /* Chassis capabilities advertisement */
Packit e9ba0d
	int c_mgmt_advertise;	 /* Management addresses advertisement */
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
	int c_noinventory;	/* Don't send inventory with LLDP-MED */
Packit e9ba0d
	int c_enable_fast_start; /* enable fast start */
Packit e9ba0d
	int c_tx_fast_init;	/* Num of lldpd lldppdu's for fast start */
Packit e9ba0d
	int c_tx_fast_interval;	/* Time intr between sends during fast start */
Packit e9ba0d
#endif
Packit e9ba0d
	int c_tx_hold;		/* Transmit hold */
Packit e9ba0d
	int c_bond_slave_src_mac_type; /* Src mac type in lldp frames over bond
Packit e9ba0d
					  slaves */
Packit e9ba0d
	int c_lldp_portid_type; /* The PortID type */
Packit e9ba0d
	int c_lldp_agent_type;	/* The agent type */
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_config)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_mgmt_pattern)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_cid_pattern)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_cid_string)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_iface_pattern)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_perm_ifaces)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_hostname)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_platform)
Packit e9ba0d
MARSHAL_STR(lldpd_config, c_description)
Packit e9ba0d
MARSHAL_END(lldpd_config);
Packit e9ba0d
Packit e9ba0d
struct lldpd_frame {
Packit e9ba0d
	int size;
Packit e9ba0d
	unsigned char frame[1];
Packit e9ba0d
};
Packit e9ba0d
Packit e9ba0d
struct lldpd_hardware;
Packit e9ba0d
struct lldpd;
Packit e9ba0d
struct lldpd_ops {
Packit e9ba0d
	int(*send)(struct lldpd *,
Packit e9ba0d
		   struct lldpd_hardware*,
Packit e9ba0d
		   char *, size_t); /* Function to send a frame */
Packit e9ba0d
	int(*recv)(struct lldpd *,
Packit e9ba0d
		   struct lldpd_hardware*,
Packit e9ba0d
		   int, char *, size_t); /* Function to receive a frame */
Packit e9ba0d
	int(*cleanup)(struct lldpd *, struct lldpd_hardware *); /* Cleanup function. */
Packit e9ba0d
};
Packit e9ba0d
Packit e9ba0d
/* An interface is uniquely identified by h_ifindex, h_ifname and h_ops. This
Packit e9ba0d
 * means if an interface becomes enslaved, it will be considered as a new
Packit e9ba0d
 * interface. The same applies for renaming and we include the index in case of
Packit e9ba0d
 * renaming to an existing interface. */
Packit e9ba0d
struct lldpd_hardware {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_hardware)	 h_entries;
Packit e9ba0d
Packit e9ba0d
	struct lldpd		*h_cfg;	    /* Pointer to main configuration */
Packit e9ba0d
	void			*h_recv;    /* FD for reception */
Packit e9ba0d
	int			 h_sendfd;  /* FD for sending, only used by h_ops */
Packit e9ba0d
	int			 h_mangle;  /* 1 if we have to mangle the MAC address */
Packit e9ba0d
	struct lldpd_ops	*h_ops;	    /* Hardware-dependent functions */
Packit e9ba0d
	void			*h_data;    /* Hardware-dependent data */
Packit e9ba0d
	void			*h_timer;   /* Timer for this port */
Packit e9ba0d
Packit e9ba0d
	int			 h_mtu;
Packit e9ba0d
	int			 h_flags; /* Packets will be sent only
Packit e9ba0d
					     if IFF_RUNNING. Will be
Packit e9ba0d
					     removed if this is left
Packit e9ba0d
					     to 0. */
Packit e9ba0d
	int			 h_ifindex; /* Interface index, used by SNMP */
Packit e9ba0d
	char			 h_ifname[IFNAMSIZ]; /* Should be unique */
Packit e9ba0d
	u_int8_t		 h_lladdr[ETHER_ADDR_LEN];
Packit e9ba0d
Packit e9ba0d
	u_int64_t		 h_tx_cnt;
Packit e9ba0d
	u_int64_t		 h_rx_cnt;
Packit e9ba0d
	u_int64_t		 h_rx_discarded_cnt;
Packit e9ba0d
	u_int64_t		 h_rx_unrecognized_cnt;
Packit e9ba0d
	u_int64_t		 h_ageout_cnt;
Packit e9ba0d
	u_int64_t		 h_insert_cnt;
Packit e9ba0d
	u_int64_t		 h_delete_cnt;
Packit e9ba0d
	u_int64_t		 h_drop_cnt;
Packit e9ba0d
Packit e9ba0d
	/* Previous values of different stuff. */
Packit e9ba0d
	/* Backup of the previous local port. Used to check if there was a
Packit e9ba0d
	 * change to send an immediate update. All those are not marshalled to
Packit e9ba0d
	 * the client. */
Packit e9ba0d
	void			*h_lport_previous;
Packit e9ba0d
	ssize_t			 h_lport_previous_len;
Packit e9ba0d
	/* Backup of the previous chassis ID. Used to check if there was a
Packit e9ba0d
	 * change and send an LLDP shutdown. */
Packit e9ba0d
	u_int8_t	 	 h_lchassis_previous_id_subtype;
Packit e9ba0d
	char			*h_lchassis_previous_id;
Packit e9ba0d
	int			 h_lchassis_previous_id_len;
Packit e9ba0d
	/* Backup of the previous port ID. Used to check if there was a change
Packit e9ba0d
	 * and send an LLDP shutdown. */
Packit e9ba0d
	u_int8_t		 h_lport_previous_id_subtype;
Packit e9ba0d
	char			*h_lport_previous_id;
Packit e9ba0d
	int			 h_lport_previous_id_len;
Packit e9ba0d
Packit e9ba0d
	struct lldpd_port	 h_lport;  /* Port attached to this hardware port */
Packit e9ba0d
	TAILQ_HEAD(, lldpd_port) h_rports; /* Remote ports */
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_LLDPMED
Packit e9ba0d
	int			h_tx_fast; /* current tx fast start count */
Packit e9ba0d
#endif
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_hardware)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_next)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_prev)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_ops)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_data)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_cfg)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lport_previous)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_len)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id_subtype)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lchassis_previous_id_len)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id_subtype)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id)
Packit e9ba0d
MARSHAL_IGNORE(lldpd_hardware, h_lport_previous_id_len)
Packit e9ba0d
MARSHAL_SUBSTRUCT(lldpd_hardware, lldpd_port, h_lport)
Packit e9ba0d
MARSHAL_SUBTQ(lldpd_hardware, lldpd_port, h_rports)
Packit e9ba0d
MARSHAL_END(lldpd_hardware);
Packit e9ba0d
Packit e9ba0d
struct lldpd_interface {
Packit e9ba0d
	TAILQ_ENTRY(lldpd_interface) next;
Packit e9ba0d
	char			*name;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_interface)
Packit e9ba0d
MARSHAL_TQE(lldpd_interface, next)
Packit e9ba0d
MARSHAL_STR(lldpd_interface, name)
Packit e9ba0d
MARSHAL_END(lldpd_interface);
Packit e9ba0d
TAILQ_HEAD(lldpd_interface_list, lldpd_interface);
Packit e9ba0d
MARSHAL_TQ(lldpd_interface_list, lldpd_interface);
Packit e9ba0d
Packit e9ba0d
struct lldpd_neighbor_change {
Packit e9ba0d
	char *ifname;
Packit e9ba0d
#define NEIGHBOR_CHANGE_DELETED -1
Packit e9ba0d
#define NEIGHBOR_CHANGE_ADDED    1
Packit e9ba0d
#define NEIGHBOR_CHANGE_UPDATED  0
Packit e9ba0d
	int state;
Packit e9ba0d
	struct lldpd_port *neighbor;
Packit e9ba0d
};
Packit e9ba0d
MARSHAL_BEGIN(lldpd_neighbor_change)
Packit e9ba0d
MARSHAL_STR(lldpd_neighbor_change, ifname)
Packit e9ba0d
MARSHAL_POINTER(lldpd_neighbor_change, lldpd_port, neighbor)
Packit e9ba0d
MARSHAL_END(lldpd_neighbor_change);
Packit e9ba0d
Packit e9ba0d
/* Cleanup functions */
Packit e9ba0d
void	 lldpd_chassis_mgmt_cleanup(struct lldpd_chassis *);
Packit e9ba0d
void	 lldpd_chassis_cleanup(struct lldpd_chassis *, int);
Packit e9ba0d
void	 lldpd_remote_cleanup(struct lldpd_hardware *,
Packit e9ba0d
    void(*expire)(struct lldpd_hardware *, struct lldpd_port *),
Packit e9ba0d
    int);
Packit e9ba0d
void	 lldpd_port_cleanup(struct lldpd_port *, int);
Packit e9ba0d
void	 lldpd_config_cleanup(struct lldpd_config *);
Packit e9ba0d
#ifdef ENABLE_DOT1
Packit e9ba0d
void	 lldpd_ppvid_cleanup(struct lldpd_port *);
Packit e9ba0d
void	 lldpd_vlan_cleanup(struct lldpd_port *);
Packit e9ba0d
void	 lldpd_pi_cleanup(struct lldpd_port *);
Packit e9ba0d
#endif
Packit e9ba0d
#ifdef ENABLE_CUSTOM
Packit e9ba0d
void     lldpd_custom_tlv_cleanup(struct lldpd_port *, struct lldpd_custom *);
Packit e9ba0d
void     lldpd_custom_tlv_add(struct lldpd_port *, struct lldpd_custom *);
Packit e9ba0d
void     lldpd_custom_list_cleanup(struct lldpd_port *);
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
#endif