diff --git a/TSCP/src/APP/APP_API.c b/TSCP/src/APP/APP_API.c index 2a1bd25..8c7a178 100644 --- a/TSCP/src/APP/APP_API.c +++ b/TSCP/src/APP/APP_API.c @@ -29,7 +29,7 @@ extern UINT8 LocalCiId; /*系 const CM_UINT8 g_SfpInnetParam[] = { - 0,5,/*不同设备通信关系表记录个数*/ + 0,7,/*不同设备通信关系表记录个数*/ /*记录的格式如下:*/ /* 发起方 发起方发送数据 发起方报文 发起方报文 发起方接收Ack 跟随方 跟随方发送数据 跟随方运行 跟随方报文 此通信关系中成功发送 */ /* 设备类型 通信类型 发送周期长度 最大延时 报文最大延时差 设备类型 通信类型 周期长度 最大延时 一包数据所需最小周期数 */ @@ -37,7 +37,9 @@ const CM_UINT8 g_SfpInnetParam[] = /*AOM->TIAS*/ 0x15, 0x55, 0x00,0xC8, 0x00,0xC8, 0x00,0xC8, 0x03, 0x55, 0x00,0xC8, 0x00,0xC8, 0x02, /*AOM->ATP*/ 0x14, 0x55, 0x00,0xC8, 0x00,0xC8, 0x00,0xC8, 0x15, 0x55, 0x00,0xC8, 0x00,0xC8, 0x02, /*RC主机->维护机*/ 0xD9, 0x55, 0x01,0x2c, 0x01,0x2C, 0x01,0x2C, 0xf8, 0x55, 0x00,0xc8, 0x00,0xc8, 0x02, + /*RC主机->维护机*/ 0xD9, 0x55, 0x01,0x2c, 0x01,0x2C, 0x01,0x2C, 0x30, 0x55, 0x01,0x2c, 0x01,0x2C, 0x02, /*CI主机->维护机*/ 0xDE, 0x55, 0x01,0x2c, 0x01,0x2C, 0x01,0x2C, 0xf8, 0x55, 0x00,0xc8, 0x00,0xc8, 0x02, + /*CI主机->维护机*/ 0xDE, 0x55, 0x01,0x2c, 0x01,0x2C, 0x01,0x2C, 0x30, 0x55, 0x01,0x2c, 0x01,0x2C, 0x02, 0,2,/*相同设备通信关系表记录个数*/ /*记录的格式如下:*/ /* 发起方 发起方 发起方发送数据 发起方报文 发起方报文 发起方接收Ack 跟随方 跟随方 跟随方发送数据 跟随方运行 跟随方报文 此通信关系中成功发送 */ @@ -301,7 +303,7 @@ void APP_API_Data_Init() .M_OutnetRaw_Enable = 0xAA, /**< 外网透传通信功能开关 */ .M_CpuUsageGet_Enable = 0x55,/**< 获取cpu使用率功能开关 */ .M_RemoteUpdate_Enable = 0x55,/**< 远程部署内网安全通信功能开关 */ - .ID_Maintenance = DEVICE_TYPE_AIM, + .ID_Maintenance = {2, DEVICE_TYPE_AIM, 0x3001U}, .Start_Path = "/emmc1", /**< 程序启动路径 */ .reboot_replycount = 10, /**< 重启确认报文回复次数 */ .M_AutoReboot_Count = 3, /**< 自动重启次数 */ @@ -369,12 +371,17 @@ void APP_API_Data_Init() .OutNetBlue.OutnetRaw_Port = 54002, /**< 外网透传通信端口 */ .OutNetBlue.InnetRaw_Port = 53003, /**< 内网透传通信端口 */ - .INNET_COM_NUM = 1, /**< 内网通信设备数量 */ + .INNET_COM_NUM = 2, /**< 内网通信设备数量 */ .INNET_COM_CFG[0].InnetID = DEVICE_TYPE_AIM, /**< 内网通信ID */ .INNET_COM_CFG[0].Port_Raw_G = 55004, /**< 绿网透传端口 */ .INNET_COM_CFG[0].Port_Safe_G = 55003, /**< 绿网安全端口 */ .INNET_COM_CFG[0].Port_Raw_P = 55004, /**< 紫网透传端口 */ .INNET_COM_CFG[0].Port_Safe_P = 55003, /**< 紫网安全端口 */ + .INNET_COM_CFG[1].InnetID = 0X3001U, /**< 内网通信ID */ + .INNET_COM_CFG[1].Port_Safe_G = 55005, /**< 绿网安全端口 */ + .INNET_COM_CFG[1].Port_Raw_G = 0XFFFF, + .INNET_COM_CFG[1].Port_Safe_P = 55005, /**< 紫网安全端口 */ + .INNET_COM_CFG[1].Port_Raw_P = 0XFFFF, }; @@ -442,6 +449,8 @@ void APP_API_Data_Init() (void)CommonMemCpy((void*)(AppCfgInterface.Logger_P_IP), (UINT32)sizeof(CM_CHAR) * 32, (const void*)("192.168.18.100"), (UINT32)sizeof("192.168.18.100")); AppCfgInterface.INNET_COM_CFG[0].IP_G = (CM_UINT32)inet_addr("192.168.146.100"); AppCfgInterface.INNET_COM_CFG[0].IP_P = (CM_UINT32)inet_addr("192.168.18.100"); + AppCfgInterface.INNET_COM_CFG[1].IP_G = (CM_UINT32)inet_addr("192.168.146.100"); + AppCfgInterface.INNET_COM_CFG[1].IP_P = (CM_UINT32)inet_addr("192.168.18.100"); } else @@ -506,6 +515,8 @@ void APP_API_Data_Init() (void)CommonMemCpy((void*)(AppCfgInterface.Logger_P_IP), (UINT32)sizeof(CM_CHAR) * 32, (const void*)("192.168.20.100"), (UINT32)sizeof("192.168.20.100")); AppCfgInterface.INNET_COM_CFG[0].IP_G = (CM_UINT32)inet_addr("192.168.148.100"); AppCfgInterface.INNET_COM_CFG[0].IP_P = (CM_UINT32)inet_addr("192.168.20.100"); + AppCfgInterface.INNET_COM_CFG[1].IP_G = (CM_UINT32)inet_addr("192.168.148.100"); + AppCfgInterface.INNET_COM_CFG[1].IP_P = (CM_UINT32)inet_addr("192.168.20.100"); } if(SYSTEM_WORK_MODE_ONLY == cSystemWorkType) diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index 84d073b..01df07f 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.c +++ b/TSCP/src/MSCP/CFM/CFM_Net.c @@ -406,7 +406,7 @@ static void s_SockInit_2oo2(void) rt = CM_UDP_Socket_Create(&s_CFM_Sock.Sock_2oo2_Assert, CM_FALSE, (CM_UINT32)inet_addr(g_PFM_Cfg.Local_Cfg.IP_2oo2), g_PFM_Cfg.Local_Cfg.Port_2oo2_Assert,0u, ENUM_UNICAST); CM_NM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE,DARK_FAULT_CODE_FUN_ORDER_1, TSCP_DARK_ASSERT_26); - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 创建维护模式下的2取socket */ rt = CM_UDP_Socket_Create(&s_CFM_Sock.Sock_2oo2_Maintenance, CM_FALSE, (CM_UINT32)inet_addr(g_PFM_Cfg.Local_Cfg.IP_2oo2), g_PFM_Cfg.Local_Cfg.Port_2oo2_Maintenance, 0u, ENUM_UNICAST); @@ -475,7 +475,7 @@ static void s_NetInit_2oo2(void) rtCheck = CM_Thread_Create((CM_THREAD_T*)NULL, (CM_THREAD_FUNC_T)t_UdpRecvThread, "2oo2_Rx", 0, CM_TASK_PRIORITY_73, (CM_Thread_Arg_Struct_T*)&s_CFM_Rx2oo2_Assert); CM_NM_ASSERT(CM_TRUE == rtCheck, NET_MODE,DARK_FAULT_CODE_FUN_ORDER_1, TSCP_DARK_ASSERT_29); - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { CM_NM_ASSERT(s_CFM_Rx2oo2Mainteance.IP != NULL, NET_MODE,DARK_FAULT_CODE_FUN_ORDER_1, TSCP_DARK_ASSERT_19); (void)sprintf(s_CFM_Rx2oo2Mainteance.IP, "%s", g_PFM_Cfg.Local_Cfg.IP_2oo2); @@ -3199,7 +3199,7 @@ static void s_NetInit_RemoteUpdate(void) CM_BOOL rtCheck; /* 临时变量 */ CM_INT32 i = 0; /* 循环变量 */ - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /* 维护模式下用到的cfg全局变量数据拷贝,防护内存自检宕机引起的维护模式下使用cfg全局变量异常 */ g_RMUP_Cfg.CPU_ID=g_PFM_Cfg.CPU_ID; @@ -3779,6 +3779,7 @@ static CM_THREAD_FUNC_T t_RemoteUpdateThread(IN CM_Thread_Arg_Struct_T* arg) CM_UINT16 rmtPort_raw;/* 对方透传端口 */ struct in_addr serveraddr;/* 源ip */ CM_UINT8 Result = 0x0u;/* 请求处理结果 */ + CM_UINT16 innetID = 0U; #if QNX void* pmask = NULL; /*- 本线程锁定在 A53 core 1 */ @@ -3786,25 +3787,7 @@ static CM_THREAD_FUNC_T t_RemoteUpdateThread(IN CM_Thread_Arg_Struct_T* arg) (void)ThreadCtl(_NTO_TCTL_RUNMASK, pmask); #endif MSCP_LOG_MSG("IP:%s:%d UDP recv Start\n", pCtrl->IP, pCtrl->port); - /*- 获取目的IP端口 */ - pCom = PFM_INI_InnetID2Addr(g_Maintenance_Id); - if (NULL != pCom) - { - /*- 本机是否为CPU1 */ - if (1u == g_PFM_Cfg.CPU_ID) - { - rmtIP = pCom->IP_G; - rmtPort_safe = pCom->Port_Safe_G; - rmtPort_raw = pCom->Port_Raw_G; - } - else - { - rmtIP = pCom->IP_P; - rmtPort_safe = pCom->Port_Safe_P; - rmtPort_raw = pCom->Port_Raw_P; - } - } - else + if(0u == g_Maintenance_Ids[0]) { (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(NET_MODE, DARK_FAULT_CODE_FUN_ORDER_9, TSCP_DARK_ASSERT_1)); MSCP_LOG_MSG("Map Value From g_Maintenance_Id Error!!!\n"); @@ -3821,10 +3804,16 @@ static CM_THREAD_FUNC_T t_RemoteUpdateThread(IN CM_Thread_Arg_Struct_T* arg) if (len > 0) { MSCP_LOG_DATALEN(rcvBuf, len, "t_RemoteUpdateThread rcvBuflen"); - /*- 源IP端口是否合法 */ - if ((srcIP == rmtIP) && ((srcPort== rmtPort_safe) || (srcPort == rmtPort_raw))) + pCom = PFM_INI_InnetIP2Addr(srcIP, srcPort); + rt = ENUM_CM_FALSE; + if(NULL != pCom) { - if (srcPort== rmtPort_safe) + rt = PFM_MaintenanceID_Search(pCom->InnetID); + } + /*- 源IP端口是否合法 */ + if (ENUM_CM_TRUE == rt) + { + if (srcPort== pCom->Port_Safe_G || srcPort == pCom->Port_Safe_P) { /*- @alias 需要解sfp协议的远程部署命令 */ /*- @alias 将收到的完整帧写入线程接收队列 */ @@ -4039,7 +4028,7 @@ void CFM_NetFlush(void) { /*无处理 */ } - if((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 内网远程部署接收缓冲区清空 */ rt = CM_MQ_Flush(&s_CFM_RxRemoteUpdate.MsgQ); diff --git a/TSCP/src/MSCP/MSCP_APP_API.c b/TSCP/src/MSCP/MSCP_APP_API.c index a828ee3..0aa1e05 100644 --- a/TSCP/src/MSCP/MSCP_APP_API.c +++ b/TSCP/src/MSCP/MSCP_APP_API.c @@ -160,7 +160,7 @@ CM_UINT8 MSCP_AppSendMsg(IN ENUM_MSCP_MSG_CHN_T ch, IN CM_UINT16 dstName, /*- 返回 */ break; case ENUM_MSG_INNET_MAINTENANCE: /*-< 远程部署内网安全通信 */ - rt = Prtcl_InnetSafe_AppRmSend(txBuf, txLen); + rt = Prtcl_InnetSafe_AppRmSend(dstName, txBuf, txLen); MSCP_LOG_MSG("MSCP_AppSendMsg txLen = %d \n",txLen); MSCP_LOG_BIN(txBuf,txLen); /*- 返回 */ diff --git a/TSCP/src/MSCP/PFM/PFM_Cfg.c b/TSCP/src/MSCP/PFM/PFM_Cfg.c index 22c14c6..af59875 100644 --- a/TSCP/src/MSCP/PFM/PFM_Cfg.c +++ b/TSCP/src/MSCP/PFM/PFM_Cfg.c @@ -40,11 +40,11 @@ CM_CHAR FS_FILE_PATH[100]; /** 平台软件版本号 */ -const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 63u }; +const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 64u }; /** 驱动软件版本号 */ CM_UINT8 MSCP_DRV_VERION[4] = {0}; /** 与维护一体机接口文档版本号(接口文档发生改变时升级版本号) */ -CM_UINT16 TSCP_DOC_VERION[2] = {38u,0u}; +CM_UINT16 TSCP_DOC_VERION[2] = {39u,0u}; /** 操作系统版本号 */ CM_UINT8 TSCP_QNX_VERION[10] = {0u}; diff --git a/TSCP/src/MSCP/PFM/PFM_Cfg.h b/TSCP/src/MSCP/PFM/PFM_Cfg.h index e163ea2..22a154d 100644 --- a/TSCP/src/MSCP/PFM/PFM_Cfg.h +++ b/TSCP/src/MSCP/PFM/PFM_Cfg.h @@ -262,7 +262,7 @@ extern CM_UINT8 TSCP_QNX_VERION[10]; /** 操作系统版本号 */ CM_UINT32 M_RemoteUpdate_Enable;/**< 远程部署内网安全通信功能开关 */ CM_UINT8 M_Area_Enable; /**< 倒切配置,0x00为兼容的主线版本,0x55为CI,0xAA为RC */ CM_UINT8 M_AREA_SEB_Enable; /**< 区域串口板卡使能开关 */ - CM_UINT16 ID_Maintenance; /*维护终端ID*/ + CM_UINT16 ID_Maintenance[257]; /*维护终端ID,可能有多个,固定下标0表示ID个数, 下标1表示主要ID*/ CM_CHAR Start_Path[32]; /**< 程序启动路径 */ CM_INT32 reboot_replycount; /**< 重启确认报文回复次数 */ CM_UINT8 M_AutoReboot_Count; /**< 自动重启次数 */ diff --git a/TSCP/src/MSCP/PFM/PFM_Log.c b/TSCP/src/MSCP/PFM/PFM_Log.c index b0b0126..fd09120 100644 --- a/TSCP/src/MSCP/PFM/PFM_Log.c +++ b/TSCP/src/MSCP/PFM/PFM_Log.c @@ -940,7 +940,7 @@ static void PFM_LOG_MaintenanceMode(ENUM_BOARD_STATE_T MaintenanceFlag, CM_UINT3 while (1) { /*- 远程部署功能开关开启,并且维护id应用已设置不是初始值0 是否允许进入维护模式*/ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) && (0x00u != g_Maintenance_Id) && (0x55 == MaintenanceFlag) && ((ENUM_BOARDSTATE_EXIT == boardState) || (ENUM_BOARDSTATE_UPDATE == boardState) || (ENUM_BOARDSTATE_DEFAULT == boardState))) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) && (0u < g_Maintenance_Ids[0]) && (0x55 == MaintenanceFlag) && ((ENUM_BOARDSTATE_EXIT == boardState) || (ENUM_BOARDSTATE_UPDATE == boardState) || (ENUM_BOARDSTATE_DEFAULT == boardState))) { MSCP_LOG_MSG("----------Maintenance Mode count = %d----------\n",s_count); @@ -989,8 +989,8 @@ static void PFM_LOG_MaintenanceMode(ENUM_BOARD_STATE_T MaintenanceFlag, CM_UINT3 } else { - MSCP_LOG_MSG("MaintenanceFlag = %d, g_Maintenance_Id = %d, g_RMUP_Cfg.M_RemoteUpdate_Enable = %d, boardState = %d\n", \ - MaintenanceFlag,g_Maintenance_Id,g_RMUP_Cfg.M_RemoteUpdate_Enable,boardState); + MSCP_LOG_MSG("MaintenanceFlag = %d, g_Maintenance_Id nums = %d, g_RMUP_Cfg.M_RemoteUpdate_Enable = %d, boardState = %d\n", \ + MaintenanceFlag,g_Maintenance_Ids[0],g_RMUP_Cfg.M_RemoteUpdate_Enable,boardState); CM_Sleep(CM_UINT32_MAX); } } diff --git a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c index e0d4995..27f7754 100644 --- a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c +++ b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.c @@ -34,7 +34,7 @@ #define WAIT_TIME_2S (2000u/g_PFM_Cfg.CYC_TIME + 1u) #define WAIT_TIME_10S (10000u/g_PFM_Cfg.CYC_TIME + 1u) #define WAIT_TIME_120S (120000u/g_PFM_Cfg.CYC_TIME + 1u) -CM_UINT16 g_Maintenance_Id = 0x00u;/* 维护终端内网id */ +CM_UINT16 g_Maintenance_Ids[256] = {0};/* 维护终端内网id */ CM_UINT8 g_RemoteUpdate_State = 0x00u;/* 远程部署过程状态 */ ENUM_BOARD_STATE_T g_boardState = ENUM_BOARDSTATE_ERROR; @@ -44,11 +44,13 @@ static CM_UINT32 s_packTimer = 0u; /**< 请求命令时间戳 */ static CM_UINT32 s_packFirstSendTimer = 0u; /**< 第一次回复重启确认的周期号 */ static CM_UINT32 s_packFirstRecvTimer = 0u; /**< 收到aid第一次回复重启确认的周期号 */ static CM_UINT8 reboottype = 0u;/**< 重启请求命令 0x55:未更新重启 0xaa:升级重启 0xd1~d7:硬重启 */ +static CM_UINT16 s_rebootSrcid = 0u; extern CM_UINT32 g_MSCP_SysCount; /**< 系统周期号 */ static CM_UINT8 s_countres = 0u;/**重启确认报文回复次数计数 */ static CM_UINT8 packAccredit = 2u; /**授权状态 (当变量置为0或者1,则需要处理远程重启请求报文)*/ static CM_UINT8 reasonAuthorization = 0u; /*授权原因*/ static CM_UINT8 s_HardReboottype = 0u;/**<0xd1~d7:硬重启 */ +static CM_UINT16 s_HardRebootSrcid = 0u;/*接收到的重启命令的源ID*/ static CM_UINT8 s_packHardAccredit = 2u; /**硬重启授权状态 (当变量置为0或者1,则需要处理远程重启请求报文)*/ static CM_UINT8 s_reasonHardAuthorization = 0u; /*硬重启授权原因*/ @@ -100,7 +102,7 @@ static void PFM_DataReastart_SendTwo(void); static void PFM_RM_File(IN CM_UINT8 pathname[]); /*- 远程硬件重启命令接收处理 */ -static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType); +static void PFM_Data_HardWareReastart(CM_UINT16 srcName, CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType); /*- 远程切系命令接收处理 */ static void PFM_Data_RemoteSwitch(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType); @@ -109,7 +111,7 @@ static void PFM_Data_RemoteSwitch(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 static void PFM_RemoteSwitch_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason); /*- 硬件重启确认帧组包发送 */ -static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason); +static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT16 dstName, CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason); /*- 继电器检测 */ static ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_Realy_Check(ENUM_HARDWARE_BOOT_SELFCHECK_T s_selfcheck_state,CM_UINT32 s_OutPutTime, CM_UINT8 comResult); @@ -284,7 +286,7 @@ ENUM_CM_RETURN PFM_InnetRemoteUpdate_Send(IN CM_UINT8 ResponseBuf[],IN CM_UINT16 STRU_PFM_INNET_CFG_T* pCom = NULL;/* 通信配置 */ /*- 获取目的IP端口 */ - pCom = PFM_INI_InnetID2Addr(g_Maintenance_Id); + pCom = PFM_INI_InnetID2Addr(g_Maintenance_Ids[1]); /*- 是否获取成功 */ if ((NULL != ResponseBuf) && (NULL != pCom)) { @@ -1034,7 +1036,7 @@ ENUM_CM_RETURN PFM_DevStateSend(CM_UINT8 ifCyc) CM_UINT8 i = 0; MSCP_LOG_MSG("Maintenance Mode DevStateSendIndex = %d\n",DevStateSendIndex); - if((0x00u != g_Maintenance_Id) && (0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) && (0x55u == g_RMUP_Cfg.M_2oo2_Enable)) + if((0u < g_Maintenance_Ids[0]) && (0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) && (0x55u == g_RMUP_Cfg.M_2oo2_Enable)) { /* 总长度(临时添加) */ txLen = 0u; @@ -1164,7 +1166,6 @@ ENUM_CM_RETURN PFM_DevStateSend(CM_UINT8 ifCyc) /*- 检查2oo2双机的输出校验帧是否一致 */ CM_ASSERT_MAINTAIN(offset == rxLen); /*- 设置设备id */ - dstName = g_Maintenance_Id; if(1u == g_RMUP_Cfg.CPU_ID) { (void)CM_Memcpy(txBuf+offset,1000u-offset,rxBuf+3u,rxLen-3u); @@ -1177,8 +1178,12 @@ ENUM_CM_RETURN PFM_DevStateSend(CM_UINT8 ifCyc) /* 填入长度,总长是offset-自身2字节 */ txLen = offset - 2u; CM_ShortToChar(txLen, &txBuf[0]); - ret = Prtcl_InnetSafe_RmSend(dstName, txBuf, offset); - MSCP_LOG_MSG("offset = %d send ret =%d\n",offset, ret); + for(i = 1; i <= g_Maintenance_Ids[0]; i++) + { + dstName = g_Maintenance_Ids[i]; + ret = Prtcl_InnetSafe_RmSend(dstName, txBuf, offset); + MSCP_LOG_MSG("INNET RM dst id %04x offset = %d send ret =%d\n",dstName, offset, ret); + } } else { @@ -1191,8 +1196,12 @@ ENUM_CM_RETURN PFM_DevStateSend(CM_UINT8 ifCyc) /* 填入长度,总长是offset-自身2字节 */ rxLen = offset - 2u; CM_ShortToChar(rxLen, &rxBuf[0]); - ret = Prtcl_InnetSafe_RmSend(dstName, rxBuf, offset); - MSCP_LOG_MSG("offset = %d send ret = %d\n",offset, ret); + for(i = 1; i <= g_Maintenance_Ids[0]; i++) + { + dstName = g_Maintenance_Ids[i]; + ret = Prtcl_InnetSafe_RmSend(dstName, rxBuf, offset); + MSCP_LOG_MSG("INNET RM dst id %04x offset = %d send ret =%d\n",dstName, offset, ret); + } } } else @@ -1460,7 +1469,7 @@ static void PFM_DataReastart_Send(void) CM_ShortToChar(packLen, &mData[0]); /*- 发送远程重启确认报文 */ MSCP_LOG_MSG("shut down dateOffset = %d, packLen = %d\n",dataOffset,packLen); - (void)Prtcl_InnetSafe_AppRmSend(mData, dataOffset); + (void)Prtcl_InnetSafe_AppRmSend(g_Maintenance_Ids[1], mData, dataOffset); } else { @@ -1533,7 +1542,7 @@ static void PFM_DataReastart_SendTwo(void) CM_ShortToChar(packLen, &mData[0]); /*- 发送远程重启确认报文 */ MSCP_LOG_MSG("shut down dateOffset = %d, packLen = %d\n",dataOffset,packLen); - (void)Prtcl_InnetSafe_AppRmSend(mData, dataOffset); + (void)Prtcl_InnetSafe_AppRmSend(g_Maintenance_Ids[1], mData, dataOffset); } else { @@ -1674,39 +1683,67 @@ void PFM_MaintenanceMode(void) * @brief 设置维护终端内网id * @param dstName 维护终端内网id */ -void PFM_SetMaintenanceId(IN CM_UINT16 dstName ) +void PFM_SetMaintenanceId(IN CM_UINT16* dstNames ) { /*- 变量初始化 */ - CM_INT32 i = 0; + CM_INT32 i = 0, j = 0, index = 1; CM_UINT8 FindFlag = 0u; /*- 开始遍历内网通信配置:是否遍历完成:下一条配置 */ - for (i = 1; i <= (CM_INT32)g_PFM_Cfg.INNET_COM_NUM; i++) - { - /*- 是否找到了目标内网ID */ - if (dstName == g_PFM_Cfg.INNET_COM_CFG[i].InnetID) - { - /*- 设置维护终端内网id */ - g_Maintenance_Id = dstName; - FindFlag = 1u; - /*- 返回 */ - break; - } - else - { - /*- 无处理 */ - } - } + if(NULL != dstNames) + { + for (i = 1; i <= (CM_INT32)g_PFM_Cfg.INNET_COM_NUM; i++) + { + for(j = 1; j <= dstNames[0]; j++) + { + /*- 是否找到了目标内网ID */ + if (dstNames[j] == g_PFM_Cfg.INNET_COM_CFG[i].InnetID) + { + /*- 设置维护终端内网id */ + g_Maintenance_Ids[index++] = dstNames[j]; + FindFlag = 1u; + /*- 返回 */ + } + else + { + /*- 无处理 */ + } + } + } + } + g_Maintenance_Ids[0] = index - 1; if (1u != FindFlag) { (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_10, TSCP_DARK_ASSERT_1)); - MSCP_LOG_MSG("MSCP_SetMaintenanceId Error!!! dstName not find in INNET_COM_CFG InnetID\n",dstName); + MSCP_LOG_MSG("MSCP_SetMaintenanceId Error!!! dstName not find in INNET_COM_CFG InnetID\n"); } else { } } +/** + * @brief 查询维护ID是否存在 + * @param id 待查询的ID + * @return + * ENUM_CM_TRUE-存在 + * ENUM_CM_FALSE-不存在 + */ +ENUM_CM_RETURN PFM_MaintenanceID_Search(IN CM_UINT16 id) +{ + ENUM_CM_RETURN ret = ENUM_CM_FALSE; + CM_UINT32 i = 0; + for(i = 1u; i <= g_Maintenance_Ids[0]; i++) + { + if(id == g_Maintenance_Ids[i]) + { + ret = ENUM_CM_TRUE; + break; + } + } + + return ret; +} /** * @brief 硬件重启确认帧组包发送 * @param type 发送数据类型 取值范围:0x55或0x56 @@ -1715,7 +1752,7 @@ void PFM_SetMaintenanceId(IN CM_UINT16 dstName ) * @param reason 授权原因 取值范围:0~0xff * @return 无 */ -static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason) +static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT16 dstName, CM_UINT32 rcv_packTime,CM_UINT8 accredit,CM_UINT8 reason) { /*- 变量初始化 */ CM_UINT8 mData[1000] = { 0u }; @@ -1769,7 +1806,7 @@ static void PFM_HardWareReastart_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UI dataOffset += 4u; packLen = dataOffset - 2u; CM_ShortToChar(packLen, &mData[0]); - ret = Prtcl_InnetSafe_AppRmSend(mData,dataOffset); + ret = Prtcl_InnetSafe_AppRmSend(dstName, mData,dataOffset); if(ret == 0) { /*输出异常警告*/ @@ -1845,7 +1882,7 @@ static void PFM_RemoteSwitch_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 dataOffset += 4u; packLen = dataOffset - 2u; CM_ShortToChar(packLen, &mData[0]); - ret = Prtcl_InnetSafe_AppRmSend(mData,dataOffset); + ret = Prtcl_InnetSafe_AppRmSend(g_Maintenance_Ids[1],mData,dataOffset); if(ret == 0) { /*输出异常警告*/ @@ -1867,7 +1904,7 @@ static void PFM_RemoteSwitch_Send(CM_UINT8 type,CM_UINT32 rcv_packTime,CM_UINT8 * @param packLen 帧长度 取值范围:0~0xffff * @param packType 帧类型 取值范围:0~0xff */ -static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType) +static void PFM_Data_HardWareReastart(CM_UINT16 srcName,CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 packLen,CM_UINT8 packType) { /*- 变量初始化 */ CM_UINT32 packTimer = 0u; @@ -1880,6 +1917,7 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI CM_UINT32 packRestartCrc = 0u; /*重启请求命令crc*/ CM_UINT8 boottype = 0u;/**<临时 重启请求命令 0x55:未更新重启 0xaa:升级重启 0xd1~d7:硬重启 */ static CM_UINT8 s_boottype = 0u;/**<静态 重启请求命令 0x55:未更新重启 0xaa:升级重启 ,0xd1~d7:硬重启 */ + static CM_UINT16 s_srcid = 0u; CM_UINT8 recvType = 0u; ENUM_2x2_STATE_T localState = SFM_2x2_GetLocal2x2State(); /*- 如果帧类型是一次请求确认 */ @@ -1912,7 +1950,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 1u; (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_1)); @@ -1922,6 +1962,7 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; /* s_HardReboottype = 0u; */ s_packHardAccredit = 1u; s_reasonHardAuthorization = 5u; @@ -1933,7 +1974,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 6u; (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_2)); @@ -1943,7 +1986,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 非法包丢弃 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 7u; (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_3)); @@ -1952,9 +1997,10 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI else { s_boottype = boottype; + s_srcid = srcName; s_packHardAccredit = 0u; s_reasonHardAuthorization = 0u; - MSCP_LOG_MSG("0xa5 boottype = %d\n",boottype); + MSCP_LOG_MSG("0xa5 boottype = %d, srcid = %04x\n",boottype, s_srcid); } /*首次应答*/ recvType = 0x55u; @@ -1992,7 +2038,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- crc计算失败丢弃错误包 */ s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 1u; MSCP_LOG_MSG("error pack 0xa6 packSwitchCrc=%d,calcCrc1=%d,packCrc=%d,calcCrc2=%d\n",packRestartCrc,calcCrc1,packCrc,calcCrc2); @@ -2003,6 +2051,7 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI { /*- 正在执行其它命令 */ s_boottype = 0u; + s_srcid = 0u; /* s_HardReboottype = 0u; */ s_packHardAccredit = 1u; s_reasonHardAuthorization = 5u; @@ -2010,11 +2059,20 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI ,s_switch2xFlag,s_switchRmFlag,g_iostate); (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_5)); } + else if(s_srcid != srcName) + { + s_packHardAccredit = 1u; + s_reasonHardAuthorization = 6u; + MSCP_LOG_MSG("error pack 0xa6 s_srcid = %04x srcName = %04x\n", s_srcid, srcName); + (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(REMOTE_UPDATE, DARK_FAULT_CODE_FUN_ORDER_13, TSCP_DARK_ASSERT_8)); + } /*- 切系命令一次回复到二次请求接收时间是否小于两分钟 */ else if(((g_MSCP_SysCount - s_packFirstRecvTimer)*g_RMUP_Cfg.CYC_TIME) >= 120000u) { s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 7u; MSCP_LOG_MSG("error pack 0xa6 g_MSCP_SysCount = %d s_packFirstRecvTimer = %d\n", g_MSCP_SysCount, s_packFirstRecvTimer); @@ -2023,7 +2081,9 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI else if((boottype <= 0xd0u) || (boottype >= 0xd8u ) || (s_boottype != boottype)) { s_boottype = 0u; + s_srcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0U; s_packHardAccredit = 1u; s_reasonHardAuthorization = 6u; MSCP_LOG_MSG("error pack 0xa6 s_boottype = %d boottype = %d\n", s_boottype, boottype); @@ -2032,17 +2092,18 @@ static void PFM_Data_HardWareReastart(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UI else { s_HardReboottype = s_boottype; + s_HardRebootSrcid = s_srcid; s_packHardAccredit = 0u; s_reasonHardAuthorization = 0u; g_iostate = 0x1u; - MSCP_LOG_MSG("0xa6 boottype = %d, s_boottype = %d\n",boottype, s_boottype); + MSCP_LOG_MSG("0xa6 boottype = %d, s_boottype = %d, s_srcid = %04x\n",boottype, s_boottype, s_srcid); } /*再次应答*/ recvType = 0x56u; } /*- 硬重启命令请求回复 */ - PFM_HardWareReastart_Send(recvType,packTimer,s_packHardAccredit,s_reasonHardAuthorization); + PFM_HardWareReastart_Send(recvType,srcName,packTimer,s_packHardAccredit,s_reasonHardAuthorization); } /** @@ -2253,7 +2314,7 @@ static void PFM_Data_RemoteSwitch(CM_UINT8* mData,CM_UINT32 dataOffset,CM_UINT16 * - 0xa7首次切系请求 * - 0xa8二次切系请求 */ -CM_UINT8 PFM_RemoteRun_Data(CM_UINT8 *mData,CM_UINT32 dataLen) +CM_UINT8 PFM_RemoteRun_Data(CM_UINT16 srcName, CM_UINT8 *mData,CM_UINT32 dataLen) { /*- 变量初始化 */ CM_UINT32 dataOffset = 0u; @@ -2273,7 +2334,7 @@ CM_UINT8 PFM_RemoteRun_Data(CM_UINT8 *mData,CM_UINT32 dataLen) { if((0xA5u == packType) || (0xA6u == packType)) { - PFM_Data_HardWareReastart(mData,dataOffset,packLen,packType); + PFM_Data_HardWareReastart(srcName,mData,dataOffset,packLen,packType); } else if((0xA7u == packType) || (0xA8u == packType)) { @@ -2308,7 +2369,8 @@ void PFM_HardWareBoot_UpData(void) g_boardState = g_AppSetboardState; /*- 更新硬重启模式 */ reboottype = s_HardReboottype; - MSCP_LOG_MSG("reboottype = %d, s_HardReboottype = %d\n",reboottype,s_HardReboottype); + s_rebootSrcid = s_HardRebootSrcid; + MSCP_LOG_MSG("reboottype = %d, s_HardReboottype = %d, s_HardRebootSrcid = %04x\n",reboottype,s_HardReboottype,s_HardRebootSrcid); /*- 更新切系状态 */ if(0x55 == s_switchRmFlag) { @@ -2335,11 +2397,13 @@ void PFM_HardWareBoot_OutPut(void) /*- 变量初始化 */ CM_INT32 ret = 0; CM_UINT8 type = 0u; + CM_UINT16 srcID = 0u; static ENUM_HARDWARE_BOOT_SELFCHECK_T checkselfret = ENUM_RELAY_1ST_OUTPUT; /*- 重启命令为硬重启命令 */ if((0xd0u < reboottype) && (0xd8u > reboottype)) { type = reboottype; + srcID = s_rebootSrcid; /*- @alias 执行硬重启 */ switch(type) { @@ -2348,7 +2412,7 @@ void PFM_HardWareBoot_OutPut(void) if(ENUM_2x2_MASTER == SFM_2x2_GetLocal2x2State()) { MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 1\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x0Cu,ENUM_TYPE_PUB,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x0Cu,ENUM_TYPE_PUB,type,srcID); } else { @@ -2360,22 +2424,22 @@ void PFM_HardWareBoot_OutPut(void) case 0xd2: /*- 1010:CCU*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 3\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x0Au,ENUM_TYPE_CCU,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x0Au,ENUM_TYPE_CCU,type,srcID); break; case 0xd3: /*- 0110:SEB*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 4\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x06u,ENUM_TYPE_SEB,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x06u,ENUM_TYPE_SEB,type,srcID); break; case 0xd4: /*- 1001:ESB*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 5\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x09u,ENUM_TYPE_ESB,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x09u,ENUM_TYPE_ESB,type,srcID); break; case 0xd5: /*- 0101:EEB*/ MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 6\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x05u,ENUM_TYPE_OTHER,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x05u,ENUM_TYPE_OTHER,type,srcID); break; case 0xd6: /*- 0011:OCIO预留,硬件不支持禁止打开*/ @@ -2389,7 +2453,7 @@ void PFM_HardWareBoot_OutPut(void) if(ENUM_2x2_MASTER == SFM_2x2_GetLocal2x2State()) { MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 9\n"); - checkselfret = PFM_HardWareBoot_CheckSelf(0x0Fu,ENUM_TYPE_ALL,type); + checkselfret = PFM_HardWareBoot_CheckSelf(0x0Fu,ENUM_TYPE_ALL,type,srcID); } else { @@ -2410,7 +2474,9 @@ void PFM_HardWareBoot_OutPut(void) MSCP_LOG_MSG("PFM_HardWareBoot_OutPut 12\n"); /*- 恢复运营状态*/ reboottype = 0u; + s_rebootSrcid = 0u; s_HardReboottype = 0u; + s_HardRebootSrcid = 0u; g_iostate = 0x0u; } } @@ -2433,7 +2499,7 @@ void PFM_HardWareBoot_OutPut(void) * @param reboottype 重启命令类型 取值范围:0xD1~0xD7 * @return ENUM_HARDWARE_BOOT_SELFCHECK_T 当前检测步骤 取值范围:0~11 */ -ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype) +ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype, CM_UINT16 srcName) { /*- 变量初始化 */ static ENUM_HARDWARE_BOOT_SELFCHECK_T s_selfcheck_state = ENUM_RELAY_1ST_OUTPUT; @@ -2703,8 +2769,8 @@ ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BO /*- 反馈执行结果 */ case ENUM_OUTPUT_RESULT: /*- 发送结果至AID */ - MSCP_LOG_MSG("s_relay_default[0] = %d,s_relay_default[1] = %d,s_relay_default[2] = %d,s_relay_default[3] = %d\n",s_relay_default[0],s_relay_default[1],s_relay_default[2],s_relay_default[3]); - PFM_HardWareBoot_CheckSelf_Response(s_boot_result,s_relay_default,reboottype); + MSCP_LOG_MSG("s_relay_default[0] = %d,s_relay_default[1] = %d,s_relay_default[2] = %d,s_relay_default[3] = %d, srcName = %04x\n",s_relay_default[0],s_relay_default[1],s_relay_default[2],s_relay_default[3], srcName); + PFM_HardWareBoot_CheckSelf_Response(s_boot_result,s_relay_default,reboottype, srcName); /*- 清空所有标志位 */ s_selfcheck_state = ENUM_RELAY_1ST_OUTPUT; s_OutPutTime = 0u; @@ -2866,7 +2932,7 @@ CM_UINT8 PFM_HardWareBoot_CheckSelf_ComState(ENUM_BOARD_TYPE_T type, CM_UINT8 s_ * @param reboottype 重启命令类型 取值范围:0xd1~0xd7 * @return 无 */ -void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype) +void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype,CM_UINT16 dstName) { /*- 变量初始化 */ CM_UINT8 mData[1000] = { 0u }; @@ -2911,7 +2977,7 @@ void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultb dataOffset += 4u; packLen = dataOffset - 2u; CM_ShortToChar(packLen, &mData[0]); - ret = Prtcl_InnetSafe_AppRmSend(mData,dataOffset); + ret = Prtcl_InnetSafe_AppRmSend(dstName,mData,dataOffset); if(ret == 0) { /*- 输出异常警告 */ diff --git a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h index e1c3446..a49b66b 100644 --- a/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h +++ b/TSCP/src/MSCP/PFM/PFM_RemoteUpdate.h @@ -12,7 +12,7 @@ extern "C" #define FAULT_REBOOT_CUT_MAX (3u) /*故障重启次数限制*/ -extern CM_UINT16 g_Maintenance_Id;/* 维护终端内网id */ +extern CM_UINT16 g_Maintenance_Ids[256];/* 维护终端内网id */ extern CM_UINT8 g_RemoteUpdate_State;/* 远程部署过程状态 */ extern CM_UINT8 s_switch2xFlag; @@ -115,12 +115,16 @@ void PFM_MaintenanceMode(void); * @brief 设置维护终端内网id * @param dstName 维护终端内网id */ -void PFM_SetMaintenanceId(IN CM_UINT16 dstName); +void PFM_SetMaintenanceId(IN CM_UINT16* dstNames); +/** + * @brief 查询维护ID是否存在 + */ +ENUM_CM_RETURN PFM_MaintenanceID_Search(IN CM_UINT16 id); /** * @brief 远程硬件重启\切系命令接收处理 */ -CM_UINT8 PFM_RemoteRun_Data(CM_UINT8 *mData,CM_UINT32 dataLen); +CM_UINT8 PFM_RemoteRun_Data(CM_UINT16 srcName, CM_UINT8 *mData,CM_UINT32 dataLen); /*硬件重启IO更新*/ void PFM_HardWareBoot_UpData(void); /*执行硬件重启IO输出*/ @@ -133,9 +137,10 @@ CM_UINT8 PFM_GetBoardRebootState(void); * @param level 待输出IO 取值范围:0x00~0x0F * @param board_type 当前命令目标重启板卡类型 取值范围:ENUM_BOARD_TYPE_T * @param reboottype 重启命令类型 取值范围:0xD1~0xD7 +* @param srcName 重启命令的源ID * @return ENUM_HARDWARE_BOOT_SELFCHECK_T 当前检测步骤 */ -ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype); +ENUM_HARDWARE_BOOT_SELFCHECK_T PFM_HardWareBoot_CheckSelf(CM_UINT8 level,ENUM_BOARD_TYPE_T board_type,CM_UINT8 reboottype, CM_UINT16 srcName); /** * @brief 识别AB系通信需要计算的板卡通信状态(对系) * @param type 当前判断板卡通信状态类型 取值范围:ENUM_BOARD_TYPE_T @@ -149,9 +154,10 @@ CM_UINT8 PFM_HardWareBoot_CheckSelf_ComState(ENUM_BOARD_TYPE_T type, CM_UINT8 s_ * @param boot_result 硬重启结果 取值范围:0x55成功,0xAA失败 * @param *defaultbuf 继电器检测结果数组 取值范围:0x55成功,0xAA故障 * @param reboottype 重启命令类型 取值范围:0xd1~0xd7 +* @param dstName 回复的目的ID * @return 无 */ -void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype); +void PFM_HardWareBoot_CheckSelf_Response(CM_UINT8 boot_result,CM_UINT8 *defaultbuf,CM_UINT8 reboottype,CM_UINT16 dstName); /** * @brief 识别AB系通信需要计算的板卡通信状态 diff --git a/TSCP/src/MSCP/SFM/SFM_Prtcl.c b/TSCP/src/MSCP/SFM/SFM_Prtcl.c index a4d2a58..46d8412 100644 --- a/TSCP/src/MSCP/SFM/SFM_Prtcl.c +++ b/TSCP/src/MSCP/SFM/SFM_Prtcl.c @@ -189,7 +189,7 @@ void SFM_PrtclInInit(CM_UINT8* p_SfpInnetPara) } /*- 入参是否为空 */ - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id) && (NULL != p_SfpInnetPara)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0]) && (NULL != p_SfpInnetPara)) { /*- 远程部署内网安全协议初始化*/ CM_NM_ASSERT(0u != InnetID, PRTCL_MODE, DARK_FAULT_CODE_FUN_ORDER_17, TSCP_DARK_ASSERT_1); @@ -658,7 +658,7 @@ void SFM_UnPrtclProc(void) } PFM_CFC_Check(46); /*- @alias 远程部署内网安全通信协议解析 */ - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { (void)QueueClear(&s_InnetPrtcl_RM.DataToApp); s_InnetPrtcl_RM.RadamSN = SFM_2x2_GetSysCount(); @@ -962,7 +962,7 @@ CM_UINT32 Prtcl_InnetSafe_RmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLifeTim CM_UINT32 rt_len = 0u; /* 函数返回长度值 */ CM_UINT8 rt = 0u; /* 函数返回值 */ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 锁定接收队列 */ (void)CM_Mutex_Lock(s_Innet_RmRecv_M); @@ -994,7 +994,7 @@ CM_UINT32 Prtcl_InnetSafe_RmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLifeTim (void)CM_QueueRead(rt_len, rxBuf, &s_Innet_RmRecvQ); /*- 解析通信协议,如果是重启或切系命令,执行重启或切系逻辑*/ - rt = PFM_RemoteRun_Data(rxBuf,rt_len); + rt = PFM_RemoteRun_Data(*pSrcName,rxBuf,rt_len); /*- 如果是重启命令*/ if((0xA5 <= rt) && (0xA8 >= rt)) { @@ -1053,7 +1053,7 @@ CM_UINT32 Prtcl_InnetSafe_PlatRmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLif CM_UINT16 msgLen = 0u; /* 报文长度 */ CM_UINT32 qStatus = 0u; /* 队列状态 */ CM_UINT32 rt_len = 0u; /* 函数返回长度值 */ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 锁定接收队列 */ (void)CM_Mutex_Lock(s_Innet_RmRecv_M); @@ -1114,7 +1114,7 @@ CM_UINT32 Prtcl_InnetSafe_PlatRmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLif * - 0 失败(输入非法) * @details */ -CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN const CM_UINT8* txBuf, IN CM_UINT32 txLen) +CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, IN CM_UINT32 txLen) { /*- 变量初始化 */ CM_UINT8 buf[2u] = { 0u }; /* 临时变量 */ @@ -1122,18 +1122,21 @@ CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN const CM_UINT8* txBuf, IN CM_UINT32 txLen) ENUM_CM_RETURN temprt = ENUM_CM_TRUE; /* 临时返回值 */ CM_ASSERT_MAINTAIN(txBuf != NULL); /*- 输入长度检查 */ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /* 2字节 长度(不含自身) + 2字节 目的ID n字节 数据 */ /*- 锁定发送队列 */ (void)CM_Mutex_Lock(s_Innet_AppRmSend_M); /*- 填写协议输出帧头 */ - CM_ShortToChar(txLen, buf); + CM_ShortToChar(txLen + 2, buf); temprt &= CM_QueueWrite(2u, buf, &s_Innet_AppRmSendQ);/*长度*/ + CM_ShortToCharLE(dstName, buf); + temprt &= CM_QueueWrite(2u, buf, &s_Innet_AppRmSendQ);/*目的ID*/ /*- 填写应用输出报文 */ temprt &= CM_QueueWrite(txLen, txBuf, &s_Innet_AppRmSendQ); if(ENUM_CM_TRUE == temprt) @@ -1174,26 +1177,54 @@ CM_UINT8 Prtcl_InnetSafe_RmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, { /*- 变量初始化 */ CM_UINT16 len = 0u; /* 长度 */ - CM_UINT16 applen = 0u; /* 长度 */ + CM_UINT16 applen = 0u, tmplen = 0u; /* 长度 */ + CM_BOOL flag_split = CM_FALSE; /*是否将平台帧和应用帧分开发送*/ CM_UINT8 buf[2u] = { 0u }; /* 临时变量 */ + CM_UINT8 buf4[4u] = {0u}; /* 临时变量*/ CM_UINT8 Buftmp[128] = { 0u }; /* 临时变量 */ CM_UINT8 rt = 0u; /* 函数返回值 */ ENUM_CM_RETURN temprt = ENUM_CM_TRUE; /* 临时返回值 */ + CM_UINT16 appDstID = 0xffffu; /*- 输入长度检查 */ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 锁定发送队列 */ (void)CM_Mutex_Lock(s_Innet_AppRmSend_M); /*- 读取应用帧头 */ /* 2字节 长度(不含自身) + 2字节 目的ID n字节 数据 */ - (void)CM_QueueRead(2u, buf, &s_Innet_AppRmSendQ);/*长度*/ + (void)CM_QueueScan(2u, buf, &s_Innet_AppRmSendQ);/*长度*/ applen = CM_ShortFromChar(buf); - - (void)CM_QueueRead(applen, Buftmp, &s_Innet_AppRmSendQ);/*长度*/ + if(applen >= 2u) + { + (void)CM_QueueScan(4u, buf4, &s_Innet_AppRmSendQ);/*长度*/ + appDstID = CM_ShortFromCharLE(&buf4[2]); + temprt = PFM_MaintenanceID_Search(appDstID); + applen -= 2u; + } + if(appDstID == dstName || ENUM_CM_FALSE == temprt) + { + (void)CM_QueueRead(2u, buf, &s_Innet_AppRmSendQ); + (void)CM_QueueRead(2u, buf, &s_Innet_AppRmSendQ); + (void)CM_QueueRead(applen, Buftmp, &s_Innet_AppRmSendQ);/*长度*/ + if(appDstID == g_Maintenance_Ids[1]) + { + tmplen = applen; + flag_split = CM_FALSE; + } + else + { + flag_split = CM_TRUE; + tmplen = 0u; + } + } + else + { + } /*- 解锁发送队列 */ (void)CM_Mutex_Unlock(s_Innet_AppRmSend_M); @@ -1206,7 +1237,7 @@ CM_UINT8 Prtcl_InnetSafe_RmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, (void)CM_Mutex_Lock(s_Innet_RmSend_M); /*- 填写协议输出帧头 */ - len = (CM_UINT16)(txLen + 4u)+applen; + len = (CM_UINT16)(txLen + 4u)+tmplen; CM_ShortToChar(len, buf); temprt &= CM_QueueWrite(2u, buf, &s_Innet_RmSendQ);/*长度*/ CM_ShortToCharLE(0u, buf); @@ -1217,7 +1248,22 @@ CM_UINT8 Prtcl_InnetSafe_RmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, temprt &= CM_QueueWrite(txLen, txBuf, &s_Innet_RmSendQ); if(ENUM_CM_TRUE == temprt) { - temprt &= CM_QueueWrite(applen, Buftmp, &s_Innet_RmSendQ); + if(CM_TRUE == flag_split) + { + len = applen + 4u; + CM_ShortToChar(len, buf); + temprt &= CM_QueueWrite(2u, buf, &s_Innet_RmSendQ);/*长度*/ + CM_ShortToCharLE(0u, buf); + temprt &= CM_QueueWrite(2u, buf, &s_Innet_RmSendQ);/*2字节预留*/ + CM_ShortToCharLE(dstName, buf); + temprt &= CM_QueueWrite(2u, buf, &s_Innet_RmSendQ);/*目的ID*/ + temprt &= CM_QueueWrite(applen, Buftmp, &s_Innet_RmSendQ); + } + else + { + temprt &= CM_QueueWrite(tmplen, Buftmp, &s_Innet_RmSendQ); + } + if(ENUM_CM_TRUE == temprt) { rt = 1u;/*成功*/ @@ -1312,7 +1358,7 @@ void SFM_EnPrtclProc(void) } /*- 远程部署内网安全协议封装 */ - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { CM_LongToChar(0u, s_InnetPrtcl_RM.PrtclSndBuff); CM_LongToChar(0u, s_InnetPrtcl_RM.RecordArray); @@ -1382,7 +1428,7 @@ CM_UINT32 SFM_ReadInnetRmCodedOutput(OUT CM_UINT8 Buf[], IN CM_UINT32 BufSize) */ /*- 获取输出报文总长度 */ CM_UINT32 len = 0u; - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { len = CM_LongFromChar(s_InnetPrtcl_RM.PrtclSndBuff); CM_RE_ASSERT(BufSize >= 4u,PRTCL_MODE, DARK_FAULT_CODE_FUN_ORDER_21, TSCP_DARK_ASSERT_1); @@ -1538,7 +1584,7 @@ void SFM_TxInnetSafeRm(IN CM_UINT8 Buf[], IN CM_UINT32 Len) STRU_PFM_INNET_CFG_T* pCom = NULL;/* 通信配置 */ ENUM_CM_RETURN ret = ENUM_CM_FALSE; - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { allLen = CM_LongFromChar(Buf); /*外网输出帧报文总长度*/ CM_RE_ASSERT((allLen + 4u) == Len,PRTCL_MODE,DARK_FAULT_CODE_FUN_ORDER_20, TSCP_DARK_ASSERT_1); @@ -1573,7 +1619,8 @@ void SFM_TxInnetSafeRm(IN CM_UINT8 Buf[], IN CM_UINT32 Len) /*- 是否获取成功 */ if (NULL != pCom) { - if (g_Maintenance_Id == dstID) + ret = PFM_MaintenanceID_Search(dstID); + if (ret == ENUM_CM_TRUE) { /*- 远程部署维护终端设备 */ /*- 本机是否为CPU1 */ @@ -1624,6 +1671,7 @@ void SFM_TxInnetSafeRemoteUpdate(IN CM_UINT8 Buf[], IN CM_UINT32 Len) CM_UINT16 msgLen = 0u; /* 外网输出帧长度 */ CM_UINT16 dstID = 0u; /* 目的设备ID */ STRU_PFM_INNET_CFG_T* pCom = NULL;/* 通信配置 */ + ENUM_CM_RETURN ret = ENUM_CM_FALSE; if ((allLen + 4u) == Len) { @@ -1658,7 +1706,8 @@ void SFM_TxInnetSafeRemoteUpdate(IN CM_UINT8 Buf[], IN CM_UINT32 Len) /*- 是否获取成功 */ if (NULL != pCom) { - if (g_Maintenance_Id == dstID) + ret = PFM_MaintenanceID_Search(dstID); + if (ret == ENUM_CM_TRUE) { /*- 远程部署维护终端设备 */ /*- 本机是否为CPU1 */ @@ -1989,7 +2038,7 @@ void SFM_PrtclBufSwitch(void) } /*- 是否开启远程部署内网安全通信 */ - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 读取远程部署内网发送缓冲 */ len = CM_QueueStatus(&s_Innet_RmSendQ); @@ -2173,7 +2222,7 @@ void SFM_UnPrtclProc_Crash(void) { CM_UINT8 ret = 0; /*- @alias 内网安全通信协议解析 */ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { g_PFM_Check = PFM_CFC_PROC_NUM + 6; CM_UINT32 QueuelenA = QueueStatus(&s_InnetPrtcl_RM.OutnetQueueA); @@ -2215,7 +2264,7 @@ void SFM_EnPrtclProc_Crash(void) SFM_AppToPrtclBuf_InnetSafeCrash(); /*- 内网安全协议封装 */ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { MSCP_LOG_MSG("SFM_EnPrtclProc_Crash Queuelen1 = %d\n",QueueStatus(&s_InnetPrtcl_RM.OutputDataQueue)); CM_LongToChar(0u, s_InnetPrtcl_RM.PrtclSndBuff); @@ -2254,7 +2303,7 @@ void SFM_PrtclBufToApp_InnetSafeCrash(void) ENUM_CM_RETURN ret = ENUM_CM_FALSE; CM_UINT8 rslt = 0u; /*- 是否开启内网安全通信 */ - if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_RMUP_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 清空应用内网接收缓冲区 */ (void)CM_QueueClear(&s_Innet_RmRecvQ); @@ -2292,7 +2341,7 @@ void SFM_AppToPrtclBuf_InnetSafeCrash(void) CM_UINT8 rslt = 0u; CM_UINT32 Queuelen = 0u; /*- 是否开启内网安全通信 */ - if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0x00u != g_Maintenance_Id)) + if ((0x55u == g_PFM_Cfg.M_RemoteUpdate_Enable) &&(0u < g_Maintenance_Ids[0])) { /*- 读取应用内网发送缓冲 */ len = CM_QueueStatus(&s_Innet_RmSendQ); diff --git a/TSCP/src/MSCP/SFM/SFM_Prtcl.h b/TSCP/src/MSCP/SFM/SFM_Prtcl.h index 03b3f7d..9ba3f0c 100644 --- a/TSCP/src/MSCP/SFM/SFM_Prtcl.h +++ b/TSCP/src/MSCP/SFM/SFM_Prtcl.h @@ -171,7 +171,7 @@ extern "C" /* 发送内网远程部署安全通信数据 */ void SFM_TxInnetSafeRemoteUpdate(IN CM_UINT8 Buf[], IN CM_UINT32 Len); - CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN const CM_UINT8* txBuf, IN CM_UINT32 txLen); + CM_UINT8 Prtcl_InnetSafe_AppRmSend(IN CM_UINT16 dstName, IN const CM_UINT8* txBuf, IN CM_UINT32 txLen); CM_UINT32 Prtcl_InnetSafe_RmRecv(OUT CM_UINT16* pSrcName, OUT CM_UINT8* pLifeTime, OUT CM_UINT8* rxBuf, IN CM_UINT32 rxSize);