网口连接状态手册
1. 网口连接状态有哪些
参见联机帮助,当前一共有以下状态:
如上图所示,连接状态与是否安装iBMA、端口是否接线、端口是否Up强相关,下面详细说明。
1.1 如何判断是否安装iBMA
1.1.1 资源树可查询
TODO:这里填写bmc.kepler.Systems.Sms的Registered方法的定义。
可使用busctl命令查询:
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命令查询:
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:
busctl --user call bmc.kepler.network_adapter /bmc/kepler/network_adapter/MicroComponent bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 "debug" 100查看实时SMBus报文:
tail -f /var/log/app.log | grep network_adapter通过opcode筛选报文: