网口链接状态手册
更新时间: 2025/10/15
在Gitcode上查看源码

网口连接状态手册

1. 网口连接状态有哪些

参见联机帮助,当前一共有以下状态:

如上图所示,连接状态与是否安装iBMA、端口是否接线、端口是否Up强相关,下面详细说明。

1.1 如何判断是否安装iBMA

1.1.1 资源树可查询

TODO:这里填写bmc.kepler.Systems.Sms的Registered方法的定义。

可使用busctl命令查询:

bash
busctl --user introspect bmc.kepler.host_agent /bmc/kepler/Systems/1/Sms

下图未安装iBMA:

1.1.2 BMC的Web页面可查询

当前iBMA在Web有单独页签:

跳转到详情页签后,可看见iBMA是否安装:

1.1.3 带内可查询

使用service BMA status命令:

下图未安装:

下图已安装且运行正常:

下图已安装但处于停止状态:

1.2 如何判断端口是否接线

1.2.1 带内使用ethtool命令查看

使用ifconfig查看网口:

使用ethtool查看具体网口的接线状态:

下图为已接线:

下图为未接线:

1.3 如何判断端口状态是Up还是Down

使用ifconfig命令查看或修改:

如图,eno2网口为UP:

使用ifconfig eno2 down命令后,查询状态缺少<UP,...>,则说明eno2网口为down:

2. 网口连接状态的获取途径

当前openUBMC已实现以下方式:

2.1 通过SMC命令字从CPLD获取

2.1.1 代码实现

该途径仅限于板载网卡。

根据SMC命令字,可在网卡CSR文件中配置Scanner:

网口属性关联Scanner,通过槽位号选择LOM1还是LOM2即可:

初始赋值监听属性变化:

LinkStatusNumeric为U8类型,LinkStatus为String类型,需要进行转换。

network_port.lua文件中,函数register_property_changed_callback()会在初始化时调用一次,此时第一次将LinkStatusNumeric转换为所需字符串:

同时该函数注册监听,当LinkStatusNumeric有变更时,会同步更新LinkStatus

2.1.2 实际环境查询

使用busctl命令查询:

bash
busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Smc/Smc_ExpBoardSMC_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0x1c002d00 2
  • 第一个byte,bit 0 1 2 3,对应网卡1网口1 2 3 4连接状态
  • 第二个byte,bit 0 1 2 3,对应网卡2网口1 2 3 4连接状态

根据命令字结果,如图可见NIC 2仅网口1连接,其余网口断开:

2.2 通过SMBus从网卡带外获取

2.2.1 代码实现

CSR中配置Chip并关联网卡属性:

写对应网卡型号的配置文件:

配置文件目录:

配置网卡的Model属性:

加载配置文件:

代码根据Model属性,拼凑出配置文件名并require:

实现配置文件中的连接状态命令字:

字段含义:

  • protocol:协议类型,如SMBus则配smbus,协议在libmgmt_protocol中汇总
  • action:是否周期性获取,on_schedule代表周期性,on_demand代表非周期,单次获取
  • period_in_sec:周期轮询时间,单位秒,仅当action字段配为on_schedule时配置
  • request:请求入参,图上为opcode,且代码能额外传入channelid等参数
  • response:给app响应的结果,可编写函数对响应原始数据进行简单处理,使app使用更加便捷

注意:更多详细介绍,参见libmgmt_protocol。

配置文件返回SMBus:

App初始化SMBus:

network_adapter.lua文件初始化时,会初始化协议,具体函数为init_protocol()

前置条件:配置文件中返回SMBus,且网卡对应关联Chip,且Chip可读写。

在初始化SMBus时,调用libmgmt_protocol提供的device_spec_parser接口,创建可访问对象,并赋值到smbus_config_obj属性中:

device_spec_parser源码:

App代码应用:

App代码仅需调用配置文件中实现的LinkStatus,即可获取网口连接状态。

当属性为轮询获取时,libmgmt_protocol提供属性变更信号和错误信号,供app进行后处理:

如上:使用table_compare()比较两次响应,如果有差异则使emit_signal_on_data_change函数发送on_data_change信号,app监听信号后进行属性赋值。

(下图示例截取其他代码,与LinkStatus无关)

如未获取到响应,则使emit_signal_on_error函数发送on_error信号,app监听到信号后进行异常处理。

(下图示例截取其他代码,与LinkStatus无关)

2.2.2 实际环境查询

调整network_adapter的日志级别为debug:

bash
busctl --user call bmc.kepler.network_adapter /bmc/kepler/network_adapter/MicroComponent bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 "debug" 100

查看实时SMBus报文:

bash
tail -f /var/log/app.log | grep network_adapter

通过opcode筛选报文: