Sfoglia il codice sorgente

New Api_BridgeInternal function

zhangbo 5 anni fa
parent
commit
614afce01d

+ 178 - 0
app/bmc/Api.c

@@ -642,3 +642,181 @@ int getSensorHistory(uint8_t sensorNum, uint8_t *phistoryBuf)
 		return -1;
 	}
 }
+
+
+pthread_mutex_t api_bridge_mutex;	
+int API_BridgeInternal(MsgPkt_T* pReqPkt, MsgPkt_T* pResPkt, uint8_t DestAddr, int Channel)
+{
+    
+    IPMIMsgHdr_T*  pReqMsgHdr;
+    IPMIMsgHdr_T*  pResMsgHdr;
+    uint8_t SeqNum = g_BMCInfo.SendMsgSeqNum;
+	int 			RetVal;
+	int 			fd_BridgeQue;
+	uint8_t 		PBTbl;
+	
+	pthread_mutex_lock(&api_bridge_mutex);
+	//create BRIDGE_QUEUE
+    if(-1 != access(BRIDGE_QUEUE, F_OK))
+    {
+        remove(BRIDGE_QUEUE);
+    }
+    if(0 != mkfifo (BRIDGE_QUEUE, 0777))
+    {
+        printf("%s: Create %s fifo failed! \n", __FUNCTION__, BRIDGE_QUEUE);
+        pthread_mutex_unlock(&api_bridge_mutex);
+        return -1;
+    }
+    fd_BridgeQue = open (BRIDGE_QUEUE, O_RDWR);
+    if(-1 == fd_BridgeQue)
+    {
+        printf("%s: Open %s fifo failed! \n", __FUNCTION__, BRIDGE_QUEUE);
+        pthread_mutex_unlock(&api_bridge_mutex);
+        return -1;
+    }
+	
+    if(NULL != pReqPkt)
+    {
+		memcpy(&(pReqPkt->Data[sizeof(IPMIMsgHdr_T)]), pReqPkt->Data, pReqPkt->Size);
+		pReqPkt->Size += sizeof(IPMIMsgHdr_T);
+		pReqMsgHdr = (IPMIMsgHdr_T*)pReqPkt->Data;
+    }
+    else
+    {
+        printf("Warning: Message Packet to be bridged is NULL\r\n");
+		remove(BRIDGE_QUEUE);
+		pthread_mutex_unlock(&api_bridge_mutex);
+        return -1;
+    }    
+    if(NULL != pResPkt)
+    {
+      pResMsgHdr = (IPMIMsgHdr_T*)pResPkt->Data;
+    }
+    else
+    {
+        printf("Warning: Message Packet to be bridged is NULL\r\n");
+		remove(BRIDGE_QUEUE);
+		pthread_mutex_unlock(&api_bridge_mutex);
+        return -1;
+    }   
+    /* Format IPMI message header */
+    pReqMsgHdr->ResAddr  = DestAddr;
+	pReqMsgHdr->NetFnLUN = pReqPkt->NetFnLUN;
+    pReqMsgHdr->ChkSum   = ~(pReqMsgHdr->ResAddr + pReqMsgHdr->NetFnLUN) + 1;
+	
+    if(Channel == PRIMARY_IPMB_CHANNEL)
+    {
+        pReqMsgHdr->ReqAddr = PRIMARY_IPMB_ADDR;
+    }
+    else if(Channel == SECONDARY_IPMB_CHANNEL) 
+    {
+        pReqMsgHdr->ReqAddr = PRIMARY_IPMB_ADDR;
+    }
+    else
+    {
+        printf ("Warning: Invalid IPMB Channel: %d\r\n", Channel);
+		remove(BRIDGE_QUEUE);
+		pthread_mutex_unlock(&api_bridge_mutex);
+        return -1;
+    }
+	
+	pResPkt->NetFnLUN 	=	pReqPkt->NetFnLUN + 0x40;
+	pResPkt->Cmd 		=	pReqPkt->Cmd;
+	
+	pReqMsgHdr->Cmd		=	pReqPkt->Cmd;
+	
+	pResMsgHdr->ResAddr  = pReqMsgHdr->ReqAddr;
+	pResMsgHdr->ChkSum   = ~(pResMsgHdr->ResAddr + pResMsgHdr->NetFnLUN) + 1;
+	pResMsgHdr->ReqAddr	= pReqMsgHdr->ResAddr;
+	pResMsgHdr->RqSeqLUN = pReqMsgHdr->RqSeqLUN;
+	pResMsgHdr->Cmd 	= pReqMsgHdr->Cmd;
+	
+	PBTbl = (Channel == SECONDARY_IPMB_CHANNEL) ? SECONDARY_PB_TBL : PRIMARY_PB_TBL ;
+	/* Store in the table for response tracking */
+	while(TRUE)
+	{
+		if (FALSE == m_PendingBridgedResTbl[PBTbl][SeqNum].Used)
+		{			
+			m_PendingBridgedResTbl[PBTbl][SeqNum].TimeOut = DEFAULT_TIMEOUT;
+	  
+			m_PendingBridgedResTbl[PBTbl][SeqNum].ChannelNum = pReqPkt->Channel; 
+			m_PendingBridgedResTbl[PBTbl][SeqNum].OriginSrc  = ORIGIN_INT_REQ;
+			g_BMCInfo.SendMsgSeqNum = SeqNum;
+			
+			/* Format Sequence Number */
+			pReqMsgHdr->RqSeqLUN = ((g_BMCInfo.SendMsgSeqNum) << 2) & 0xFC;
+			pResMsgHdr->RqSeqLUN = pReqMsgHdr->RqSeqLUN + 0x40;
+			
+			memcpy (&m_PendingBridgedResTbl[PBTbl][SeqNum].ReqMsgHdr, pReqMsgHdr, sizeof (IPMIMsgHdr_T));
+			memcpy (&m_PendingBridgedResTbl[PBTbl][SeqNum].ResMsgHdr, pResMsgHdr,  sizeof (IPMIMsgHdr_T));
+			m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ = fd_BridgeQue;
+			
+			/* Store Session ID for final response to the origin for KCS*/
+			//m_PendingBridgedResTbl[SeqNum].SrcSessionID = pReqPkt->SessionID;
+			
+			m_PendingBridgedResTbl[PBTbl][SeqNum].Used = TRUE;
+			//printf( "---> oemApi.c:  Bridged message added index = %d.\n", SeqNum );
+			
+			break;
+		}
+		else
+		{
+			SeqNum = (SeqNum + 1) & 0x3F;
+			if(SeqNum == g_BMCInfo.SendMsgSeqNum)
+			{
+				printf ("Warning: Pending Bridge Response Table is full \n");
+				remove(BRIDGE_QUEUE);
+				pthread_mutex_unlock(&api_bridge_mutex);
+				return -1;
+			}
+		}
+	}
+    
+    /* Format message packet */
+    pReqPkt->Channel = Channel;
+    pReqPkt->Param   = PARAM_BRIDGE;
+    
+    /* Recalculate the checksum */
+    pReqPkt->Data [pReqPkt->Size] =  CalculateCheckSum2 (pReqPkt->Data, pReqPkt->Size);
+	pReqPkt->Size++;
+    
+	if(Channel == PRIMARY_IPMB_CHANNEL) 
+	{
+		pReqPkt->SrcQ = gFd_PrimaryIpmbIfcQ; 
+	}
+	else if(Channel == SECONDARY_IPMB_CHANNEL)
+	{
+		pReqPkt->SrcQ = gFd_SecondaryIpmbIfcQ; 
+	}
+	else
+	{
+		printf("Warning: Invalid Channel %d\n", Channel);
+		remove(BRIDGE_QUEUE);
+		pthread_mutex_unlock(&api_bridge_mutex);
+		return -1;
+	}
+  
+    /* Post Message to the bridge queue */
+    if(0 != PostMsg(pReqPkt->SrcQ, pReqPkt) )
+    {
+        printf ("Warning: oemApi.c : Error posting message to Queue %p \n", pReqPkt->SrcQ);
+		remove(BRIDGE_QUEUE);
+		pthread_mutex_unlock(&api_bridge_mutex);
+        return -1;
+    }
+	
+	m_PendingBridgedResTbl[PBTbl][SeqNum].ResDataOk = 1;
+	
+    RetVal = GetMsg (fd_BridgeQue, pResPkt, 5000);  //3s
+	remove(BRIDGE_QUEUE);
+	pthread_mutex_unlock(&api_bridge_mutex);
+	if(RetVal != 0)
+	{
+		return -1;
+	}
+	
+	memcpy(pResPkt->Data, &(pResPkt->Data[sizeof(IPMIMsgHdr_T)]), pResPkt->Size - sizeof(IPMIMsgHdr_T)-1);
+	pResPkt->Size = pResPkt->Size - sizeof(IPMIMsgHdr_T)-1;	//remove header & checksum2
+
+    return 0;
+}

