linux-firmware-wl18xx-20190815-r0.noarch
linux-firmware-wlcommon-20190815-r0.noarch
linux-libc-headers-dev-5.0-r0.corei7_64
-lldpd-0.9.8-r0.corei7_64
+lldpd-0.9.0-r0.corei7_64
locale-base-en-gb-2.29-r0.corei7_64
locale-base-en-us-2.29-r0.corei7_64
localedef-2.29-r0.corei7_64
linux-firmware-wl18xx-20190815-r0.noarch
linux-firmware-wlcommon-20190815-r0.noarch
linux-libc-headers-dev-5.0-r0.corei7_64
-lldpd-0.9.8-r0.corei7_64
+lldpd-0.9.0-r0.corei7_64
locale-base-en-gb-2.29-r0.corei7_64
locale-base-en-us-2.29-r0.corei7_64
localedef-2.29-r0.corei7_64
PREFERRED_VERSION_ruby-native = "2.0.0-p648"
PREFERRED_VERSION_puppet = "4.8.2"
PREFERRED_VERSION_python-eventlet = "0.18.4"
+PREFERRED_VERSION_lldpd = "0.9.0"
+++ /dev/null
-From 0e355867f211a922c5b21ddbbb073eb2c35430b9 Mon Sep 17 00:00:00 2001
-From: "Sar Ashki, Babak" <Babak.SarAshki@windriver.com>
-Date: Mon, 24 Feb 2020 06:01:03 -0800
-Subject: [PATCH] lldpd client add show interfaces cmd from upstream
-
-commit a54f6012efff77c966f533b8ef35b8627e3c8212
----
- src/client/client.h | 2 +
- src/client/display.c | 99 ++++++++++++++++++++++++++++++++++-------
- src/client/lldpcli.8.in | 20 +++++++++
- src/client/show.c | 44 ++++++++++++++++++
- src/daemon/lldpd.c | 1 +
- 5 files changed, 151 insertions(+), 15 deletions(-)
-
-diff --git a/src/client/client.h b/src/client/client.h
-index e3ee352..8da3e3f 100644
---- a/src/client/client.h
-+++ b/src/client/client.h
-@@ -131,6 +131,8 @@ void display_interfaces_stats(lldpctl_conn_t *, struct writer *,
- struct cmd_env *);
- void display_interface_stats(lldpctl_conn_t *, struct writer *,
- lldpctl_atom_t *);
-+void display_local_interfaces(lldpctl_conn_t *, struct writer *,
-+ struct cmd_env *, int, int);
-
-
-
-diff --git a/src/client/display.c b/src/client/display.c
-index cbd0e31..2769890 100644
---- a/src/client/display.c
-+++ b/src/client/display.c
-@@ -349,7 +349,8 @@ display_port(struct writer *w, lldpctl_atom_t *port, int details)
-
- tag_datatag(w, "descr", "PortDescr",
- lldpctl_atom_get_str(port, lldpctl_k_port_descr));
-- if (details)
-+ if (details &&
-+ lldpctl_atom_get_int(port, lldpctl_k_port_ttl) > 0)
- tag_datatag(w, "ttl", "TTL",
- lldpctl_atom_get_str(port, lldpctl_k_port_ttl));
-
-@@ -473,6 +474,38 @@ display_port(struct writer *w, lldpctl_atom_t *port, int details)
- tag_end(w);
- }
-
-+static void
-+display_local_ttl(struct writer *w, lldpctl_conn_t *conn, int details)
-+{
-+ char *ttl;
-+ long int tx_hold;
-+ long int tx_interval;
-+
-+ lldpctl_atom_t *configuration;
-+ configuration = lldpctl_get_configuration(conn);
-+ if (!configuration) {
-+ log_warnx("lldpctl", "not able to get configuration. %s",
-+ lldpctl_last_strerror(conn));
-+ return;
-+ }
-+
-+ tx_hold = lldpctl_atom_get_int(configuration, lldpctl_k_config_tx_hold);
-+ tx_interval = lldpctl_atom_get_int(configuration, lldpctl_k_config_tx_interval);
-+
-+ if (asprintf(&ttl, "%lu", tx_hold*tx_interval) == -1) {
-+ log_warnx("lldpctl", "not enough memory to build TTL.");
-+ goto end;
-+ }
-+
-+ tag_start(w, "ttl", "TTL");
-+ tag_attr(w, "ttl", "", ttl);
-+ tag_end(w);
-+ free(ttl);
-+end:
-+ lldpctl_atom_dec_ref(configuration);
-+ return;
-+}
-+
- static void
- display_vlans(struct writer *w, lldpctl_atom_t *port)
- {
-@@ -582,43 +615,51 @@ display_local_chassis(lldpctl_conn_t *conn, struct writer *w,
-
- void
- display_interface(lldpctl_conn_t *conn, struct writer *w, int hidden,
-- lldpctl_atom_t *iface, lldpctl_atom_t *neighbor, int details, int protocol)
-+ lldpctl_atom_t *iface, lldpctl_atom_t *port, int details, int protocol)
- {
-+ int local = 0;
-+
- if (!hidden &&
-- lldpctl_atom_get_int(neighbor, lldpctl_k_port_hidden))
-+ lldpctl_atom_get_int(port, lldpctl_k_port_hidden))
- return;
-
- /* user might have specified protocol to filter on display */
- if ((protocol != LLDPD_MODE_MAX) &&
-- (protocol != lldpctl_atom_get_int(neighbor, lldpctl_k_port_protocol)))
-+ (protocol != lldpctl_atom_get_int(port, lldpctl_k_port_protocol)))
- return;
-
-- lldpctl_atom_t *chassis = lldpctl_atom_get(neighbor, lldpctl_k_port_chassis);
-+ /* Infer local / remote port from the port index (remote == 0) */
-+ local = lldpctl_atom_get_int(port, lldpctl_k_port_index)>0?1:0;
-+
-+ lldpctl_atom_t *chassis = lldpctl_atom_get(port, lldpctl_k_port_chassis);
-
- tag_start(w, "interface", "Interface");
- tag_attr(w, "name", "",
- lldpctl_atom_get_str(iface, lldpctl_k_interface_name));
- tag_attr(w, "via" , "via",
-- lldpctl_atom_get_str(neighbor, lldpctl_k_port_protocol));
-+ lldpctl_atom_get_str(port, lldpctl_k_port_protocol));
- if (details > DISPLAY_BRIEF) {
-- tag_attr(w, "rid" , "RID",
-- lldpctl_atom_get_str(chassis, lldpctl_k_chassis_index));
-+ if (!local)
-+ tag_attr(w, "rid" , "RID",
-+ lldpctl_atom_get_str(chassis, lldpctl_k_chassis_index));
- tag_attr(w, "age" , "Time",
-- display_age(lldpctl_atom_get_int(neighbor, lldpctl_k_port_age)));
-+ display_age(lldpctl_atom_get_int(port, lldpctl_k_port_age)));
- }
-
- display_chassis(w, chassis, details);
-- display_port(w, neighbor, details);
-+ display_port(w, port, details);
-+ if (details && local)
-+ display_local_ttl(w, conn, details);
- if (details == DISPLAY_DETAILS) {
-- display_vlans(w, neighbor);
-- display_ppvids(w, neighbor);
-- display_pids(w, neighbor);
-- display_med(w, neighbor, chassis);
-+ display_vlans(w, port);
-+ display_ppvids(w, port);
-+ display_pids(w, port);
-+ display_med(w, port, chassis);
- }
-
- lldpctl_atom_dec_ref(chassis);
-
-- display_custom_tlvs(w, neighbor);
-+ display_custom_tlvs(w, port);
-
- tag_end(w);
- }
-@@ -675,6 +716,34 @@ display_interfaces(lldpctl_conn_t *conn, struct writer *w,
- tag_end(w);
- }
-
-+
-+/**
-+ * Display information about local interfaces.
-+ *
-+ * @param conn Connection to lldpd.
-+ * @param w Writer.
-+ * @param hidden Whatever to show hidden ports.
-+ * @param env Environment from which we may find the list of ports.
-+ * @param details Level of details we need (DISPLAY_*).
-+ */
-+void
-+display_local_interfaces(lldpctl_conn_t *conn, struct writer *w,
-+ struct cmd_env *env,
-+ int hidden, int details)
-+{
-+ lldpctl_atom_t *iface;
-+ int protocol = LLDPD_MODE_MAX;
-+
-+ tag_start(w, "lldp", "LLDP interfaces");
-+ while ((iface = cmd_iterate_on_interfaces(conn, env))) {
-+ lldpctl_atom_t *port;
-+ port = lldpctl_get_port(iface);
-+ display_interface(conn, w, hidden, iface, port, details, protocol);
-+ lldpctl_atom_dec_ref(port);
-+ }
-+ tag_end(w);
-+ }
-+
- void
- display_stat(struct writer *w, const char *tag, const char *descr,
- long unsigned int cnt)
-diff --git a/src/client/lldpcli.8.in b/src/client/lldpcli.8.in
-index 1a20fa8..8a4123e 100644
---- a/src/client/lldpcli.8.in
-+++ b/src/client/lldpcli.8.in
-@@ -134,6 +134,26 @@ one or several ports, the information displayed is limited to the
- given list of ports.
- .Ed
-
-+.Cd show interfaces
-+.Op ports Ar ethX Op ,...
-+.Op Cd details | summary
-+.Op Cd hidden
-+.Bd -ragged -offset XXXXXX
-+Display information about each local interface known by
-+.Xr lldpd 8
-+daemon. With
-+.Cd summary ,
-+only the name and the port description of each local interface will be
-+displayed. On the other hand, with
-+.Cd details ,
-+all available information will be displayed, giving a verbose
-+view. When using
-+.Cd hidden ,
-+also display local ports hidden by the smart filter. When specifying
-+one or several ports, the information displayed is limited to the
-+given list of ports.
-+.Ed
-+
- .Cd show chassis
- .Op Cd details | summary
- .Bd -ragged -offset XXXXXX
-diff --git a/src/client/show.c b/src/client/show.c
-index fa704b8..8ba8acb 100644
---- a/src/client/show.c
-+++ b/src/client/show.c
-@@ -48,6 +48,35 @@ cmd_show_neighbors(struct lldpctl_conn_t *conn, struct writer *w,
- return 1;
- }
-
-+/**
-+ * Show interfaces.
-+ *
-+ * The environment will contain the following keys:
-+ * - C{ports} list of ports we want to restrict showing.
-+ * - C{hidden} if we should show hidden ports.
-+ * - C{summary} if we want to show only a summary
-+ * - C{detailed} for a detailed overview
-+ */
-+static int
-+cmd_show_interfaces(struct lldpctl_conn_t *conn, struct writer *w,
-+ struct cmd_env *env, void *arg)
-+{
-+ log_debug("lldpctl", "show interfaces data (%s) %s hidden interfaces",
-+ cmdenv_get(env, "summary")?"summary":
-+ cmdenv_get(env, "detailed")?"detailed":
-+ "normal", cmdenv_get(env, "hidden")?"with":"without");
-+ if (cmdenv_get(env, "ports"))
-+ log_debug("lldpctl", "restrict to the following ports: %s",
-+ cmdenv_get(env, "ports"));
-+
-+ display_local_interfaces(conn, w, env, !!cmdenv_get(env, "hidden"),
-+ cmdenv_get(env, "summary")?DISPLAY_BRIEF:
-+ cmdenv_get(env, "detailed")?DISPLAY_DETAILS:
-+ DISPLAY_NORMAL);
-+
-+ return 1;
-+}
-+
- /**
- * Show chassis.
- *
-@@ -286,6 +315,12 @@ register_commands_show(struct cmd_node *root)
- "Show neighbors data",
- NULL, NULL, NULL);
-
-+ struct cmd_node *interfaces = commands_new(
-+ show,
-+ "interfaces",
-+ "Show interfaces data",
-+ NULL, NULL, NULL);
-+
- struct cmd_node *chassis = commands_new(
- show,
- "chassis",
-@@ -306,6 +341,15 @@ register_commands_show(struct cmd_node *root)
-
- register_common_commands(neighbors, 1);
-
-+ /* Interfaces data */
-+ commands_new(interfaces,
-+ NEWLINE,
-+ "Show interfaces data",
-+ NULL, cmd_show_interfaces, NULL);
-+
-+ cmd_restrict_ports(interfaces);
-+ register_common_commands(interfaces, 0);
-+
- /* Chassis data */
- commands_new(chassis,
- NEWLINE,
-diff --git a/src/daemon/lldpd.c b/src/daemon/lldpd.c
-index 97df38e..8ce38a9 100644
---- a/src/daemon/lldpd.c
-+++ b/src/daemon/lldpd.c
-@@ -1037,6 +1037,7 @@ lldpd_send(struct lldpd_hardware *hardware)
- cfg->g_protocols[i].name);
- cfg->g_protocols[i].send(cfg,
- hardware);
-+ hardware->h_lport.p_protocol = cfg->g_protocols[i].mode;
- sent++;
- break;
- }
---
-2.23.0
-
+++ /dev/null
-From 461e728e8bd71529c09a113f2610766be61aa50a Mon Sep 17 00:00:00 2001
-From: "Sar Ashki, Babak" <Babak.SarAshki@windriver.com>
-Date: Mon, 24 Feb 2020 05:06:57 -0800
-Subject: [PATCH 2/2] Clear station bit if any other capability is enabled
-
-From stx.3.0 b2ed14edc66c7876cd9239a346b92630403e996c
----
- src/daemon/interfaces.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/daemon/interfaces.c b/src/daemon/interfaces.c
-index d004c70..b870a46 100644
---- a/src/daemon/interfaces.c
-+++ b/src/daemon/interfaces.c
-@@ -328,6 +328,9 @@ interfaces_helper_chassis(struct lldpd *cfg,
- if ((LOCAL_CHASSIS(cfg)->c_cap_available & LLDP_CAP_STATION) &&
- (LOCAL_CHASSIS(cfg)->c_cap_enabled == 0))
- LOCAL_CHASSIS(cfg)->c_cap_enabled = LLDP_CAP_STATION;
-+ else if (LOCAL_CHASSIS(cfg)->c_cap_enabled != LLDP_CAP_STATION)
-+ LOCAL_CHASSIS(cfg)->c_cap_enabled &= ~LLDP_CAP_STATION;
-+
-
- if (LOCAL_CHASSIS(cfg)->c_id != NULL &&
- LOCAL_CHASSIS(cfg)->c_id_subtype == LLDP_CHASSISID_SUBTYPE_LLADDR)
---
-2.23.0
-
+++ /dev/null
-#!/bin/bash
-################################################################################
-# Copyright (c) 2016 Wind River Systems, Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-################################################################################
-
-# Certain i40e network devices (XL710 Fortville) have an internal firmware LLDP
-# agent enabled by default. This can prevent LLDP PDUs from being processed by
-# the driver and any upper layer agents.
-#
-# This script allows a user to enable and disable the internal LLDP agent.
-#
-# Note: debugfs must be enabled in the kernel
-#
-# To enable:
-# ./i40e-lldp-configure.sh start
-#
-# To disable:
-# ./i40e-lldp-configure.sh stop
-
-PROGNAME=$(basename $0)
-DEBUGFS_PATH=/sys/kernel/debug
-DEBUGFS_I40_DEVICES_PATH=$DEBUGFS_PATH/i40e
-LLDP_COMMAND=lldp
-
-function log {
- local MSG="${PROGNAME}: $1"
- logger -p notice "${MSG}"
-}
-
-function err {
- local MSG="${PROGNAME}: $1"
- logger -p error "${MSG}"
-}
-
-function configure_device {
- local DEVICE=$1
- local ACTION=$2
- local DEVICE_PATH=${DEBUGFS_I40_DEVICES}/${DEVICE}
-
- if [ ! -d ${DEVICE_PATH} ]; then
- return 1
- fi
-
- echo "${LLDP_COMMAND} ${ACTION}" > ${DEVICE_PATH}/command
- RET=$?
-
- if [ ${RET} -ne 0 ]; then
- err "Failed to ${ACTION} internal LLDP agent for device ${DEVICE}"
- return ${RET}
- fi
-
- log "${ACTION} internal LLDP agent for device ${DEVICE}"
- return ${RET}
-}
-
-function is_debugfs_mounted {
- if grep -qs "${DEBUGFS_PATH}" /proc/mounts; then
- return 0
- fi
- return 1
-}
-
-function mount_debugfs {
- mount -t debugfs none ${DEBUGFS_PATH}
-}
-
-function unmount_debugfs {
- umount ${DEBUGFS_PATH}
-}
-
-function scan_devices {
- local ACTION=$1
- local DEBUGFS_MOUNTED="false"
- local DEVICES=${DEBUGFS_I40_DEVICES_PATH}/*
-
- if is_debugfs_mounted; then
- DEBUGFS_MOUNTED="true"
- fi
-
- if [ ${DEBUGFS_MOUNTED} = "false" ]; then
- mount_debugfs
- RET=$?
- if [ ${RET} -ne 0 ]; then
- err "Failed to mount debugfs"
- return ${RET}
- fi
- log "Mounted debugfs"
- fi
-
- for DEVICE in $DEVICES; do
- configure_device ${DEVICE} ${ACTION}
- done
-
- if [ ${DEBUGFS_MOUNTED} = "false" ]; then
- unmount_debugfs
- RET=$?
- if [ ${RET} -ne 0 ]; then
- err "Failed to unmount debugfs"
- return ${RET}
- fi
- log "Unmounted debugfs"
- fi
-
- return 0
-}
-
-function start {
- scan_devices start
- return $?
-}
-
-function stop {
- scan_devices stop
- return $?
-}
-
-function status {
- return 0
-}
-
-case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- stop
- start
- ;;
- status)
- status
- ;;
- *)
- echo "Usage: $0 {start|stop|restart|status}"
- exit 1
-esac
+++ /dev/null
-From b2ed14edc66c7876cd9239a346b92630403e996c Mon Sep 17 00:00:00 2001
-From: Steven Webster <steven.webster@windriver.com>
-Date: Sun, 18 Jun 2017 22:23:49 -0400
-Subject: [PATCH 1/1] Clear station bit if any other capability is enabled
-
----
- src/daemon/interfaces.c | 2 ++
- src/daemon/lldpd.c | 2 ++
- 2 files changed, 4 insertions(+)
-
-diff --git a/src/daemon/interfaces.c b/src/daemon/interfaces.c
-index ec81721..4923049 100644
---- a/src/daemon/interfaces.c
-+++ b/src/daemon/interfaces.c
-@@ -309,6 +309,8 @@ interfaces_helper_chassis(struct lldpd *cfg,
- if ((LOCAL_CHASSIS(cfg)->c_cap_available & LLDP_CAP_STATION) &&
- (LOCAL_CHASSIS(cfg)->c_cap_enabled == 0))
- LOCAL_CHASSIS(cfg)->c_cap_enabled = LLDP_CAP_STATION;
-+ else if (LOCAL_CHASSIS(cfg)->c_cap_enabled != LLDP_CAP_STATION)
-+ LOCAL_CHASSIS(cfg)->c_cap_enabled &= ~LLDP_CAP_STATION;
-
- if (LOCAL_CHASSIS(cfg)->c_id != NULL &&
- LOCAL_CHASSIS(cfg)->c_id_subtype == LLDP_CHASSISID_SUBTYPE_LLADDR)
-diff --git a/src/daemon/lldpd.c b/src/daemon/lldpd.c
-index c815705..dac633f 100644
---- a/src/daemon/lldpd.c
-+++ b/src/daemon/lldpd.c
-@@ -1152,6 +1152,8 @@ lldpd_update_localchassis(struct lldpd *cfg)
- if ((LOCAL_CHASSIS(cfg)->c_cap_available & LLDP_CAP_STATION) &&
- (LOCAL_CHASSIS(cfg)->c_cap_enabled == 0))
- LOCAL_CHASSIS(cfg)->c_cap_enabled = LLDP_CAP_STATION;
-+ else if (LOCAL_CHASSIS(cfg)->c_cap_enabled != LLDP_CAP_STATION)
-+ LOCAL_CHASSIS(cfg)->c_cap_enabled &= ~LLDP_CAP_STATION;
-
- /* Set chassis ID if needed. This is only done if chassis ID
- has not been set previously (with the MAC address of an
---
-1.8.3.1
-
+++ /dev/null
-Index: lldpd-0.9.0/src/daemon/lldpd.service.in
-===================================================================
---- lldpd-0.9.0.orig/src/daemon/lldpd.service.in
-+++ lldpd-0.9.0/src/daemon/lldpd.service.in
-@@ -9,6 +9,7 @@ Type=notify
- NotifyAccess=main
- EnvironmentFile=-/etc/default/lldpd
- EnvironmentFile=-/etc/sysconfig/lldpd
-+ExecStartPre=/bin/mkdir -p /var/run/lldpd
- ExecStart=@sbindir@/lldpd $DAEMON_ARGS $LLDPD_OPTIONS
- Restart=on-failure
-
+++ /dev/null
-Index: lldpd-0.9.0/src/daemon/lldpd.service.in
-===================================================================
---- lldpd-0.9.0.orig/src/daemon/lldpd.service.in
-+++ lldpd-0.9.0/src/daemon/lldpd.service.in
-@@ -10,6 +10,7 @@
- EnvironmentFile=-/etc/default/lldpd
- EnvironmentFile=-/etc/sysconfig/lldpd
- ExecStartPre=/bin/mkdir -p /var/run/lldpd
-+ExecStartPre=/etc/init.d/i40e-lldp-configure.sh stop
- ExecStart=@sbindir@/lldpd $DAEMON_ARGS $LLDPD_OPTIONS
- Restart=on-failure
-
\ No newline at end of file
+++ /dev/null
----
- src/client/client.h | 2 +
- src/client/display.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-
- src/client/show.c | 44 ++++++++++++++++++++++++++++++++++++++
- src/lib/atoms/port.c | 7 ++++++
- src/lib/lldpctl.h | 1
- 5 files changed, 112 insertions(+), 1 deletion(-)
-
---- a/src/client/client.h
-+++ b/src/client/client.h
-@@ -115,6 +115,8 @@ char* totag(const char *);
- #define DISPLAY_DETAILS 3
- void display_interfaces(lldpctl_conn_t *, struct writer *,
- struct cmd_env *, int, int);
-+void display_local_interfaces(lldpctl_conn_t *, struct writer *,
-+ struct cmd_env *, int, int);
- void display_interface(lldpctl_conn_t *, struct writer *, int,
- lldpctl_atom_t *, lldpctl_atom_t *, int, int);
- void display_local_chassis(lldpctl_conn_t *, struct writer *,
---- a/src/client/display.c
-+++ b/src/client/display.c
-@@ -344,12 +344,23 @@ display_port(struct writer *w, lldpctl_a
- tag_datatag(w, "descr", "PortDescr",
- lldpctl_atom_get_str(port, lldpctl_k_port_descr));
-
-+ tag_datatag(w, "ttl", "Ttl",
-+ lldpctl_atom_get_str(port, lldpctl_k_port_ttl));
-+
- /* Dot3 */
- if (details == DISPLAY_DETAILS) {
- tag_datatag(w, "mfs", "MFS",
- lldpctl_atom_get_str(port, lldpctl_k_port_dot3_mfs));
-- tag_datatag(w, "aggregation", "Port is aggregated. PortAggregID",
-+
-+ long int lag_id = lldpctl_atom_get_int(port,
-+ lldpctl_k_port_dot3_aggregid);
-+ tag_start(w, "link-aggregation", "LinkAgg");
-+ tag_attr(w, "supported", "supported", "yes");
-+ tag_attr(w, "enabled", "enabled",
-+ (lag_id > 0)?"yes":"no");
-+ tag_datatag(w, "aggregation", "PortAggregID",
- lldpctl_atom_get_str(port, lldpctl_k_port_dot3_aggregid));
-+ tag_end(w);
-
- long int autoneg_support, autoneg_enabled, autoneg_advertised;
- autoneg_support = lldpctl_atom_get_int(port,
-@@ -663,6 +674,52 @@ display_interfaces(lldpctl_conn_t *conn,
- lldpctl_atom_dec_ref(port);
- }
- tag_end(w);
-+}
-+
-+/**
-+ * Display information about local interfaces.
-+ *
-+ * @param conn Connection to lldpd.
-+ * @param w Writer.
-+ * @param hidden Whatever to show hidden ports.
-+ * @param env Environment from which we may find the list of ports.
-+ * @param details Level of details we need (DISPLAY_*).
-+ */
-+void
-+display_local_interfaces(lldpctl_conn_t *conn, struct writer *w,
-+ struct cmd_env *env,
-+ int hidden, int details)
-+{
-+ lldpctl_atom_t *iface;
-+ int protocol = LLDPD_MODE_MAX;
-+ const char *proto_str;
-+
-+ /* user might have specified protocol to filter display results */
-+ proto_str = cmdenv_get(env, "protocol");
-+
-+ if (proto_str) {
-+ log_debug("display", "filter protocol: %s ", proto_str);
-+
-+ protocol = 0;
-+ for (lldpctl_map_t *protocol_map =
-+ lldpctl_key_get_map(lldpctl_k_port_protocol);
-+ protocol_map->string;
-+ protocol_map++) {
-+ if (!strcasecmp(proto_str, protocol_map->string)) {
-+ protocol = protocol_map->value;
-+ break;
-+ }
-+ }
-+ }
-+
-+ tag_start(w, "lldp", "LLDP interfaces");
-+ while ((iface = cmd_iterate_on_interfaces(conn, env))) {
-+ lldpctl_atom_t *port;
-+ port = lldpctl_get_port(iface);
-+ display_interface(conn, w, hidden, iface, port, details, protocol);
-+ lldpctl_atom_dec_ref(port);
-+ }
-+ tag_end(w);
- }
-
- void
---- a/src/client/show.c
-+++ b/src/client/show.c
-@@ -48,6 +48,35 @@ cmd_show_neighbors(struct lldpctl_conn_t
- }
-
- /**
-+ * Show interfaces.
-+ *
-+ * The environment will contain the following keys:
-+ * - C{ports} list of ports we want to restrict showing.
-+ * - C{hidden} if we should show hidden ports.
-+ * - C{summary} if we want to show only a summary
-+ * - C{detailed} for a detailed overview
-+ */
-+static int
-+cmd_show_interfaces(struct lldpctl_conn_t *conn, struct writer *w,
-+ struct cmd_env *env, void *arg)
-+{
-+ log_debug("lldpctl", "show interfaces data (%s) %s hidden interfaces",
-+ cmdenv_get(env, "summary")?"summary":
-+ cmdenv_get(env, "detailed")?"detailed":
-+ "normal", cmdenv_get(env, "hidden")?"with":"without");
-+ if (cmdenv_get(env, "ports"))
-+ log_debug("lldpctl", "restrict to the following ports: %s",
-+ cmdenv_get(env, "ports"));
-+
-+ display_local_interfaces(conn, w, env, !!cmdenv_get(env, "hidden"),
-+ cmdenv_get(env, "summary")?DISPLAY_BRIEF:
-+ cmdenv_get(env, "detailed")?DISPLAY_DETAILS:
-+ DISPLAY_NORMAL);
-+
-+ return 1;
-+}
-+
-+/**
- * Show chassis.
- *
- * The environment will contain the following keys:
-@@ -269,6 +298,12 @@ register_commands_show(struct cmd_node *
- "Show neighbors data",
- NULL, NULL, NULL);
-
-+ struct cmd_node *interfaces = commands_new(
-+ show,
-+ "interfaces",
-+ "Show interfaces data",
-+ NULL, NULL, NULL);
-+
- struct cmd_node *chassis = commands_new(
- show,
- "chassis",
-@@ -289,6 +324,15 @@ register_commands_show(struct cmd_node *
-
- register_common_commands(neighbors, 1);
-
-+ /* Interfaces data */
-+ commands_new(interfaces,
-+ NEWLINE,
-+ "Show interfaces data",
-+ NULL, cmd_show_interfaces, NULL);
-+
-+ cmd_restrict_ports(interfaces);
-+ register_common_commands(interfaces, 0);
-+
- /* Chassis data */
- commands_new(chassis,
- NEWLINE,
---- a/src/lib/atoms/port.c
-+++ b/src/lib/atoms/port.c
-@@ -19,6 +19,7 @@
- #include <stdarg.h>
- #include <string.h>
- #include <arpa/inet.h>
-+#include <time.h>
-
- #include "lldpctl.h"
- #include "../log.h"
-@@ -544,6 +545,7 @@ _lldpctl_atom_get_int_port(lldpctl_atom_
- (struct _lldpctl_atom_port_t *)atom;
- struct lldpd_port *port = p->port;
- struct lldpd_hardware *hardware = p->hardware;
-+ time_t now = time(NULL);
-
- /* Local port only */
- if (hardware != NULL) {
-@@ -585,6 +587,11 @@ _lldpctl_atom_get_int_port(lldpctl_atom_
- return port->p_id_subtype;
- case lldpctl_k_port_hidden:
- return port->p_hidden_in;
-+ case lldpctl_k_port_ttl:
-+ if (port->p_lastupdate > 0)
-+ return (port->p_chassis->c_ttl - (now - port->p_lastupdate));
-+ else
-+ return port->p_chassis->c_ttl;
- #ifdef ENABLE_DOT3
- case lldpctl_k_port_dot3_mfs:
- if (port->p_mfs > 0)
---- a/src/lib/lldpctl.h
-+++ b/src/lib/lldpctl.h
-@@ -674,6 +674,7 @@ typedef enum {
- lldpctl_k_port_hidden, /**< `(I)` Is this port hidden (or should it be displayed?)? */
- lldpctl_k_port_status, /**< `(IS,WO)` Operational status of this (local) port */
- lldpctl_k_port_chassis, /**< `(A)` Chassis associated to the port */
-+ lldpctl_k_port_ttl, /**< `(I)` The port ttl. */
-
- lldpctl_k_port_dot3_mfs = 1300, /**< `(I)` MFS */
- lldpctl_k_port_dot3_aggregid, /**< `(I)` Port aggregation ID */
+++ /dev/null
-# Uncomment to start SNMP subagent and enable CDP, SONMP and EDP protocol
-#DAEMON_ARGS="-x -c -s -e"
\ No newline at end of file
+++ /dev/null
-#! /bin/sh
-### BEGIN INIT INFO
-# Provides: lldpd
-# Required-Start: $remote_fs $network $syslog
-# Required-Stop: $network $remote_fs $syslog
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: LLDP daemon
-# Description: lldpd is a 802.1AB implementation, a L2 network
-# discovery protocol. It also supports CDP, EDP and
-# various other protocols.
-### END INIT INFO
-
-# Do NOT "set -e"
-
-# PATH should only include /usr/* if it runs after the mountnfs.sh script
-PATH=/sbin:/usr/sbin:/bin:/usr/bin
-DESC="LLDP daemon"
-NAME=lldpd
-DAEMON=/usr/sbin/$NAME
-DAEMON_ARGS=""
-PIDFILE=/var/run/$NAME.pid
-SCRIPTNAME=/etc/init.d/$NAME
-CHROOT=/var/run/$NAME
-
-# Exit if the package is not installed
-[ -x "$DAEMON" ] || exit 0
-
-# Read configuration variable file if it is present
-[ -r /etc/default/$NAME ] && . /etc/default/$NAME
-
-# Create the chroot directory if not present
-[ -d "$CHROOT" ] || mkdir -p $CHROOT
-
-# LSB log_* functions
-. /lib/lsb/init-functions
-
-if [ ! -d "$CHROOT" ]; then
- mkdir -p $CHROOT
-fi
-
-
-do_start()
-{
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
- || return 1
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
- $DAEMON_ARGS \
- || return 2
-}
-
-do_stop()
-{
- start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
- RETVAL="$?"
- [ "$RETVAL" = 2 ] && return 2
- start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
- [ "$?" = 2 ] && return 2
- rm -f $PIDFILE
- return "$RETVAL"
-}
-
-do_reload() {
- start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
- return 0
-}
-
-case "$1" in
- start)
- [ "$VERBOSE" != no ] && log_begin_msg "Starting $DESC" "$NAME"
- do_start
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
- esac
- ;;
- stop)
- [ "$VERBOSE" != no ] && log_begin_msg "Stopping $DESC" "$NAME"
- do_stop
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
- esac
- ;;
- reload)
- log_begin_msg "Reloading $DESC" "$NAME"
- do_reload
- log_end_msg $?
- ;;
- restart|force-reload)
- log_begin_msg "Restarting $DESC" "$NAME"
- do_stop
- case "$?" in
- 0|1)
- do_start
- case "$?" in
- 0) log_end_msg 0 ;;
- 1) log_end_msg 1 ;; # Old process is still running
- *) log_end_msg 1 ;; # Failed to start
- esac
- ;;
- *)
- # Failed to stop
- log_end_msg 1
- ;;
- esac
- ;;
- status)
- status_of_proc $DAEMON $NAME -p $PIDFILE && exit 0 || exit $?
- ;;
- *)
- echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload|status}" >&2
- exit 3
- ;;
-esac
-
-:
\ No newline at end of file
+++ /dev/null
-#
-## Copyright (C) 2019 Wind River Systems, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/patches:${THISDIR}/files:"
-
-DISTRO_FEATURES_BACKFILL_CONSIDERED_remove = "sysvinit"
-
-SRC_URI += " \
- file://0001-lldpd-client-add-show-interfaces-cmd-from-upstream.patch \
- file://0002-Clear-station-bit-if-any-other-capability-is-enabled.patch \
- file://i40e-lldp-configure.sh \
- "
-
-# TODO:
-# Check Yocto handling of i40e firmware?
-# See i40e-lldp-configure.sh and lldpd-i40e-disable.patch
-
-# file://lldpd.init
-# lldpd-create-run-dir.patch
-
-do_install_append() {
- cd ${S}
- install -d -m 0755 ${D}/${sysconfdir}/init.d
- install -m 0755 ${WORKDIR}/i40e-lldp-configure.sh ${D}/${sysconfdir}/init.d/
-}
-
-FILES_${PN}_append = " \
- ${sysconfdir}/init.d/i40e-lldp-configure.sh \
- "
-
-RDEPENDS_${PN} += "bash"
--- /dev/null
+#
+# Copyright (C) 2019 Wind River Systems, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+SUMMARY = "A 802.1ab implementation (LLDP) to help you locate neighbors of all your equipments"
+SECTION = "net/misc"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/ISC;md5=f3b90e78ea0cffb20bf5cca7947a896d"
+
+DEPENDS = "libbsd libevent json-c"
+
+PROTOCOL = "https"
+BRANCH = "r/stx.3.0"
+SRCNAME = "integ"
+SRCREV = "0bf4b546df8c7fdec8cfc6cb6f71b9609ee54306"
+
+SRC_URI = "\
+ http://media.luffy.cx/files/${BPN}/${BPN}-${PV}.tar.gz \
+ git://opendev.org/starlingx/${SRCNAME}.git;protocol=${PROTOCOL};rev=${SRCREV};branch=${BRANCH};destsuffix=stx-patches;subpath=networking/lldpd \
+ "
+
+SRC_URI[md5sum] = "ed0226129b0c90b3a45c273fe1aba8de"
+SRC_URI[sha256sum] = "300e4a590f7bf21c79d5ff94c2d6a69d0b2c34dbc21e17281496462a04ca80bc"
+
+do_patch_append () {
+ bb.build.exec_func('stx_do_patch', d)
+}
+
+stx_do_patch () {
+ cd ${S}
+ patch -p1 < ${WORKDIR}/stx-patches/lldpd-0.9.0/lldpd-interface-show.patch
+ patch -p1 < ${WORKDIR}/stx-patches/centos/files/lldpd-create-run-dir.patch
+ patch -p1 < ${WORKDIR}/stx-patches/centos/files/lldpd-i40e-disable.patch
+ patch -p1 < ${WORKDIR}/stx-patches/centos/files/lldpd-clear-station.patch
+}
+
+SOURCE1 = "${WORKDIR}/stx-patches/lldpd-0.9.0/lldpd.init"
+SOURCE2 = "${WORKDIR}/stx-patches/lldpd-0.9.0/lldpd.default"
+SOURCE3 = "${WORKDIR}/stx-patches/centos/files/i40e-lldp-configure.sh"
+
+DISTRO_FEATURES_BACKFILL_CONSIDERED_remove = "sysvinit"
+
+inherit autotools update-rc.d useradd systemd pkgconfig bash-completion
+
+USERADD_PACKAGES = "${PN}"
+USERADD_PARAM_${PN} = "--system -g lldpd --shell /bin/false lldpd"
+GROUPADD_PARAM_${PN} = "--system lldpd"
+
+EXTRA_OECONF += "--without-embedded-libevent \
+ --disable-oldies \
+ --with-privsep-user=lldpd \
+ --with-privsep-group=lldpd \
+ --with-systemdsystemunitdir=${systemd_system_unitdir} \
+ --without-sysusersdir \
+"
+
+PACKAGECONFIG ??= "cdp fdp edp sonmp lldpmed dot1 dot3"
+PACKAGECONFIG[xml] = "--with-xml,--without-xml,libxm2"
+PACKAGECONFIG[snmp] = "--with-snmp,--without-snmp,net-snmp"
+PACKAGECONFIG[readline] = "--with-readline,--without-readline,readline"
+PACKAGECONFIG[seccomp] = "--with-seccomp,--without-seccomp,libseccomp"
+PACKAGECONFIG[cdp] = "--enable-cdp,--disable-cdp"
+PACKAGECONFIG[fdp] = "--enable-fdp,--disable-fdp"
+PACKAGECONFIG[edp] = "--enable-edp,--disable-edp"
+PACKAGECONFIG[sonmp] = "--enable-sonmp,--disable-sonmp"
+PACKAGECONFIG[lldpmed] = "--enable-lldpmed,--disable-lldpmed"
+PACKAGECONFIG[dot1] = "--enable-dot1,--disable-dot1"
+PACKAGECONFIG[dot3] = "--enable-dot3,--disable-dot3"
+PACKAGECONFIG[custom] = "--enable-custom,--disable-custom"
+
+INITSCRIPT_NAME = "lldpd"
+INITSCRIPT_PARAMS = "defaults"
+
+SYSTEMD_SERVICE_${PN} = "lldpd.service"
+
+do_install_append() {
+ install -d -m 0755 ${D}/${sysconfdir}/init.d
+ install -Dm 0755 ${SOURCE1} ${D}${sysconfdir}/init.d/lldpd
+ install -Dm 0644 ${SOURCE2} ${D}${sysconfdir}/default/lldpd
+ install -Dm 0755 ${SOURCE3} ${D}${sysconfdir}/init.d/
+ # Make an empty configuration file
+ touch ${D}${sysconfdir}/lldpd.conf
+}
+
+PACKAGES =+ "${PN}-zsh-completion"
+
+FILES_${PN} += "${libdir}/sysusers.d"
+RDEPENDS_${PN} += "os-release bash"
+
+FILES_${PN}-zsh-completion += "${datadir}/zsh/"
+# FIXME: zsh is broken in meta-oe so this cannot be enabled for now
+#RDEPENDS_${PN}-zsh-completion += "zsh"