summaryrefslogtreecommitdiffstats
path: root/target/linux/generic-2.6/files/crypto/ocf/ep80579/icp_sym.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic-2.6/files/crypto/ocf/ep80579/icp_sym.c')
-rw-r--r--target/linux/generic-2.6/files/crypto/ocf/ep80579/icp_sym.c423
1 files changed, 97 insertions, 326 deletions
diff --git a/target/linux/generic-2.6/files/crypto/ocf/ep80579/icp_sym.c b/target/linux/generic-2.6/files/crypto/ocf/ep80579/icp_sym.c
index d632970165..e1c71484a6 100644
--- a/target/linux/generic-2.6/files/crypto/ocf/ep80579/icp_sym.c
+++ b/target/linux/generic-2.6/files/crypto/ocf/ep80579/icp_sym.c
@@ -5,7 +5,7 @@
*
* GPL LICENSE SUMMARY
*
- * Copyright(c) 2007,2008 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007,2008,2009 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
@@ -27,7 +27,7 @@
*
* BSD LICENSE
*
- * Copyright(c) 2007,2008 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007,2008,2009 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -57,7 +57,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
- * version: Security.L.1.0.130
+ * version: Security.L.1.0.2-229
*
***************************************************************************/
/*
@@ -96,38 +96,6 @@ static int
icp_ocfDrvAlgorithmSetup(struct cryptoini *cri,
CpaCySymSessionSetupData * lacSessCtx);
-/*This top level function is used to find a pointer to where a digest is
- stored/needs to be inserted. */
-static uint8_t *icp_ocfDrvDigestPointerFind(struct icp_drvOpData *drvOpData,
- struct cryptodesc *crp_desc);
-
-/*This function is called when a digest pointer has to be found within a
- SKBUFF.*/
-static inline uint8_t *icp_ocfDrvSkbuffDigestPointerFind(struct icp_drvOpData
- *drvOpData,
- int offsetInBytes,
- uint32_t
- digestSizeInBytes);
-
-/*The following two functions are called if the SKBUFF digest pointer is not
- positioned in the linear portion of the buffer (i.e. it is in a linked SKBUFF
- or page fragment).*/
-/*This function takes care of the page fragment case.*/
-static inline uint8_t *icp_ocfDrvDigestSkbNRFragsCheck(struct sk_buff *skb,
- struct skb_shared_info
- *skb_shared,
- int offsetInBytes,
- uint32_t
- digestSizeInBytes);
-
-/*This function takes care of the linked list case.*/
-static inline uint8_t *icp_ocfDrvDigestSkbFragListCheck(struct sk_buff *skb,
- struct skb_shared_info
- *skb_shared,
- int offsetInBytes,
- uint32_t
- digestSizeInBytes);
-
/*This function is used to free an OCF->OCF_DRV session object*/
static void icp_ocfDrvFreeOCFSession(struct icp_drvSessionData *sessionData);
@@ -142,7 +110,7 @@ static void icp_ocfDrvFreeOCFSession(struct icp_drvSessionData *sessionData);
* Notes : The callbackTag is a pointer to an icp_drvOpData. This memory
* object was passed to LAC for the cryptographic processing and contains all
* the relevant information for cleaning up buffer handles etc. so that the
- * OCF Tolapai Driver portion of this crypto operation can be fully completed.
+ * OCF EP80579 Driver portion of this crypto operation can be fully completed.
*/
static void
icp_ocfDrvSymCallBack(void *callbackTag,
@@ -188,11 +156,12 @@ icp_ocfDrvSymCallBack(void *callbackTag,
if (CPA_STATUS_SUCCESS == status) {
- if (temp_drvOpData->bufferType == CRYPTO_F_SKBUF) {
+ if (temp_drvOpData->bufferType == ICP_CRYPTO_F_PACKET_BUF) {
if (ICP_OCF_DRV_STATUS_SUCCESS !=
- icp_ocfDrvBufferListToSkBuff(pDstBuffer,
- (struct sk_buff **)
- &(crp->crp_buf))) {
+ icp_ocfDrvBufferListToPacketBuff(pDstBuffer,
+ (icp_packet_buffer_t
+ **)
+ & (crp->crp_buf))) {
EPRINTK("%s(): BufferList to SkBuff "
"conversion error.\n", __FUNCTION__);
crp->crp_etype = EPERM;
@@ -213,10 +182,10 @@ icp_ocfDrvSymCallBack(void *callbackTag,
if (temp_drvOpData->numBufferListArray >
ICP_OCF_DRV_DEFAULT_BUFFLIST_ARRAYS) {
- kfree(pDstBuffer->pBuffers);
+ icp_kfree(pDstBuffer->pBuffers);
}
icp_ocfDrvFreeMetaData(pDstBuffer);
- kmem_cache_free(drvOpData_zone, temp_drvOpData);
+ ICP_CACHE_FREE(drvOpData_zone, temp_drvOpData);
/* Invoke the OCF callback function */
crypto_done(crp);
@@ -231,7 +200,8 @@ icp_ocfDrvSymCallBack(void *callbackTag,
* Notes : LAC session registration happens during the first perform call.
* That is the first time we know all information about a given session.
*/
-int icp_ocfDrvNewSession(device_t dev, uint32_t * sid, struct cryptoini *cri)
+int icp_ocfDrvNewSession(icp_device_t dev, uint32_t * sid,
+ struct cryptoini *cri)
{
struct icp_drvSessionData *sessionData = NULL;
uint32_t delete_session = 0;
@@ -258,44 +228,44 @@ int icp_ocfDrvNewSession(device_t dev, uint32_t * sid, struct cryptoini *cri)
return EINVAL;
}
- sessionData = kmem_cache_zalloc(drvSessionData_zone, GFP_ATOMIC);
+ sessionData = icp_kmem_cache_zalloc(drvSessionData_zone, ICP_M_NOWAIT);
if (NULL == sessionData) {
DPRINTK("%s():No memory for Session Data\n", __FUNCTION__);
return ENOMEM;
}
/*ENTER CRITICAL SECTION */
- spin_lock_bh(&icp_ocfDrvSymSessInfoListSpinlock);
+ icp_spin_lockbh_lock(&icp_ocfDrvSymSessInfoListSpinlock);
/*put this check in the spinlock so no new sessions can be added to the
linked list when we are exiting */
- if (CPA_TRUE == atomic_read(&icp_ocfDrvIsExiting)) {
+ if (CPA_TRUE == icp_atomic_read(&icp_ocfDrvIsExiting)) {
delete_session++;
} else if (NO_OCF_TO_DRV_MAX_SESSIONS != max_sessions) {
- if (atomic_read(&num_ocf_to_drv_registered_sessions) >=
+ if (icp_atomic_read(&num_ocf_to_drv_registered_sessions) >=
(max_sessions -
- atomic_read(&lac_session_failed_dereg_count))) {
+ icp_atomic_read(&lac_session_failed_dereg_count))) {
delete_session++;
} else {
- atomic_inc(&num_ocf_to_drv_registered_sessions);
+ icp_atomic_inc(&num_ocf_to_drv_registered_sessions);
/* Add to session data linked list */
- list_add(&(sessionData->listNode),
- &icp_ocfDrvGlobalSymListHead);
+ ICP_LIST_ADD(sessionData, &icp_ocfDrvGlobalSymListHead,
+ listNode);
}
} else if (NO_OCF_TO_DRV_MAX_SESSIONS == max_sessions) {
- list_add(&(sessionData->listNode),
- &icp_ocfDrvGlobalSymListHead);
+ ICP_LIST_ADD(sessionData, &icp_ocfDrvGlobalSymListHead,
+ listNode);
}
sessionData->inUse = ICP_SESSION_INITIALISED;
/*EXIT CRITICAL SECTION */
- spin_unlock_bh(&icp_ocfDrvSymSessInfoListSpinlock);
+ icp_spin_lockbh_unlock(&icp_ocfDrvSymSessInfoListSpinlock);
if (delete_session) {
DPRINTK("%s():No Session handles available\n", __FUNCTION__);
- kmem_cache_free(drvSessionData_zone, sessionData);
+ ICP_CACHE_FREE(drvSessionData_zone, sessionData);
return EPERM;
}
@@ -560,27 +530,27 @@ static void icp_ocfDrvFreeOCFSession(struct icp_drvSessionData *sessionData)
sessionData->inUse = ICP_SESSION_DEREGISTERED;
/*ENTER CRITICAL SECTION */
- spin_lock_bh(&icp_ocfDrvSymSessInfoListSpinlock);
+ icp_spin_lockbh_lock(&icp_ocfDrvSymSessInfoListSpinlock);
- if (CPA_TRUE == atomic_read(&icp_ocfDrvIsExiting)) {
+ if (CPA_TRUE == icp_atomic_read(&icp_ocfDrvIsExiting)) {
/*If the Driver is exiting, allow that process to
handle any deletions */
/*EXIT CRITICAL SECTION */
- spin_unlock_bh(&icp_ocfDrvSymSessInfoListSpinlock);
+ icp_spin_lockbh_unlock(&icp_ocfDrvSymSessInfoListSpinlock);
return;
}
- atomic_dec(&num_ocf_to_drv_registered_sessions);
+ icp_atomic_dec(&num_ocf_to_drv_registered_sessions);
- list_del(&(sessionData->listNode));
+ ICP_LIST_DEL(sessionData, listNode);
/*EXIT CRITICAL SECTION */
- spin_unlock_bh(&icp_ocfDrvSymSessInfoListSpinlock);
+ icp_spin_lockbh_unlock(&icp_ocfDrvSymSessInfoListSpinlock);
if (NULL != sessionData->sessHandle) {
- kfree(sessionData->sessHandle);
+ icp_kfree(sessionData->sessHandle);
}
- kmem_cache_free(drvSessionData_zone, sessionData);
+ ICP_CACHE_FREE(drvSessionData_zone, sessionData);
}
/* Name : icp_ocfDrvFreeLACSession
@@ -588,7 +558,7 @@ static void icp_ocfDrvFreeOCFSession(struct icp_drvSessionData *sessionData)
* Description : This attempts to deregister a LAC session. If it fails, the
* deregistation retry function is called.
*/
-int icp_ocfDrvFreeLACSession(device_t dev, uint64_t sid)
+int icp_ocfDrvFreeLACSession(icp_device_t dev, uint64_t sid)
{
CpaCySymSessionCtx sessionToDeregister = NULL;
struct icp_drvSessionData *sessionData = NULL;
@@ -604,14 +574,14 @@ int icp_ocfDrvFreeLACSession(device_t dev, uint64_t sid)
sessionToDeregister = sessionData->sessHandle;
- if (ICP_SESSION_INITIALISED == sessionData->inUse) {
- DPRINTK("%s() Session not registered with LAC\n", __FUNCTION__);
- } else if (NULL == sessionData->sessHandle) {
- EPRINTK
- ("%s(): OCF Free session called with Null Session Handle.\n",
- __FUNCTION__);
+ if ((ICP_SESSION_INITIALISED != sessionData->inUse) &&
+ (ICP_SESSION_RUNNING != sessionData->inUse) &&
+ (ICP_SESSION_DEREGISTERED != sessionData->inUse)) {
+ DPRINTK("%s() Session not initialised.\n", __FUNCTION__);
return EINVAL;
- } else {
+ }
+
+ if (ICP_SESSION_RUNNING == sessionData->inUse) {
lacStatus = cpaCySymRemoveSession(CPA_INSTANCE_HANDLE_SINGLE,
sessionToDeregister);
if (CPA_STATUS_RETRY == lacStatus) {
@@ -629,9 +599,12 @@ int icp_ocfDrvFreeLACSession(device_t dev, uint64_t sid)
DPRINTK("%s(): LAC failed to deregister the session. "
"localSessionId= %p, lacStatus = %d\n",
__FUNCTION__, sessionToDeregister, lacStatus);
- atomic_inc(&lac_session_failed_dereg_count);
+ icp_atomic_inc(&lac_session_failed_dereg_count);
retval = EPERM;
}
+ } else {
+ DPRINTK("%s() Session not registered with LAC.\n",
+ __FUNCTION__);
}
icp_ocfDrvFreeOCFSession(sessionData);
@@ -668,13 +641,12 @@ static int icp_ocfDrvAlgCheck(struct cryptodesc *crp_desc)
* to whether session paramaters have changed (e.g. alg chain order) are
* done.
*/
-int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
+int icp_ocfDrvSymProcess(icp_device_t dev, struct cryptop *crp, int hint)
{
struct icp_drvSessionData *sessionData = NULL;
struct icp_drvOpData *drvOpData = NULL;
CpaStatus lacStatus = CPA_STATUS_SUCCESS;
Cpa32U sessionCtxSizeInBytes = 0;
- uint16_t numBufferListArray = 0;
if (NULL == crp) {
DPRINTK("%s(): Invalid input parameters, cryptop is NULL\n",
@@ -696,7 +668,7 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
return EINVAL;
}
- if (CPA_TRUE == atomic_read(&icp_ocfDrvIsExiting)) {
+ if (CPA_TRUE == icp_atomic_read(&icp_ocfDrvIsExiting)) {
crp->crp_etype = EFAULT;
return EFAULT;
}
@@ -793,14 +765,16 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
if (CPA_STATUS_SUCCESS != lacStatus) {
EPRINTK("%s(): cpaCySymSessionCtxGetSize failed - %d\n",
__FUNCTION__, lacStatus);
+ crp->crp_etype = EINVAL;
return EINVAL;
}
sessionData->sessHandle =
- kmalloc(sessionCtxSizeInBytes, GFP_ATOMIC);
+ icp_kmalloc(sessionCtxSizeInBytes, ICP_M_NOWAIT);
if (NULL == sessionData->sessHandle) {
EPRINTK
("%s(): Failed to get memory for SymSessionCtx\n",
__FUNCTION__);
+ crp->crp_etype = ENOMEM;
return ENOMEM;
}
@@ -812,13 +786,14 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
if (CPA_STATUS_SUCCESS != lacStatus) {
EPRINTK("%s(): cpaCySymInitSession failed -%d \n",
__FUNCTION__, lacStatus);
+ crp->crp_etype = EFAULT;
return EFAULT;
}
sessionData->inUse = ICP_SESSION_RUNNING;
}
- drvOpData = kmem_cache_zalloc(drvOpData_zone, GFP_ATOMIC);
+ drvOpData = icp_kmem_cache_zalloc(drvOpData_zone, ICP_M_NOWAIT);
if (NULL == drvOpData) {
EPRINTK("%s():Failed to get memory for drvOpData\n",
__FUNCTION__);
@@ -835,28 +810,48 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
drvOpData->srcBuffer.pBuffers = drvOpData->bufferListArray;
drvOpData->numBufferListArray = ICP_OCF_DRV_DEFAULT_BUFFLIST_ARRAYS;
+ if (ICP_OCF_DRV_STATUS_SUCCESS !=
+ icp_ocfDrvProcessDataSetup(drvOpData, drvOpData->crp->crp_desc)) {
+ crp->crp_etype = EINVAL;
+ goto err;
+ }
+
+ if (drvOpData->crp->crp_desc->crd_next != NULL) {
+ if (icp_ocfDrvProcessDataSetup(drvOpData, drvOpData->crp->
+ crp_desc->crd_next)) {
+ crp->crp_etype = EINVAL;
+ goto err;
+ }
+
+ }
+
/*
- * Allocate buffer list array memory allocation if the
- * data fragment is more than the default allocation
+ * Allocate buffer list array memory if the data fragment is more than
+ * the default number (ICP_OCF_DRV_DEFAULT_BUFFLIST_ARRAYS) and not
+ * calculated already
*/
- if (crp->crp_flags & CRYPTO_F_SKBUF) {
- numBufferListArray = icp_ocfDrvGetSkBuffFrags((struct sk_buff *)
- crp->crp_buf);
- if (ICP_OCF_DRV_DEFAULT_BUFFLIST_ARRAYS < numBufferListArray) {
+ if (crp->crp_flags & ICP_CRYPTO_F_PACKET_BUF) {
+ if (NULL == drvOpData->lacOpData.pDigestResult) {
+ drvOpData->numBufferListArray =
+ icp_ocfDrvGetPacketBuffFrags((icp_packet_buffer_t *)
+ crp->crp_buf);
+ }
+
+ if (ICP_OCF_DRV_DEFAULT_BUFFLIST_ARRAYS <
+ drvOpData->numBufferListArray) {
DPRINTK("%s() numBufferListArray more than default\n",
__FUNCTION__);
drvOpData->srcBuffer.pBuffers = NULL;
drvOpData->srcBuffer.pBuffers =
- kmalloc(numBufferListArray *
- sizeof(CpaFlatBuffer), GFP_ATOMIC);
+ icp_kmalloc(drvOpData->numBufferListArray *
+ sizeof(CpaFlatBuffer), ICP_M_NOWAIT);
if (NULL == drvOpData->srcBuffer.pBuffers) {
EPRINTK("%s() Failed to get memory for "
"pBuffers\n", __FUNCTION__);
- kmem_cache_free(drvOpData_zone, drvOpData);
+ ICP_CACHE_FREE(drvOpData_zone, drvOpData);
crp->crp_etype = ENOMEM;
return ENOMEM;
}
- drvOpData->numBufferListArray = numBufferListArray;
}
}
@@ -864,17 +859,18 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
* Check the type of buffer structure we got and convert it into
* CpaBufferList format.
*/
- if (crp->crp_flags & CRYPTO_F_SKBUF) {
+ if (crp->crp_flags & ICP_CRYPTO_F_PACKET_BUF) {
if (ICP_OCF_DRV_STATUS_SUCCESS !=
- icp_ocfDrvSkBuffToBufferList((struct sk_buff *)crp->crp_buf,
- &(drvOpData->srcBuffer))) {
- EPRINTK("%s():Failed to translate from SK_BUF "
+ icp_ocfDrvPacketBuffToBufferList((icp_packet_buffer_t *)
+ crp->crp_buf,
+ &(drvOpData->srcBuffer))) {
+ EPRINTK("%s():Failed to translate from packet buffer "
"to bufferlist\n", __FUNCTION__);
crp->crp_etype = EINVAL;
goto err;
}
- drvOpData->bufferType = CRYPTO_F_SKBUF;
+ drvOpData->bufferType = ICP_CRYPTO_F_PACKET_BUF;
} else if (crp->crp_flags & CRYPTO_F_IOV) {
/* OCF only supports IOV of one entry. */
if (NUM_IOV_SUPPORTED ==
@@ -906,21 +902,6 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
drvOpData->bufferType = CRYPTO_BUF_CONTIG;
}
- if (ICP_OCF_DRV_STATUS_SUCCESS !=
- icp_ocfDrvProcessDataSetup(drvOpData, drvOpData->crp->crp_desc)) {
- crp->crp_etype = EINVAL;
- goto err;
- }
-
- if (drvOpData->crp->crp_desc->crd_next != NULL) {
- if (icp_ocfDrvProcessDataSetup(drvOpData, drvOpData->crp->
- crp_desc->crd_next)) {
- crp->crp_etype = EINVAL;
- goto err;
- }
-
- }
-
/* Allocate srcBuffer's private meta data */
if (ICP_OCF_DRV_STATUS_SUCCESS !=
icp_ocfDrvAllocMetaData(&(drvOpData->srcBuffer), drvOpData)) {
@@ -941,7 +922,7 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
DPRINTK("%s(): cpaCySymPerformOp retry, lacStatus = %d\n",
__FUNCTION__, lacStatus);
memset(&(drvOpData->lacOpData), 0, sizeof(CpaCySymOpData));
- crp->crp_etype = EINVAL;
+ crp->crp_etype = ERESTART;
goto err;
}
if (CPA_STATUS_SUCCESS != lacStatus) {
@@ -956,10 +937,10 @@ int icp_ocfDrvSymProcess(device_t dev, struct cryptop *crp, int hint)
err:
if (drvOpData->numBufferListArray > ICP_OCF_DRV_DEFAULT_BUFFLIST_ARRAYS) {
- kfree(drvOpData->srcBuffer.pBuffers);
+ icp_kfree(drvOpData->srcBuffer.pBuffers);
}
icp_ocfDrvFreeMetaData(&(drvOpData->srcBuffer));
- kmem_cache_free(drvOpData_zone, drvOpData);
+ ICP_CACHE_FREE(drvOpData_zone, drvOpData);
return crp->crp_etype;
}
@@ -1129,32 +1110,20 @@ static int icp_ocfDrvProcessDataSetup(struct icp_drvOpData *drvOpData,
* must be traversed by the data length offset in order to find the digest start
* address. Whether there is enough space for the digest must also be checked.
*/
-
-static uint8_t *icp_ocfDrvDigestPointerFind(struct icp_drvOpData *drvOpData,
- struct cryptodesc *crp_desc)
+uint8_t *icp_ocfDrvDigestPointerFind(struct icp_drvOpData * drvOpData,
+ struct cryptodesc * crp_desc)
{
int offsetInBytes = crp_desc->crd_inject;
uint32_t digestSizeInBytes = drvOpData->digestSizeInBytes;
uint8_t *flat_buffer_base = NULL;
int flat_buffer_length = 0;
- struct sk_buff *skb;
- if (drvOpData->crp->crp_flags & CRYPTO_F_SKBUF) {
- /*check if enough overall space to store hash */
- skb = (struct sk_buff *)(drvOpData->crp->crp_buf);
-
- if (skb->len < (offsetInBytes + digestSizeInBytes)) {
- DPRINTK("%s() Not enough space for Digest"
- " payload after the offset (%d), "
- "digest size (%d) \n", __FUNCTION__,
- offsetInBytes, digestSizeInBytes);
- return NULL;
- }
+ if (drvOpData->crp->crp_flags & ICP_CRYPTO_F_PACKET_BUF) {
- return icp_ocfDrvSkbuffDigestPointerFind(drvOpData,
- offsetInBytes,
- digestSizeInBytes);
+ return icp_ocfDrvPacketBufferDigestPointerFind(drvOpData,
+ offsetInBytes,
+ digestSizeInBytes);
} else {
/* IOV or flat buffer */
@@ -1182,201 +1151,3 @@ static uint8_t *icp_ocfDrvDigestPointerFind(struct icp_drvOpData *drvOpData,
DPRINTK("%s() Should not reach this point\n", __FUNCTION__);
return NULL;
}
-
-/* Name : icp_ocfDrvSkbuffDigestPointerFind
- *
- * Description : This function is used by icp_ocfDrvDigestPointerFind to process
- * the non-linear portion of the skbuff if the fragmentation type is a linked
- * list (frag_list is not NULL in the skb_shared_info structure)
- */
-static inline uint8_t *icp_ocfDrvSkbuffDigestPointerFind(struct icp_drvOpData
- *drvOpData,
- int offsetInBytes,
- uint32_t
- digestSizeInBytes)
-{
-
- struct sk_buff *skb = NULL;
- struct skb_shared_info *skb_shared = NULL;
-
- uint32_t skbuffisnonlinear = 0;
-
- uint32_t skbheadlen = 0;
-
- skb = (struct sk_buff *)(drvOpData->crp->crp_buf);
- skbuffisnonlinear = skb_is_nonlinear(skb);
-
- skbheadlen = skb_headlen(skb);
-
- /*Linear skb checks */
- if (skbheadlen > offsetInBytes) {
-
- if (skbheadlen >= (offsetInBytes + digestSizeInBytes)) {
- return (uint8_t *) (skb->data + offsetInBytes);
- } else {
- DPRINTK("%s() Auth payload stretches "
- "accross contiguous memory\n", __FUNCTION__);
- return NULL;
- }
- } else {
- if (skbuffisnonlinear) {
- offsetInBytes -= skbheadlen;
- } else {
- DPRINTK("%s() Offset outside of buffer boundaries\n",
- __FUNCTION__);
- return NULL;
- }
- }
-
- /*Non Linear checks */
- skb_shared = (struct skb_shared_info *)(skb->end);
- if (unlikely(NULL == skb_shared)) {
- DPRINTK("%s() skbuff shared info stucture is NULL! \n",
- __FUNCTION__);
- return NULL;
- } else if ((0 != skb_shared->nr_frags) &&
- (skb_shared->frag_list != NULL)) {
- DPRINTK("%s() skbuff nr_frags AND "
- "frag_list not supported \n", __FUNCTION__);
- return NULL;
- }
-
- /*TCP segmentation more likely than IP fragmentation */
- if (likely(0 != skb_shared->nr_frags)) {
- return icp_ocfDrvDigestSkbNRFragsCheck(skb, skb_shared,
- offsetInBytes,
- digestSizeInBytes);
- } else if (skb_shared->frag_list != NULL) {
- return icp_ocfDrvDigestSkbFragListCheck(skb, skb_shared,
- offsetInBytes,
- digestSizeInBytes);
- } else {
- DPRINTK("%s() skbuff is non-linear but does not show any "
- "linked data\n", __FUNCTION__);
- return NULL;
- }
-
-}
-
-/* Name : icp_ocfDrvDigestSkbNRFragsCheck
- *
- * Description : This function is used by icp_ocfDrvSkbuffDigestPointerFind to
- * process the non-linear portion of the skbuff, if the fragmentation type is
- * page fragments
- */
-static inline uint8_t *icp_ocfDrvDigestSkbNRFragsCheck(struct sk_buff *skb,
- struct skb_shared_info
- *skb_shared,
- int offsetInBytes,
- uint32_t
- digestSizeInBytes)
-{
- int i = 0;
- /*nr_frags starts from 1 */
- if (MAX_SKB_FRAGS < skb_shared->nr_frags) {
- DPRINTK("%s error processing skbuff "
- "page frame -- MAX FRAGS exceeded \n", __FUNCTION__);
- return NULL;
- }
-
- for (i = 0; i < skb_shared->nr_frags; i++) {
-
- if (offsetInBytes >= skb_shared->frags[i].size) {
- /*offset still greater than data position */
- offsetInBytes -= skb_shared->frags[i].size;
- } else {
- /* found the page containing start of hash */
-
- if (NULL == skb_shared->frags[i].page) {
- DPRINTK("%s() Linked page is NULL!\n",
- __FUNCTION__);
- return NULL;
- }
-
- if (offsetInBytes + digestSizeInBytes >
- skb_shared->frags[i].size) {
- DPRINTK("%s() Auth payload stretches accross "
- "contiguous memory\n", __FUNCTION__);
- return NULL;
- } else {
- return (uint8_t *) (skb_shared->frags[i].page +
- skb_shared->frags[i].
- page_offset +
- offsetInBytes);
- }
- }
- /*only possible if internal page sizes are set wrong */
- if (offsetInBytes < 0) {
- DPRINTK("%s error processing skbuff page frame "
- "-- offset calculation \n", __FUNCTION__);
- return NULL;
- }
- }
- /*only possible if internal page sizes are set wrong */
- DPRINTK("%s error processing skbuff page frame "
- "-- ran out of page fragments, remaining offset = %d \n",
- __FUNCTION__, offsetInBytes);
- return NULL;
-
-}
-
-/* Name : icp_ocfDrvDigestSkbFragListCheck
- *
- * Description : This function is used by icp_ocfDrvSkbuffDigestPointerFind to
- * process the non-linear portion of the skbuff, if the fragmentation type is
- * a linked list
- *
- */
-static inline uint8_t *icp_ocfDrvDigestSkbFragListCheck(struct sk_buff *skb,
- struct skb_shared_info
- *skb_shared,
- int offsetInBytes,
- uint32_t
- digestSizeInBytes)
-{
-
- struct sk_buff *skb_list = skb_shared->frag_list;
- /*check added for readability */
- if (NULL == skb_list) {
- DPRINTK("%s error processing skbuff "
- "-- no more list! \n", __FUNCTION__);
- return NULL;
- }
-
- for (; skb_list; skb_list = skb_list->next) {
- if (NULL == skb_list) {
- DPRINTK("%s error processing skbuff "
- "-- no more list! \n", __FUNCTION__);
- return NULL;
- }
-
- if (offsetInBytes >= skb_list->len) {
- offsetInBytes -= skb_list->len;
-
- } else {
- if (offsetInBytes + digestSizeInBytes > skb_list->len) {
- DPRINTK("%s() Auth payload stretches accross "
- "contiguous memory\n", __FUNCTION__);
- return NULL;
- } else {
- return (uint8_t *)
- (skb_list->data + offsetInBytes);
- }
-
- }
-
- /*This check is only needed if internal skb_list length values
- are set wrong. */
- if (0 > offsetInBytes) {
- DPRINTK("%s() error processing skbuff object -- offset "
- "calculation \n", __FUNCTION__);
- return NULL;
- }
-
- }
-
- /*catch all for unusual for-loop exit.
- This code should never be reached */
- DPRINTK("%s() Catch-All hit! Process error.\n", __FUNCTION__);
- return NULL;
-}