|
@@ -159,17 +159,18 @@ void *MsgHndlrTask( void *pArg )
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //update checksum2
|
|
|
- resMsgPkt.Data[resMsgPkt.Size] = CalculateCheckSum2(resMsgPkt.Data, resMsgPkt.Size);
|
|
|
- resMsgPkt.Size++;
|
|
|
-
|
|
|
if(g_BMCInfo.IpmiConfig.UDSIfcSupport == 0x01 && (reqMsgPkt.SrcQ == gFdUdsRes))
|
|
|
{
|
|
|
- //TODO:UDS的数据结构在最后多了一个0,找机会要给他去掉。
|
|
|
- resMsgPkt.Size = resMsgPkt.Size+1;
|
|
|
+ //UDS 数据包不需要checksum
|
|
|
SwapUDSIPMIMsg(&reqMsgPkt,&resMsgPkt);
|
|
|
- resMsgPkt.Data[resMsgPkt.Size-1] = 0;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //update checksum2
|
|
|
+ resMsgPkt.Data[resMsgPkt.Size] = CalculateCheckSum2(resMsgPkt.Data, resMsgPkt.Size);
|
|
|
+ resMsgPkt.Size++;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
if(SYS_IFC_CHANNEL == reqMsgPkt.Channel)
|
|
|
{
|
|
@@ -233,15 +234,14 @@ ValidateMsgHdr (MsgPkt_T* pReq)
|
|
|
pIPMIMsgReq->ResAddr = m_PendingBridgedResTbl[PBTbl][SeqNum].ReqMsgHdr.ReqAddr;
|
|
|
pIPMIMsgReq->RqSeqLUN = m_PendingBridgedResTbl[PBTbl][SeqNum].ReqMsgHdr.RqSeqLUN;
|
|
|
|
|
|
- /* Calculate the Second CheckSum */
|
|
|
- pReq->Data[ pReq->Size - 1 ] = CalculateCheckSum2( pReq->Data, pReq->Size - 1 );
|
|
|
- pReq->Data[2] = (~(pReq->Data[0] + pReq->Data[1])) +1; //2's complement checksum
|
|
|
-
|
|
|
pReq->Param = BRIDGING_REQUEST;
|
|
|
-
|
|
|
|
|
|
if (m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ == gFd_LanIfcQ)
|
|
|
{
|
|
|
+ /* Calculate the Second CheckSum */
|
|
|
+ pReq->Data[ pReq->Size - 1 ] = CalculateCheckSum2( pReq->Data, pReq->Size - 1 );
|
|
|
+ pReq->Data[2] = (~(pReq->Data[0] + pReq->Data[1])) +1; //2's complement checksum
|
|
|
+
|
|
|
for (j=pReq->Size - 1; j>=0; j--)
|
|
|
{
|
|
|
pReq->Data[j+1] = pReq->Data[j];
|
|
@@ -258,8 +258,8 @@ ValidateMsgHdr (MsgPkt_T* pReq)
|
|
|
memcpy(&pReq->Data[sizeof(IPMIUDSMsg_T)], &pReq->Data[0], pReq->Size);
|
|
|
memcpy(&pReq->Data[0], &m_PendingBridgedResTbl[PBTbl][SeqNum].ResMsgHdr.UDSMsgHdr, sizeof(IPMIUDSMsg_T));
|
|
|
pReq->Size += sizeof(IPMIUDSMsg_T);
|
|
|
- pReq->Size++;
|
|
|
- pReq->Data[pReq->Size-1] = 0;
|
|
|
+ //pReq->Size++;
|
|
|
+ //pReq->Data[pReq->Size-1] = 0;
|
|
|
|
|
|
((IPMIUDSMsg_T*)&pReq->Data[0])->IPMIMsgLen = pReq->Size;
|
|
|
|
|
@@ -318,17 +318,18 @@ ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes)
|
|
|
{
|
|
|
//printf("log 1, pReq->Channel: %#x\n", pReq->Channel);
|
|
|
HdrOffset = sizeof (IPMIMsgHdr_T);
|
|
|
- pReq->Size = pReq->Size - HdrOffset - 1;
|
|
|
+ pReq->Size = pReq->Size - HdrOffset - 1; //remove header and checksum2
|
|
|
}
|
|
|
if(UDS_CHANNEL == pReq->Channel)
|
|
|
{
|
|
|
//printf("log 2, pReq->Size: %d, HdrOffset: %d\n", pReq->Size, HdrOffset);
|
|
|
+ //UDS数据没有校验,UDSHeader + data
|
|
|
HdrOffset = sizeof(IPMIUDSMsg_T);
|
|
|
- pReq->Size = pReq->Size -HdrOffset - 1;
|
|
|
+ pReq->Size = pReq->Size -HdrOffset;
|
|
|
}
|
|
|
|
|
|
SwapIPMIMsgHdr((IPMIMsgHdr_T*)pReq->Data, (IPMIMsgHdr_T*)pRes->Data);
|
|
|
- pRes->Size = HdrOffset + sizeof(uint8_t);
|
|
|
+ pRes->Size = HdrOffset + sizeof(uint8_t); //+ ccode
|
|
|
|
|
|
pthread_setspecific(g_tls.CurSessionID,&pReq->SessionID);
|
|
|
|
|
@@ -336,7 +337,7 @@ ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes)
|
|
|
{
|
|
|
pRes->Data [HdrOffset] = CC_INV_CMD;
|
|
|
printf ("Invalid Net Function 0x%x or Invalid Command 0x%x\n",NET_FN(pReq->NetFnLUN), pReq->Cmd);
|
|
|
- pRes->Size += 2;
|
|
|
+ pRes->Size;// += 2; //??? why
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -351,30 +352,19 @@ ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes)
|
|
|
{
|
|
|
if (0 != GetMsgHndlrMap (NET_FN (pReq->NetFnLUN), &pCmdHndlrMap))
|
|
|
{
|
|
|
- // if(pBMCInfo->IpmiConfig.GrpExtnSupport == 1)
|
|
|
- // {
|
|
|
- if (0 != GroupExtnGetMsgHndlrMap (NET_FN (pReq->NetFnLUN), pReq->Data [HdrOffset], &pCmdHndlrMap) )
|
|
|
- {
|
|
|
- pRes->Data [HdrOffset] = CC_INV_CMD;
|
|
|
- printf ("MsgHndlr.c : Invalid Net Function 0x%x or Invalid Command 0x%x\n",NET_FN(pReq->NetFnLUN), pReq->Cmd);
|
|
|
- pRes->Size += 2;
|
|
|
- return;
|
|
|
- }
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // pRes->Data [HdrOffset] = CC_INV_CMD;
|
|
|
- // printf ("MsgHndlr.c : Invalid Net Function 0x%x\n",NET_FN(pReq->NetFnLUN));
|
|
|
- // pRes->Size += 2;
|
|
|
- // return;
|
|
|
- // }
|
|
|
+ if (0 != GroupExtnGetMsgHndlrMap (NET_FN (pReq->NetFnLUN), pReq->Data [HdrOffset], &pCmdHndlrMap) )
|
|
|
+ {
|
|
|
+ pRes->Data [HdrOffset] = CC_INV_CMD;
|
|
|
+ printf ("MsgHndlr.c : Invalid Net Function 0x%x or Invalid Command 0x%x\n",NET_FN(pReq->NetFnLUN), pReq->Cmd);
|
|
|
+ pRes->Size;// += 2;
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if(GetCmdHndlr(pReq,pRes,pCmdHndlrMap,HdrOffset,CmdOverride,&pCmdHndlrMap) == FALSE)
|
|
|
{
|
|
|
pRes->Data [HdrOffset] = CC_INV_CMD;
|
|
|
- pRes->Size += 2;
|
|
|
- //printf("log 3\n");
|
|
|
+ pRes->Size;// += 2; //??? why
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -387,7 +377,7 @@ ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes)
|
|
|
{
|
|
|
printf("Warning: Request data len error, require %d\n", pCmdHndlrMap->ReqLen);
|
|
|
pRes->Data [HdrOffset] = CC_REQ_INV_LEN;
|
|
|
- pRes->Size += 2;
|
|
|
+ pRes->Size;// += 2; //??? why
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -397,7 +387,6 @@ ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes)
|
|
|
//prepare response data for send message command
|
|
|
if( (CMD_SEND_MSG == pReq->Cmd) && (NETFN_APP == pReq->NetFnLUN >> 2))
|
|
|
{
|
|
|
-// printf("log 4, size %d, Channel %d\n",pRes->Size, pRes->Channel);
|
|
|
int Offset = 0;
|
|
|
uint8_t SeqNum = g_BMCInfo.SendMsgSeqNum;
|
|
|
if ((0 == pRes->Size) &&
|
|
@@ -405,11 +394,11 @@ ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes)
|
|
|
(g_BMCInfo.IpmiConfig.SecondaryIPMBSupport == 0x01 && SECONDARY_IPMB_CHANNEL == pRes->Channel)) )
|
|
|
{
|
|
|
pRes->Param = PARAM_NO_RESPONSE;
|
|
|
- Offset = HdrOffset + 2;
|
|
|
+ Offset = HdrOffset + 2; //ccode + checksum2
|
|
|
}
|
|
|
else if (HdrOffset == pRes->Size)
|
|
|
{
|
|
|
- Offset = HdrOffset + 1;
|
|
|
+ Offset = HdrOffset + 1; // + checksum2
|
|
|
}
|
|
|
|
|
|
PBTbl = ( ((pReq->Data[sizeof (IPMIMsgHdr_T)] & 0x0F) == SECONDARY_IPMB_CHANNEL) ? SECONDARY_PB_TBL : PRIMARY_PB_TBL );
|
|
@@ -426,9 +415,7 @@ ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes)
|
|
|
}
|
|
|
else if(m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ == gFdUdsIfc)
|
|
|
{
|
|
|
- //pRes->Size ++;
|
|
|
SwapUDSIPMIMsg ( pReq, pRes);
|
|
|
- //pRes->Data[pRes->Size-1] = 0;
|
|
|
memcpy (&m_PendingBridgedResTbl[PBTbl][SeqNum].ResMsgHdr, pRes->Data, sizeof (IPMIUDSMsg_T));
|
|
|
m_PendingBridgedResTbl[PBTbl][SeqNum].UDSSocket = pRes->Socket;
|
|
|
// printf("log666 \n");
|
|
@@ -673,15 +660,19 @@ void RespondSendMessage ( MsgPkt_T* pReq, uint8_t Status)
|
|
|
{
|
|
|
ResPkt.Data [HdrOffset] = CC_UNSPECIFIED_ERR;
|
|
|
}
|
|
|
-
|
|
|
- ResPkt.Size = HdrOffset + 1 + 1; // IPMI Header + Completion Code + Second Checksum
|
|
|
+ ResPkt.Size = HdrOffset + 1; // IPMI Header + Completion Code
|
|
|
+
|
|
|
ResPkt.Cmd = pIPMIResHdr->Cmd;
|
|
|
ResPkt.NetFnLUN = pIPMIReqHdr->NetFnLUN;
|
|
|
ResPkt.Channel = pReq->Channel;
|
|
|
- //ResPkt.Socket = pReq->Socket;
|
|
|
|
|
|
- /* Calculate the Second CheckSum */
|
|
|
- ResPkt.Data[ResPkt.Size - 1] = CalculateCheckSum2 (ResPkt.Data, ResPkt.Size-1);
|
|
|
+ //UDS不需要checksum
|
|
|
+ if(m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ != gFdUdsIfc)
|
|
|
+ {
|
|
|
+ /* Calculate the Second CheckSum */
|
|
|
+ ResPkt.Data[ResPkt.Size] = CalculateCheckSum2 (ResPkt.Data, ResPkt.Size);
|
|
|
+ ResPkt.Size++; //+ Second Checksum
|
|
|
+ }
|
|
|
|
|
|
ResPkt.Param = BRIDGING_REQUEST;
|
|
|
|
|
@@ -691,8 +682,6 @@ void RespondSendMessage ( MsgPkt_T* pReq, uint8_t Status)
|
|
|
}
|
|
|
else if(m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ == gFdUdsIfc)
|
|
|
{
|
|
|
- ResPkt.Size++;
|
|
|
- ResPkt.Data[ResPkt.Size-1] = 0;
|
|
|
((IPMIUDSMsg_T*)&ResPkt.Data[0])->IPMIMsgLen = ResPkt.Size;
|
|
|
ResPkt.Socket = m_PendingBridgedResTbl[PBTbl][SeqNum].UDSSocket;
|
|
|
QueueFd = gFdUdsRes;
|