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