+ 3 - 0
app/bmc/Api.h

@@ -36,6 +36,9 @@ int FlushUserInfoTbl(void);
 int UpdateUserInfoTble(void);
 int Init_UserInfoTbl(void);
 
+	
+int API_BridgeInternal(MsgPkt_T* pReqPkt, MsgPkt_T* pResPkt, uint8_t DestAddr, int Channel);
 
+extern pthread_mutex_t api_bridge_mutex;
 
 #endif /* __API_H__ */

+ 20 - 1
app/bmc/ChassisTimer/ChassisTimerTask.c

@@ -33,13 +33,15 @@
 
 void *ChassisTimerTask(void* pArg)
 {
-	MsgPkt_T	MsgPkt;
+	MsgPkt_T	ReqPkt;
+	MsgPkt_T	ResPkt;
 	uint32_t	preChassisSeconds;
 	uint32_t	preFanSeconds;
 	uint32_t	preIdentifySeconds = 0;
 	uint8_t		IdentifyTickCnt = 0;
 	char  		cmdStr[100] = {0};
 	SetLanConfigReq_T  *pSetLanCfg;
+	int i;
 	prctl(PR_SET_NAME,__FUNCTION__,0,0,0);
 
 	printf("ChassisTimerTask Started... \n");
@@ -63,6 +65,8 @@ void *ChassisTimerTask(void* pArg)
 
 	preChassisSeconds	=	g_BMCInfo.CurTimerSecond;
 	preFanSeconds	=	g_BMCInfo.CurTimerSecond;
+
+	sleep(5);
 	while(1)
 	{
 		//Chassis timer interval
@@ -74,6 +78,21 @@ void *ChassisTimerTask(void* pArg)
 			//TODO:
 			//g_BMCInfo.PowerGoodFlag = 1;
 			g_BMCInfo.IpmiConfig.ChassisPowerState.PowerState	=	g_BMCInfo.PowerGoodFlag;
+
+			// ReqPkt.NetFnLUN 	= 0x2e<<2;
+			// ReqPkt.Cmd 			= 0x01;
+			// ReqPkt.Size 		= 0;
+			// if(0 == API_BridgeInternal(&ReqPkt, &ResPkt, 0x40, 6))
+			// {
+			// 	printf("---> Access 0x40 successful: ");
+			// }
+			// else
+			// {
+			// 	printf("---> Access 0x40 failed: ");
+			// }
+			// for(i=0;i<ResPkt.Size;i++)
+			// 	printf("%x ", ResPkt.Data[i]);
+			// printf("\n");
 		}
 		
 		//Fan control

BIN
app/bmc/bmc_app


+ 21 - 21
app/bmc/ipmb/IPMBIfc.c

@@ -180,22 +180,22 @@ void *IPMBIfcTask(void *Param)
                 if(RcvMsgPkt.Channel == PRIMARY_IPMB_CHANNEL)
                 {
                     RetVal = stm32_i2c_master_write(gFd_Primary, RcvMsgPkt.Data[0], &RcvMsgPkt.Data[1], RcvMsgPkt.Size-1);
-                    //printf("PriTx: ");
+                    printf("PriTx: ");
                 }
                 else if(RcvMsgPkt.Channel == SECONDARY_IPMB_CHANNEL)
                 {
                     RetVal = stm32_i2c_master_write(gFd_Secondary, RcvMsgPkt.Data[0], &RcvMsgPkt.Data[1], RcvMsgPkt.Size-1);
-                    //printf("SecTx: ");
+                    printf("SecTx: ");
                 }
                 else
                 {
                     printf("IPMBIfc.c: IPMB channel error. %#x\r\n", RcvMsgPkt.Channel);
                 }
 
-                // int i;
-                // for(i=0;i<RcvMsgPkt.Size;i++)
-                //     printf("%#x ", RcvMsgPkt.Data[i]);
-                // printf("\n");
+                int i;
+                for(i=0;i<RcvMsgPkt.Size;i++)
+                    printf("%#x ", RcvMsgPkt.Data[i]);
+                printf("\n");
 
                 if (RetVal < 0)
                 {
@@ -262,7 +262,7 @@ ProcessIPMBReq ( MsgPkt_T* pReq)
          return;
     }
     /* Post the message to message handler Task */
-    PostMsg (gFd_MsgHndlrIfc, pReq);
+    //PostMsg (gFd_MsgHndlrIfc, pReq);
        
     if(pReq->ResTimeOut < 1)	pReq->ResTimeOut = 10;
     do
@@ -298,24 +298,24 @@ ProcessIPMBReq ( MsgPkt_T* pReq)
         pthread_mutex_lock(&primary_mutex);
 		RetVal = stm32_i2c_master_write(gFd_Primary, ResPkt.Data[0], &ResPkt.Data[1], ResPkt.Size-1);
         pthread_mutex_unlock(&primary_mutex);
-        //printf("PriTx: ");
+        printf("PriTx: ");
 	}
 	else if(pReq->Channel == SECONDARY_IPMB_CHANNEL)
 	{
         pthread_mutex_lock(&secondary_mutex);
 		RetVal = stm32_i2c_master_write(gFd_Secondary, ResPkt.Data[0], &ResPkt.Data[1], ResPkt.Size-1);
         pthread_mutex_unlock(&secondary_mutex);
-        //printf("SecTx: ");
+        printf("SecTx: ");
 	}
 	else
 	{
 		printf("IPMBIfc.c: IPMB channel error. %#x\r\n", pReq->Channel);
 	}
 
