问题描述
当前器件FRU位宽为1 只支持256字节数据,但代码中固定读取保存2048字节数据,会导致后续再次写入时写入失败,报错为数据超出范围。
问题:位宽为1时是否有特殊配置,如何保证读取字节在合理范围
当前器件FRU位宽为1 只支持256字节数据,但代码中固定读取保存2048字节数据,会导致后续再次写入时写入失败,报错为数据超出范围。
问题:位宽为1时是否有特殊配置,如何保证读取字节在合理范围
答案内容由AI生成,仅供参考:
static int l_get_fru_area(lua_State *L)
{
guint8 fru_id = (guint8)luaL_checkinteger(L, 1);
debug_log(DLOG_INFO, "[frudata] get fru(%d) area", fru_id);
// 根据FRU ID动态确定最大长度
int max_len = get_fru_max_length(fru_id); // 新增函数获取对应FRU的最大长度
if (max_len <= 0 || max_len > FRU_MAX_LEN) {
max_len = 256; // 默认安全值
}
char data[max_len] = {0};
if (get_fru_file_by_id(fru_id, data, max_len) != COMP_CODE_SUCCESS) {
return luaL_error(L, "get frudata failed, fru_id = %d", fru_id);
}
lua_pushlstring(L, data, max_len); // 使用实际长度而非固定长度
return 1;
}
// 根据FRU ID返回对应的最大数据长度
int get_fru_max_length(guint8 fru_id) {
switch(fru_id) {
case 1:
case 2:
case 3:
return 256; // 位宽为1的设备
case 9:
case 10:
return 2048; // 标准FRU设备
default:
return 256; // 安全默认值
}
}
在执行写操作前增加校验:
function write_fru_area(fru_id, data)
local max_len = get_fru_max_length(fru_id)
if #data > max_len then
log_error(string.format("FRU write failed: data size %d exceeds limit %d", #data, max_len))
return false, "data size exceeds limit"
end
-- 执行实际写入操作
return do_write_operation(fru_id, data)
end
在写入位宽为1的电子标签时,出现数据超出范围的错误。当前器件FRU位宽为1,仅支持256字节数据,但代码中固定读取保存2048字节数据(由FRU_MAX_LEN常量定义),导致后续写入操作失败,报错为"unsigned overflow"。
FRU_MAX_LEN常量固定为2048字节进行读取和写入操作static int l_get_fru_area(lua_State *L)
{
char data[FRU_MAX_LEN] = {0}; // 固定分配2048字节缓冲区
guint8 fru_id = (guint8)luaL_checkinteger(L, 1);
if (get_fru_file_by_id(fru_id, data, FRU_MAX_LEN) != COMP_CODE_SUCCESS) {
return luaL_error(L, "get frudata failed, fru_id = %d", fru_id);
}
lua_pushlstring(L, data, FRU_MAX_LEN); // 固定推送2048字节数据
return 1;
}
从日志可以看出:
026-04-06 06:42:46.189655 frudata NOTICE: manage_lua(323): +++++++++++++ XFU5IONTS2-KLSW-AI213666BCP3000N2SS000190PN:02Y938xxxxxxxxxxPCBA Ver:A++++++++= 2048
026-04-06 06:42:46.793482 frudata ERROR: frudata_service.lua(148): write fru area failed... i2c.lua:239: bad argument #3 to 's_pack' (unsigned overflow)
错误发生在s_pack函数调用时出现"unsigned overflow",表明试图写入的数据超过了目标设备所能处理的范围。
根据相关知识:
动态长度适配
FRU_MAX_LENHeader验证与修复
Fru_Check_And_Fix_Eeprom_Fru_Head函数验证并修正EEPROM头部I2C通信参数调整
max_batch_len(单帧读写最大字节数)max_data_len(单次读写请求的最大字节数)static int l_get_fru_area(lua_State *L)
{
guint8 fru_id = (guint8)luaL_checkinteger(L, 1);
debug_log(DLOG_INFO, "[frudata] get fru(%d) area", fru_id);
// 根据FRU ID动态确定最大长度
int max_len = get_fru_max_length(fru_id); // 新增函数获取对应FRU的最大长度
if (max_len <= 0 || max_len > FRU_MAX_LEN) {
max_len = 256; // 默认安全值
}
char data[max_len] = {0};
if (get_fru_file_by_id(fru_id, data, max_len) != COMP_CODE_SUCCESS) {
return luaL_error(L, "get frudata failed, fru_id = %d", fru_id);
}
lua_pushlstring(L, data, max_len); // 使用实际长度而非固定长度
return 1;
}
// 根据FRU ID返回对应的最大数据长度
int get_fru_max_length(guint8 fru_id) {
switch(fru_id) {
case 1:
case 2:
case 3:
return 256; // 位宽为1的设备
case 9:
case 10:
return 2048; // 标准FRU设备
default:
return 256; // 安全默认值
}
}
在执行写操作前增加校验:
function write_fru_area(fru_id, data)
local max_len = get_fru_max_length(fru_id)
if #data > max_len then
log_error(string.format("FRU write failed: data size %d exceeds limit %d", #data, max_len))
return false, "data size exceeds limit"
end
-- 执行实际写入操作
return do_write_operation(fru_id, data)
end
建立FRU配置表
实施分层读写策略
完善错误处理机制
0x80 Error表示不支持操作)使用标准工具验证
ipmcget -d fru命令检查FRU状态WriteElabelData Command测试扩展标签写入能力考虑非标准标签情况
0x80 Error错误码通过以上改进措施,可以有效解决因数据长度超出范围导致的写入失败问题,确保系统稳定性和数据完整性。