Beispiel #1
0
ipmi_rsp_t IntelIpmiProxy::RequestResponse(const ipmi_req_t& req)
{
	SI_DEBUG_TRACE(SI_THIS_MODULE, "IntelImbDriverIpmiProxy::requestResponse() invoked");

	IMBPREQUESTDATA imbreq;
	int status, i;

	imbreq.rsSa	= 0x20;
	imbreq.rsLun	= 0;
	imbreq.busType	= 0;
	imbreq.netFn	= req.netFun;
	imbreq.cmdType	= req.cmd;

	imbreq.dataLength = req.len;
	if(imbreq.dataLength > 0)
		imbreq.data = (unsigned char *)req.data;
	else
		imbreq.data = NULL;

	//printf("IMB rsSa       : %x\n", imbreq.rsSa);
	//printf("IMB netFn      : %x\n", imbreq.netFn);
	//printf("IMB cmdType    : %x\n", imbreq.cmdType);
	//printf("IMB dataLength : %d\n", imbreq.dataLength);

	unsigned char rspData[1024];
	memset(rspData, 0, 1024);
	int rspDataLen = 0;
	unsigned char ccode = 0xFE;

	if(imbreq.cmdType == 0x34)
	{
		rspDataLen = 1024;

		// clear async messages in case other entities are using driver at same time
		while(GetAsyncImbpMessage((ImbPacket *)rspData, (DWORD *)&rspDataLen, 1000, &seqNo_, req.data[0]) == 0)
		{
			rspDataLen = 1024;
		}

		rspDataLen = 0;
	}

	for (i=0; i<1; i++)
	{
		status = SendTimedImbpRequest(&imbreq, 5000,
							rspData, &rspDataLen, &ccode);
		if (status == 0)
			break;

		/* error */
		SI_DEBUG_TRACE(SI_THIS_MODULE, "Retry: Error sending IMB request, status=0x%x, ccode=0x%x", status, (int)ccode);
	}

	if(status != 0)
	{
		throw IpmiProxyException(NMPRK_PROXY_ERROR_XFER, "Error sending IMB request: " + status);
	}

	if(req.netFun == 0x06 && req.cmd == 0x34)
		lastRequestChannel_ = req.data[0];

	ipmi_rsp_t rsp;
	rsp.compCode = ccode;
	rsp.len = rspDataLen;
	memcpy(rsp.data, rspData, rspDataLen);

	return rsp;
}
Beispiel #2
0
int ipmicmd_ld( uchar cmd, uchar netfn, uchar lun, uchar sa, uchar bus,
		uchar *pdata, int sdata, uchar *presp, int *sresp, 
		uchar *pcc, char fdebugcmd)
{
#ifdef  LINK_LANDESK
   IMBPREQUESTDATA requestData;
   int status = 0;
   uchar * pc;
   int sz, i;

   requestData.cmdType	= cmd;
   requestData.rsSa	= sa;
   requestData.busType	= bus;
   requestData.netFn	= netfn;
   requestData.rsLun	= lun;
   requestData.dataLength = sdata;
   requestData.data       = pdata; 

   if (fdebugcmd) {
          sz = sizeof(IMBPREQUESTDATA);
          pc = (uchar *)&requestData.cmdType;
          fprintf(fpdbg,"ipmicmd_ld: request (len=%d): ",sz);
          for (i = 0; i < sz; i++) fprintf(fpdbg,"%02x ",pc[i]);
          fprintf(fpdbg,"\n");
          pc = requestData.data;
          sz = requestData.dataLength;
          fprintf(fpdbg,"  req.data=%p, dlen=%d: ", pc, sz);
          for (i = 0; i < sz; i++) fprintf(fpdbg,"%02x ",pc[i]);
          fprintf(fpdbg,"\n");
        }

   if (ipmi_fd == -1) {
	status = ipmi_open_ld(fdebugcmd);
	if (status != 0) return(status);
   }

   { 
	   sz = *sresp;  /* note that sresp must be pre-set */
	   memset(presp, 0, sz);
           for ( i =0 ; i < MAX_NO_OF_RETRIES; i++) 
	   {
		*sresp = sz;   /* retries may need to re-init *sresp */
		if((status =SendTimedImbpRequest(&requestData, 
				ipmi_timeout_ld, presp, sresp, 
				pcc)) == 0 ) {
			break;
			}
		if (fdebugcmd)   // only gets here if error
	          fprintf(fpdbg,"ipmi_cmd_ld: sendImbRequest error status=%x, ccode=%x\n",
                            (uint)status, *pcc);
	   } 
   }

    if (fdebugcmd) {  /* if debug, show both good and bad statuses */
	    fprintf(fpdbg,"ipmi_cmd_ld: sendImbRequest status=%x, ccode=%x\n", 
                      (uint)status, *pcc);
            if (status == 0) {  
               uchar * pc; int sz;
               sz = *sresp;
               pc = (uchar *)presp;
               fprintf(fpdbg,"ipmi_cmd_ld: response (len=%d): ",sz);
               for (i = 0; i < sz; i++) fprintf(fpdbg,"%02x ",pc[i]);
               fprintf(fpdbg,"\n");
            }
        }

    return(status);
#else
    return(-1);
#endif
} /* end ipmicmd_ld() */