-    // int i;
-    // for(i=0;i<ResPkt.Size;i++)
-    //     printf("%#x ", ResPkt.Data[i]);
-    // printf("\n");
+    int i;
+    for(i=0;i<ResPkt.Size;i++)
+        printf("%#x ", ResPkt.Data[i]);
+    printf("\n");
 	
     if (0 != RetVal)
     {
@@ -456,15 +456,15 @@ static void* RecvIPMBPkt (void *Param)
             IPMBReqPkt.Param    = PARAM_REQUEST;
             IPMBReqPkt.Size     = retval + 1;       /* +1 to include BMC Slave address */
 
-            // int cnt;
-            // if(0 == ipmbSelect)
-            //     printf("\nPriRx: ");
-            // else
-            //     printf("\nSecRx: ");
+            int cnt;
+            if(0 == ipmbSelect)
+                printf("\nPriRx: ");
+            else
+                printf("\nSecRx: ");
 
-            // for(cnt=0;cnt < IPMBReqPkt.Size; cnt++)
-            //     printf("%#x ", IPMBReqPkt.Data[cnt]);
-            // printf("\n");
+            for(cnt=0;cnt < IPMBReqPkt.Size; cnt++)
+                printf("%#x ", IPMBReqPkt.Data[cnt]);
+            printf("\n");
 
             /* Post the IPMB Request message to IPMBIfc Queue */
             if(ipmbSelect == 0)

+ 2 - 0
app/bmc/lan/RMCP.c

@@ -402,6 +402,8 @@ ProcessRMCPReq( RMCPHdr_T* pRMCPReq,  RMCPHdr_T* pRMCPRes)
 				printf("Password error!\n");
 				return 0;
 			}
