original files of m241
This commit is contained in:
@@ -0,0 +1,798 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* SOURCE FILE
|
||||
*
|
||||
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: sec4_request.c,v $ $Revision: 1.8.12.1 $
|
||||
* $Source: /home/interpeak/CVSRoot/ipfreescale/sec4/sec4_request.c,v $
|
||||
* $Author: jsheng $
|
||||
* $State: Exp $ $Locker: $
|
||||
*
|
||||
* INTERPEAK_COPYRIGHT_STRING
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 1 DESCRIPTION
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* sec4_request.c - request/response handler
|
||||
* Based on sec2_request.c for SEC2 driver.
|
||||
****************************************************************************
|
||||
* Copyright (c) 2003-2005 Freescale Semiconductor
|
||||
* All Rights Reserved. Proprietary and Confidential.
|
||||
*
|
||||
* NOTICE: The information contained in this file is proprietary
|
||||
* to Freescale Semiconductor, and is being made available to
|
||||
* Freescale's customers under strict license agreements.
|
||||
* Use or disclosure of this information is permissible only
|
||||
* under the terms of the existing license agreement.
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/* Revision History:
|
||||
* 1.0 Mar 11,2011 - Based on sec2_request.c v1.2
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 2 CONFIGURATION
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 3 INCLUDE FILES
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <sec_ext.h>
|
||||
#include <sec_jq_ext.h>
|
||||
#include <sec_dcl_cmd.h>
|
||||
#include <sec_dcl.h>
|
||||
#include <sec_dcl_ipfreescale.h>
|
||||
#include "sec.h"
|
||||
#include "Sec4Driver.h"
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 4 DEFINES
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/* Define module for errors reported from this file (as used in SEC4 driver) */
|
||||
#define __ERR_MODULE__ MODULE_SEC
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 5 TYPES
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 6 EXTERN PROTOTYPES
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 7 LOCAL PROTOTYPES
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 8 DATA
|
||||
****************************************************************************
|
||||
*/
|
||||
/* Global handles */
|
||||
SEC4_GLOBAL t_Handle h_Sec4;
|
||||
SEC4_GLOBAL t_Handle h_SecDcl;
|
||||
SEC4_GLOBAL t_Handle h_SecJobQueue;
|
||||
#ifdef SEC4_USE_SHARED_JOB_QUEUE
|
||||
SEC4_GLOBAL t_sec4IpcMsg *sec4IpcVector;
|
||||
SEC4_GLOBAL uint32_t sec4CoreId;
|
||||
#endif
|
||||
/*
|
||||
****************************************************************************
|
||||
* 9 LOCAL FUNCTIONS
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* 10 PUBLIC FUNCTIONS
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/********************************************************************************/
|
||||
/* Function Name: ProcessRequest */
|
||||
/* Purpose: To handle the IO request routine */
|
||||
/* Input: req - the pointer of the IO request */
|
||||
/* callingTaskId - the task Id */
|
||||
/* Output: req - the pointer of the IO request buffer */
|
||||
/* Return: SEC4_SUCCESS if success, otherwise error code */
|
||||
/********************************************************************************/
|
||||
int ProcessRequest(GENERIC_REQ *req, int callingTaskId)
|
||||
{
|
||||
t_Error status;
|
||||
t_Handle h_JobDesc;
|
||||
t_Handle h_Context;
|
||||
t_JobDescParam jobDescParam;
|
||||
t_IpsecJobDescParam ipsecJobDescParam;
|
||||
bool jobIsIpsec = FALSE;
|
||||
t_sec4SgtEntry *p_sec4Sgt;
|
||||
|
||||
SEC4Dump(DBGTXT_SETRQ, ("ProcessRequest(): taskId = 0x%x, opId = 0x%x\n", callingTaskId, req->opId));
|
||||
|
||||
/* Prepare parameters for SEC job descriptor */
|
||||
memset(&jobDescParam, 0, sizeof(t_JobDescParam));
|
||||
switch (req->opId)
|
||||
{
|
||||
case DPD_RNG_GETRN:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_RANDNUM;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((RNG_REQ *)req)->rngBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((RNG_REQ *)req)->rngData;
|
||||
break;
|
||||
case DPD_MD5_LDCTX_IDGS_HASH_PAD_ULCTX:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_MD5_DIGEST;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((HASH_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((HASH_REQ *)req)->inData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((HASH_REQ *)req)->outBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((HASH_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_MD5_LDCTX_HMAC_PAD_ULCTX:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_MD5_HMAC;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((HMAC_PAD_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((HMAC_PAD_REQ *)req)->inData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->outBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((HMAC_PAD_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_SHA_LDCTX_IDGS_HASH_PAD_ULCTX:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_SHA1_DIGEST;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((HASH_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((HASH_REQ *)req)->inData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((HASH_REQ *)req)->outBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((HASH_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_SHA_LDCTX_HMAC_PAD_ULCTX:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_SHA1_HMAC;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((HMAC_PAD_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((HMAC_PAD_REQ *)req)->inData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->outBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((HMAC_PAD_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_SDES_CBC_CTX_ENCRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_DES_CBC_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_SDES_CBC_CTX_DECRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_DES_CBC_DECRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_SDES_ECB_ENCRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_DES_ECB_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_SDES_ECB_DECRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_DES_ECB_DECRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_TDES_CBC_CTX_ENCRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_TDES_CBC_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_TDES_CBC_CTX_DECRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_TDES_CBC_DECRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_TDES_ECB_ENCRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_TDES_ECB_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_TDES_ECB_DECRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_TDES_ECB_DECRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_AESA_CBC_ENCRYPT_CRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_AES_CBC_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inIvBytes;
|
||||
jobDescParam.outCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->outCtxBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inIvData;
|
||||
jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData;
|
||||
jobDescParam.outCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outCtxData;
|
||||
break;
|
||||
case DPD_AESA_CBC_DECRYPT_CRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_AES_CBC_DECRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inIvBytes;
|
||||
jobDescParam.outCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->outCtxBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inIvData;
|
||||
jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData;
|
||||
jobDescParam.outCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outCtxData;
|
||||
break;
|
||||
case DPD_AESA_ECB_ENCRYPT_CRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_AES_ECB_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
case DPD_AESA_ECB_DECRYPT_CRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_AES_ECB_DECRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData;
|
||||
break;
|
||||
/* RC4 stream cipher */
|
||||
case DPD_RC4_LDKEY_CRYPT_ULCTX:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_RC4_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) 0;
|
||||
jobDescParam.inData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) NULL;
|
||||
jobDescParam.outData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outData;
|
||||
jobDescParam.outCtxDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxBytes;
|
||||
jobDescParam.outCtxData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxData;
|
||||
break;
|
||||
case DPD_RC4_LDCTX_CRYPT_ULCTX:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_RC4_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) 0;
|
||||
jobDescParam.keyData = (uint8_t *) NULL;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inBytes;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inCtxBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inData;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inCtxData;
|
||||
jobDescParam.outData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outData;
|
||||
jobDescParam.outCtxDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxBytes;
|
||||
jobDescParam.outCtxData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxData;
|
||||
break;
|
||||
case DPD_MM_SS_RSA_EXP:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_MODEXP;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->expBytes;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->aDataBytes;
|
||||
jobDescParam.modDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->modBytes;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->bDataBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->expData;
|
||||
jobDescParam.inData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->aData;
|
||||
jobDescParam.modData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->modData;
|
||||
jobDescParam.outData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->bData;
|
||||
break;
|
||||
case DPD_802_11_CCMP_OUTBOUND:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_CCMP_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((CCMP_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((CCMP_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((CCMP_REQ *)req)->FrameDataBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((CCMP_REQ *)req)->FrameData;
|
||||
jobDescParam.MICDataBytes = (uint32_t) ((CCMP_REQ *)req)->MICBytes;
|
||||
jobDescParam.inMICData = (uint8_t *) ((CCMP_REQ *)req)->MICData;
|
||||
jobDescParam.AADDataBytes = (uint32_t) ((CCMP_REQ *)req)->AADBytes;
|
||||
jobDescParam.AADData = (uint8_t *) ((CCMP_REQ *)req)->AADData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((CCMP_REQ *)req)->cryptDataBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((CCMP_REQ *)req)->cryptDataOut;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((CCMP_REQ *)req)->ctxBytes;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((CCMP_REQ *)req)->context;
|
||||
break;
|
||||
case DPD_802_11_CCMP_INBOUND:
|
||||
/* TODO: Should this be supported? */
|
||||
break;
|
||||
case DPD_CHKSUM_CRC:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_CHKSUM_CRC;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->inDataBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->inData;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->inCtxDataBytes;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->inCtxData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->crcOutBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->crcOut;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->crcOutBytes; /* Polynomial is always same size as crcOut */
|
||||
jobDescParam.keyData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->polynomialData;
|
||||
jobDescParam.options = (uint32_t) ((CHKSUM_CRC_REQ *)req)->crcOptions;
|
||||
break;
|
||||
case DPD_DMA:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_MOVE_DATA;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((DMA_REQ *)req)->inDataBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((DMA_REQ *)req)->inData;
|
||||
jobDescParam.outData = (uint8_t *) ((DMA_REQ *)req)->outData;
|
||||
jobDescParam.options = (uint32_t) ((DMA_REQ *)req)->options;
|
||||
break;
|
||||
case DPD_AESCCM_ENCRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_AESCCM_ENCRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((AESCCM_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((AESCCM_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((AESCCM_REQ *)req)->inDataBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((AESCCM_REQ *)req)->inData;
|
||||
jobDescParam.MICDataBytes = (uint32_t) ((AESCCM_REQ *)req)->MICBytes;
|
||||
jobDescParam.inMICData = (uint8_t *) ((AESCCM_REQ *)req)->inMICData;
|
||||
jobDescParam.outMICData = (uint8_t *) ((AESCCM_REQ *)req)->outMICData;
|
||||
jobDescParam.AADDataBytes = (uint32_t) ((AESCCM_REQ *)req)->AADBytes;
|
||||
jobDescParam.AADData = (uint8_t *) ((AESCCM_REQ *)req)->AADData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((AESCCM_REQ *)req)->outDataBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((AESCCM_REQ *)req)->outData;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((AESCCM_REQ *)req)->ctxBytes;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((AESCCM_REQ *)req)->ctx;
|
||||
jobDescParam.options = (uint32_t) ((AESCCM_REQ *)req)->options;
|
||||
break;
|
||||
case DPD_AESCCM_DECRYPT:
|
||||
jobDescParam.jobTypeId = e_DCL_JOB_AESCCM_DECRYPT;
|
||||
jobDescParam.keyDataBytes = (uint32_t) ((AESCCM_REQ *)req)->keyBytes;
|
||||
jobDescParam.keyData = (uint8_t *) ((AESCCM_REQ *)req)->keyData;
|
||||
jobDescParam.inDataBytes = (uint32_t) ((AESCCM_REQ *)req)->inDataBytes;
|
||||
jobDescParam.inData = (uint8_t *) ((AESCCM_REQ *)req)->inData;
|
||||
jobDescParam.MICDataBytes = (uint32_t) ((AESCCM_REQ *)req)->MICBytes;
|
||||
jobDescParam.inMICData = (uint8_t *) ((AESCCM_REQ *)req)->inMICData;
|
||||
jobDescParam.outMICData = (uint8_t *) ((AESCCM_REQ *)req)->outMICData;
|
||||
jobDescParam.AADDataBytes = (uint32_t) ((AESCCM_REQ *)req)->AADBytes;
|
||||
jobDescParam.AADData = (uint8_t *) ((AESCCM_REQ *)req)->AADData;
|
||||
jobDescParam.outDataBytes = (uint32_t) ((AESCCM_REQ *)req)->outDataBytes;
|
||||
jobDescParam.outData = (uint8_t *) ((AESCCM_REQ *)req)->outData;
|
||||
jobDescParam.inCtxDataBytes = (uint32_t) ((AESCCM_REQ *)req)->ctxBytes;
|
||||
jobDescParam.inCtxData = (uint8_t *) ((AESCCM_REQ *)req)->ctx;
|
||||
jobDescParam.options = (uint32_t) ((AESCCM_REQ *)req)->options;
|
||||
break;
|
||||
#ifdef IPIPSEC2
|
||||
case DPD_IPSEC_CBC_SDES_DECRYPT_MD5_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96;
|
||||
break;
|
||||
case DPD_IPSEC_CBC_SDES_ENCRYPT_MD5_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96;
|
||||
break;
|
||||
case DPD_IPSEC_CBC_SDES_DECRYPT_SHA_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96;
|
||||
break;
|
||||
case DPD_IPSEC_CBC_SDES_ENCRYPT_SHA_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96;
|
||||
break;
|
||||
case DPD_IPSEC_CBC_TDES_DECRYPT_MD5_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96;
|
||||
break;
|
||||
case DPD_IPSEC_CBC_TDES_ENCRYPT_MD5_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96;
|
||||
break;
|
||||
case DPD_IPSEC_CBC_TDES_DECRYPT_SHA_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96;
|
||||
break;
|
||||
case DPD_IPSEC_CBC_TDES_ENCRYPT_SHA_PAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96;
|
||||
break;
|
||||
case DPD_IPSEC_AES_CBC_DECRYPT_MD5_APAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96;
|
||||
break;
|
||||
case DPD_IPSEC_AES_CBC_ENCRYPT_MD5_APAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96;
|
||||
|
||||
break;
|
||||
case DPD_IPSEC_AES_CBC_DECRYPT_SHA_APAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96;
|
||||
break;
|
||||
case DPD_IPSEC_AES_CBC_ENCRYPT_SHA_APAD:
|
||||
jobIsIpsec = TRUE;
|
||||
ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC;
|
||||
ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC;
|
||||
ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC;
|
||||
ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return ERROR_CODE(E_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
/* Create job descriptor */
|
||||
if(jobIsIpsec == TRUE)
|
||||
{
|
||||
ipsecJobDescParam.cryptoKeyData = ((IPSEC_CBC_REQ *)req)->cryptKeyData;
|
||||
ipsecJobDescParam.cryptoKeyDataBytes = ((IPSEC_CBC_REQ *)req)->cryptKeyBytes;
|
||||
ipsecJobDescParam.hashKeyDataBytes = ((IPSEC_CBC_REQ *)req)->hashKeyBytes;
|
||||
ipsecJobDescParam.hashKeyData = ((IPSEC_CBC_REQ *)req)->hashKeyData;
|
||||
ipsecJobDescParam.hashInDataBytes = ((IPSEC_CBC_REQ *)req)->hashInDataBytes;
|
||||
ipsecJobDescParam.hashInData = ((IPSEC_CBC_REQ *)req)->hashInData;
|
||||
ipsecJobDescParam.hashOutDataBytes = ((IPSEC_CBC_REQ *)req)->hashDataOutBytes;
|
||||
ipsecJobDescParam.hashOutData = ((IPSEC_CBC_REQ *)req)->hashDataOut;
|
||||
ipsecJobDescParam.inCtxData = ((IPSEC_CBC_REQ *)req)->cryptCtxInData;
|
||||
ipsecJobDescParam.inCtxDataBytes = ((IPSEC_CBC_REQ *)req)->cryptCtxInBytes;
|
||||
ipsecJobDescParam.outCtxData = NULL; /* Next packet IV is currently handled by caller */
|
||||
ipsecJobDescParam.outCtxDataBytes = 0;
|
||||
ipsecJobDescParam.inData = ((IPSEC_CBC_REQ *)req)->inData;
|
||||
ipsecJobDescParam.inDataBytes = ((IPSEC_CBC_REQ *)req)->inDataBytes;
|
||||
ipsecJobDescParam.outData = ((IPSEC_CBC_REQ *)req)->cryptDataOut - ipsecJobDescParam.hashInDataBytes;
|
||||
SEC4Dump(DBGTXT_SETRQ, ("SEC4 IPsec Job request params:\n"\
|
||||
" jobDirection: %u\n"\
|
||||
" cryptoAlg: %u\n"\
|
||||
" authAlg: %u\n"\
|
||||
" cryptoKeyDataBytes: %u\n"\
|
||||
" hashKeyDataBytes: %u\n"\
|
||||
" hashInDataBytes: %u\n"\
|
||||
" hashOutDataBytes: %u\n"\
|
||||
" inCtxDataBytes: %u\n"\
|
||||
" outCtxDataBytes: %u\n"\
|
||||
" inDataBytes: %u\n",\
|
||||
ipsecJobDescParam.jobDirection,\
|
||||
ipsecJobDescParam.cryptoAlg,\
|
||||
ipsecJobDescParam.authAlg,\
|
||||
ipsecJobDescParam.cryptoKeyDataBytes,\
|
||||
ipsecJobDescParam.hashKeyDataBytes,\
|
||||
ipsecJobDescParam.hashInDataBytes,\
|
||||
ipsecJobDescParam.hashOutDataBytes,\
|
||||
ipsecJobDescParam.inCtxDataBytes,\
|
||||
ipsecJobDescParam.outCtxDataBytes,\
|
||||
ipsecJobDescParam.inDataBytes));
|
||||
|
||||
h_JobDesc = SEC_DCL_InitIpsecJobDesc(h_SecDcl, &ipsecJobDescParam);
|
||||
}
|
||||
else
|
||||
{
|
||||
SEC4Dump(DBGTXT_SETRQ, ("SEC4 Job request params:\n"\
|
||||
" jobTypeId: %u\n"\
|
||||
" inDataBytes: %u\n"\
|
||||
" outDataBytes: %u\n"\
|
||||
" keyDataBytes: %u\n"\
|
||||
" inCtxDataBytes: %u\n"\
|
||||
" outCtxDataBytes: %u\n"\
|
||||
" modDataBytes: %u\n"\
|
||||
" MICDataBytes: %u\n"\
|
||||
" AADDataBytes: %u\n",
|
||||
jobDescParam.jobTypeId,\
|
||||
jobDescParam.inDataBytes,\
|
||||
jobDescParam.outDataBytes,\
|
||||
jobDescParam.keyDataBytes,\
|
||||
jobDescParam.inCtxDataBytes,\
|
||||
jobDescParam.outCtxDataBytes,\
|
||||
jobDescParam.modDataBytes,\
|
||||
jobDescParam.MICDataBytes,\
|
||||
jobDescParam.AADDataBytes));
|
||||
|
||||
h_JobDesc = SEC_DCL_InitJobDesc(h_SecDcl, &jobDescParam);
|
||||
}
|
||||
if(NULL == h_JobDesc)
|
||||
{
|
||||
SEC4Dump(DBGTXT_SETRQ,("SEC_JQ_Enqueue() :: Error creating jobDescriptor\n"));
|
||||
return ERROR_CODE(E_NO_MEMORY);
|
||||
}
|
||||
req->jobDesc = h_JobDesc;
|
||||
|
||||
/* Print descriptor */
|
||||
SEC4DbgDo(DBGTXT_DESCSHOW, SEC_DCL_DebugPrintDescriptor((t_Desc *)h_JobDesc));
|
||||
|
||||
/* Enqueue job to SEC engine*/
|
||||
h_Context = (t_Handle) req;
|
||||
IOLockJobEnqueue();
|
||||
#ifdef SEC4_USE_SHARED_JOB_QUEUE
|
||||
sec4IpcVector[sec4CoreId].state = SEC4_IPC_STATE_PENDING;
|
||||
sec4IpcVector[sec4CoreId].req = req;
|
||||
/* Update core ID in request to be able to get the job back to the same core */
|
||||
req->coreId = sec4CoreId;
|
||||
/* Protect the shared job queue while enqueueing job */
|
||||
sec4spinLockLock(SEC4_SH_JQ_SPINLOCK_ID);
|
||||
#endif
|
||||
status = SEC_JQ_Enqueue(h_SecJobQueue, (void *) ((t_Desc *)h_JobDesc)->p_Buffer, h_Context);
|
||||
#ifdef SEC4_USE_SHARED_JOB_QUEUE
|
||||
sec4spinLockUnlock(SEC4_SH_JQ_SPINLOCK_ID);
|
||||
#endif
|
||||
IOUnLockJobEnqueue();
|
||||
if(E_OK != status)
|
||||
{
|
||||
SEC4Dump(DBGTXT_SETRQ,("SEC_JQ_Enqueue() :: Error: 0x%x, from SEC_JQ_Enqueue\n", status));
|
||||
SEC_DCL_FreeDesc(h_JobDesc);
|
||||
return status;
|
||||
}
|
||||
|
||||
SEC4Dump(DBGTXT_SETRQ, ("SEC_JQ_Enqueue() :: h_Context=0x%x, h_JobDesc=0x%x, JobDescBuffer=0x%x\n", (uint32_t) h_Context, (uint32_t) h_JobDesc, ((t_Desc *)h_JobDesc)->p_Buffer));
|
||||
|
||||
return SEC4_SUCCESS;
|
||||
} /* end of ProcessRequest() */
|
||||
|
||||
/*
|
||||
*===========================================================================
|
||||
* ProcessingComplete
|
||||
*===========================================================================
|
||||
* Description: Process completed jobs that is sent by the ISR.
|
||||
* Parameters:
|
||||
* Returns:
|
||||
*
|
||||
*/
|
||||
void ProcessingComplete(void)
|
||||
{
|
||||
static COMPLETED_JOB completedJob;
|
||||
GENERIC_REQ *pReq;
|
||||
static int jobStatus;
|
||||
COMPLETED_JOB *pCompletedJob = &completedJob;
|
||||
int i;
|
||||
|
||||
#ifdef SEC4_USE_SHARED_JOB_QUEUE
|
||||
/* Wait for vector to be initialized */
|
||||
while((volatile)(sec4IpcVector) == NULL)
|
||||
{
|
||||
taskDelay(10);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* we sit here forever, waiting for job completion messages from the ISR */
|
||||
for(;;)
|
||||
{
|
||||
#ifdef SEC4_USE_SHARED_JOB_QUEUE
|
||||
/* Poll shared vector for completed jobs */
|
||||
while((volatile)(sec4IpcVector[sec4CoreId].state) != SEC4_IPC_STATE_DONE)
|
||||
{
|
||||
taskDelay(1); /* TODO */
|
||||
}
|
||||
pReq = (GENERIC_REQ *)sec4IpcVector[sec4CoreId].req;
|
||||
jobStatus = pReq->status;
|
||||
/* Clear shared vector */
|
||||
sec4IpcVector[sec4CoreId].req = NULL;
|
||||
sec4IpcVector[sec4CoreId].state = SEC4_IPC_STATE_IDLE;
|
||||
#else
|
||||
/* Wait for job completion message from the ISR */
|
||||
if (msgQReceive(IsrMsgQId,
|
||||
(char*)pCompletedJob,
|
||||
sizeof(COMPLETED_JOB),
|
||||
WAIT_FOREVER) != sizeof(COMPLETED_JOB))
|
||||
{
|
||||
SEC4Dump(DBGTXT_ERROR,("ProcessingComplete() :: Error: msgQReceive errno = %d\n", errno));
|
||||
continue;
|
||||
}
|
||||
if(pCompletedJob == NULL)
|
||||
{
|
||||
SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: job error: pCompletedJob=NULL\n"));
|
||||
return;
|
||||
}
|
||||
pReq = pCompletedJob->req;
|
||||
if(pReq == NULL)
|
||||
{
|
||||
SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: job error: pReq=NULL\n"));
|
||||
pCompletedJob->jobStatus = SEC4_JOB_ERROR;
|
||||
return;
|
||||
}
|
||||
jobStatus = pCompletedJob->jobStatus;
|
||||
pReq->status = jobStatus;
|
||||
#endif
|
||||
|
||||
if((0 == jobStatus) && (pReq->jobDesc != NULL))
|
||||
{
|
||||
/* Job executed without errors */
|
||||
SEC4Dump(DBGTXT_SVCRQ, ("ProcessingComplete() :: job ok: jobDesc=0x%x, notifyCtx=0x%x, jobStatus=0x%x\n", pReq->jobDesc, pReq->pNotifyCtx, jobStatus));
|
||||
SEC4DbgDo(DBGTXT_DESCSHOW, SEC_DCL_DebugPrintDescriptor((t_Desc *) pReq->jobDesc));
|
||||
|
||||
/* Free job descriptor as its job is done*/
|
||||
SEC_DCL_FreeDesc((t_Handle *) (pReq->jobDesc));
|
||||
pReq->jobDesc = NULL;
|
||||
|
||||
/* Notify waiting context, that may now continue */
|
||||
if (pReq->notifyFlags & NOTIFY_IS_PID)
|
||||
{
|
||||
kill((long)(pReq->notify), SIGUSR1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((pReq->notify) != NULL)
|
||||
pReq->notify(pReq->pNotifyCtx);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Job had errors */
|
||||
pReq->status = SEC4_JOB_ERROR;
|
||||
SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: job error: jobDesc=0x%x, notifyCtx=0x%x, jobStatus=0x%x\n", (uint32_t) pReq->jobDesc, (uint32_t) pReq->pNotifyCtx, jobStatus));
|
||||
|
||||
SEC4DbgDo(DBGTXT_ERROR, SEC_PrintJobStatus(jobStatus));
|
||||
if(pReq->jobDesc != NULL)
|
||||
{
|
||||
SEC4DbgDo(DBGTXT_DESCSHOW, SEC_DCL_DebugPrintDescriptor((t_Desc *)pReq->jobDesc));
|
||||
/* Free job descriptor as its job is done*/
|
||||
SEC_DCL_FreeDesc((t_Handle *) (pReq->jobDesc));
|
||||
pReq->jobDesc = NULL;
|
||||
}
|
||||
|
||||
/* Notify waiting context, that may now continue */
|
||||
if (pReq->notifyFlags & NOTIFY_ERROR_IS_PID)
|
||||
{
|
||||
kill((long)(pReq->notify_on_error), SIGUSR2);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((pReq->notify_on_error) != NULL)
|
||||
{
|
||||
/* (Error code may be decoded using SEC_DecodeJobStatus() )*/
|
||||
pReq->ctxNotifyOnErr.errorcode = jobStatus;
|
||||
pReq->ctxNotifyOnErr.request = pReq;
|
||||
|
||||
/* Call the handler */
|
||||
pReq->notify_on_error(&(pReq->ctxNotifyOnErr));
|
||||
}
|
||||
else
|
||||
{
|
||||
SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: Error: pReq->notify_on_error=NULL. Can not notify calling context\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Dump job queue registers */
|
||||
SEC4DbgDo(DBGTXT_DESCSHOW, SEC_JQ_DumpRegisters(h_SecJobQueue));
|
||||
SEC4Dump(DBGTXT_SVCRQ, ("ProcessingComplete Done\n"));
|
||||
} /* if (message from queue) */
|
||||
} /* End of ProcessingComplete */
|
||||
|
||||
#ifdef SEC4_POLLED_MODE
|
||||
/*
|
||||
*===========================================================================
|
||||
* PollComplete
|
||||
*===========================================================================
|
||||
* Description: Poll SEC4 engine job queue for completed jobs.
|
||||
* They will call their job completion callback function.
|
||||
* Parameters:
|
||||
* Returns:
|
||||
*
|
||||
*/
|
||||
void PollComplete(void)
|
||||
{
|
||||
t_Error jobStatus;
|
||||
|
||||
/* we sit here forever, looking for job completion from the SEC job queue */
|
||||
for(;;)
|
||||
{
|
||||
taskDelay(1); /* TODO: What delay to use here? */
|
||||
#ifdef SEC4_USE_SHARED_JOB_QUEUE
|
||||
/* Only master core polls for completed jobs */
|
||||
if(sec4CoreId == NCSW_MASTER_ID)
|
||||
#endif
|
||||
{
|
||||
if(h_SecJobQueue != NULL)
|
||||
{
|
||||
jobStatus = SEC_JQ_Dequeue(h_SecJobQueue);
|
||||
if(jobStatus != E_OK)
|
||||
{
|
||||
SEC4DbgDo(DBGTXT_ERROR, ("PollComplete: Error: SEC_JQ_Dequeue returned %d\n", jobStatus));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* #ifdef SEC4_POLLED_MODE */
|
||||
|
||||
/*
|
||||
*===========================================================================
|
||||
* GetStatus
|
||||
*===========================================================================
|
||||
* Description: Get current values of SEC4 status registers.
|
||||
* Parameters:
|
||||
* Returns:
|
||||
*
|
||||
*/
|
||||
int GetStatus(STATUS_REQ *pStatus, int callingTaskId)
|
||||
{
|
||||
t_Sec* p_Sec = (t_Sec*)h_Sec4;
|
||||
t_SecStatRegs* p_SecStatCopy = (t_SecStatRegs*) pStatus;
|
||||
|
||||
/* Copy device registers */
|
||||
p_SecStatCopy->ccbvidr = p_Sec->p_MemMap->stat.ccbvidr;
|
||||
p_SecStatCopy->chanumr = p_Sec->p_MemMap->stat.chanumr;
|
||||
p_SecStatCopy->chavidr = p_Sec->p_MemMap->stat.chavidr;
|
||||
p_SecStatCopy->crnr = p_Sec->p_MemMap->stat.crnr;
|
||||
p_SecStatCopy->ctpr = p_Sec->p_MemMap->stat.ctpr;
|
||||
p_SecStatCopy->fadr = p_Sec->p_MemMap->stat.fadr;
|
||||
p_SecStatCopy->falr = p_Sec->p_MemMap->stat.falr;
|
||||
p_SecStatCopy->far = p_Sec->p_MemMap->stat.far;
|
||||
p_SecStatCopy->ib_dec_req = p_Sec->p_MemMap->stat.ib_dec_req;
|
||||
p_SecStatCopy->ib_decrypt = p_Sec->p_MemMap->stat.ib_decrypt;
|
||||
p_SecStatCopy->ib_validated = p_Sec->p_MemMap->stat.ib_validated;
|
||||
p_SecStatCopy->ob_enc_req = p_Sec->p_MemMap->stat.ob_enc_req;
|
||||
p_SecStatCopy->ob_encrypt = p_Sec->p_MemMap->stat.ob_encrypt;
|
||||
p_SecStatCopy->ob_protect = p_Sec->p_MemMap->stat.ob_protect;
|
||||
p_SecStatCopy->req_deq = p_Sec->p_MemMap->stat.req_deq;
|
||||
p_SecStatCopy->rvidr = p_Sec->p_MemMap->stat.rvidr;
|
||||
p_SecStatCopy->secvidr = p_Sec->p_MemMap->stat.secvidr;
|
||||
p_SecStatCopy->sstar = p_Sec->p_MemMap->stat.sstar;
|
||||
|
||||
return SEC4_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************
|
||||
*/
|
||||
Reference in New Issue
Block a user