Add alternative command to disable lldp agent for i40e devices

LLDP information is not available for certain i40e network devices when
running system host-lldp-neighbor-show.

This is caused by the firmware lldp agent on the devices not getting
disabled by the i40e-lldp-configure.sh script which is invoked by lldpd.

The command used to disable the firmware lldp agent in the script works
for some firmware versions found on devices, but not others. This change
adds an ethtool command to disable the lldp agent which works for these
other firmware versions.

From testing, the ethtool method is used for firmware versions 5.05 and
8.10. The sysfs method is used for firmware version 7.10. In all cases,
the driver version is 2.14.13

Closes-Bug: 1923665

Signed-off-by: Cole Walker <cole.walker@windriver.com>
Change-Id: Ifac34091599bd4020bf55cc1b8ba3119edccb297
(cherry picked from commit de263f633e)
This commit is contained in:
Cole Walker 2021-04-13 16:47:24 -04:00
parent 61873e7de1
commit 118cf39d4a
1 changed files with 76 additions and 2 deletions

View File

@ -1,6 +1,6 @@
#!/bin/bash
################################################################################
# Copyright (c) 2016 Wind River Systems, Inc.
# Copyright (c) 2021 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
@ -14,6 +14,9 @@
#
# Note: debugfs must be enabled in the kernel
#
# Note: Devices with firmware 5.05 and 8.10 use the ethtool command
# Devices with firmware 7.10 use the sysfs command
#
# To enable:
# ./i40e-lldp-configure.sh start
#
@ -56,6 +59,23 @@ function configure_device {
return ${RET}
}
function ethtool_device {
local DEVICE=$1
local COMMAND=$2
ethtool --set-priv-flags ${DEVICE} disable-fw-lldp ${COMMAND}
RET=$?
if [ ${RET} -ne 0 ]; then
err "Failed to set disable-fw-lldp ${COMMAND} for device ${DEVICE}"
return ${RET}
fi
log "Set disable-fw-lldp ${COMMAND} for device ${DEVICE}"
return ${RET}
}
function is_debugfs_mounted {
if grep -qs "${DEBUGFS_PATH}" /proc/mounts; then
return 0
@ -71,11 +91,41 @@ function unmount_debugfs {
umount ${DEBUGFS_PATH}
}
function find_device_interface_from_pciaddr {
INTERFACE=""
#Get device PCI address from path
local PCI_ADDR=${DEVICE##*/}
#Lookup the device directory
local DEVICE_PATH
DEVICE_PATH=$(find /sys/devices -type d -name ${PCI_ADDR})
if [ -z "${DEVICE_PATH}" ]; then
log "Unable to find interface for ${PCI_ADDR}"
else
#Get the interface name for device
INTERFACE=$(ls ${DEVICE_PATH}/net)
if [ -z "${INTERFACE}" ]; then
log "Unable to find interface for ${PCI_ADDR}"
else
log "Found interface ${INTERFACE} for PCI address ${PCI_ADDR}"
fi
fi
}
function scan_devices {
local ACTION=$1
local DEBUGFS_MOUNTED="false"
local DEVICES=${DEBUGFS_I40_DEVICES_PATH}/*
if [ "${ACTION}" = "start" ]; then
local ETHTOOL_COMMAND="off"
else
local ETHTOOL_COMMAND="on"
fi
if is_debugfs_mounted; then
DEBUGFS_MOUNTED="true"
fi
@ -90,10 +140,34 @@ function scan_devices {
log "Mounted debugfs"
fi
# Set option to prevent the below for loop from running once
# if there are no directories in the $DEVICES path.
# Save the initial state in order to reset later
shopt -q nullglob
NULLGLOB=$?
shopt -s nullglob
for DEVICE in $DEVICES; do
configure_device ${DEVICE} ${ACTION}
find_device_interface_from_pciaddr
if [ ! -z "${INTERFACE}" ]; then
ethtool_device ${INTERFACE} ${ETHTOOL_COMMAND}
RET=$?
# Ethtool method does not work for some firmware versions
# Fall back to sysfs method if ethtool does not work
if [ ${RET} -ne 0 ]; then
# Sysfs method is not able to return 1 if it fails
configure_device ${DEVICE} ${ACTION}
fi
else
configure_device ${DEVICE} ${ACTION}
fi
done
# Unset option if that was the original state
if [ "${NULLGLOB}" -eq 1 ]; then
shopt -u nullglob
fi
if [ ${DEBUGFS_MOUNTED} = "false" ]; then
unmount_debugfs
RET=$?