+			//TODO:pSessionInfo->Password到底是在哪里赋值的?在这里可以吗?
+			//memcpy(pSessionInfo->Password,g_BMCInfo.pUserInfo->UserPassword,MAX_PASSWORD_LEN);
 		}
 
 		/* Frame the Message Packet for Message Handler */

+ 3 - 0
app/bmc/main.c

@@ -33,6 +33,7 @@
 #include "hal_interface_api.h"
 #include "com_BMCCfg.h"
 #include "PendActionTask.h"
+#include "Api.h"
 
 
 /* gloabl varible */
@@ -95,6 +96,8 @@ void main(void)
 	InitTimerTaskTbl();
 	Init_UserInfoTbl();
 
+	pthread_mutex_init(&api_bridge_mutex, NULL);
+
 	//初始化系统时间
 	system("date -s 2020.05.12-00:00:00");
 

+ 7 - 19
app/bmc/msghndlr/MsgHndlrTask.c

@@ -250,7 +250,7 @@ ValidateMsgHdr (MsgPkt_T* pReq)
 				 else
 				 {
 					//TODO:其它接口转发
-				 	printf("Invalid interface!\n");
+					Queuefd = m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ;
 				 }
 						
 				 /* Post the data to Destination Interface queue */
@@ -597,6 +597,11 @@ void RespondSendMessage ( MsgPkt_T* pReq, uint8_t Status)
 			if(tcnt > 100000)	break;	//100ms
 		}
 
