|
@@ -952,9 +952,8 @@ SendMessage ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
|
|
|
}
|
|
|
|
|
|
#if 1
|
|
|
- printf("SendMsg: ReqLen = %d, size = %ld\n",ReqLen,m_MsgPkt.Size);
|
|
|
int z;
|
|
|
- printf("m_MsgPkt: \n");
|
|
|
+ printf("m_MsgPkt: ");
|
|
|
for(z = 0; z < m_MsgPkt.Size;z++)
|
|
|
printf("%02x ", m_MsgPkt.Data[z]);
|
|
|
printf("\n");
|
|
@@ -981,103 +980,41 @@ SendMessage ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
|
|
|
// }
|
|
|
|
|
|
printf("curchannel: %d, Channel: %d\n", *curchannel, Channel);
|
|
|
- if(g_BMCInfo.IpmiConfig.LANIfcSupport == 1)
|
|
|
- {
|
|
|
- /* To Check the Wheather LAN Channel */
|
|
|
- //if (IsLANChannel(*curchannel & 0xF, BMCInst))
|
|
|
- if(*curchannel&0xf == LAN_RMCP_CHANNEL) //jimbo
|
|
|
- {
|
|
|
- SessionInfo_T* pSessionInfo = getSessionInfo (SESSION_ID_INFO,CurSesID);
|
|
|
-
|
|
|
- if (NULL != pSessionInfo)
|
|
|
- {
|
|
|
- SrcSessionHndl = pSessionInfo->SessionHandle;
|
|
|
- }
|
|
|
-
|
|
|
- printf ("SendMsg: To LAN Interface for reference\n");
|
|
|
- // Offset++; : causes bridging issues
|
|
|
- strcpy ((char *)m_MsgPkt.SrcQ, LAN_IFC_Q);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if((Channel == PRIMARY_IPMB_CHANNEL) && g_BMCInfo.IpmiConfig.PrimaryIPMBSupport == 1)
|
|
|
- {
|
|
|
- printf ("SendMsg: To Primary IPMB Interface\n");
|
|
|
- m_MsgPkt.SrcQ = gFd_PrimaryIpmbIfcQ;
|
|
|
- }
|
|
|
- else if(( Channel == SECONDARY_IPMB_CHANNEL) && (g_BMCInfo.IpmiConfig.SecondaryIPMBSupport == 1))
|
|
|
- {
|
|
|
- printf ("SendMsg: To SMLink IPMB Interface\n");
|
|
|
- m_MsgPkt.SrcQ = gFd_SecondaryIpmbIfcQ;
|
|
|
- }
|
|
|
- // else if ((pBMCInfo->SERIALch != CH_NOT_USED && Channel == pBMCInfo->SERIALch) && pBMCInfo->IpmiConfig.SerialIfcSupport == 1)
|
|
|
- // {
|
|
|
- // TDBG ("SendMsg: To Serial Interface\n");
|
|
|
- // Offset++;
|
|
|
- // strcpy ((char *)m_MsgPkt.SrcQ, SERIAL_IFC_Q);
|
|
|
- // }
|
|
|
- // else if ((pBMCInfo->ICMBCh != CH_NOT_USED && Channel == pBMCInfo->ICMBCh) && pBMCInfo->IpmiConfig.ICMBIfcSupport == 1)
|
|
|
- // {
|
|
|
- // TDBG ("SendMsg: To ICMB Interface\n");
|
|
|
- // strcpy ((char *)m_MsgPkt.SrcQ, ICMB_IFC_Q);
|
|
|
- // }
|
|
|
- // else if(pBMCInfo->SYSCh != CH_NOT_USED && Channel == pBMCInfo->SYSCh)
|
|
|
- // {
|
|
|
- // TDBG ("SendMsg: To System Interface\n");
|
|
|
- // /*
|
|
|
- // * According to IPMI Spec v2.0.
|
|
|
- // * It is recommended to send CC_DEST_UNAVAILABLE
|
|
|
- // * completion code, if the channel is disabled for
|
|
|
- // * receiving messages.
|
|
|
- // * */
|
|
|
- // OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
|
|
|
- // pChannelInfo = getChannelInfo(Channel,BMCInst);
|
|
|
- // if(NULL == pChannelInfo)
|
|
|
- // {
|
|
|
- // *pRes = CC_INV_DATA_FIELD;
|
|
|
- // OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
|
|
|
- // OS_THREAD_MUTEX_RELEASE(&pBMCInfo->BMCMsgMutex);
|
|
|
- // return sizeof (*pRes);
|
|
|
- // }
|
|
|
- // if (0x0 == pChannelInfo->ReceiveMsgQ)
|
|
|
- // {
|
|
|
- // printf ("The Channel(0x%x) has been Disabled "
|
|
|
- // "for Receive message\n", Channel);
|
|
|
- // *pRes = CC_DEST_UNAVAILABLE;
|
|
|
- // OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
|
|
|
- // OS_THREAD_MUTEX_RELEASE(&pBMCInfo->BMCMsgMutex);
|
|
|
- // return sizeof (*pRes);
|
|
|
- // }
|
|
|
- // OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
|
|
|
- // strcpy ((char *)m_MsgPkt.SrcQ, &g_RcvMsgQ[*kcsifcnum][0]);
|
|
|
- // m_MsgPkt.Param = SrcSessionHndl;
|
|
|
- // }
|
|
|
- else
|
|
|
- {
|
|
|
- printf ("SendMsg: Invalid Channel\n");
|
|
|
- *pRes = CC_DEST_UNAVAILABLE;
|
|
|
- return sizeof (*pRes);
|
|
|
- }
|
|
|
-
|
|
|
- // if( (TRUE == pBMCInfo->NMConfig.NMSupport) && (pBMCInfo->NMConfig.NMDevSlaveAddress == pIPMIMsgHdr->ResAddr) &&
|
|
|
- // (Channel == (NM_PRIMARY_IPMB_BUS == pBMCInfo->NMConfig.NM_IPMBBus) ? pBMCInfo->PrimaryIPMBCh : pBMCInfo->SecondaryIPMBCh) )
|
|
|
- // {
|
|
|
- // if( (pBMCInfo->RMCPLAN1Ch == *curchannel) ||
|
|
|
- // (pBMCInfo->RMCPLAN2Ch == *curchannel) ||
|
|
|
- // (pBMCInfo->RMCPLAN3Ch == *curchannel) ||
|
|
|
- // (pBMCInfo->RMCPLAN4Ch == *curchannel) ||
|
|
|
- // (pBMCInfo->SERIALch == *curchannel) )
|
|
|
- // {
|
|
|
- // OS_THREAD_TLS_GET(g_tls.CurPrivLevel,curprivlevel);
|
|
|
- // if(PRIV_ADMIN != *curprivlevel)
|
|
|
- // {
|
|
|
- // TDBG("Insufficient Privilege\n");
|
|
|
- // *pRes = CC_INSUFFIENT_PRIVILEGE;
|
|
|
- // OS_THREAD_MUTEX_RELEASE(&pBMCInfo->BMCMsgMutex);
|
|
|
- // return sizeof(*pRes);
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
+ // if(g_BMCInfo.IpmiConfig.LANIfcSupport == 1)
|
|
|
+ // {
|
|
|
+ // /* To Check the Wheather LAN Channel */
|
|
|
+ // //if (IsLANChannel(*curchannel & 0xF, BMCInst))
|
|
|
+ // if(*curchannel&0xf == LAN_RMCP_CHANNEL) //jimbo
|
|
|
+ // {
|
|
|
+ // SessionInfo_T* pSessionInfo = getSessionInfo (SESSION_ID_INFO,CurSesID);
|
|
|
+
|
|
|
+ // if (NULL != pSessionInfo)
|
|
|
+ // {
|
|
|
+ // SrcSessionHndl = pSessionInfo->SessionHandle;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // printf ("SendMsg: To LAN Interface for reference\n");
|
|
|
+ // // Offset++; : causes bridging issues
|
|
|
+ // m_MsgPkt.SrcQ = gFd_LanIfcQ;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
+ if((Channel == PRIMARY_IPMB_CHANNEL) && g_BMCInfo.IpmiConfig.PrimaryIPMBSupport == 1)
|
|
|
+ {
|
|
|
+ printf ("SendMsg: To Primary IPMB Interface\n");
|
|
|
+ m_MsgPkt.SrcQ = gFd_PrimaryIpmbIfcQ;
|
|
|
+ }
|
|
|
+ else if(( Channel == SECONDARY_IPMB_CHANNEL) && (g_BMCInfo.IpmiConfig.SecondaryIPMBSupport == 1))
|
|
|
+ {
|
|
|
+ printf ("SendMsg: To SMLink IPMB Interface\n");
|
|
|
+ m_MsgPkt.SrcQ = gFd_SecondaryIpmbIfcQ;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf ("SendMsg: Invalid Channel\n");
|
|
|
+ *pRes = CC_DEST_UNAVAILABLE;
|
|
|
+ return sizeof (*pRes);
|
|
|
+ }
|
|
|
|
|
|
if (1 == Tracking)
|
|
|
{
|
|
@@ -1376,16 +1313,13 @@ GetSessionChallenge ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
|
|
|
{
|
|
|
GetSesChallengeReq_T* pGetSesChalReq = ( GetSesChallengeReq_T*)pReq;
|
|
|
GetSesChallengeRes_T* pGetSesChalRes = ( GetSesChallengeRes_T*)pRes;
|
|
|
- uint8_t Index;
|
|
|
- uint8_t ChallengeString[CHALLENGE_STR_LEN];
|
|
|
+ uint8_t Index;
|
|
|
+ uint8_t ChallengeString[CHALLENGE_STR_LEN];
|
|
|
UserInfo_T *pUserInfo;
|
|
|
-
|
|
|
- // // Check for Reserved bits
|
|
|
- // if((pGetSesChalReq->AuthType == AUTHTYPE_RESERVED) || (pGetSesChalReq->AuthType > AUTHTYPE_OEM_PROPRIETARY))
|
|
|
- // {
|
|
|
- // pGetSesChalRes->CompletionCode = CC_INV_DATA_FIELD;
|
|
|
- // return sizeof (*pRes);
|
|
|
- // }
|
|
|
+ uint32_t TempSessId;
|
|
|
+ SessionInfo_T SessionInfo;
|
|
|
+ uint8_t *curchannel;
|
|
|
+ uint32_t TempRandom;
|
|
|
|
|
|
if(pGetSesChalReq->UserName[0] == 0)
|
|
|
{
|
|
@@ -1400,28 +1334,49 @@ GetSessionChallenge ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
|
|
|
pGetSesChalRes->CompletionCode = 0x81;
|
|
|
return sizeof (*pRes);
|
|
|
}
|
|
|
-
|
|
|
- // if((pUserInfo->ID != USER_ID) || (pUserInfo->UserStatus == FALSE))
|
|
|
- // {
|
|
|
- // pGetSesChalRes->CompletionCode = 0x81;
|
|
|
- // return sizeof (*pRes);
|
|
|
- // }
|
|
|
+
|
|
|
+ curchannel = pthread_getspecific(g_tls.CurChannel);
|
|
|
+
|
|
|
+ do
|
|
|
+ {
|
|
|
+ /*generate 32 bit temp session Id*/
|
|
|
+ TempSessId = stm32_generate_random32bit();
|
|
|
+ } while ((NULL != getSessionInfo (SESSION_ID_INFO, &TempSessId)) || (0 == TempSessId));
|
|
|
+
|
|
|
+ SessionInfo.UserId = (uint8_t)pUserInfo->UserId;
|
|
|
+ /*Activated in ActivateSession Command*/
|
|
|
+ SessionInfo.Activated = FALSE;
|
|
|
+ SessionInfo.AuthType = pGetSesChalReq->AuthType;
|
|
|
+ SessionInfo.Channel = *curchannel & 0xF;
|
|
|
+ SessionInfo.SessionID = TempSessId;
|
|
|
+ SessionInfo.TimeOutValue = g_BMCInfo.IpmiConfig.SessionTimeOut;
|
|
|
+
|
|
|
+ if(GetNumOfUsedSessions() >= g_BMCInfo.IpmiConfig.MaxSession)
|
|
|
+ {
|
|
|
+ CleanSession();
|
|
|
+ }
|
|
|
+ /* Add Session information in Table */
|
|
|
+ AddSession (&SessionInfo);
|
|
|
+
|
|
|
+
|
|
|
g_BMCInfo.pUserInfo = pUserInfo;
|
|
|
|
|
|
- g_BMCInfo.LanSession.AuthType = pGetSesChalReq->AuthType;
|
|
|
- g_BMCInfo.LanSession.SessionID = 0x1234;//trng_get_true_random_data();
|
|
|
-
|
|
|
pGetSesChalRes->CompletionCode = CC_NORMAL;
|
|
|
- pGetSesChalRes->TempSessionID = g_BMCInfo.LanSession.SessionID;
|
|
|
+ pGetSesChalRes->TempSessionID = TempSessId;
|
|
|
|
|
|
/* generate Randam Challenge String */
|
|
|
- for(Index=0;Index < CHALLENGE_STR_LEN;Index++)
|
|
|
- {
|
|
|
- ChallengeString[Index] = 0x56;//trng_get_true_random_data()&0xff;
|
|
|
- }
|
|
|
- memcpy(pGetSesChalRes->ChallengeString, ChallengeString, CHALLENGE_STR_LEN);
|
|
|
-
|
|
|
- return sizeof (GetSesChallengeRes_T);
|
|
|
+ for(Index=0;Index < CHALLENGE_STR_LEN;Index+=4)
|
|
|
+ {
|
|
|
+ TempRandom = stm32_generate_random32bit();
|
|
|
+ printf("TempRandom: %#lx\n", TempRandom);
|
|
|
+ ChallengeString[Index] = TempRandom&0xff;
|
|
|
+ ChallengeString[Index+1] = TempRandom>>8;
|
|
|
+ ChallengeString[Index+2] = TempRandom>>16;
|
|
|
+ ChallengeString[Index+3] = TempRandom>>24;
|
|
|
+ }
|
|
|
+ memcpy(pGetSesChalRes->ChallengeString, ChallengeString, CHALLENGE_STR_LEN);
|
|
|
+
|
|
|
+ return sizeof (GetSesChallengeRes_T);
|
|
|
}
|
|
|
|
|
|
/*---------------------------------------
|
|
@@ -1433,34 +1388,46 @@ ActivateSession ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
|
|
|
//TODO: dummy data
|
|
|
ActivateSesReq_T* pAcvtSesReq = ( ActivateSesReq_T*)pReq;
|
|
|
ActivateSesRes_T* pAcvtSesRes = ( ActivateSesRes_T*)pRes;
|
|
|
-
|
|
|
+ uint32_t *CurSesID,*curchannel;
|
|
|
+ SessionInfo_T* pSessInfo;
|
|
|
+
|
|
|
+ /* Initial Outbound Sequence Number cannot be null */
|
|
|
+ if (pAcvtSesReq->OutboundSeq == 0)
|
|
|
+ {
|
|
|
+ pAcvtSesRes->CompletionCode = CC_ACTIVATE_SESS_SEQ_OUT_OF_RANGE;
|
|
|
+ return sizeof(*pRes);
|
|
|
+ }
|
|
|
|
|
|
- // /* Initial Outbound Sequence Number cannot be null */
|
|
|
- // if (pAcvtSesReq->OutboundSeq == 0)
|
|
|
- // {
|
|
|
- // pAcvtSesRes->CompletionCode = CC_ACTIVATE_SESS_SEQ_OUT_OF_RANGE;
|
|
|
- // return sizeof(*pRes);
|
|
|
- // }
|
|
|
-
|
|
|
- // // Check for Reserved bitss
|
|
|
- // if((pAcvtSesReq->AuthType == AUTHTYPE_RESERVED) || (pAcvtSesReq->AuthType > AUTHTYPE_OEM_PROPRIETARY))
|
|
|
- // {
|
|
|
- // pAcvtSesRes->CompletionCode = CC_INV_DATA_FIELD;
|
|
|
- // return sizeof (*pRes);
|
|
|
- // }
|
|
|
+ CurSesID = pthread_getspecific(g_tls.CurSessionID);
|
|
|
+ curchannel = pthread_getspecific(g_tls.CurChannel);
|
|
|
+
|
|
|
+ pSessInfo = getSessionInfo (SESSION_ID_INFO, CurSesID);
|
|
|
+ if(pSessInfo == NULL)
|
|
|
+ {
|
|
|
+ pAcvtSesRes->CompletionCode = CC_ACTIVATE_SESS_INVALID_SESSION_ID;
|
|
|
+ return sizeof (*pRes);
|
|
|
+ }
|
|
|
+
|
|
|
+ pSessInfo->Activated = TRUE;
|
|
|
+ pSessInfo->Channel = (*curchannel & 0xF);
|
|
|
+ /* set the Max Privilege allowed for the Session*/
|
|
|
+ pSessInfo->MaxPrivilege = pAcvtSesReq->Privilege;
|
|
|
+ /* set the Out bound sequensce Number */
|
|
|
+ pSessInfo->OutboundSeq = (pAcvtSesReq->OutboundSeq);
|
|
|
+
|
|
|
+ g_BMCInfo.SessionHandle += 1;
|
|
|
+ pSessInfo->SessionHandle = g_BMCInfo.SessionHandle;
|
|
|
|
|
|
- // if ((pAcvtSesReq->Privilege == PRIV_LEVEL_RESERVED) || (pAcvtSesReq->Privilege > PRIV_LEVEL_PROPRIETARY))
|
|
|
- // {
|
|
|
- // pAcvtSesRes->CompletionCode = CC_INV_DATA_FIELD;/* Privilege is Reserved */
|
|
|
- // return sizeof (*pRes);
|
|
|
- // }
|
|
|
|
|
|
pAcvtSesRes->CompletionCode = CC_NORMAL;
|
|
|
- pAcvtSesRes->AuthType = g_BMCInfo.LanSession.AuthType;
|
|
|
- pAcvtSesRes->SessionID = g_BMCInfo.LanSession.SessionID;
|
|
|
- pAcvtSesRes->InboundSeq = 0x78;//trng_get_true_random_data();
|
|
|
+ pAcvtSesRes->AuthType = (pSessInfo->AuthType & 0x0F);
|
|
|
+ pAcvtSesRes->SessionID = pSessInfo->SessionID;
|
|
|
+ pAcvtSesRes->InboundSeq = stm32_generate_random32bit();
|
|
|
pAcvtSesRes->Privilege = 0x04;
|
|
|
|
|
|
+ pSessInfo->InboundRecv = 0xFF;
|
|
|
+ pSessInfo->InboundSeq = (pAcvtSesRes->InboundSeq -1);
|
|
|
+
|
|
|
return sizeof (ActivateSesRes_T);
|
|
|
}
|
|
|
|
|
@@ -1505,7 +1472,45 @@ SetSessionPrivLevel ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
|
|
|
int
|
|
|
CloseSession ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
|
|
|
{
|
|
|
- //TODO: dymmy data
|
|
|
+ CloseSesReq_T* pCloseSesReq = (CloseSesReq_T*)pReq;
|
|
|
+ SessionInfo_T* pSessInfo;
|
|
|
+ uint32_t SessionID;
|
|
|
+
|
|
|
+ *pRes = CC_REQ_INV_LEN;
|
|
|
+
|
|
|
+ if ((4 != ReqLen) && (5 != ReqLen))
|
|
|
+ {
|
|
|
+ return sizeof (*pRes);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (0 == pCloseSesReq->SessionID)
|
|
|
+ {
|
|
|
+ if (5 != ReqLen)
|
|
|
+ {
|
|
|
+ return sizeof (*pRes);
|
|
|
+ }
|
|
|
+ SessionID = (uint32_t)pCloseSesReq->SessionHandle;
|
|
|
+ *pRes = CC_CLOSE_INVALID_SESSION_ID_HANDLE;
|
|
|
+ pSessInfo = getSessionInfo (SESSION_HANDLE_INFO, &SessionID);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (4 != ReqLen)
|
|
|
+ {
|
|
|
+ return sizeof (*pRes);
|
|
|
+ }
|
|
|
+ SessionID = pCloseSesReq->SessionID;
|
|
|
+ *pRes = CC_CLOSE_INVALID_SESSION_ID;
|
|
|
+ pSessInfo = getSessionInfo (SESSION_ID_INFO, &SessionID);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((NULL == pSessInfo) || (0 == pSessInfo->Activated))
|
|
|
+ {
|
|
|
+ return sizeof (*pRes);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* The SessionInfo is deleted form session table from interface */
|
|
|
+ DeleteSession(pSessInfo);
|
|
|
*pRes = CC_NORMAL;
|
|
|
return sizeof (*pRes);
|
|
|
}
|