lldpd: update for stx 5.0

* inherit stx-metadata to help apply patches and
  install files from stx 'integ' repo

* remove the local copy of stx files and patches

Story: 2008952
Task: 42576

Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
Change-Id: Id1fc872b737a7caf0f0aefbd87fd76add32e7219
This commit is contained in:
Jackie Huang 2021-06-04 17:49:02 +08:00
parent d77325e139
commit 23d558fe52
8 changed files with 14 additions and 550 deletions

View File

@ -1,141 +0,0 @@
#!/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

View File

@ -1,39 +0,0 @@
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

View File

@ -1,12 +0,0 @@
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

View File

@ -1,12 +0,0 @@
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

View File

@ -1,206 +0,0 @@
---
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 */

View File

@ -1,2 +0,0 @@
# Uncomment to start SNMP subagent and enable CDP, SONMP and EDP protocol
#DAEMON_ARGS="-x -c -s -e"

View File

@ -1,117 +0,0 @@
#! /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
:

View File

@ -20,35 +20,28 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/ISC;md5=f3b90e
DEPENDS = "libbsd libevent json-c"
# Patches pullled from
# PROTOCOL = "https"
# BRANCH = "r/stx.3.0"
# SRCNAME = "integ"
# SRCREV = "0bf4b546df8c7fdec8cfc6cb6f71b9609ee54306"
# git://opendev.org/starlingx/${SRCNAME}.git;protocol=${PROTOCOL};rev=${SRCREV};branch=${BRANCH};destsuffix=stx-patches;subpath=networking/lldpd
SRC_URI = "\
http://media.luffy.cx/files/${BPN}/${BPN}-${PV}.tar.gz \
file://lldpd-interface-show.patch \
file://lldpd-create-run-dir.patch \
file://lldpd-i40e-disable.patch \
file://lldpd-clear-station.patch \
file://i40e-lldp-configure.sh \
file://lldpd.init \
file://lldpd.default\
"
SRC_URI[md5sum] = "ed0226129b0c90b3a45c273fe1aba8de"
SRC_URI[sha256sum] = "300e4a590f7bf21c79d5ff94c2d6a69d0b2c34dbc21e17281496462a04ca80bc"
do_patch_append () {
bb.build.exec_func('stx_do_patch', d)
}
inherit stx-metadata
SOURCE1 = "${WORKDIR}/lldpd.init"
SOURCE2 = "${WORKDIR}/lldpd.default"
SOURCE3 = "${WORKDIR}/i40e-lldp-configure.sh"
STX_REPO = "integ"
STX_SUBPATH = "networking/lldpd"
SRC_URI_STX = " \
file://centos/files/lldpd-create-run-dir.patch \
file://centos/files/lldpd-i40e-disable.patch \
file://centos/files/lldpd-clear-station.patch \
file://${BP}/lldpd-interface-show.patch \
"
SOURCE1 = "${STX_METADATA_PATH}/${BP}/lldpd.init"
SOURCE2 = "${STX_METADATA_PATH}/${BP}/lldpd.default"
SOURCE3 = "${STX_METADATA_PATH}/centos/files/i40e-lldp-configure.sh"
DISTRO_FEATURES_BACKFILL_CONSIDERED_remove = "sysvinit"