+		if((m_PendingBridgedResTbl[PBTbl][SeqNum].OriginSrc == ORIGIN_INT_REQ) && (Status = STATUS_OK))
+		{
+			return;
+		}
+
 		memcpy (pIPMIResHdr, &m_PendingBridgedResTbl[PBTbl][SeqNum].ResMsgHdr.IPMIMsgHdr, sizeof (IPMIMsgHdr_T));
 		 
 			
@@ -634,26 +639,9 @@ void RespondSendMessage ( MsgPkt_T* pReq, uint8_t Status)
 		 {
 			 QueueFd = gFd_LanResQ;
 		 }
-		 // else if (0 == strcmp ((char *)m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ, SerialQueueName))
-		 // {
-			//  //ResPkt.SessionID = m_PendingBridgedResTbl[i].ResMsgHdr.RqSeqLUN;
-			//  strcpy (QueueName, SERIAL_RES_Q);
-		 // }
-		 else if ( (m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ == gFd_PrimaryIpmbIfcQ) ||
-				   (m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ == gFd_SecondaryIpmbIfcQ) )
-		 {
-		 	QueueFd = m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ;
-		 }
 		 else
 		 {
-			 /* PDK Hook to format Pending Bridge Response Packet for other destinations */
-			// if(g_PDKHandle[PDK_FORMATBRIDGERESPKT] != NULL)
-			 {
-				  SwapIPMIMsgHdr ( pIPMIReqHdr, pIPMIResHdr);
-				  
-			//	  ( (void (*)(MsgPkt_T *, int) ) g_PDKHandle[PDK_FORMATBRIDGERESPKT]) ( &ResPkt, BMCInst);
-			 }     
-		   
+			SwapIPMIMsgHdr ( pIPMIReqHdr, pIPMIResHdr);
 		   	QueueFd = m_PendingBridgedResTbl[PBTbl][SeqNum].DestQ;
 		 }
 

+ 2 - 0
app/common_include/com_IPMIDefs.h

@@ -136,6 +136,8 @@
 
 #define PEND_ACTION_HNDLR_Q   "/var/PEND_ACTION_HNDLR_Q"
 
+#define BRIDGE_QUEUE 		  "/var/BRIDGE_QUEUE"
+
 /*----------------------------------------------
  * Channel
  *----------------------------------------------*/