MsgHndlr.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. #include "bmc_type.h"
  2. #include "bmc_main.h"
  3. #include "bmc_conf.h"
  4. #include "hook.h"
  5. #include "App.h"
  6. #include "Chassis.h"
  7. #include "Bridge.h"
  8. #include "SensorEvent.h"
  9. #include "Storage.h"
  10. //#include "Transport.h"
  11. //#include "AMI.h"
  12. #include "Oem.h"
  13. #include "IPMIDefs.h"
  14. #include "DeviceConfig.h"
  15. #include "bmc_main.h"
  16. #include "IPMI_App.h"
  17. #include "IPMI_Chassis.h"
  18. #include "IPMI_Bridge.h"
  19. #include "IPMI_SensorEvent.h"
  20. #include "IPMI_Storage.h"
  21. #include "IPMI_Oem.h"
  22. #include "cmdselect.h"
  23. #include "Support.h"
  24. #include "session.h"
  25. void BMCInfo_InitChConfig()
  26. {
  27. // int i=0;
  28. // BMCInfo_t* pBMCInfo = &g_BMCInfo;
  29. // ChcfgInfo_T gChConfig;
  30. // UserInfo_T UserInfo;
  31. // SessionTblInfo_T SessionTblInfo;
  32. // char admin[16]={0x61,0x64,0x6d,0x69,0x6e};//data is "admin"
  33. // //ChannelInfo_T gChannelInfo;
  34. // //memset(&gChConfig,0,sizeof(ChcfgInfo_T));
  35. // pBMCInfo->SDRConfig.ReservationID=0x08;
  36. // gChConfig.ChannelInfo.ChannelNumber=1;
  37. // gChConfig.ChannelInfo.SessionLimit=0x04;
  38. // gChConfig.ChannelInfo.ActiveSession=0x01;
  39. // gChConfig.ChannelInfo.ChannelUserInfo[0].UserId=0x01;
  40. // gChConfig.ChannelInfo.ChannelUserInfo[0].AccessLimit=0x04;
  41. // pBMCInfo->IpmiConfig.MaxUsers=0x7;
  42. // pBMCInfo->IpmiConfig.MaxChUsers=0x7;
  43. // pBMCInfo->IpmiConfig.MaxSession=0x7;
  44. // UserInfo.UserId=0x01;
  45. // UserInfo.UserStatus=TRUE;
  46. // SessionTblInfo.SessionTbl[0].Activated=TRUE;
  47. // SessionTblInfo.SessionTbl[0].SessionID=0x0;
  48. // memcpy(UserInfo.UserName,admin,16);
  49. // for(i=0;i<MAX_PRIVILEGE_TYPES;i++)
  50. // gChConfig.ChannelInfo.AuthType[i]=0x36;
  51. // memcpy(&(pBMCInfo->UserInfo),&UserInfo,sizeof(UserInfo_T));
  52. //// memcpy(gChConfig.ChannelInfo.ChannelUserInfo[0].)
  53. // memcpy(&(pBMCInfo->ChConfig),&gChConfig,sizeof(ChcfgInfo_T));
  54. }
  55. MsgHndlrTbl_T m_MsgHndlrTbl [15] = //notice!
  56. {
  57. { NETFN_APP, g_App_CmdHndlr },
  58. { NETFN_CHASSIS, g_Chassis_CmdHndlr },
  59. { NETFN_BRIDGE, g_Bridge_CmdHndlr },
  60. { NETFN_SENSOR, g_SensorEvent_CmdHndlr },
  61. { NETFN_STORAGE, g_Storage_CmdHndlr },
  62. { NETFN_TRANSPORT, g_Config_CmdHndlr },
  63. // { NETFN_AMI, (CmdHndlrMap_T*)g_AMI_CmdHndlr },
  64. { NETFN_OEM, g_Oem_CmdHndlr },
  65. };
  66. void ProcessIPMIReq (MsgPkt_T* pReq, MsgPkt_T* pRes);
  67. int GetCmdHndlr(MsgPkt_T* pReq,MsgPkt_T* pRes,CmdHndlrMap_T* pCmdHndlrMap,INT32U HdrOffset,CmdHndlrMap_T** CmdHndrl );
  68. int CheckPrivilege (INT8U ReqPrivilege, INT8U CmdPrivilege);
  69. int GetMsgHndlrMap (INT8U NetFn, CmdHndlrMap_T ** pCmdHndlrMap);
  70. /**
  71. *@fn MsgHndlr
  72. *@brief Message Handler Task
  73. * Starting Main function of MsgHndlr task
  74. */
  75. void *MsgHndlr (void *pArg)
  76. {
  77. MsgPkt_T Req;
  78. MsgPkt_T Res;
  79. int i=0;
  80. while (1)
  81. {
  82. if (0 != GetMsg (&Req,MSG_HNDLR_Q,WAIT_INFINITE))
  83. {
  84. printf ("Error fetching messages from hMsgHndlr_Q\n");
  85. continue;
  86. }
  87. switch (Req.Param)
  88. {
  89. case PARAM_IFC :
  90. Res.Param = NO_RESPONSE;
  91. Res.Size = 0;
  92. Req.Channel &= 0x0f; /* Only 4 bits are used */
  93. Res.Param = NORMAL_RESPONSE;
  94. ProcessIPMIReq (&Req, &Res);
  95. if (0 != PostMsg(&Res,OBSM_TASK_Q))
  96. {
  97. printf ("Error fetching messages from hMsgHndlr_Q\n");
  98. continue;
  99. }
  100. break;
  101. default :
  102. printf("Invalid request\n");
  103. break;
  104. }
  105. // /* Check if there is a request from the command handlers */
  106. // if (0 != pBMCInfo->Msghndlr.WarmReset)
  107. // {
  108. // Platform_WarmReset ();
  109. // pBMCInfo->Msghndlr.WarmReset = 0;
  110. // }
  111. // if (0 != pBMCInfo->Msghndlr.ColdReset) { pBMCInfo->Msghndlr.ColdReset = 0; Platform_ColdReset (); }
  112. // if (0 != pBMCInfo->Msghndlr.BBlk) { pBMCInfo->Msghndlr.BBlk = 0; Platform_ColdReset (); }
  113. //printf("==== chassis control ====\n");
  114. // switch (pBMCInfo->Msghndlr.ChassisControl)
  115. // {
  116. // case CHASSIS_POWER_DOWN : Platform_HostPowerOff (); break;
  117. // case CHASSIS_POWER_UP : Platform_HostPowerOn (); break;
  118. // case CHASSIS_POWER_CYCLE: Platform_HostPowerCycle (); break;
  119. // case CHASSIS_HARD_RESET : Platform_HostColdReset (); break;
  120. // default : break;
  121. // }
  122. // pBMCInfo->Msghndlr.ChassisControl = 0xFF;
  123. // if (pBMCInfo->Msghndlr.ChassisIdentify == TRUE)
  124. // {
  125. // Platform_Identify (pBMCInfo->Msghndlr.ChassisIdentifyTimeout, pBMCInfo->Msghndlr.ChassisIdentifyForce,BMCInst);
  126. // pBMCInfo->Msghndlr.ChassisIdentify = FALSE;
  127. // }
  128. }
  129. }
  130. /**
  131. *@fn ProcessIPMIReq
  132. *@brief Processes the requested IPMI command
  133. *@param pReq Request of the command
  134. *@param pRes Response for the requested command
  135. *@return none
  136. */
  137. void
  138. ProcessIPMIReq (_NEAR_ MsgPkt_T* pReq, _NEAR_ MsgPkt_T* pRes)
  139. {
  140. CmdHndlrMap_T * pCmdHndlrMap;
  141. INT32U HdrOffset = 0;
  142. INT8U ResLen;
  143. INT8U PBTbl = PRIMARY_PB_TBL;
  144. // INT8U IfcSupport =0,kcsifcnum;
  145. // INT8S MsgHndlrMapGot=0;
  146. BMCInfo_t* pBMCInfo = &g_BMCInfo;
  147. // INT8U Index;
  148. // ChannelInfo_T* pChannelInfo=NULL;
  149. // ChannelUserInfo_T* pChUserInfo=NULL;
  150. // SessionInfo_T* pSessInfo=NULL;
  151. int i = 0;
  152. // int cnt = 0;
  153. // bool blCmdAllowed = FALSE;
  154. /* Set the Cmd and Net function in response packet */
  155. pRes->Cmd = pReq->Cmd;
  156. pRes->NetFnLUN = pReq->NetFnLUN;
  157. /* Normal IPMI Command response */
  158. pRes->Param = NORMAL_RESPONSE;
  159. // printf ("Processing IPMI Packet.\n");
  160. HdrOffset = sizeof (IPMIMsgHdr_T);
  161. pReq->Size = pReq->Size - HdrOffset - 1; //remove header and checksum2
  162. pRes->Size = HdrOffset + sizeof (INT8U); //header and compeletion code
  163. // printf ("Processing PreProcessIPMI Cmd.\n");
  164. if(IsCommandEnabled(NET_FN(pReq->NetFnLUN), pReq->Cmd) != 0)
  165. {
  166. pRes->Data [HdrOffset] = CC_INV_CMD;
  167. printf ("Invalid Net Function 0x%x or Invalid Command 0x%x\n",NET_FN(pReq->NetFnLUN), pReq->Cmd);
  168. return;
  169. }
  170. if(0 != GetMsgHndlrMap (NET_FN (pReq->NetFnLUN), &pCmdHndlrMap))
  171. {
  172. pRes->Data [HdrOffset] = CC_INV_CMD;
  173. printf("MsgHndlr.c : Invalid Net Function 0x%x\n",NET_FN(pReq->NetFnLUN));
  174. return;
  175. }
  176. if(GetCmdHndlr(pReq,pRes,pCmdHndlrMap,HdrOffset,&pCmdHndlrMap) == FALSE)
  177. {
  178. pRes->Data [HdrOffset] = CC_INV_CMD;
  179. printf("MsgHndlr.c : Invalid Command 0x%x\n", pReq->Cmd);
  180. return;
  181. }
  182. // printf("pCmdHndlrMap->ReqLen is %d,pReq->Size is %d\n",pCmdHndlrMap->ReqLen,pReq->Size);
  183. /* Check for the request size */
  184. if (0xff != pCmdHndlrMap->ReqLen)
  185. {
  186. /* Check for invalid request size */
  187. if (pCmdHndlrMap->ReqLen != pReq->Size)
  188. {
  189. //IPMI_DBG_PRINT_BUF (pReq->Data, pReq->Size);
  190. pRes->Data [HdrOffset] = CC_REQ_INV_LEN;
  191. return;
  192. }
  193. }
  194. /* Check for the privilege */
  195. if (0 != CheckPrivilege (pReq->Privilege, pCmdHndlrMap->Privilege))
  196. {
  197. pRes->Data [HdrOffset] = CC_INSUFFIENT_PRIVILEGE;
  198. printf ("MsgHndlr.c : Insufficent privilage\n");
  199. return;
  200. }
  201. /* Invoke the command handler */
  202. // printf("pReq->Data [HdrOffset] is %d,HdrOffset is %d\n",pReq->Data [HdrOffset],HdrOffset);
  203. pRes->Size =
  204. pCmdHndlrMap->CmdHndlr (&pReq->Data [HdrOffset], pReq->Size, &pRes->Data [HdrOffset]) + HdrOffset;
  205. // printf("ipmi data size is %d data is : \n",pRes->Size);
  206. // for(i=0;i<pRes->Size;i++)
  207. // printf("%#x ",pRes->Data [HdrOffset+i]);
  208. // printf("\n");
  209. // printf ("MsgHndlr.c : Processed command\n");
  210. if( (CMD_SEND_MSG == pReq->Cmd) && (NETFN_APP == pReq->NetFnLUN >> 2))
  211. {
  212. int Offset = 0;
  213. INT8U SeqNum = pBMCInfo->SendMsgSeqNum;
  214. //printf("---> CMD_SEND_MSG ");
  215. if ((0 == pRes->Size) &&
  216. ((pBMCInfo->IpmiConfig.PrimaryIPMBSupport == 0x01 && PRIMARY_IPMB_CHANNEL == pRes->Channel) ||
  217. (pBMCInfo->IpmiConfig.SecondaryIPMBSupport == 0x01 && pBMCInfo->SecondaryIPMBCh == pRes->Channel)) )
  218. {
  219. // printf(" no response\n");
  220. pRes->Param = NO_RESPONSE;
  221. Offset = HdrOffset + 2;
  222. }
  223. else if (HdrOffset == pRes->Size)
  224. {
  225. // printf(" response\n");
  226. Offset = HdrOffset + 1;
  227. }
  228. PBTbl = ( ((pReq->Data[sizeof (IPMIMsgHdr_T)] & 0x0F) == pBMCInfo->SecondaryIPMBCh) ? SECONDARY_PB_TBL : PRIMARY_PB_TBL );
  229. while(TRUE)
  230. {
  231. // if ( (TRUE == m_PendingBridgedResTbl[PBTbl][SeqNum].Used) &&
  232. // (0 == _fmemcmp (&m_PendingBridgedResTbl[PBTbl][SeqNum].ReqMsgHdr, &pReq->Data[Offset], sizeof (IPMIMsgHdr_T))) )
  233. {
  234. // _fmemcpy (&m_PendingBridgedResTbl[PBTbl][SeqNum].ResMsgHdr, pRes->Data, sizeof (IPMIMsgHdr_T));
  235. break;
  236. }
  237. // else
  238. {
  239. SeqNum = (SeqNum - 1) & 0x3F;
  240. if(SeqNum == pBMCInfo->SendMsgSeqNum)
  241. {
  242. break;
  243. }
  244. }
  245. }
  246. }
  247. return;
  248. }
  249. /**
  250. *@fn GetCmdHndlr
  251. *@brief Picks up the exact command to execute by comparing Cmd no.
  252. *@param pReq Request buffer for the command
  253. *@param pRes Response buffer for the command
  254. *@param pCmdHndlrMap
  255. *@param HdrOffset
  256. *@param CmdOverride
  257. *@param CmdHndlr
  258. *@return Returns TRUE on success
  259. * Returns FALSE on failure
  260. */
  261. int GetCmdHndlr(MsgPkt_T* pReq,MsgPkt_T* pRes,CmdHndlrMap_T* pCmdHndlrMap,INT32U HdrOffset,CmdHndlrMap_T** CmdHndrl )
  262. {
  263. while (1)
  264. {
  265. /**
  266. * If we reached the end of the Command Handler map - invalid command
  267. **/
  268. // printf("pCmdHndlrMap->Cmd is %d\n",pCmdHndlrMap->Cmd);
  269. if (0 == pCmdHndlrMap->CmdHndlr)
  270. {
  271. pRes->Data [HdrOffset] = CC_INV_CMD;
  272. printf( "MsgHndlr.c : Invalid Command %d\n", pReq->Cmd );
  273. return FALSE;
  274. }
  275. if (pCmdHndlrMap->Cmd == pReq->Cmd)
  276. {
  277. /* Check if command has been implemented */
  278. if (UNIMPLEMENTED == pCmdHndlrMap->CmdHndlr)
  279. {
  280. pRes->Data [HdrOffset] = CC_INV_CMD;
  281. printf("MsgHndlr.c : Command is not implemented\n");
  282. return FALSE;
  283. }
  284. else
  285. {
  286. break;
  287. }
  288. }
  289. pCmdHndlrMap++;
  290. }
  291. *CmdHndrl = pCmdHndlrMap;
  292. return TRUE;
  293. }
  294. /**
  295. *@fn CheckPrivilege
  296. *@brief Checks the privilege of the requested command
  297. *@param ReqPrivilege Privilege of the requested command
  298. *@param CmdPrivilege Privilege of the requested command in CmdHndlr map
  299. *@return Returns 0 on success
  300. * Returns -1 on success
  301. */
  302. int
  303. CheckPrivilege (INT8U ReqPrivilege, INT8U CmdPrivilege)
  304. {
  305. if (ReqPrivilege >= CmdPrivilege) { return 0; }
  306. return -1;
  307. }
  308. /**
  309. *@fn GetMsgHndlrMap
  310. *@brief Gets the exact command Handler by comparing NetFn
  311. *@param Netfn -NetFunction of the Cmd to execute
  312. *@param pCmdHndlrMap Pointer to the Command Handler
  313. *@return Returns 0 on success
  314. * Returns -1 on failure
  315. */
  316. int
  317. GetMsgHndlrMap (INT8U NetFn, CmdHndlrMap_T ** pCmdHndlrMap)
  318. {
  319. int i;
  320. BMCInfo_t* pBMCInfo = &g_BMCInfo;
  321. /* Get the command handler corresponding to the net function */
  322. for (i = 0; i < pBMCInfo->MsgHndlrTblSize ; i++)
  323. {
  324. if (pBMCInfo->MsgHndlrTbl [i].NetFn == NetFn) { break; }
  325. }
  326. /* Check if we have not found our net function */
  327. if (i == pBMCInfo->MsgHndlrTblSize )
  328. {
  329. return -1;
  330. }
  331. /* Get the handler corresponding to the command */
  332. *pCmdHndlrMap = (CmdHndlrMap_T*)pBMCInfo->MsgHndlrTbl [i].CmdHndlrMap;
  333. return 0;
  334. }