我们进行了一些需要大量使用 LLDP 的特殊硬件配置。我们有几个新的服务器机架,它们都使用 Intel X710 10Gb 网卡。LLDP 突然停止工作。我们对 LLDP 的实施很简单。使用默认 TLV 在 TOR(机架顶部)交换机上启用 LLDP。使用 lldpad(CentOS 6.5)在 Linux 映像上启用 LLDP,并使用 lldptool 提取邻居信息,这种方法在过去已在数千台机器上奏效。只是,对于这些带有这些 NIC 的机器,整个系统都停止工作了。
使用来自交换机和服务器的数据包转储显示,帧已从服务器正确发送到交换机,相反,交换机也正确接收来自服务器的帧并将 TLV 帧发送回服务器。但是,服务器没有收到交换机帧 TLV,这让我们很困惑。我们将使用不同 NIC 的其他机器放在 TOR 上,它们按预期获取 LLDP 数据。
我问过 Google 们...
根据此链接看来这些 X710 可能正在运行内部 LLDP 代理,该代理正在拦截来自交换机的 LLDP 帧。我们看到发生这种情况的受影响机器上的固件是:
# ethtool -i eth2
driver: i40e
version: 1.3.47
firmware-version: 4.53 0x80001e5d 17.0.10
bus-info: 0000:01:00.2
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes
禁用 NIC 上的内部 LLDP 代理的方法不起作用。尽管如此,我仍在研究,但我认为我有几个选择:
- 找到正确的方法来禁用 NIC 上的内部 LLDP 代理,并使用在这些机器上提取 LLDP 数据的现有方法——首选。
- 使用 NIC LLDP 代理并找到从 NIC 中提取邻居 TLV 的方法。
有没有其他人遇到过与这些卡相同或类似的问题?如果是,您是如何解决这个问题的?
ethtool
我认为如果我想使用内部代理数据,它将通过或公开snmp
,但我尚未找到显示该信息的方法。
短暂性脑缺血发作
编辑 需要说明的是,当我尝试按照英特尔论坛中概述的步骤操作时,得到了以下输出:
root@host (~)# find /sys/kernel/debug/
/sys/kernel/debug/
root@host (~)# mkdir /sys/kernel/debug/i40e
mkdir: cannot create directory `/sys/kernel/debug/i40e': No such file or directory
答案1
好的。Google 帮了我大忙。下面介绍如何解决此问题。
事实证明,要使用调试文件系统,首先需要将其挂载。我们使用 memfs OS 在我们正在调整的机器上运行命令,默认情况下我们不挂载 debugfs。所以这个脚本给了我所需的答案。
...并且对于我的用例,以下步骤有效:
root@host (~)# mount -t debugfs none /sys/kernel/debug
root@host (~)# echo lldp stop > /sys/kernel/debug/i40e/0000:01:00.2/command
得到:
root@host (~)# lldptool -i eth2 stat
Total Frames Transmitted = 1834
Total Discarded Frames Received = 0
Total Error Frames Received = 0
Total Frames Received = 1
Total Discarded TLVs = 0
Total Unrecognized TLVs = 0
Total Ageouts = 0
root@host (~)# lldptool -t -n -i eth2
Chassis ID TLV
MAC: ec:13:db:41:63:00
Port ID TLV
Local: 508
Time to Live TLV
120
System Name TLV
sw1
System Description TLV
Juniper Networks, Inc. qfx5100-48s-6q Ethernet Switch, kernel JUNOS 13.2X51-D38, Build date: 2015-06-12 02:33:47 UTC Copyright (c) 1996-2015 Juniper Networks, Inc.
System Capabilities TLV
System capabilities: Bridge, Router
Enabled capabilities: Bridge, Router
Port Description TLV
xe-0/0/0
MAC/PHY Configuration Status TLV
Auto-negotiation not supported and not enabled
PMD auto-negotiation capabilities: 0x8000
MAU type: Unknown [0x0000]
Link Aggregation TLV
Aggregation capable
Currently not aggregated
Aggregated Port ID: 0
Maximum Frame Size TLV
1514
Port VLAN ID TLV
PVID: 1
Unidentified Org Specific TLV
OUI: 0x009069, Subtype: 1, Info: 564633373136303530303437
VLAN Name TLV
VID 1: Name vlan-1
LLDP-MED Capabilities TLV
Device Type: netcon
Capabilities: LLDP-MED, Network Policy, Location Identification, Extended Power via MDI-PSE
End of LLDPDU TLV
其他有用链接:
http://comments.gmane.org/gmane.linux.network/408868 https://communities.intel.com/thread/87759 https://sourceforge.net/p/e1000/mailman/message/34129092/
还有我的谷歌搜索
答案2
这是固件功能,可以关闭
自 2017 年 10 月 13 日起英特尔发布了其驱动程序的一个版本2.3.6支持关闭 LLDP 处理使用私有标志。这可以通过执行以下命令来完成:
sudo ethtool --set-priv-flags <interface name> disable-fw-lldp on
- 替换
<interface name>
为您的接口名称。(例如-eth0
)
下载英特尔 i40e 驱动程序(适用于 X710/XL710 版本 2.3.6)
安装说明 (来源)
1. Move the base driver tar file to the directory of your choice. For
example, use '/home/username/i40e' or '/usr/local/src/i40e'.
2. Untar/unzip the archive, where <x.x.x> is the version number for the
driver tar file:
tar zxf i40e-<x.x.x>.tar.gz
3. Change to the driver src directory, where <x.x.x> is the version number
for the driver tar:
cd i40e-<x.x.x>/src/
4. Compile the driver module:
# make install
The binary will be installed as:
/lib/modules/<KERNEL VERSION>/updates/drivers/net/ethernet/intel/i40e/i40e.ko
The install location listed above is the default location. This may differ
for various Linux distributions.
NOTE:Â To compile the driver on some kernel/arch combinations, a
package with the development version of libelf (e.g. libelf-dev,
libelf-devel, elfutilsl-libelf-devel) may need to be installed.
NOTE: To gather and display additional statistics, use the
I40E_ADD_PROBES pre-processor macro:
#make CFLAGS_EXTRA=-DI40E_ADD_PROBES
Please note that this additional statistics gathering can impact
performance.
5. Load the module using the modprobe command:
modprobe <i40e> [parameter=port1_value,port2_value]
Make sure that any older i40e drivers are removed from the kernel before
loading the new module:
rmmod i40e; modprobe i40e
6. Assign an IP address to the interface by entering the following,
where ethX is the interface name that was shown in dmesg after modprobe:
ip address add <IP_address>/<netmask bits> dev ethX
7. Verify that the interface works. Enter the following, where IP_address
is the IP address for another machine on the same subnet as the interface
that is being tested:
ping <IP_address>
这是来自英特尔的承诺:
来自:戴夫·埃特曼
为 ethtool 实现私有标志 disable-fw-lldp,以禁用 FW 对 LLDP 数据包的处理。这将阻止 FW 使用 LLDPDU 并使其向上发送到堆栈。
FW 也被配置为在链接时应用默认 DCB 配置。
切换此标志的值也会导致 PF 重置。
禁用 FW DCB 也将禁用 DCBx。
答案3
创建了一个初始化脚本,在机器启动时执行此操作。欢迎任何请求。
如果有人知道如何判断嵌入式 lldp 代理的状态,我将不胜感激。这可以适用于 systemd,并提供一些更好的退出代码。
答案4
由于 ethtool 切换似乎在重启后不会持久,因此我们设置了以下 udev 规则。
/etc/udev/rules.d/10-disable-fw-lldp.rules:
ACTION=="add", SUBSYSTEM=="net", ENV{INTERFACE}=="*", DRIVERS=="i40e", PROGRAM="/usr/sbin/ethtool --set-priv-flags $name disable-fw-lldp on"