1296177Sjhibbits/* Copyright (c) 2008-2011 Freescale Semiconductor, Inc. 2296177Sjhibbits * All rights reserved. 3296177Sjhibbits * 4296177Sjhibbits * Redistribution and use in source and binary forms, with or without 5296177Sjhibbits * modification, are permitted provided that the following conditions are met: 6296177Sjhibbits * * Redistributions of source code must retain the above copyright 7296177Sjhibbits * notice, this list of conditions and the following disclaimer. 8296177Sjhibbits * * Redistributions in binary form must reproduce the above copyright 9296177Sjhibbits * notice, this list of conditions and the following disclaimer in the 10296177Sjhibbits * documentation and/or other materials provided with the distribution. 11296177Sjhibbits * * Neither the name of Freescale Semiconductor nor the 12296177Sjhibbits * names of its contributors may be used to endorse or promote products 13296177Sjhibbits * derived from this software without specific prior written permission. 14296177Sjhibbits * 15296177Sjhibbits * 16296177Sjhibbits * ALTERNATIVELY, this software may be distributed under the terms of the 17296177Sjhibbits * GNU General Public License ("GPL") as published by the Free Software 18296177Sjhibbits * Foundation, either version 2 of that License or (at your option) any 19296177Sjhibbits * later version. 20296177Sjhibbits * 21296177Sjhibbits * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY 22296177Sjhibbits * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23296177Sjhibbits * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24296177Sjhibbits * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY 25296177Sjhibbits * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26296177Sjhibbits * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27296177Sjhibbits * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 28296177Sjhibbits * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29296177Sjhibbits * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30296177Sjhibbits * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31296177Sjhibbits */ 32296177Sjhibbits 33296177Sjhibbits/****************************************************************************** 34296177Sjhibbits @File fm_cc.c 35296177Sjhibbits 36296177Sjhibbits @Description FM CC ... 37296177Sjhibbits*//***************************************************************************/ 38296177Sjhibbits#include "std_ext.h" 39296177Sjhibbits#include "error_ext.h" 40296177Sjhibbits#include "string_ext.h" 41296177Sjhibbits#include "debug_ext.h" 42296177Sjhibbits#include "fm_pcd_ext.h" 43296177Sjhibbits#include "fm_muram_ext.h" 44296177Sjhibbits 45296177Sjhibbits#include "fm_common.h" 46296177Sjhibbits#include "fm_hc.h" 47296177Sjhibbits#include "fm_cc.h" 48296177Sjhibbits 49296177Sjhibbits 50296177Sjhibbits#if defined(FM_CAPWAP_SUPPORT) 51296177Sjhibbits#define FM_PCD_CC_MANIP 52296177Sjhibbits#endif /* defined(FM_CAPWAP_SUPPORT) || ... */ 53296177Sjhibbits 54296177Sjhibbits 55296177Sjhibbitst_Handle FmPcdCcTreeGetSavedManipParams(t_Handle h_FmTree, uint8_t manipIndx) 56296177Sjhibbits{ 57296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree; 58296177Sjhibbits 59296177Sjhibbits ASSERT_COND(p_FmPcdCcTree); 60296177Sjhibbits 61296177Sjhibbits return p_FmPcdCcTree->fmPcdCcSavedManipParams[manipIndx]; 62296177Sjhibbits} 63296177Sjhibbits 64296177Sjhibbitsvoid FmPcdCcTreeSetSavedManipParams(t_Handle h_FmTree, t_Handle h_SavedManipParams, uint8_t manipIndx) 65296177Sjhibbits{ 66296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree; 67296177Sjhibbits 68296177Sjhibbits ASSERT_COND(p_FmPcdCcTree); 69296177Sjhibbits 70296177Sjhibbits p_FmPcdCcTree->fmPcdCcSavedManipParams[manipIndx] = h_SavedManipParams; 71296177Sjhibbits} 72296177Sjhibbits 73296177Sjhibbitsuint8_t FmPcdCcGetParseCode(t_Handle h_CcNode) 74296177Sjhibbits{ 75296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_CcNode; 76296177Sjhibbits 77296177Sjhibbits ASSERT_COND(p_FmPcdCcNode); 78296177Sjhibbits return p_FmPcdCcNode->parseCode; 79296177Sjhibbits} 80296177Sjhibbits 81296177Sjhibbitsuint8_t FmPcdCcGetOffset(t_Handle h_CcNode) 82296177Sjhibbits{ 83296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_CcNode; 84296177Sjhibbits 85296177Sjhibbits ASSERT_COND(p_FmPcdCcNode); 86296177Sjhibbits return p_FmPcdCcNode->offset; 87296177Sjhibbits} 88296177Sjhibbits 89296177Sjhibbitsuint16_t FmPcdCcGetNumOfKeys(t_Handle h_CcNode) 90296177Sjhibbits{ 91296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_CcNode; 92296177Sjhibbits 93296177Sjhibbits ASSERT_COND(p_FmPcdCcNode); 94296177Sjhibbits return p_FmPcdCcNode->numOfKeys; 95296177Sjhibbits} 96296177Sjhibbitsstatic void EnqueueNodeInfoToRelevantLst(t_List *p_List, t_CcNodeInformation *p_CcInfo) 97296177Sjhibbits{ 98296177Sjhibbits t_CcNodeInformation *p_CcInformation; 99296177Sjhibbits uint32_t intFlags; 100296177Sjhibbits 101296177Sjhibbits p_CcInformation = (t_CcNodeInformation *)XX_Malloc(sizeof(t_CcNodeInformation)); 102296177Sjhibbits if (p_CcInformation) 103296177Sjhibbits { 104296177Sjhibbits memset(p_CcInformation, 0, sizeof(t_CcNodeInformation)); 105296177Sjhibbits memcpy(p_CcInformation, p_CcInfo, sizeof(t_CcNodeInformation)); 106296177Sjhibbits INIT_LIST(&p_CcInformation->node); 107296177Sjhibbits 108296177Sjhibbits intFlags = XX_DisableAllIntr(); 109296177Sjhibbits LIST_AddToTail(&p_CcInformation->node, p_List); 110296177Sjhibbits XX_RestoreAllIntr(intFlags); 111296177Sjhibbits } 112296177Sjhibbits else 113296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("CC Node Information")); 114296177Sjhibbits} 115296177Sjhibbits 116296177Sjhibbits 117296177Sjhibbitsstatic t_CcNodeInformation* FindNodeInfoInReleventLst(t_List *p_List, t_Handle h_Info) 118296177Sjhibbits{ 119296177Sjhibbits t_CcNodeInformation *p_CcInformation; 120296177Sjhibbits t_List *p_Pos; 121296177Sjhibbits uint32_t intFlags; 122296177Sjhibbits 123296177Sjhibbits intFlags = XX_DisableAllIntr(); 124296177Sjhibbits for (p_Pos = NCSW_LIST_FIRST(p_List); p_Pos != (p_List); p_Pos = NCSW_LIST_NEXT(p_Pos)) 125296177Sjhibbits { 126296177Sjhibbits p_CcInformation = CC_NODE_F_OBJECT(p_Pos); 127296177Sjhibbits ASSERT_COND(p_CcInformation->h_CcNode); 128296177Sjhibbits if(p_CcInformation->h_CcNode == h_Info) 129296177Sjhibbits { 130296177Sjhibbits XX_RestoreAllIntr(intFlags); 131296177Sjhibbits return p_CcInformation; 132296177Sjhibbits } 133296177Sjhibbits } 134296177Sjhibbits XX_RestoreAllIntr(intFlags); 135296177Sjhibbits return NULL; 136296177Sjhibbits} 137296177Sjhibbits 138296177Sjhibbitsstatic void DequeueNodeInfoFromRelevantLst(t_List *p_List, t_Handle h_Info) 139296177Sjhibbits{ 140296177Sjhibbits t_CcNodeInformation *p_CcInformation = NULL; 141296177Sjhibbits uint32_t intFlags; 142296177Sjhibbits t_List *p_Pos; 143296177Sjhibbits 144296177Sjhibbits intFlags = XX_DisableAllIntr(); 145296177Sjhibbits if (LIST_IsEmpty(p_List)) 146296177Sjhibbits { 147296177Sjhibbits XX_RestoreAllIntr(intFlags); 148296177Sjhibbits return; 149296177Sjhibbits } 150296177Sjhibbits 151296177Sjhibbits for (p_Pos = NCSW_LIST_FIRST(p_List); p_Pos != (p_List); p_Pos = NCSW_LIST_NEXT(p_Pos)) 152296177Sjhibbits { 153296177Sjhibbits p_CcInformation = CC_NODE_F_OBJECT(p_Pos); 154296177Sjhibbits ASSERT_COND(p_CcInformation->h_CcNode); 155296177Sjhibbits if (p_CcInformation->h_CcNode == h_Info) 156296177Sjhibbits break; 157296177Sjhibbits } 158296177Sjhibbits if (p_CcInformation) 159296177Sjhibbits LIST_DelAndInit(&p_CcInformation->node); 160296177Sjhibbits XX_RestoreAllIntr(intFlags); 161296177Sjhibbits} 162296177Sjhibbits 163296177Sjhibbitsstatic t_Error FmPcdCcSetRequiredAction(t_Handle h_FmPcd, uint32_t requiredAction, t_FmPcdCcNextEngineAndRequiredActionParams *p_CcNextEngineParamsTmp, 164296177Sjhibbits t_Handle h_AdTmp, uint16_t numOfEntries, t_Handle h_Tree) 165296177Sjhibbits{ 166296177Sjhibbits 167296177Sjhibbits t_AdOfTypeResult *p_AdTmp = (t_AdOfTypeResult *)h_AdTmp; 168296177Sjhibbits uint32_t tmpReg32; 169296177Sjhibbits t_Error err; 170296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode; 171296177Sjhibbits int i = 0; 172296177Sjhibbits uint16_t tmp = 0; 173296177Sjhibbits uint16_t profileId; 174296177Sjhibbits uint8_t relativeSchemeId, physicalSchemeId; 175296177Sjhibbits t_CcNodeInformation ccNodeInfo; 176296177Sjhibbits 177296177Sjhibbits for(i = 0; i < numOfEntries; i++) 178296177Sjhibbits { 179296177Sjhibbits if(i == 0) 180296177Sjhibbits h_AdTmp = PTR_MOVE(h_AdTmp, i*FM_PCD_CC_AD_ENTRY_SIZE); 181296177Sjhibbits else 182296177Sjhibbits h_AdTmp = PTR_MOVE(h_AdTmp, FM_PCD_CC_AD_ENTRY_SIZE); 183296177Sjhibbits 184296177Sjhibbits if(p_CcNextEngineParamsTmp[i].shadowAction & requiredAction) 185296177Sjhibbits continue; 186296177Sjhibbits switch(p_CcNextEngineParamsTmp[i].nextEngineParams.nextEngine) 187296177Sjhibbits { 188296177Sjhibbits case(e_FM_PCD_CC): 189296177Sjhibbits if(requiredAction) 190296177Sjhibbits { 191296177Sjhibbits p_FmPcdCcNode = p_CcNextEngineParamsTmp[i].nextEngineParams.params.ccParams.h_CcNode; 192296177Sjhibbits ASSERT_COND(p_FmPcdCcNode); 193296177Sjhibbits if(p_FmPcdCcNode->shadowAction == requiredAction) 194296177Sjhibbits break; 195296177Sjhibbits if((requiredAction & UPDATE_CC_WITH_TREE) && !(p_FmPcdCcNode->shadowAction & UPDATE_CC_WITH_TREE)) 196296177Sjhibbits { 197296177Sjhibbits 198296177Sjhibbits ASSERT_COND(LIST_NumOfObjs(&p_FmPcdCcNode->ccTreesLst) == 0); 199296177Sjhibbits if(p_FmPcdCcNode->shadowAction & UPDATE_CC_WITH_DELETE_TREE) 200296177Sjhibbits p_FmPcdCcNode->shadowAction &= ~UPDATE_CC_WITH_DELETE_TREE; 201296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 202296177Sjhibbits ccNodeInfo.h_CcNode = h_Tree; 203296177Sjhibbits EnqueueNodeInfoToRelevantLst(&p_FmPcdCcNode->ccTreesLst, &ccNodeInfo); 204296177Sjhibbits p_CcNextEngineParamsTmp[i].shadowAction |= UPDATE_CC_WITH_TREE; 205296177Sjhibbits } 206296177Sjhibbits if((requiredAction & UPDATE_CC_WITH_DELETE_TREE) && !(p_FmPcdCcNode->shadowAction & UPDATE_CC_WITH_DELETE_TREE)) 207296177Sjhibbits { 208296177Sjhibbits ASSERT_COND(LIST_NumOfObjs(&p_FmPcdCcNode->ccTreesLst) == 1); 209296177Sjhibbits if(p_FmPcdCcNode->shadowAction & UPDATE_CC_WITH_TREE) 210296177Sjhibbits p_FmPcdCcNode->shadowAction &= ~UPDATE_CC_WITH_TREE; 211296177Sjhibbits DequeueNodeInfoFromRelevantLst(&p_FmPcdCcNode->ccTreesLst, h_Tree); 212296177Sjhibbits p_CcNextEngineParamsTmp[i].shadowAction |= UPDATE_CC_WITH_DELETE_TREE; 213296177Sjhibbits } 214296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[p_FmPcdCcNode->numOfKeys].nextEngineParams.nextEngine != e_FM_PCD_INVALID) 215296177Sjhibbits tmp = (uint8_t)(p_FmPcdCcNode->numOfKeys + 1); 216296177Sjhibbits else 217296177Sjhibbits tmp = p_FmPcdCcNode->numOfKeys; 218296177Sjhibbits err = FmPcdCcSetRequiredAction(h_FmPcd, requiredAction, p_FmPcdCcNode->nextEngineAndRequiredAction, p_FmPcdCcNode->h_AdTable, tmp, h_Tree); 219296177Sjhibbits if(err != E_OK) 220296177Sjhibbits return err; 221296177Sjhibbits p_FmPcdCcNode->shadowAction |= requiredAction; 222296177Sjhibbits } 223296177Sjhibbits break; 224296177Sjhibbits 225296177Sjhibbits case(e_FM_PCD_KG): 226296177Sjhibbits if((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && !(p_CcNextEngineParamsTmp[i].shadowAction & UPDATE_NIA_ENQ_WITHOUT_DMA)) 227296177Sjhibbits { 228296177Sjhibbits physicalSchemeId = (uint8_t)(PTR_TO_UINT(p_CcNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme)-1); 229296177Sjhibbits relativeSchemeId = FmPcdKgGetRelativeSchemeId(h_FmPcd, physicalSchemeId); 230296177Sjhibbits if(relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES) 231296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG); 232296177Sjhibbits if (!FmPcdKgIsSchemeValidSw(h_FmPcd, relativeSchemeId)) 233296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid direct scheme.")); 234296177Sjhibbits if(!KgIsSchemeAlwaysDirect(h_FmPcd, relativeSchemeId)) 235296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this action scheme has to be direct.")); 236296177Sjhibbits err = FmPcdKgCcGetSetParams(h_FmPcd, p_CcNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme, requiredAction); 237296177Sjhibbits if(err != E_OK) 238296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 239296177Sjhibbits p_CcNextEngineParamsTmp[i].shadowAction |= requiredAction; 240296177Sjhibbits } 241296177Sjhibbits break; 242296177Sjhibbits 243296177Sjhibbits case(e_FM_PCD_PLCR): 244296177Sjhibbits if((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && !(p_CcNextEngineParamsTmp[i].shadowAction & UPDATE_NIA_ENQ_WITHOUT_DMA)) 245296177Sjhibbits { 246296177Sjhibbits if(!p_CcNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.overrideParams) 247296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this intialization only overrideFqid can be intiizliaes")); 248296177Sjhibbits if(!p_CcNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.sharedProfile) 249296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this intialization only overrideFqid can be intiizliaes")); 250296177Sjhibbits err = FmPcdPlcrGetAbsoluteProfileId(h_FmPcd, e_FM_PCD_PLCR_SHARED, NULL, p_CcNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.newRelativeProfileId, &profileId); 251296177Sjhibbits if(err!= E_OK) 252296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 253296177Sjhibbits err = FmPcdPlcrCcGetSetParams(h_FmPcd, profileId, requiredAction); 254296177Sjhibbits if(err != E_OK) 255296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 256296177Sjhibbits p_CcNextEngineParamsTmp[i].shadowAction |= requiredAction; 257296177Sjhibbits } 258296177Sjhibbits break; 259296177Sjhibbits 260296177Sjhibbits case(e_FM_PCD_DONE): 261296177Sjhibbits if((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && !(p_CcNextEngineParamsTmp[i].shadowAction & UPDATE_NIA_ENQ_WITHOUT_DMA)) 262296177Sjhibbits { 263296177Sjhibbits tmpReg32 = GET_UINT32(p_AdTmp->nia); 264296177Sjhibbits if((tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)) != (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)) 265296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine was previosely assigned not as PCD_DONE")); 266296177Sjhibbits tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA; 267296177Sjhibbits WRITE_UINT32(p_AdTmp->nia, tmpReg32); 268296177Sjhibbits p_CcNextEngineParamsTmp[i].shadowAction |= requiredAction; 269296177Sjhibbits } 270296177Sjhibbits break; 271296177Sjhibbits 272296177Sjhibbits default: 273296177Sjhibbits break; 274296177Sjhibbits } 275296177Sjhibbits } 276296177Sjhibbits 277296177Sjhibbits return E_OK; 278296177Sjhibbits} 279296177Sjhibbits 280296177Sjhibbitsstatic t_Error CcUpdateParam(t_Handle h_FmPcd, 281296177Sjhibbits t_Handle h_FmPort, 282296177Sjhibbits t_FmPcdCcNextEngineAndRequiredActionParams *p_CcNextEngineParams, 283296177Sjhibbits uint16_t numOfEntries, 284296177Sjhibbits t_Handle h_Ad, 285296177Sjhibbits bool validate, 286296177Sjhibbits uint16_t level, 287296177Sjhibbits t_Handle h_FmTree, 288296177Sjhibbits bool modify) 289296177Sjhibbits{ 290296177Sjhibbits t_CcNodeInformation *p_CcNodeInfo; 291296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode; 292296177Sjhibbits t_Error err; 293296177Sjhibbits uint16_t tmp = 0; 294296177Sjhibbits int i = 0; 295296177Sjhibbits 296296177Sjhibbits level++; 297296177Sjhibbits 298296177Sjhibbits if(numOfEntries) 299296177Sjhibbits { 300296177Sjhibbits for(i = 0; i < numOfEntries; i++) 301296177Sjhibbits { 302296177Sjhibbits if(i == 0) 303296177Sjhibbits h_Ad = PTR_MOVE(h_Ad, i*FM_PCD_CC_AD_ENTRY_SIZE); 304296177Sjhibbits else 305296177Sjhibbits h_Ad = PTR_MOVE(h_Ad, FM_PCD_CC_AD_ENTRY_SIZE); 306296177Sjhibbits 307296177Sjhibbits if(p_CcNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_CC) 308296177Sjhibbits { 309296177Sjhibbits p_FmPcdCcNode = p_CcNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode; 310296177Sjhibbits ASSERT_COND(p_FmPcdCcNode); 311296177Sjhibbits p_CcNodeInfo = FindNodeInfoInReleventLst(&p_FmPcdCcNode->ccTreesLst,h_FmTree); 312296177Sjhibbits ASSERT_COND(p_CcNodeInfo); 313296177Sjhibbits p_CcNodeInfo->index = level; 314296177Sjhibbits#ifdef FM_PCD_CC_MANIP 315296177Sjhibbits if(p_CcNextEngineParams[i].nextEngineParams.h_Manip) 316296177Sjhibbits { 317296177Sjhibbits err = FmPcdManipUpdate(h_FmPcd, h_FmPort, p_CcNextEngineParams[i].nextEngineParams.h_Manip, h_Ad, validate, p_CcNodeInfo->index, h_FmTree, modify); 318296177Sjhibbits if(err) 319296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 320296177Sjhibbits } 321296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 322296177Sjhibbits 323296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[p_FmPcdCcNode->numOfKeys].nextEngineParams.nextEngine != e_FM_PCD_INVALID) 324296177Sjhibbits tmp = (uint8_t)(p_FmPcdCcNode->numOfKeys + 1); 325296177Sjhibbits else 326296177Sjhibbits tmp = p_FmPcdCcNode->numOfKeys; 327296177Sjhibbits 328296177Sjhibbits err = CcUpdateParam(h_FmPcd, h_FmPort, p_FmPcdCcNode->nextEngineAndRequiredAction, tmp, p_FmPcdCcNode->h_AdTable, validate,level, h_FmTree, modify); 329296177Sjhibbits if(err) 330296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 331296177Sjhibbits } 332296177Sjhibbits#ifdef FM_PCD_CC_MANIP 333296177Sjhibbits else 334296177Sjhibbits { 335296177Sjhibbits if(p_CcNextEngineParams[i].nextEngineParams.h_Manip) 336296177Sjhibbits { 337296177Sjhibbits err = FmPcdManipUpdate(h_FmPcd, h_FmPort, p_CcNextEngineParams[i].nextEngineParams.h_Manip, h_Ad, validate, level,h_FmTree, modify); 338296177Sjhibbits if(err) 339296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 340296177Sjhibbits } 341296177Sjhibbits } 342296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 343296177Sjhibbits } 344296177Sjhibbits } 345296177Sjhibbits 346296177Sjhibbits return E_OK; 347296177Sjhibbits} 348296177Sjhibbitsstatic bool IsNodeInModifiedState(t_Handle h_CcNode) 349296177Sjhibbits{ 350296177Sjhibbits t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode; 351296177Sjhibbits 352296177Sjhibbits ASSERT_COND(p_CcNode); 353296177Sjhibbits 354296177Sjhibbits return p_CcNode->modifiedState; 355296177Sjhibbits} 356296177Sjhibbits 357296177Sjhibbitsstatic void UpdateNodeWithModifiedState(t_Handle h_CcNode, bool modifiedState) 358296177Sjhibbits{ 359296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_CcNode; 360296177Sjhibbits 361296177Sjhibbits ASSERT_COND(p_FmPcdCcNode); 362296177Sjhibbits 363296177Sjhibbits p_FmPcdCcNode->modifiedState = modifiedState; 364296177Sjhibbits} 365296177Sjhibbits 366296177Sjhibbitsstatic ccPrivateInfo_t IcDefineCode(t_FmPcdCcNodeParams *p_CcNodeParam) 367296177Sjhibbits{ 368296177Sjhibbits switch (p_CcNodeParam->extractCcParams.extractNonHdr.action) 369296177Sjhibbits { 370296177Sjhibbits case(e_FM_PCD_ACTION_EXACT_MATCH): 371296177Sjhibbits switch(p_CcNodeParam->extractCcParams.extractNonHdr.src) 372296177Sjhibbits { 373296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_KEY): 374296177Sjhibbits return CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH; 375296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_HASH): 376296177Sjhibbits return CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH; 377296177Sjhibbits default: 378296177Sjhibbits return CC_PRIVATE_INFO_NONE; 379296177Sjhibbits } 380296177Sjhibbits case(e_FM_PCD_ACTION_INDEXED_LOOKUP): 381296177Sjhibbits switch(p_CcNodeParam->extractCcParams.extractNonHdr.src) 382296177Sjhibbits { 383296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_HASH): 384296177Sjhibbits return CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP; 385296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_FLOW_ID): 386296177Sjhibbits return CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP; 387296177Sjhibbits default: 388296177Sjhibbits return CC_PRIVATE_INFO_NONE; 389296177Sjhibbits } 390296177Sjhibbits default: 391296177Sjhibbits break; 392296177Sjhibbits } 393296177Sjhibbits return CC_PRIVATE_INFO_NONE; 394296177Sjhibbits} 395296177Sjhibbits 396296177Sjhibbitsstatic t_CcNodeInformation * DequeueAdditionalInfoFromRelevantLst(t_List *p_List) 397296177Sjhibbits{ 398296177Sjhibbits t_CcNodeInformation *p_CcNodeInfo = NULL; 399296177Sjhibbits uint32_t intFlags; 400296177Sjhibbits 401296177Sjhibbits intFlags = XX_DisableAllIntr(); 402296177Sjhibbits if (!LIST_IsEmpty(p_List)) 403296177Sjhibbits { 404296177Sjhibbits p_CcNodeInfo = CC_NODE_F_OBJECT(p_List->p_Next); 405296177Sjhibbits LIST_DelAndInit(&p_CcNodeInfo->node); 406296177Sjhibbits } 407296177Sjhibbits XX_RestoreAllIntr(intFlags); 408296177Sjhibbits return p_CcNodeInfo; 409296177Sjhibbits} 410296177Sjhibbits 411296177Sjhibbitsstatic void ReleaseLst(t_List *p_List) 412296177Sjhibbits{ 413296177Sjhibbits t_CcNodeInformation *p_CcNodeInfo = NULL; 414296177Sjhibbits 415296177Sjhibbits if(!LIST_IsEmpty(p_List)) 416296177Sjhibbits { 417296177Sjhibbits p_CcNodeInfo = DequeueAdditionalInfoFromRelevantLst(p_List); 418296177Sjhibbits while (p_CcNodeInfo) 419296177Sjhibbits { 420296177Sjhibbits XX_Free(p_CcNodeInfo); 421296177Sjhibbits p_CcNodeInfo = DequeueAdditionalInfoFromRelevantLst(p_List); 422296177Sjhibbits } 423296177Sjhibbits } 424296177Sjhibbits LIST_DelAndInit(p_List); 425296177Sjhibbits} 426296177Sjhibbits 427296177Sjhibbitsvoid FmPcdCcTreeReleaseLock(t_Handle h_FmPcdCcTree) 428296177Sjhibbits{ 429296177Sjhibbits RELEASE_LOCK(((t_FmPcdCcTree *)h_FmPcdCcTree)->lock); 430296177Sjhibbits} 431296177Sjhibbits 432296177Sjhibbitsvoid FmPcdCcNodeTreeReleaseLock(t_List *p_List) 433296177Sjhibbits{ 434296177Sjhibbits t_List *p_Pos; 435296177Sjhibbits t_CcNodeInformation *p_CcNodeInfo; 436296177Sjhibbits t_Handle h_FmPcdCcTree; 437296177Sjhibbits 438296177Sjhibbits LIST_FOR_EACH(p_Pos, p_List) 439296177Sjhibbits { 440296177Sjhibbits p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos); 441296177Sjhibbits h_FmPcdCcTree = p_CcNodeInfo->h_CcNode; 442296177Sjhibbits FmPcdCcTreeReleaseLock(h_FmPcdCcTree); 443296177Sjhibbits } 444296177Sjhibbits ReleaseLst(p_List); 445296177Sjhibbits} 446296177Sjhibbits 447296177Sjhibbitsstatic void DeleteNode(t_FmPcdCcNode *p_FmPcdCcNode) 448296177Sjhibbits{ 449296177Sjhibbits if(p_FmPcdCcNode) 450296177Sjhibbits { 451296177Sjhibbits if(p_FmPcdCcNode->p_GlblMask) 452296177Sjhibbits { 453296177Sjhibbits XX_Free(p_FmPcdCcNode->p_GlblMask); 454296177Sjhibbits p_FmPcdCcNode->p_GlblMask = NULL; 455296177Sjhibbits } 456296177Sjhibbits if(p_FmPcdCcNode->h_KeysMatchTable) 457296177Sjhibbits { 458296177Sjhibbits FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcdCcNode->h_FmPcd), p_FmPcdCcNode->h_KeysMatchTable); 459296177Sjhibbits p_FmPcdCcNode->h_KeysMatchTable = NULL; 460296177Sjhibbits } 461296177Sjhibbits if(p_FmPcdCcNode->h_AdTable) 462296177Sjhibbits { 463296177Sjhibbits FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcdCcNode->h_FmPcd), p_FmPcdCcNode->h_AdTable); 464296177Sjhibbits p_FmPcdCcNode->h_AdTable = NULL; 465296177Sjhibbits } 466296177Sjhibbits 467296177Sjhibbits ReleaseLst(&p_FmPcdCcNode->ccPrevNodesLst); 468296177Sjhibbits ReleaseLst(&p_FmPcdCcNode->ccTreeIdLst); 469296177Sjhibbits ReleaseLst(&p_FmPcdCcNode->ccTreesLst); 470296177Sjhibbits 471296177Sjhibbits XX_Free(p_FmPcdCcNode); 472296177Sjhibbits } 473296177Sjhibbits} 474296177Sjhibbits 475296177Sjhibbitsstatic void DeleteTree(t_FmPcdCcTree *p_FmPcdTree, t_FmPcd *p_FmPcd) 476296177Sjhibbits{ 477296177Sjhibbits if(p_FmPcdTree) 478296177Sjhibbits { 479296177Sjhibbits if(p_FmPcdTree->ccTreeBaseAddr) 480296177Sjhibbits { 481296177Sjhibbits FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcd), UINT_TO_PTR(p_FmPcdTree->ccTreeBaseAddr)); 482296177Sjhibbits p_FmPcdTree->ccTreeBaseAddr = 0; 483296177Sjhibbits } 484296177Sjhibbits 485296177Sjhibbits ReleaseLst(&p_FmPcdTree->fmPortsLst); 486296177Sjhibbits 487296177Sjhibbits XX_Free(p_FmPcdTree); 488296177Sjhibbits } 489296177Sjhibbits} 490296177Sjhibbits 491296177Sjhibbitsstatic void UpdateNodeOwner(t_FmPcdCcNode *p_FmPcdCcNode, bool add) 492296177Sjhibbits{ 493296177Sjhibbits ASSERT_COND(p_FmPcdCcNode); 494296177Sjhibbits 495296177Sjhibbits if(add) 496296177Sjhibbits p_FmPcdCcNode->owners++; 497296177Sjhibbits else 498296177Sjhibbits { 499296177Sjhibbits ASSERT_COND(p_FmPcdCcNode->owners); 500296177Sjhibbits p_FmPcdCcNode->owners--; 501296177Sjhibbits } 502296177Sjhibbits} 503296177Sjhibbits 504296177Sjhibbitsstatic void GetCcExtractKeySize(uint8_t parseCodeRealSize, uint8_t *parseCodeCcSize) 505296177Sjhibbits{ 506296177Sjhibbits if((parseCodeRealSize > 0) && (parseCodeRealSize < 2)) 507296177Sjhibbits *parseCodeCcSize = 1; 508296177Sjhibbits else if(parseCodeRealSize == 2) 509296177Sjhibbits *parseCodeCcSize = 2; 510296177Sjhibbits else if((parseCodeRealSize > 2) && (parseCodeRealSize <= 4)) 511296177Sjhibbits *parseCodeCcSize = 4; 512296177Sjhibbits else if((parseCodeRealSize > 4) && (parseCodeRealSize <= 8)) 513296177Sjhibbits *parseCodeCcSize = 8; 514296177Sjhibbits else if((parseCodeRealSize > 8) && (parseCodeRealSize <= 16)) 515296177Sjhibbits *parseCodeCcSize = 16; 516296177Sjhibbits else if((parseCodeRealSize > 16) && (parseCodeRealSize <= 24)) 517296177Sjhibbits *parseCodeCcSize = 24; 518296177Sjhibbits else if((parseCodeRealSize > 24) && (parseCodeRealSize <= 32)) 519296177Sjhibbits *parseCodeCcSize = 32; 520296177Sjhibbits else if((parseCodeRealSize > 32) && (parseCodeRealSize <= 40)) 521296177Sjhibbits *parseCodeCcSize = 40; 522296177Sjhibbits else if((parseCodeRealSize > 40) && (parseCodeRealSize <= 48)) 523296177Sjhibbits *parseCodeCcSize = 48; 524296177Sjhibbits else if((parseCodeRealSize > 48) && (parseCodeRealSize <= 56)) 525296177Sjhibbits *parseCodeCcSize = 56; 526296177Sjhibbits else 527296177Sjhibbits *parseCodeCcSize = 0; 528296177Sjhibbits} 529296177Sjhibbits 530296177Sjhibbitsstatic void GetSizeHeaderField(e_NetHeaderType hdr,t_FmPcdFields field,uint8_t *parseCodeRealSize) 531296177Sjhibbits{ 532296177Sjhibbits switch(hdr) 533296177Sjhibbits { 534296177Sjhibbits case (HEADER_TYPE_ETH): 535296177Sjhibbits switch(field.eth) 536296177Sjhibbits { 537296177Sjhibbits case(NET_HEADER_FIELD_ETH_DA): 538296177Sjhibbits *parseCodeRealSize = 6; 539296177Sjhibbits break; 540296177Sjhibbits case(NET_HEADER_FIELD_ETH_SA): 541296177Sjhibbits *parseCodeRealSize = 6; 542296177Sjhibbits break; 543296177Sjhibbits case(NET_HEADER_FIELD_ETH_TYPE): 544296177Sjhibbits *parseCodeRealSize = 2; 545296177Sjhibbits break; 546296177Sjhibbits default: 547296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported1")); 548296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 549296177Sjhibbits break; 550296177Sjhibbits } 551296177Sjhibbits break; 552296177Sjhibbits case(HEADER_TYPE_PPPoE): 553296177Sjhibbits switch(field.pppoe) 554296177Sjhibbits { 555296177Sjhibbits case(NET_HEADER_FIELD_PPPoE_PID): 556296177Sjhibbits *parseCodeRealSize = 2; 557296177Sjhibbits break; 558296177Sjhibbits default: 559296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported1")); 560296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 561296177Sjhibbits break; 562296177Sjhibbits } 563296177Sjhibbits break; 564296177Sjhibbits case (HEADER_TYPE_VLAN): 565296177Sjhibbits switch(field.vlan) 566296177Sjhibbits { 567296177Sjhibbits case(NET_HEADER_FIELD_VLAN_TCI): 568296177Sjhibbits *parseCodeRealSize = 2; 569296177Sjhibbits break; 570296177Sjhibbits default: 571296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported2")); 572296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 573296177Sjhibbits break; 574296177Sjhibbits } 575296177Sjhibbits break; 576296177Sjhibbits case (HEADER_TYPE_MPLS): 577296177Sjhibbits switch(field.mpls) 578296177Sjhibbits { 579296177Sjhibbits case(NET_HEADER_FIELD_MPLS_LABEL_STACK): 580296177Sjhibbits *parseCodeRealSize = 4; 581296177Sjhibbits break; 582296177Sjhibbits default: 583296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported3")); 584296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 585296177Sjhibbits break; 586296177Sjhibbits } 587296177Sjhibbits break; 588296177Sjhibbits case (HEADER_TYPE_IPv4): 589296177Sjhibbits switch(field.ipv4) 590296177Sjhibbits { 591296177Sjhibbits case(NET_HEADER_FIELD_IPv4_DST_IP): 592296177Sjhibbits case(NET_HEADER_FIELD_IPv4_SRC_IP): 593296177Sjhibbits *parseCodeRealSize = 4; 594296177Sjhibbits break; 595296177Sjhibbits case(NET_HEADER_FIELD_IPv4_TOS): 596296177Sjhibbits case(NET_HEADER_FIELD_IPv4_PROTO): 597296177Sjhibbits *parseCodeRealSize = 1; 598296177Sjhibbits break; 599296177Sjhibbits case(NET_HEADER_FIELD_IPv4_DST_IP | NET_HEADER_FIELD_IPv4_SRC_IP): 600296177Sjhibbits *parseCodeRealSize = 8; 601296177Sjhibbits break; 602296177Sjhibbits case(NET_HEADER_FIELD_IPv4_TTL): 603296177Sjhibbits *parseCodeRealSize = 1; 604296177Sjhibbits break; 605296177Sjhibbits default: 606296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported4")); 607296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 608296177Sjhibbits break; 609296177Sjhibbits } 610296177Sjhibbits break; 611296177Sjhibbits case (HEADER_TYPE_IPv6): 612296177Sjhibbits switch(field.ipv6) 613296177Sjhibbits { 614296177Sjhibbits case(NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL | NET_HEADER_FIELD_IPv6_TC): 615296177Sjhibbits *parseCodeRealSize = 4; 616296177Sjhibbits break; 617296177Sjhibbits case(NET_HEADER_FIELD_IPv6_NEXT_HDR): 618296177Sjhibbits case(NET_HEADER_FIELD_IPv6_HOP_LIMIT): 619296177Sjhibbits *parseCodeRealSize = 1; 620296177Sjhibbits break; 621296177Sjhibbits case(NET_HEADER_FIELD_IPv6_DST_IP): 622296177Sjhibbits case(NET_HEADER_FIELD_IPv6_SRC_IP): 623296177Sjhibbits *parseCodeRealSize = 16; 624296177Sjhibbits break; 625296177Sjhibbits default: 626296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported5")); 627296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 628296177Sjhibbits break; 629296177Sjhibbits } 630296177Sjhibbits break; 631296177Sjhibbits case (HEADER_TYPE_GRE): 632296177Sjhibbits switch(field.gre) 633296177Sjhibbits { 634296177Sjhibbits case(NET_HEADER_FIELD_GRE_TYPE): 635296177Sjhibbits *parseCodeRealSize = 2; 636296177Sjhibbits break; 637296177Sjhibbits default: 638296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported6")); 639296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 640296177Sjhibbits break; 641296177Sjhibbits } 642296177Sjhibbits break; 643296177Sjhibbits case (HEADER_TYPE_MINENCAP): 644296177Sjhibbits switch(field.minencap) 645296177Sjhibbits { 646296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_TYPE): 647296177Sjhibbits *parseCodeRealSize = 1; 648296177Sjhibbits break; 649296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_DST_IP): 650296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_SRC_IP): 651296177Sjhibbits *parseCodeRealSize = 4; 652296177Sjhibbits break; 653296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_SRC_IP | NET_HEADER_FIELD_MINENCAP_DST_IP): 654296177Sjhibbits *parseCodeRealSize = 8; 655296177Sjhibbits break; 656296177Sjhibbits default: 657296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported7")); 658296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 659296177Sjhibbits break; 660296177Sjhibbits } 661296177Sjhibbits break; 662296177Sjhibbits case (HEADER_TYPE_TCP): 663296177Sjhibbits switch(field.tcp) 664296177Sjhibbits { 665296177Sjhibbits case(NET_HEADER_FIELD_TCP_PORT_SRC): 666296177Sjhibbits case(NET_HEADER_FIELD_TCP_PORT_DST): 667296177Sjhibbits *parseCodeRealSize = 2; 668296177Sjhibbits break; 669296177Sjhibbits case(NET_HEADER_FIELD_TCP_PORT_SRC | NET_HEADER_FIELD_TCP_PORT_DST): 670296177Sjhibbits *parseCodeRealSize = 4; 671296177Sjhibbits break; 672296177Sjhibbits default: 673296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported8")); 674296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 675296177Sjhibbits break; 676296177Sjhibbits } 677296177Sjhibbits break; 678296177Sjhibbits case (HEADER_TYPE_UDP): 679296177Sjhibbits switch(field.udp) 680296177Sjhibbits { 681296177Sjhibbits case(NET_HEADER_FIELD_UDP_PORT_SRC): 682296177Sjhibbits case(NET_HEADER_FIELD_UDP_PORT_DST): 683296177Sjhibbits *parseCodeRealSize = 2; 684296177Sjhibbits break; 685296177Sjhibbits case(NET_HEADER_FIELD_UDP_PORT_SRC | NET_HEADER_FIELD_UDP_PORT_DST): 686296177Sjhibbits *parseCodeRealSize = 4; 687296177Sjhibbits break; 688296177Sjhibbits default: 689296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported9")); 690296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 691296177Sjhibbits break; 692296177Sjhibbits } 693296177Sjhibbits break; 694296177Sjhibbits default: 695296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported10")); 696296177Sjhibbits *parseCodeRealSize = CC_SIZE_ILLEGAL; 697296177Sjhibbits break; 698296177Sjhibbits } 699296177Sjhibbits} 700296177Sjhibbits 701296177Sjhibbitsstatic t_Error ValidateNextEngineParams(t_Handle h_FmPcd, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams) 702296177Sjhibbits{ 703296177Sjhibbits uint16_t absoluteProfileId; 704296177Sjhibbits t_Error err = E_OK; 705296177Sjhibbits uint8_t relativeSchemeId; 706296177Sjhibbits 707296177Sjhibbits switch(p_FmPcdCcNextEngineParams->nextEngine) 708296177Sjhibbits { 709296177Sjhibbits case(e_FM_PCD_INVALID): 710296177Sjhibbits err = E_NOT_SUPPORTED; 711296177Sjhibbits break; 712296177Sjhibbits case(e_FM_PCD_DONE): 713296177Sjhibbits if(p_FmPcdCcNextEngineParams->params.enqueueParams.action == e_FM_PCD_ENQ_FRAME) 714296177Sjhibbits { 715296177Sjhibbits if(p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid && 716296177Sjhibbits !p_FmPcdCcNextEngineParams->params.enqueueParams.newFqid) 717296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("not defined fqid for control flow for BMI next engine ")); 718296177Sjhibbits if(p_FmPcdCcNextEngineParams->params.enqueueParams.newFqid & ~0x00FFFFFF) 719296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidForCtrlFlow must be between 1 and 2^24-1")); 720296177Sjhibbits } 721296177Sjhibbits break; 722296177Sjhibbits case(e_FM_PCD_KG): 723296177Sjhibbits relativeSchemeId = FmPcdKgGetRelativeSchemeId(h_FmPcd, (uint8_t)(PTR_TO_UINT(p_FmPcdCcNextEngineParams->params.kgParams.h_DirectScheme)-1)); 724296177Sjhibbits if(relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES) 725296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG); 726296177Sjhibbits 727296177Sjhibbits if(!FmPcdKgIsSchemeValidSw(h_FmPcd, relativeSchemeId)) 728296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("not valid schemeIndex in KG next engine param")); 729296177Sjhibbits if(!KgIsSchemeAlwaysDirect(h_FmPcd, relativeSchemeId)) 730296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("CC Node may point only to a scheme that is always direct.")); 731296177Sjhibbits break; 732296177Sjhibbits case(e_FM_PCD_PLCR): 733296177Sjhibbits if(p_FmPcdCcNextEngineParams->params.plcrParams.overrideParams) 734296177Sjhibbits { 735296177Sjhibbits /* if private policer profile, it may be uninitialized yet, therefor no checks are done at this stage */ 736296177Sjhibbits if(p_FmPcdCcNextEngineParams->params.plcrParams.sharedProfile) 737296177Sjhibbits { 738296177Sjhibbits err = FmPcdPlcrGetAbsoluteProfileId(h_FmPcd,e_FM_PCD_PLCR_SHARED,NULL,p_FmPcdCcNextEngineParams->params.plcrParams.newRelativeProfileId, &absoluteProfileId); 739296177Sjhibbits if(err) 740296177Sjhibbits RETURN_ERROR(MAJOR, err, ("Shared profile offset is out of range")); 741296177Sjhibbits if(!FmPcdPlcrIsProfileValid(h_FmPcd, absoluteProfileId)) 742296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid profile")); 743296177Sjhibbits } 744296177Sjhibbits else 745296177Sjhibbits { 746296177Sjhibbits } 747296177Sjhibbits /* TODO - add check according to the revision of the chip. 748296177Sjhibbits if(!p_FmPcdCcNextEngineParams->params.plcrParams.newFqid || 749296177Sjhibbits (p_FmPcdCcNextEngineParams->params.plcrParams.newFqid & ~0x00FFFFFF)) 750296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("newFqid must be between 1 and 2^24-1")); 751296177Sjhibbits */ 752296177Sjhibbits } 753296177Sjhibbits break; 754296177Sjhibbits case(e_FM_PCD_CC): 755296177Sjhibbits if(!p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode) 756296177Sjhibbits RETURN_ERROR(MAJOR, E_NULL_POINTER, ("handler to next Node is NULL")); 757296177Sjhibbits break; 758296177Sjhibbits default: 759296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine is not correct")); 760296177Sjhibbits } 761296177Sjhibbits return err; 762296177Sjhibbits} 763296177Sjhibbits 764296177Sjhibbitsstatic uint8_t GetGenParseCode(e_FmPcdExtractFrom src, uint32_t offset, bool glblMask, uint8_t *parseArrayOffset, bool fromIc, ccPrivateInfo_t icCode) 765296177Sjhibbits{ 766296177Sjhibbits if(!fromIc) 767296177Sjhibbits { 768296177Sjhibbits switch(src) 769296177Sjhibbits { 770296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_FRAME_START): 771296177Sjhibbits if(glblMask) 772296177Sjhibbits return CC_PC_GENERIC_WITH_MASK ; 773296177Sjhibbits else 774296177Sjhibbits return CC_PC_GENERIC_WITHOUT_MASK; 775296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_CURR_END_OF_PARSE): 776296177Sjhibbits *parseArrayOffset = CC_PC_PR_NEXT_HEADER_OFFSET; 777296177Sjhibbits if(offset) 778296177Sjhibbits return CC_PR_OFFSET; 779296177Sjhibbits else 780296177Sjhibbits return CC_PR_WITHOUT_OFFSET; 781296177Sjhibbits default: 782296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal 'extract from' src")); 783296177Sjhibbits return CC_PC_ILLEGAL; 784296177Sjhibbits } 785296177Sjhibbits } 786296177Sjhibbits else 787296177Sjhibbits { 788296177Sjhibbits switch (icCode) 789296177Sjhibbits { 790296177Sjhibbits case(CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH): 791296177Sjhibbits *parseArrayOffset = 0x50; 792296177Sjhibbits return CC_PC_GENERIC_IC_GMASK; 793296177Sjhibbits case(CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH): 794296177Sjhibbits *parseArrayOffset = 0x48; 795296177Sjhibbits return CC_PC_GENERIC_IC_GMASK; 796296177Sjhibbits case(CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP): 797296177Sjhibbits *parseArrayOffset = 0x48; 798296177Sjhibbits return CC_PC_GENERIC_IC_HASH_INDEXED; 799296177Sjhibbits case(CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP): 800296177Sjhibbits *parseArrayOffset = 0x16; 801296177Sjhibbits return CC_PC_GENERIC_IC_HASH_INDEXED; 802296177Sjhibbits default: 803296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal 'extract from' src")); 804296177Sjhibbits break; 805296177Sjhibbits } 806296177Sjhibbits } 807296177Sjhibbits return CC_PC_ILLEGAL; 808296177Sjhibbits} 809296177Sjhibbits 810296177Sjhibbitsstatic uint8_t GetFullFieldParseCode(e_NetHeaderType hdr, e_FmPcdHdrIndex index, t_FmPcdFields field) 811296177Sjhibbits{ 812296177Sjhibbits 813296177Sjhibbits switch(hdr) 814296177Sjhibbits { 815296177Sjhibbits case(HEADER_TYPE_NONE): 816296177Sjhibbits ASSERT_COND(FALSE); 817296177Sjhibbits return CC_PC_ILLEGAL; 818296177Sjhibbits 819296177Sjhibbits case(HEADER_TYPE_ETH): 820296177Sjhibbits switch(field.eth) 821296177Sjhibbits { 822296177Sjhibbits case(NET_HEADER_FIELD_ETH_DA): 823296177Sjhibbits return CC_PC_FF_MACDST; 824296177Sjhibbits case(NET_HEADER_FIELD_ETH_SA): 825296177Sjhibbits return CC_PC_FF_MACSRC; 826296177Sjhibbits case(NET_HEADER_FIELD_ETH_TYPE): 827296177Sjhibbits return CC_PC_FF_ETYPE; 828296177Sjhibbits default: 829296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 830296177Sjhibbits return CC_PC_ILLEGAL; 831296177Sjhibbits } 832296177Sjhibbits 833296177Sjhibbits case(HEADER_TYPE_VLAN): 834296177Sjhibbits switch(field.vlan) 835296177Sjhibbits { 836296177Sjhibbits case(NET_HEADER_FIELD_VLAN_TCI): 837296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 838296177Sjhibbits return CC_PC_FF_TCI1; 839296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_LAST) 840296177Sjhibbits return CC_PC_FF_TCI2; 841296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 842296177Sjhibbits return CC_PC_ILLEGAL; 843296177Sjhibbits default: 844296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 845296177Sjhibbits return CC_PC_ILLEGAL; 846296177Sjhibbits } 847296177Sjhibbits 848296177Sjhibbits case(HEADER_TYPE_MPLS): 849296177Sjhibbits switch(field.mpls) 850296177Sjhibbits { 851296177Sjhibbits case(NET_HEADER_FIELD_MPLS_LABEL_STACK): 852296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 853296177Sjhibbits return CC_PC_FF_MPLS1; 854296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_LAST) 855296177Sjhibbits return CC_PC_FF_MPLS_LAST; 856296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS index")); 857296177Sjhibbits return CC_PC_ILLEGAL; 858296177Sjhibbits default: 859296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 860296177Sjhibbits return CC_PC_ILLEGAL; 861296177Sjhibbits } 862296177Sjhibbits 863296177Sjhibbits case(HEADER_TYPE_IPv4): 864296177Sjhibbits switch(field.ipv4) 865296177Sjhibbits { 866296177Sjhibbits case(NET_HEADER_FIELD_IPv4_DST_IP): 867296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 868296177Sjhibbits return CC_PC_FF_IPV4DST1; 869296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 870296177Sjhibbits return CC_PC_FF_IPV4DST2; 871296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index")); 872296177Sjhibbits return CC_PC_ILLEGAL; 873296177Sjhibbits case(NET_HEADER_FIELD_IPv4_TOS): 874296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 875296177Sjhibbits return CC_PC_FF_IPV4IPTOS_TC1; 876296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 877296177Sjhibbits return CC_PC_FF_IPV4IPTOS_TC2; 878296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index")); 879296177Sjhibbits return CC_PC_ILLEGAL; 880296177Sjhibbits case(NET_HEADER_FIELD_IPv4_PROTO): 881296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 882296177Sjhibbits return CC_PC_FF_IPV4PTYPE1; 883296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 884296177Sjhibbits return CC_PC_FF_IPV4PTYPE2; 885296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index")); 886296177Sjhibbits return CC_PC_ILLEGAL; 887296177Sjhibbits case(NET_HEADER_FIELD_IPv4_SRC_IP): 888296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 889296177Sjhibbits return CC_PC_FF_IPV4SRC1; 890296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 891296177Sjhibbits return CC_PC_FF_IPV4SRC2; 892296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index")); 893296177Sjhibbits return CC_PC_ILLEGAL; 894296177Sjhibbits case(NET_HEADER_FIELD_IPv4_SRC_IP | NET_HEADER_FIELD_IPv4_DST_IP): 895296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 896296177Sjhibbits return CC_PC_FF_IPV4SRC1_IPV4DST1; 897296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 898296177Sjhibbits return CC_PC_FF_IPV4SRC2_IPV4DST2; 899296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index")); 900296177Sjhibbits return CC_PC_ILLEGAL; 901296177Sjhibbits case(NET_HEADER_FIELD_IPv4_TTL): 902296177Sjhibbits return CC_PC_FF_IPV4TTL; 903296177Sjhibbits default: 904296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 905296177Sjhibbits return CC_PC_ILLEGAL; 906296177Sjhibbits } 907296177Sjhibbits 908296177Sjhibbits case(HEADER_TYPE_IPv6): 909296177Sjhibbits switch(field.ipv6) 910296177Sjhibbits { 911296177Sjhibbits case(NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL | NET_HEADER_FIELD_IPv6_TC): 912296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 913296177Sjhibbits return CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1; 914296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 915296177Sjhibbits return CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2; 916296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index")); 917296177Sjhibbits return CC_PC_ILLEGAL; 918296177Sjhibbits case(NET_HEADER_FIELD_IPv6_NEXT_HDR): 919296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 920296177Sjhibbits return CC_PC_FF_IPV6PTYPE1; 921296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 922296177Sjhibbits return CC_PC_FF_IPV6PTYPE2; 923296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index")); 924296177Sjhibbits return CC_PC_ILLEGAL; 925296177Sjhibbits case(NET_HEADER_FIELD_IPv6_DST_IP): 926296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 927296177Sjhibbits return CC_PC_FF_IPV6DST1; 928296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 929296177Sjhibbits return CC_PC_FF_IPV6DST2; 930296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index")); 931296177Sjhibbits return CC_PC_ILLEGAL; 932296177Sjhibbits case(NET_HEADER_FIELD_IPv6_SRC_IP): 933296177Sjhibbits if((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1)) 934296177Sjhibbits return CC_PC_FF_IPV6SRC1; 935296177Sjhibbits if(index == e_FM_PCD_HDR_INDEX_2) 936296177Sjhibbits return CC_PC_FF_IPV6SRC2; 937296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index")); 938296177Sjhibbits return CC_PC_ILLEGAL; 939296177Sjhibbits case(NET_HEADER_FIELD_IPv6_HOP_LIMIT): 940296177Sjhibbits return CC_PC_FF_IPV6HOP_LIMIT; 941296177Sjhibbits default: 942296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 943296177Sjhibbits return CC_PC_ILLEGAL; 944296177Sjhibbits } 945296177Sjhibbits 946296177Sjhibbits case(HEADER_TYPE_GRE): 947296177Sjhibbits switch(field.gre) 948296177Sjhibbits { 949296177Sjhibbits case(NET_HEADER_FIELD_GRE_TYPE): 950296177Sjhibbits return CC_PC_FF_GREPTYPE; 951296177Sjhibbits default: 952296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 953296177Sjhibbits return CC_PC_ILLEGAL; 954296177Sjhibbits } 955296177Sjhibbits case(HEADER_TYPE_MINENCAP): 956296177Sjhibbits switch(field.minencap) 957296177Sjhibbits { 958296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_TYPE): 959296177Sjhibbits return CC_PC_FF_MINENCAP_PTYPE; 960296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_DST_IP): 961296177Sjhibbits return CC_PC_FF_MINENCAP_IPDST; 962296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_SRC_IP): 963296177Sjhibbits return CC_PC_FF_MINENCAP_IPSRC; 964296177Sjhibbits case(NET_HEADER_FIELD_MINENCAP_SRC_IP | NET_HEADER_FIELD_MINENCAP_DST_IP): 965296177Sjhibbits return CC_PC_FF_MINENCAP_IPSRC_IPDST; 966296177Sjhibbits default: 967296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 968296177Sjhibbits return CC_PC_ILLEGAL; 969296177Sjhibbits } 970296177Sjhibbits 971296177Sjhibbits case(HEADER_TYPE_TCP): 972296177Sjhibbits switch(field.tcp) 973296177Sjhibbits { 974296177Sjhibbits case(NET_HEADER_FIELD_TCP_PORT_SRC): 975296177Sjhibbits return CC_PC_FF_L4PSRC; 976296177Sjhibbits case(NET_HEADER_FIELD_TCP_PORT_DST): 977296177Sjhibbits return CC_PC_FF_L4PDST; 978296177Sjhibbits case(NET_HEADER_FIELD_TCP_PORT_DST | NET_HEADER_FIELD_TCP_PORT_SRC): 979296177Sjhibbits return CC_PC_FF_L4PSRC_L4PDST; 980296177Sjhibbits default: 981296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 982296177Sjhibbits return CC_PC_ILLEGAL; 983296177Sjhibbits } 984296177Sjhibbits 985296177Sjhibbits case(HEADER_TYPE_PPPoE): 986296177Sjhibbits switch(field.pppoe) 987296177Sjhibbits { 988296177Sjhibbits case(NET_HEADER_FIELD_PPPoE_PID): 989296177Sjhibbits return CC_PC_FF_PPPPID; 990296177Sjhibbits default: 991296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 992296177Sjhibbits return CC_PC_ILLEGAL; 993296177Sjhibbits } 994296177Sjhibbits 995296177Sjhibbits case(HEADER_TYPE_UDP): 996296177Sjhibbits switch(field.udp) 997296177Sjhibbits { 998296177Sjhibbits case(NET_HEADER_FIELD_UDP_PORT_SRC): 999296177Sjhibbits return CC_PC_FF_L4PSRC; 1000296177Sjhibbits case(NET_HEADER_FIELD_UDP_PORT_DST): 1001296177Sjhibbits return CC_PC_FF_L4PDST; 1002296177Sjhibbits case(NET_HEADER_FIELD_UDP_PORT_DST | NET_HEADER_FIELD_UDP_PORT_SRC): 1003296177Sjhibbits return CC_PC_FF_L4PSRC_L4PDST; 1004296177Sjhibbits default: 1005296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 1006296177Sjhibbits return CC_PC_ILLEGAL; 1007296177Sjhibbits } 1008296177Sjhibbits 1009296177Sjhibbits default: 1010296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 1011296177Sjhibbits return CC_PC_ILLEGAL; 1012296177Sjhibbits } 1013296177Sjhibbits} 1014296177Sjhibbits 1015296177Sjhibbitsstatic uint8_t GetPrParseCode(e_NetHeaderType hdr, e_FmPcdHdrIndex hdrIndex, uint32_t offset, bool glblMask, uint8_t *parseArrayOffset) 1016296177Sjhibbits{ 1017296177Sjhibbits bool offsetRelevant = FALSE; 1018296177Sjhibbits 1019296177Sjhibbits if(offset) 1020296177Sjhibbits offsetRelevant = TRUE; 1021296177Sjhibbits 1022296177Sjhibbits switch(hdr){ 1023296177Sjhibbits case(HEADER_TYPE_NONE): 1024296177Sjhibbits ASSERT_COND(FALSE); 1025296177Sjhibbits return CC_PC_ILLEGAL; 1026296177Sjhibbits case(HEADER_TYPE_ETH): 1027296177Sjhibbits *parseArrayOffset = (uint8_t)CC_PC_PR_ETH_OFFSET; 1028296177Sjhibbits break; 1029296177Sjhibbits case(HEADER_TYPE_USER_DEFINED_SHIM1): 1030296177Sjhibbits if(offset || glblMask) 1031296177Sjhibbits *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM1_OFFSET; 1032296177Sjhibbits else 1033296177Sjhibbits return CC_PC_PR_SHIM1; 1034296177Sjhibbits break; 1035296177Sjhibbits case(HEADER_TYPE_USER_DEFINED_SHIM2): 1036296177Sjhibbits if(offset || glblMask) 1037296177Sjhibbits *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM2_OFFSET; 1038296177Sjhibbits else 1039296177Sjhibbits return CC_PC_PR_SHIM2; 1040296177Sjhibbits break; 1041296177Sjhibbits case(HEADER_TYPE_LLC_SNAP): 1042296177Sjhibbits *parseArrayOffset = CC_PC_PR_USER_LLC_SNAP_OFFSET; 1043296177Sjhibbits break; 1044296177Sjhibbits case(HEADER_TYPE_PPPoE): 1045296177Sjhibbits *parseArrayOffset = CC_PC_PR_PPPOE_OFFSET; 1046296177Sjhibbits break; 1047296177Sjhibbits case(HEADER_TYPE_MPLS): 1048296177Sjhibbits if((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1)) 1049296177Sjhibbits *parseArrayOffset = CC_PC_PR_MPLS1_OFFSET; 1050296177Sjhibbits else if(hdrIndex == e_FM_PCD_HDR_INDEX_LAST) 1051296177Sjhibbits *parseArrayOffset = CC_PC_PR_MPLS_LAST_OFFSET; 1052296177Sjhibbits else 1053296177Sjhibbits { 1054296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS header index")); 1055296177Sjhibbits return CC_PC_ILLEGAL; 1056296177Sjhibbits } 1057296177Sjhibbits break; 1058296177Sjhibbits case(HEADER_TYPE_IPv4): 1059296177Sjhibbits case(HEADER_TYPE_IPv6): 1060296177Sjhibbits if((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1)) 1061296177Sjhibbits *parseArrayOffset = CC_PC_PR_IP1_OFFSET; 1062296177Sjhibbits else if(hdrIndex == e_FM_PCD_HDR_INDEX_2) 1063296177Sjhibbits *parseArrayOffset = CC_PC_PR_IP_LAST_OFFSET; 1064296177Sjhibbits else 1065296177Sjhibbits { 1066296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP header index")); 1067296177Sjhibbits return CC_PC_ILLEGAL; 1068296177Sjhibbits 1069296177Sjhibbits } 1070296177Sjhibbits break; 1071296177Sjhibbits case(HEADER_TYPE_MINENCAP): 1072296177Sjhibbits *parseArrayOffset = CC_PC_PR_MINENC_OFFSET; 1073296177Sjhibbits break; 1074296177Sjhibbits case(HEADER_TYPE_GRE): 1075296177Sjhibbits *parseArrayOffset = CC_PC_PR_GRE_OFFSET; 1076296177Sjhibbits break; 1077296177Sjhibbits case(HEADER_TYPE_TCP): 1078296177Sjhibbits case(HEADER_TYPE_UDP): 1079296177Sjhibbits case(HEADER_TYPE_IPSEC_AH): 1080296177Sjhibbits case(HEADER_TYPE_IPSEC_ESP): 1081296177Sjhibbits case(HEADER_TYPE_DCCP): 1082296177Sjhibbits case(HEADER_TYPE_SCTP): 1083296177Sjhibbits *parseArrayOffset = CC_PC_PR_L4_OFFSET; 1084296177Sjhibbits break; 1085296177Sjhibbits 1086296177Sjhibbits default: 1087296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP header for this type of operation")); 1088296177Sjhibbits return CC_PC_ILLEGAL; 1089296177Sjhibbits } 1090296177Sjhibbits 1091296177Sjhibbits if(offsetRelevant) 1092296177Sjhibbits return CC_PR_OFFSET; 1093296177Sjhibbits else 1094296177Sjhibbits return CC_PR_WITHOUT_OFFSET; 1095296177Sjhibbits} 1096296177Sjhibbits 1097296177Sjhibbitsstatic uint8_t GetFieldParseCode(e_NetHeaderType hdr, t_FmPcdFields field, uint32_t offset, uint8_t *parseArrayOffset, e_FmPcdHdrIndex hdrIndex) 1098296177Sjhibbits{ 1099296177Sjhibbits bool offsetRelevant = FALSE; 1100296177Sjhibbits 1101296177Sjhibbits if(offset) 1102296177Sjhibbits offsetRelevant = TRUE; 1103296177Sjhibbits 1104296177Sjhibbits switch(hdr) 1105296177Sjhibbits { 1106296177Sjhibbits case(HEADER_TYPE_NONE): 1107296177Sjhibbits ASSERT_COND(FALSE); 1108296177Sjhibbits case(HEADER_TYPE_ETH): 1109296177Sjhibbits switch(field.eth) 1110296177Sjhibbits { 1111296177Sjhibbits case(NET_HEADER_FIELD_ETH_TYPE): 1112296177Sjhibbits *parseArrayOffset = CC_PC_PR_ETYPE_LAST_OFFSET; 1113296177Sjhibbits break; 1114296177Sjhibbits default: 1115296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 1116296177Sjhibbits return CC_PC_ILLEGAL; 1117296177Sjhibbits } 1118296177Sjhibbits break; 1119296177Sjhibbits case(HEADER_TYPE_VLAN): 1120296177Sjhibbits switch(field.vlan) 1121296177Sjhibbits { 1122296177Sjhibbits case(NET_HEADER_FIELD_VLAN_TCI): 1123296177Sjhibbits if((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1)) 1124296177Sjhibbits *parseArrayOffset = CC_PC_PR_VLAN1_OFFSET; 1125296177Sjhibbits else if(hdrIndex == e_FM_PCD_HDR_INDEX_LAST) 1126296177Sjhibbits *parseArrayOffset = CC_PC_PR_VLAN2_OFFSET; 1127296177Sjhibbits break; 1128296177Sjhibbits default: 1129296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported")); 1130296177Sjhibbits return CC_PC_ILLEGAL; 1131296177Sjhibbits } 1132296177Sjhibbits break; 1133296177Sjhibbits default: 1134296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal header ")); 1135296177Sjhibbits return CC_PC_ILLEGAL; 1136296177Sjhibbits } 1137296177Sjhibbits if(offsetRelevant) 1138296177Sjhibbits return CC_PR_OFFSET; 1139296177Sjhibbits else 1140296177Sjhibbits return CC_PR_WITHOUT_OFFSET; 1141296177Sjhibbits} 1142296177Sjhibbits 1143296177Sjhibbitsstatic void FillAdOfTypeResult(t_Handle p_Ad, t_FmPcd *p_FmPcd, t_FmPcdCcNextEngineParams *p_CcNextEngineParams) 1144296177Sjhibbits{ 1145296177Sjhibbits t_AdOfTypeResult *p_AdResult = (t_AdOfTypeResult*)p_Ad; 1146296177Sjhibbits uint32_t tmp = 0, tmpNia = 0; 1147296177Sjhibbits uint16_t profileId; 1148296177Sjhibbits t_Handle p_AdNewPtr = NULL; 1149296177Sjhibbits 1150296177Sjhibbits p_AdNewPtr = p_AdResult; 1151296177Sjhibbits 1152296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1153296177Sjhibbits if (p_CcNextEngineParams->h_Manip) 1154296177Sjhibbits FmPcdManipUpdateAdResultForCc(p_CcNextEngineParams->h_Manip, p_Ad, &p_AdNewPtr); 1155296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1156296177Sjhibbits 1157296177Sjhibbits if(p_AdNewPtr) 1158296177Sjhibbits { 1159296177Sjhibbits switch(p_CcNextEngineParams->nextEngine) 1160296177Sjhibbits { 1161296177Sjhibbits case(e_FM_PCD_DONE): 1162296177Sjhibbits if(p_CcNextEngineParams->params.enqueueParams.action == e_FM_PCD_ENQ_FRAME) 1163296177Sjhibbits { 1164296177Sjhibbits if(p_CcNextEngineParams->params.enqueueParams.overrideFqid) 1165296177Sjhibbits { 1166296177Sjhibbits tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE; 1167296177Sjhibbits tmp |= p_CcNextEngineParams->params.enqueueParams.newFqid; 1168296177Sjhibbits } 1169296177Sjhibbits else 1170296177Sjhibbits { 1171296177Sjhibbits tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE; 1172296177Sjhibbits tmp |= FM_PCD_AD_RESULT_PLCR_DIS; 1173296177Sjhibbits } 1174296177Sjhibbits } 1175296177Sjhibbits if(p_CcNextEngineParams->params.enqueueParams.action == e_FM_PCD_DROP_FRAME) 1176296177Sjhibbits tmpNia |= (NIA_ENG_BMI |NIA_BMI_AC_DISCARD); 1177296177Sjhibbits else 1178296177Sjhibbits tmpNia |= (NIA_ENG_BMI |NIA_BMI_AC_ENQ_FRAME); 1179296177Sjhibbits if(p_CcNextEngineParams->params.enqueueParams.statisticsEn) 1180296177Sjhibbits tmpNia |= FM_PCD_AD_RESULT_EXTENDED_MODE | FM_PCD_AD_RESULT_STATISTICS_EN; 1181296177Sjhibbits break; 1182296177Sjhibbits case(e_FM_PCD_KG): 1183296177Sjhibbits if(p_CcNextEngineParams->params.kgParams.overrideFqid) 1184296177Sjhibbits { 1185296177Sjhibbits tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE; 1186296177Sjhibbits tmp |= p_CcNextEngineParams->params.kgParams.newFqid; 1187296177Sjhibbits } 1188296177Sjhibbits else 1189296177Sjhibbits { 1190296177Sjhibbits tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE; 1191296177Sjhibbits tmp |= FM_PCD_AD_RESULT_PLCR_DIS; 1192296177Sjhibbits } 1193296177Sjhibbits tmpNia = NIA_KG_DIRECT; 1194296177Sjhibbits tmpNia |= NIA_ENG_KG; 1195296177Sjhibbits tmpNia |= (uint8_t)(PTR_TO_UINT(p_CcNextEngineParams->params.kgParams.h_DirectScheme)-1); 1196296177Sjhibbits if(p_CcNextEngineParams->params.kgParams.statisticsEn) 1197296177Sjhibbits tmpNia |= FM_PCD_AD_RESULT_EXTENDED_MODE | FM_PCD_AD_RESULT_STATISTICS_EN; 1198296177Sjhibbits break; 1199296177Sjhibbits case(e_FM_PCD_PLCR): 1200296177Sjhibbits tmp = 0; 1201296177Sjhibbits if(p_CcNextEngineParams->params.plcrParams.overrideParams) 1202296177Sjhibbits { 1203296177Sjhibbits tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE; 1204296177Sjhibbits 1205296177Sjhibbits /* if private policer profile, it may be uninitialized yet, therefor no checks are done at this stage */ 1206296177Sjhibbits if(p_CcNextEngineParams->params.plcrParams.sharedProfile) 1207296177Sjhibbits { 1208296177Sjhibbits tmpNia |= NIA_PLCR_ABSOLUTE; 1209296177Sjhibbits FmPcdPlcrGetAbsoluteProfileId((t_Handle)p_FmPcd,e_FM_PCD_PLCR_SHARED,NULL,p_CcNextEngineParams->params.plcrParams.newRelativeProfileId, &profileId); 1210296177Sjhibbits } 1211296177Sjhibbits else 1212296177Sjhibbits profileId = p_CcNextEngineParams->params.plcrParams.newRelativeProfileId; 1213296177Sjhibbits 1214296177Sjhibbits tmp |= p_CcNextEngineParams->params.plcrParams.newFqid; 1215296177Sjhibbits WRITE_UINT32(p_AdResult->plcrProfile,(uint32_t)((uint32_t)profileId << FM_PCD_AD_PROFILEID_FOR_CNTRL_SHIFT)); 1216296177Sjhibbits } 1217296177Sjhibbits else 1218296177Sjhibbits tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE; 1219296177Sjhibbits tmpNia |= NIA_ENG_PLCR | p_CcNextEngineParams->params.plcrParams.newRelativeProfileId; 1220296177Sjhibbits if(p_CcNextEngineParams->params.kgParams.statisticsEn) 1221296177Sjhibbits tmpNia |= FM_PCD_AD_RESULT_EXTENDED_MODE | FM_PCD_AD_RESULT_STATISTICS_EN; 1222296177Sjhibbits break; 1223296177Sjhibbits default: 1224296177Sjhibbits return; 1225296177Sjhibbits } 1226296177Sjhibbits WRITE_UINT32(p_AdResult->fqid, tmp); 1227296177Sjhibbits 1228296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1229296177Sjhibbits if(p_CcNextEngineParams->h_Manip) 1230296177Sjhibbits { 1231296177Sjhibbits tmp = GET_UINT32(p_AdResult->plcrProfile); 1232296177Sjhibbits tmp |= (uint32_t)(XX_VirtToPhys(p_AdNewPtr) - (p_FmPcd->physicalMuramBase)) >> 4; 1233296177Sjhibbits WRITE_UINT32(p_AdResult->plcrProfile, tmp); 1234296177Sjhibbits 1235296177Sjhibbits tmpNia |= FM_PCD_AD_RESULT_EXTENDED_MODE; 1236296177Sjhibbits tmpNia |= FM_PCD_AD_RESULT_NADEN; 1237296177Sjhibbits } 1238296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1239296177Sjhibbits 1240296177Sjhibbits WRITE_UINT32(p_AdResult->nia, tmpNia); 1241296177Sjhibbits } 1242296177Sjhibbits} 1243296177Sjhibbits 1244296177Sjhibbitsstatic void FillAdOfTypeContLookup(t_Handle p_Ad, t_Handle h_FmPcd, t_Handle p_FmPcdCcNode, t_Handle h_Manip) 1245296177Sjhibbits{ 1246296177Sjhibbits t_FmPcdCcNode *p_Node = (t_FmPcdCcNode *)p_FmPcdCcNode; 1247296177Sjhibbits t_AdOfTypeContLookup *p_AdContLookup = (t_AdOfTypeContLookup *)p_Ad; 1248296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1249296177Sjhibbits uint32_t tmpReg32; 1250296177Sjhibbits t_Handle p_AdNewPtr = NULL; 1251296177Sjhibbits 1252296177Sjhibbits p_AdNewPtr = p_AdContLookup; 1253296177Sjhibbits 1254296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1255296177Sjhibbits if (h_Manip) 1256296177Sjhibbits FmPcdManipUpdateAdContLookupForCc(h_Manip, p_Ad, &p_AdNewPtr, (uint32_t)((XX_VirtToPhys(p_Node->h_AdTable) - p_FmPcd->physicalMuramBase))); 1257296177Sjhibbits#else 1258296177Sjhibbits UNUSED(h_Manip); 1259296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1260296177Sjhibbits 1261296177Sjhibbits if(p_AdNewPtr) 1262296177Sjhibbits { 1263296177Sjhibbits tmpReg32 = 0; 1264296177Sjhibbits tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE; 1265296177Sjhibbits tmpReg32 |= p_Node->sizeOfExtraction ? ((p_Node->sizeOfExtraction - 1) << 24) : 0; 1266296177Sjhibbits tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Node->h_AdTable) - p_FmPcd->physicalMuramBase); 1267296177Sjhibbits WRITE_UINT32(p_AdContLookup->ccAdBase, tmpReg32); 1268296177Sjhibbits 1269296177Sjhibbits tmpReg32 = 0; 1270296177Sjhibbits tmpReg32 |= p_Node->numOfKeys << 24; 1271296177Sjhibbits tmpReg32 |= (p_Node->lclMask ? FM_PCD_AD_CONT_LOOKUP_LCL_MASK : 0); 1272296177Sjhibbits tmpReg32 |= p_Node->h_KeysMatchTable ? 1273296177Sjhibbits (uint32_t)(XX_VirtToPhys(p_Node->h_KeysMatchTable) - p_FmPcd->physicalMuramBase) : 0; 1274296177Sjhibbits WRITE_UINT32(p_AdContLookup->matchTblPtr, tmpReg32); 1275296177Sjhibbits 1276296177Sjhibbits tmpReg32 = 0; 1277296177Sjhibbits tmpReg32 |= p_Node->prsArrayOffset << 24; 1278296177Sjhibbits tmpReg32 |= p_Node->offset << 16; 1279296177Sjhibbits tmpReg32 |= p_Node->parseCode; 1280296177Sjhibbits WRITE_UINT32(p_AdContLookup->pcAndOffsets, tmpReg32); 1281296177Sjhibbits 1282296177Sjhibbits Mem2IOCpy32((void*)&p_AdContLookup->gmask, p_Node->p_GlblMask, CC_GLBL_MASK_SIZE); 1283296177Sjhibbits } 1284296177Sjhibbits} 1285296177Sjhibbits 1286296177Sjhibbitsstatic void NextStepAd(t_Handle p_Ad, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams, t_FmPcd *p_FmPcd) 1287296177Sjhibbits{ 1288296177Sjhibbits switch(p_FmPcdCcNextEngineParams->nextEngine) 1289296177Sjhibbits { 1290296177Sjhibbits case(e_FM_PCD_KG): 1291296177Sjhibbits case(e_FM_PCD_PLCR): 1292296177Sjhibbits case(e_FM_PCD_DONE): 1293296177Sjhibbits FillAdOfTypeResult(p_Ad, p_FmPcd, p_FmPcdCcNextEngineParams); 1294296177Sjhibbits break; 1295296177Sjhibbits case(e_FM_PCD_CC): 1296296177Sjhibbits FillAdOfTypeContLookup(p_Ad, 1297296177Sjhibbits p_FmPcd, 1298296177Sjhibbits p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode, 1299296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1300296177Sjhibbits p_FmPcdCcNextEngineParams->h_Manip 1301296177Sjhibbits#else 1302296177Sjhibbits NULL 1303296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1304296177Sjhibbits ); 1305296177Sjhibbits UpdateNodeOwner (p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode, 1306296177Sjhibbits TRUE); 1307296177Sjhibbits break; 1308296177Sjhibbits default: 1309296177Sjhibbits return; 1310296177Sjhibbits } 1311296177Sjhibbits} 1312296177Sjhibbits 1313296177Sjhibbits 1314296177Sjhibbitsstatic void ReleaseNewNodeCommonPart(t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo) 1315296177Sjhibbits{ 1316296177Sjhibbits if(p_AdditionalInfo->p_AdTableNew) 1317296177Sjhibbits FM_MURAM_FreeMem(FmPcdGetMuramHandle(((t_FmPcdCcNode *)(p_AdditionalInfo->h_CurrentNode))->h_FmPcd), p_AdditionalInfo->p_AdTableNew); 1318296177Sjhibbits if(p_AdditionalInfo->p_KeysMatchTableNew) 1319296177Sjhibbits FM_MURAM_FreeMem(FmPcdGetMuramHandle(((t_FmPcdCcNode *)(p_AdditionalInfo->h_CurrentNode))->h_FmPcd), p_AdditionalInfo->p_KeysMatchTableNew); 1320296177Sjhibbits} 1321296177Sjhibbits 1322296177Sjhibbitsstatic t_Error UpdateGblMask(t_FmPcdCcNode *p_FmPcdCcNode, uint8_t keySize, uint8_t *p_Mask) 1323296177Sjhibbits{ 1324296177Sjhibbits if (p_Mask && 1325296177Sjhibbits !p_FmPcdCcNode->glblMaskUpdated && 1326296177Sjhibbits (keySize <= 4) && 1327296177Sjhibbits !p_FmPcdCcNode->lclMask ) 1328296177Sjhibbits { 1329296177Sjhibbits memcpy(p_FmPcdCcNode->p_GlblMask, p_Mask, (sizeof(uint8_t))*keySize); 1330296177Sjhibbits p_FmPcdCcNode->glblMaskUpdated = TRUE; 1331296177Sjhibbits p_FmPcdCcNode->glblMaskSize = 4; 1332296177Sjhibbits } 1333296177Sjhibbits else if (p_Mask && 1334296177Sjhibbits (keySize <= 4) && 1335296177Sjhibbits !p_FmPcdCcNode->lclMask) 1336296177Sjhibbits { 1337296177Sjhibbits if (memcmp(p_FmPcdCcNode->p_GlblMask, p_Mask, keySize) != 0) 1338296177Sjhibbits { 1339296177Sjhibbits p_FmPcdCcNode->lclMask = TRUE; 1340296177Sjhibbits p_FmPcdCcNode->glblMaskSize = 0; 1341296177Sjhibbits } 1342296177Sjhibbits } 1343296177Sjhibbits else if (!p_Mask && (p_FmPcdCcNode->glblMaskUpdated) && (keySize <= 4)) 1344296177Sjhibbits { 1345296177Sjhibbits uint32_t tmpMask = 0xffffffff; 1346296177Sjhibbits if (memcmp(p_FmPcdCcNode->p_GlblMask, &tmpMask, 4) != 0) 1347296177Sjhibbits { 1348296177Sjhibbits p_FmPcdCcNode->lclMask = TRUE; 1349296177Sjhibbits p_FmPcdCcNode->glblMaskSize = 0; 1350296177Sjhibbits } 1351296177Sjhibbits } 1352296177Sjhibbits else if (p_Mask) 1353296177Sjhibbits { 1354296177Sjhibbits p_FmPcdCcNode->lclMask = TRUE; 1355296177Sjhibbits p_FmPcdCcNode->glblMaskSize = 0; 1356296177Sjhibbits } 1357296177Sjhibbits 1358296177Sjhibbits return E_OK; 1359296177Sjhibbits} 1360296177Sjhibbits 1361296177Sjhibbitsstatic t_Error BuildNewNodeCommonPart(t_FmPcdCcNode *p_FmPcdCcNode, 1362296177Sjhibbits int *size, 1363296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo) 1364296177Sjhibbits{ 1365296177Sjhibbits 1366296177Sjhibbits p_AdditionalInfo->p_AdTableNew = (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcdCcNode->h_FmPcd), 1367296177Sjhibbits (uint32_t)( (p_AdditionalInfo->numOfKeys+1) * FM_PCD_CC_AD_ENTRY_SIZE), 1368296177Sjhibbits FM_PCD_CC_AD_TABLE_ALIGN); 1369296177Sjhibbits if(!p_AdditionalInfo->p_AdTableNew) 1370296177Sjhibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("No memory in MURAM for AD table ")); 1371296177Sjhibbits 1372296177Sjhibbits IOMemSet32((uint8_t*)p_AdditionalInfo->p_AdTableNew, 0, (uint32_t)((p_AdditionalInfo->numOfKeys+1) * FM_PCD_CC_AD_ENTRY_SIZE)); 1373296177Sjhibbits 1374296177Sjhibbits if(p_FmPcdCcNode->lclMask) 1375296177Sjhibbits *size = 2 * p_FmPcdCcNode->ccKeySizeAccExtraction; 1376296177Sjhibbits else 1377296177Sjhibbits *size = p_FmPcdCcNode->ccKeySizeAccExtraction; 1378296177Sjhibbits 1379296177Sjhibbits p_AdditionalInfo->p_KeysMatchTableNew = 1380296177Sjhibbits (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcdCcNode->h_FmPcd), 1381296177Sjhibbits (uint32_t)(*size * sizeof(uint8_t) * (p_AdditionalInfo->numOfKeys + 1)), 1382296177Sjhibbits FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN); 1383296177Sjhibbits if(!p_AdditionalInfo->p_KeysMatchTableNew) 1384296177Sjhibbits { 1385296177Sjhibbits FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcdCcNode->h_FmPcd), p_AdditionalInfo->p_AdTableNew); 1386296177Sjhibbits p_AdditionalInfo->p_AdTableNew = NULL; 1387296177Sjhibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("No memory in MURAM for KEY MATCH table")); 1388296177Sjhibbits } 1389296177Sjhibbits IOMemSet32((uint8_t*)p_AdditionalInfo->p_KeysMatchTableNew, 0, *size * sizeof(uint8_t) * (p_AdditionalInfo->numOfKeys + 1)); 1390296177Sjhibbits 1391296177Sjhibbits p_AdditionalInfo->p_AdTableOld = p_FmPcdCcNode->h_AdTable; 1392296177Sjhibbits p_AdditionalInfo->p_KeysMatchTableOld = p_FmPcdCcNode->h_KeysMatchTable; 1393296177Sjhibbits 1394296177Sjhibbits return E_OK; 1395296177Sjhibbits} 1396296177Sjhibbits 1397296177Sjhibbitsstatic t_Error BuildNewNodeAddOrMdfyKeyAndNextEngine(t_Handle h_FmPcd ,t_FmPcdCcNode *p_FmPcdCcNode, uint8_t keyIndex, t_FmPcdCcKeyParams *p_KeyParams,t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo, bool add) 1398296177Sjhibbits{ 1399296177Sjhibbits t_Error err = E_OK; 1400296177Sjhibbits t_Handle p_AdTableNewTmp, p_KeysMatchTableNewTmp; 1401296177Sjhibbits t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp; 1402296177Sjhibbits int size; 1403296177Sjhibbits int i = 0, j = 0; 1404296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1405296177Sjhibbits uint32_t requiredAction = 0; 1406296177Sjhibbits bool prvLclMask; 1407296177Sjhibbits t_CcNodeInformation *p_CcNodeInformation; 1408296177Sjhibbits t_List *p_Pos; 1409296177Sjhibbits 1410296177Sjhibbits /*check that new NIA is legal*/ 1411296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_KeyParams->ccNextEngineParams); 1412296177Sjhibbits if(err) 1413296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1414296177Sjhibbits 1415296177Sjhibbits prvLclMask = p_FmPcdCcNode->lclMask; 1416296177Sjhibbits 1417296177Sjhibbits /*check that new key is not require update of localMask*/ 1418296177Sjhibbits err = UpdateGblMask(p_FmPcdCcNode, 1419296177Sjhibbits p_FmPcdCcNode->ccKeySizeAccExtraction, 1420296177Sjhibbits p_KeyParams->p_Mask); 1421296177Sjhibbits if (err != E_OK) 1422296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1423296177Sjhibbits 1424296177Sjhibbits /*update internal data structure for next engine per index (index - key)*/ 1425296177Sjhibbits memcpy(&p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].nextEngineParams,&p_KeyParams->ccNextEngineParams, sizeof(t_FmPcdCcNextEngineParams)); 1426296177Sjhibbits 1427296177Sjhibbits /*update numOfKeys*/ 1428296177Sjhibbits if(add) 1429296177Sjhibbits p_AdditionalInfo->numOfKeys = (uint8_t)(p_FmPcdCcNode->numOfKeys + 1); 1430296177Sjhibbits else 1431296177Sjhibbits p_AdditionalInfo->numOfKeys = (uint8_t)p_FmPcdCcNode->numOfKeys; 1432296177Sjhibbits /*function which build in the memory new KeyTbl, AdTbl*/ 1433296177Sjhibbits err = BuildNewNodeCommonPart(p_FmPcdCcNode, &size, p_AdditionalInfo); 1434296177Sjhibbits if(err) 1435296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1436296177Sjhibbits 1437296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1438296177Sjhibbits /*check that manip is legal and what requiredAction is necessary for this manip*/ 1439296177Sjhibbits if(p_KeyParams->ccNextEngineParams.h_Manip) 1440296177Sjhibbits { 1441296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(&p_KeyParams->ccNextEngineParams,&requiredAction); 1442296177Sjhibbits if(err) 1443296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1444296177Sjhibbits 1445296177Sjhibbits } 1446296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1447296177Sjhibbits 1448296177Sjhibbits p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].requiredAction = requiredAction; 1449296177Sjhibbits 1450296177Sjhibbits p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].requiredAction |= UPDATE_CC_WITH_TREE; 1451296177Sjhibbits 1452296177Sjhibbits 1453296177Sjhibbits /*update new Ad and new Key Table according to new requirement*/ 1454296177Sjhibbits i = 0; 1455296177Sjhibbits for(j = 0; j < p_AdditionalInfo->numOfKeys; j++) 1456296177Sjhibbits { 1457296177Sjhibbits p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE); 1458296177Sjhibbits if(j == keyIndex) 1459296177Sjhibbits { 1460296177Sjhibbits NextStepAd(p_AdTableNewTmp,&p_KeyParams->ccNextEngineParams, p_FmPcd); 1461296177Sjhibbits p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j*size * sizeof(uint8_t)); 1462296177Sjhibbits Mem2IOCpy32((void*)p_KeysMatchTableNewTmp, p_KeyParams->p_Key, p_FmPcdCcNode->userSizeOfExtraction); 1463296177Sjhibbits if(p_FmPcdCcNode->lclMask) 1464296177Sjhibbits { 1465296177Sjhibbits if(p_KeyParams->p_Mask) 1466296177Sjhibbits Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), p_KeyParams->p_Mask, p_FmPcdCcNode->userSizeOfExtraction); 1467296177Sjhibbits else if (p_FmPcdCcNode->ccKeySizeAccExtraction > 4) 1468296177Sjhibbits IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 0xff, p_FmPcdCcNode->userSizeOfExtraction); 1469296177Sjhibbits else 1470296177Sjhibbits Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction),p_FmPcdCcNode->p_GlblMask, p_FmPcdCcNode->userSizeOfExtraction); 1471296177Sjhibbits } 1472296177Sjhibbits if(!add) 1473296177Sjhibbits i++; 1474296177Sjhibbits } 1475296177Sjhibbits else 1476296177Sjhibbits { 1477296177Sjhibbits p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i*FM_PCD_CC_AD_ENTRY_SIZE); 1478296177Sjhibbits IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE); 1479296177Sjhibbits p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j*size * sizeof(uint8_t)); 1480296177Sjhibbits p_KeysMatchTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableOld, i*size * sizeof(uint8_t)); 1481296177Sjhibbits 1482296177Sjhibbits if(p_FmPcdCcNode->lclMask) 1483296177Sjhibbits { 1484296177Sjhibbits if(prvLclMask) 1485296177Sjhibbits IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 1486296177Sjhibbits PTR_MOVE(p_KeysMatchTableOldTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 1487296177Sjhibbits p_FmPcdCcNode->ccKeySizeAccExtraction); 1488296177Sjhibbits else 1489296177Sjhibbits { 1490296177Sjhibbits p_KeysMatchTableOldTmp = PTR_MOVE(p_FmPcdCcNode->h_KeysMatchTable, i*p_FmPcdCcNode->ccKeySizeAccExtraction*sizeof(uint8_t)); 1491296177Sjhibbits 1492296177Sjhibbits if (p_FmPcdCcNode->ccKeySizeAccExtraction > 4) 1493296177Sjhibbits IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 0xff, p_FmPcdCcNode->userSizeOfExtraction); 1494296177Sjhibbits else 1495296177Sjhibbits IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), p_FmPcdCcNode->p_GlblMask, p_FmPcdCcNode->userSizeOfExtraction); 1496296177Sjhibbits } 1497296177Sjhibbits } 1498296177Sjhibbits IO2IOCpy32(p_KeysMatchTableNewTmp, p_KeysMatchTableOldTmp, p_FmPcdCcNode->ccKeySizeAccExtraction); 1499296177Sjhibbits i++; 1500296177Sjhibbits } 1501296177Sjhibbits } 1502296177Sjhibbits 1503296177Sjhibbits p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE); 1504296177Sjhibbits p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i*FM_PCD_CC_AD_ENTRY_SIZE); 1505296177Sjhibbits IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE); 1506296177Sjhibbits 1507296177Sjhibbits 1508296177Sjhibbits if(!LIST_IsEmpty(&p_FmPcdCcNode->ccTreesLst)) 1509296177Sjhibbits { 1510296177Sjhibbits LIST_FOR_EACH(p_Pos, &p_FmPcdCcNode->ccTreesLst) 1511296177Sjhibbits { 1512296177Sjhibbits p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos); 1513296177Sjhibbits ASSERT_COND(p_CcNodeInformation->h_CcNode); 1514296177Sjhibbits /*update the manipulation which has to be updated from parameters of the port*/ 1515296177Sjhibbits /*it's has to be updated with restrictions defined in the function*/ 1516296177Sjhibbits err = FmPcdCcSetRequiredAction(p_FmPcdCcNode->h_FmPcd, 1517296177Sjhibbits p_FmPcdCcNode->shadowAction | p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].requiredAction, 1518296177Sjhibbits &p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex], 1519296177Sjhibbits PTR_MOVE(p_AdditionalInfo->p_AdTableNew, keyIndex*FM_PCD_CC_AD_ENTRY_SIZE), 1520296177Sjhibbits 1, 1521296177Sjhibbits p_CcNodeInformation->h_CcNode); 1522296177Sjhibbits if (err) 1523296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1524296177Sjhibbits 1525296177Sjhibbits err = CcUpdateParam(p_FmPcdCcNode->h_FmPcd, 1526296177Sjhibbits NULL, 1527296177Sjhibbits &p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex], 1528296177Sjhibbits 1, 1529296177Sjhibbits PTR_MOVE(p_AdditionalInfo->p_AdTableNew, keyIndex*FM_PCD_CC_AD_ENTRY_SIZE), 1530296177Sjhibbits TRUE, 1531296177Sjhibbits p_CcNodeInformation->index, 1532296177Sjhibbits p_CcNodeInformation->h_CcNode, 1533296177Sjhibbits TRUE); 1534296177Sjhibbits if (err) 1535296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1536296177Sjhibbits } 1537296177Sjhibbits } 1538296177Sjhibbits 1539296177Sjhibbits if(p_FmPcdCcNode->lclMask) 1540296177Sjhibbits memset(p_FmPcdCcNode->p_GlblMask, 0xff, CC_GLBL_MASK_SIZE * sizeof(uint8_t)); 1541296177Sjhibbits 1542296177Sjhibbits 1543296177Sjhibbits if(p_KeyParams->ccNextEngineParams.nextEngine == e_FM_PCD_CC) 1544296177Sjhibbits p_AdditionalInfo->h_NodeForAdd = p_KeyParams->ccNextEngineParams.params.ccParams.h_CcNode; 1545296177Sjhibbits 1546296177Sjhibbits if(!add) 1547296177Sjhibbits { 1548296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC) 1549296177Sjhibbits p_AdditionalInfo->h_NodeForRmv = p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.params.ccParams.h_CcNode; 1550296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1551296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip) 1552296177Sjhibbits p_AdditionalInfo->h_ManipForRmv = p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip; 1553296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1554296177Sjhibbits } 1555296177Sjhibbits 1556296177Sjhibbits return E_OK; 1557296177Sjhibbits} 1558296177Sjhibbits 1559296177Sjhibbitsstatic t_Error BuildNewNodeRemoveKey(t_FmPcdCcNode *p_FmPcdCcNode, uint8_t keyIndex, t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo) 1560296177Sjhibbits{ 1561296177Sjhibbits int i = 0, j = 0; 1562296177Sjhibbits t_Handle p_AdTableNewTmp,p_KeysMatchTableNewTmp; 1563296177Sjhibbits t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp; 1564296177Sjhibbits int size; 1565296177Sjhibbits t_Error err = E_OK; 1566296177Sjhibbits 1567296177Sjhibbits /*save new numOfKeys*/ 1568296177Sjhibbits p_AdditionalInfo->numOfKeys = (uint16_t)(p_FmPcdCcNode->numOfKeys - 1); 1569296177Sjhibbits 1570296177Sjhibbits /*function which allocates in the memory new KeyTbl, AdTbl*/ 1571296177Sjhibbits err = BuildNewNodeCommonPart(p_FmPcdCcNode, &size, p_AdditionalInfo); 1572296177Sjhibbits if(err) 1573296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1574296177Sjhibbits 1575296177Sjhibbits /*update new Ad and new Key Table according to new requirement*/ 1576296177Sjhibbits for(i = 0, j = 0; j < p_FmPcdCcNode->numOfKeys; i++, j++) 1577296177Sjhibbits { 1578296177Sjhibbits if(j == keyIndex) 1579296177Sjhibbits { 1580296177Sjhibbits p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j*FM_PCD_CC_AD_ENTRY_SIZE); 1581296177Sjhibbits j++; 1582296177Sjhibbits } 1583296177Sjhibbits if(j == p_FmPcdCcNode->numOfKeys) 1584296177Sjhibbits break; 1585296177Sjhibbits p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, i*FM_PCD_CC_AD_ENTRY_SIZE); 1586296177Sjhibbits p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j*FM_PCD_CC_AD_ENTRY_SIZE); 1587296177Sjhibbits IO2IOCpy32(p_AdTableNewTmp,p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE); 1588296177Sjhibbits p_KeysMatchTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableOld, j*size * sizeof(uint8_t)); 1589296177Sjhibbits p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, i*size * sizeof(uint8_t)); 1590296177Sjhibbits IO2IOCpy32(p_KeysMatchTableNewTmp,p_KeysMatchTableOldTmp, size * sizeof(uint8_t)); 1591296177Sjhibbits } 1592296177Sjhibbits 1593296177Sjhibbits p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, i*FM_PCD_CC_AD_ENTRY_SIZE); 1594296177Sjhibbits p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j*FM_PCD_CC_AD_ENTRY_SIZE); 1595296177Sjhibbits IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE); 1596296177Sjhibbits 1597296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC) 1598296177Sjhibbits p_AdditionalInfo->h_NodeForRmv = p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.params.ccParams.h_CcNode; 1599296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1600296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip) 1601296177Sjhibbits p_AdditionalInfo->h_ManipForRmv = p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip; 1602296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1603296177Sjhibbits 1604296177Sjhibbits return E_OK; 1605296177Sjhibbits} 1606296177Sjhibbits 1607296177Sjhibbitsstatic t_Error BuildNewNodeModifyKey(t_FmPcdCcNode *p_FmPcdCcNode, uint8_t keyIndex, uint8_t *p_Key, uint8_t *p_Mask,t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo) 1608296177Sjhibbits{ 1609296177Sjhibbits t_Error err = E_OK; 1610296177Sjhibbits t_Handle p_AdTableNewTmp, p_KeysMatchTableNewTmp; 1611296177Sjhibbits t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp; 1612296177Sjhibbits int size; 1613296177Sjhibbits int i = 0, j = 0; 1614296177Sjhibbits bool prvLclMask; 1615296177Sjhibbits 1616296177Sjhibbits p_AdditionalInfo->numOfKeys = p_FmPcdCcNode->numOfKeys; 1617296177Sjhibbits 1618296177Sjhibbits prvLclMask = p_FmPcdCcNode->lclMask; 1619296177Sjhibbits 1620296177Sjhibbits /*check that new key is not require update of localMask*/ 1621296177Sjhibbits err = UpdateGblMask(p_FmPcdCcNode, 1622296177Sjhibbits p_FmPcdCcNode->sizeOfExtraction, 1623296177Sjhibbits p_Mask); 1624296177Sjhibbits if(err) 1625296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1626296177Sjhibbits 1627296177Sjhibbits /*function which build in the memory new KeyTbl, AdTbl*/ 1628296177Sjhibbits err = BuildNewNodeCommonPart(p_FmPcdCcNode, &size, p_AdditionalInfo); 1629296177Sjhibbits if(err) 1630296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1631296177Sjhibbits 1632296177Sjhibbits /*fill the New AdTable and New KeyTable*/ 1633296177Sjhibbits for(j = 0, i = 0; j < p_AdditionalInfo->numOfKeys; j++, i++) 1634296177Sjhibbits { 1635296177Sjhibbits p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE); 1636296177Sjhibbits p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i*FM_PCD_CC_AD_ENTRY_SIZE); 1637296177Sjhibbits IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE); 1638296177Sjhibbits if(j == keyIndex) 1639296177Sjhibbits { 1640296177Sjhibbits p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j*size * sizeof(uint8_t)); 1641296177Sjhibbits Mem2IOCpy32(p_KeysMatchTableNewTmp, p_Key, p_FmPcdCcNode->userSizeOfExtraction); 1642296177Sjhibbits if(p_FmPcdCcNode->lclMask) 1643296177Sjhibbits { 1644296177Sjhibbits if(p_Mask) 1645296177Sjhibbits Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), p_Mask, p_FmPcdCcNode->userSizeOfExtraction); 1646296177Sjhibbits else if (p_FmPcdCcNode->ccKeySizeAccExtraction > 4) 1647296177Sjhibbits IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 0xff, p_FmPcdCcNode->userSizeOfExtraction); 1648296177Sjhibbits else 1649296177Sjhibbits Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction),p_FmPcdCcNode->p_GlblMask, p_FmPcdCcNode->userSizeOfExtraction); 1650296177Sjhibbits } 1651296177Sjhibbits } 1652296177Sjhibbits else 1653296177Sjhibbits { 1654296177Sjhibbits p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j*size * sizeof(uint8_t)); 1655296177Sjhibbits p_KeysMatchTableOldTmp = PTR_MOVE(p_FmPcdCcNode->h_KeysMatchTable, i*size * sizeof(uint8_t)); 1656296177Sjhibbits if (p_FmPcdCcNode->lclMask) 1657296177Sjhibbits { 1658296177Sjhibbits if(prvLclMask) 1659296177Sjhibbits IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 1660296177Sjhibbits PTR_MOVE(p_KeysMatchTableOldTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 1661296177Sjhibbits p_FmPcdCcNode->userSizeOfExtraction); 1662296177Sjhibbits else 1663296177Sjhibbits { 1664296177Sjhibbits p_KeysMatchTableOldTmp = PTR_MOVE(p_FmPcdCcNode->h_KeysMatchTable, i*p_FmPcdCcNode->ccKeySizeAccExtraction * sizeof(uint8_t)); 1665296177Sjhibbits 1666296177Sjhibbits if (p_FmPcdCcNode->ccKeySizeAccExtraction > 4) 1667296177Sjhibbits IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 0xff, p_FmPcdCcNode->userSizeOfExtraction); 1668296177Sjhibbits else 1669296177Sjhibbits IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), p_FmPcdCcNode->p_GlblMask, p_FmPcdCcNode->userSizeOfExtraction); 1670296177Sjhibbits } 1671296177Sjhibbits } 1672296177Sjhibbits IO2IOCpy32((void*)p_KeysMatchTableNewTmp, p_KeysMatchTableOldTmp, p_FmPcdCcNode->ccKeySizeAccExtraction); 1673296177Sjhibbits } 1674296177Sjhibbits } 1675296177Sjhibbits 1676296177Sjhibbits p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE); 1677296177Sjhibbits p_AdTableOldTmp = PTR_MOVE(p_FmPcdCcNode->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE); 1678296177Sjhibbits IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE); 1679296177Sjhibbits 1680296177Sjhibbits return E_OK; 1681296177Sjhibbits} 1682296177Sjhibbits 1683296177Sjhibbitsstatic t_Error BuildNewNodeModifyNextEngine(t_Handle h_FmPcd ,t_Handle h_FmPcdCcNodeOrTree, uint16_t keyIndex,t_FmPcdCcNextEngineParams *p_CcNextEngineParams, t_List *h_OldLst, t_List *h_NewLst,t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo) 1684296177Sjhibbits{ 1685296177Sjhibbits 1686296177Sjhibbits t_Error err = E_OK; 1687296177Sjhibbits uint32_t requiredAction = 0; 1688296177Sjhibbits t_List *p_Pos; 1689296177Sjhibbits t_CcNodeInformation *p_CcNodeInformation, ccNodeInfo; 1690296177Sjhibbits t_Handle p_Ad; 1691296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode1 = NULL; 1692296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree = NULL; 1693296177Sjhibbits 1694296177Sjhibbits ASSERT_COND(p_CcNextEngineParams); 1695296177Sjhibbits /*check that new NIA is legal*/ 1696296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, p_CcNextEngineParams); 1697296177Sjhibbits if(err) 1698296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1699296177Sjhibbits 1700296177Sjhibbits /*update internal data structure for next engine per index (index - key)*/ 1701296177Sjhibbits memcpy(&p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].nextEngineParams,p_CcNextEngineParams, sizeof(t_FmPcdCcNextEngineParams)); 1702296177Sjhibbits 1703296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1704296177Sjhibbits /*check that manip is legal and what requiredAction is necessary for this manip*/ 1705296177Sjhibbits if(p_CcNextEngineParams->h_Manip) 1706296177Sjhibbits { 1707296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(p_CcNextEngineParams,&requiredAction); 1708296177Sjhibbits if(err) 1709296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1710296177Sjhibbits 1711296177Sjhibbits } 1712296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1713296177Sjhibbits 1714296177Sjhibbits if(!p_AdditionalInfo->tree) 1715296177Sjhibbits { 1716296177Sjhibbits p_FmPcdCcNode1 = (t_FmPcdCcNode *)h_FmPcdCcNodeOrTree; 1717296177Sjhibbits p_Ad = p_FmPcdCcNode1->h_AdTable; 1718296177Sjhibbits if(p_FmPcdCcNode1->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC) 1719296177Sjhibbits p_AdditionalInfo->h_NodeForRmv = p_FmPcdCcNode1->nextEngineAndRequiredAction[keyIndex].nextEngineParams.params.ccParams.h_CcNode; 1720296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1721296177Sjhibbits if(p_FmPcdCcNode1->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip) 1722296177Sjhibbits p_AdditionalInfo->h_ManipForRmv = p_FmPcdCcNode1->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip; 1723296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1724296177Sjhibbits } 1725296177Sjhibbits else 1726296177Sjhibbits { 1727296177Sjhibbits p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcNodeOrTree; 1728296177Sjhibbits p_Ad = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr); 1729296177Sjhibbits if(p_FmPcdCcTree->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC) 1730296177Sjhibbits p_AdditionalInfo->h_NodeForRmv = p_FmPcdCcTree->nextEngineAndRequiredAction[keyIndex].nextEngineParams.params.ccParams.h_CcNode; 1731296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1732296177Sjhibbits if(p_FmPcdCcTree->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip) 1733296177Sjhibbits p_AdditionalInfo->h_ManipForRmv = p_FmPcdCcTree->nextEngineAndRequiredAction[keyIndex].nextEngineParams.h_Manip; 1734296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1735296177Sjhibbits } 1736296177Sjhibbits ASSERT_COND(p_Ad); 1737296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 1738296177Sjhibbits ccNodeInfo.h_CcNode = PTR_MOVE(p_Ad, keyIndex * FM_PCD_CC_AD_ENTRY_SIZE); 1739296177Sjhibbits EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo); 1740296177Sjhibbits 1741296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 1742296177Sjhibbits p_Ad = (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(h_FmPcd), 1743296177Sjhibbits FM_PCD_CC_AD_ENTRY_SIZE, 1744296177Sjhibbits FM_PCD_CC_AD_TABLE_ALIGN); 1745296177Sjhibbits 1746296177Sjhibbits if(!p_Ad) 1747296177Sjhibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation in MURAM FAILED")); 1748296177Sjhibbits 1749296177Sjhibbits IOMemSet32((uint8_t *)p_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE); 1750296177Sjhibbits if(p_CcNextEngineParams) 1751296177Sjhibbits NextStepAd(p_Ad,p_CcNextEngineParams, h_FmPcd); 1752296177Sjhibbits ccNodeInfo.h_CcNode = p_Ad; 1753296177Sjhibbits EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo); 1754296177Sjhibbits 1755296177Sjhibbits p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].requiredAction = requiredAction; 1756296177Sjhibbits 1757296177Sjhibbits p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].requiredAction |= UPDATE_CC_WITH_TREE; 1758296177Sjhibbits 1759296177Sjhibbits if(!p_AdditionalInfo->tree) 1760296177Sjhibbits { 1761296177Sjhibbits ASSERT_COND(p_FmPcdCcNode1); 1762296177Sjhibbits if(!LIST_IsEmpty(&p_FmPcdCcNode1->ccTreesLst)) 1763296177Sjhibbits { 1764296177Sjhibbits LIST_FOR_EACH(p_Pos, &p_FmPcdCcNode1->ccTreesLst) 1765296177Sjhibbits { 1766296177Sjhibbits p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos); 1767296177Sjhibbits ASSERT_COND(p_CcNodeInformation->h_CcNode); 1768296177Sjhibbits /*update the manipulation which has to be updated from parameters of the port*/ 1769296177Sjhibbits /*it's has to be updated with restrictions defined in the function*/ 1770296177Sjhibbits err = FmPcdCcSetRequiredAction(p_FmPcdCcNode1->h_FmPcd, p_FmPcdCcNode1->shadowAction | p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].requiredAction, &p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex], 1771296177Sjhibbits p_Ad, 1, p_CcNodeInformation->h_CcNode); 1772296177Sjhibbits if(err) 1773296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1774296177Sjhibbits err = CcUpdateParam(p_FmPcdCcNode1->h_FmPcd, NULL, &p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex],1, p_Ad, TRUE, p_CcNodeInformation->index, p_CcNodeInformation->h_CcNode, TRUE); 1775296177Sjhibbits if(err) 1776296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1777296177Sjhibbits } 1778296177Sjhibbits } 1779296177Sjhibbits } 1780296177Sjhibbits else 1781296177Sjhibbits { 1782296177Sjhibbits ASSERT_COND(p_FmPcdCcTree); 1783296177Sjhibbits err = FmPcdCcSetRequiredAction(h_FmPcd, p_FmPcdCcTree->requiredAction | p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex].requiredAction, &p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex], 1784296177Sjhibbits p_Ad, 1, (t_Handle)p_FmPcdCcTree); 1785296177Sjhibbits if(err) 1786296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1787296177Sjhibbits err = CcUpdateParam(h_FmPcd, NULL, &p_AdditionalInfo->nextEngineAndRequiredAction[keyIndex],1, p_Ad, TRUE, 0, (t_Handle)p_FmPcdCcTree, TRUE); 1788296177Sjhibbits if(err) 1789296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 1790296177Sjhibbits } 1791296177Sjhibbits 1792296177Sjhibbits if(p_CcNextEngineParams->nextEngine == e_FM_PCD_CC) 1793296177Sjhibbits p_AdditionalInfo->h_NodeForAdd = p_CcNextEngineParams->params.ccParams.h_CcNode; 1794296177Sjhibbits return E_OK; 1795296177Sjhibbits} 1796296177Sjhibbits 1797296177Sjhibbitsstatic t_Handle BuildNewAd(t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams, 1798296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode, 1799296177Sjhibbits t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams) 1800296177Sjhibbits{ 1801296177Sjhibbits 1802296177Sjhibbits t_Handle p_Ad; 1803296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNodeTmp; 1804296177Sjhibbits 1805296177Sjhibbits p_Ad = (t_Handle)FM_MURAM_AllocMem(((t_FmPcd *)(p_FmPcdCcNode->h_FmPcd))->h_FmMuram, 1806296177Sjhibbits FM_PCD_CC_AD_ENTRY_SIZE, 1807296177Sjhibbits FM_PCD_CC_AD_TABLE_ALIGN); 1808296177Sjhibbits if(!p_Ad) 1809296177Sjhibbits { 1810296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM for AD")); 1811296177Sjhibbits return NULL; 1812296177Sjhibbits } 1813296177Sjhibbits IOMemSet32(p_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE); 1814296177Sjhibbits 1815296177Sjhibbits p_FmPcdCcNodeTmp = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode)); 1816296177Sjhibbits if(!p_FmPcdCcNodeTmp) 1817296177Sjhibbits { 1818296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_FmPcdCcNodeTmp")); 1819296177Sjhibbits return NULL; 1820296177Sjhibbits } 1821296177Sjhibbits memset(p_FmPcdCcNodeTmp, 0, sizeof(t_FmPcdCcNode)); 1822296177Sjhibbits 1823296177Sjhibbits p_FmPcdCcNodeTmp->numOfKeys = p_FmPcdModifyCcKeyAdditionalParams->numOfKeys; 1824296177Sjhibbits p_FmPcdCcNodeTmp->h_KeysMatchTable = p_FmPcdModifyCcKeyAdditionalParams->p_KeysMatchTableNew; 1825296177Sjhibbits p_FmPcdCcNodeTmp->h_AdTable = p_FmPcdModifyCcKeyAdditionalParams->p_AdTableNew; 1826296177Sjhibbits 1827296177Sjhibbits p_FmPcdCcNodeTmp->lclMask = p_FmPcdCcNode->lclMask; 1828296177Sjhibbits p_FmPcdCcNodeTmp->parseCode = p_FmPcdCcNode->parseCode; 1829296177Sjhibbits p_FmPcdCcNodeTmp->offset = p_FmPcdCcNode->offset; 1830296177Sjhibbits p_FmPcdCcNodeTmp->prsArrayOffset = p_FmPcdCcNode->prsArrayOffset; 1831296177Sjhibbits p_FmPcdCcNodeTmp->ctrlFlow = p_FmPcdCcNode->ctrlFlow; 1832296177Sjhibbits p_FmPcdCcNodeTmp->ccKeySizeAccExtraction = p_FmPcdCcNode->ccKeySizeAccExtraction; 1833296177Sjhibbits p_FmPcdCcNodeTmp->sizeOfExtraction = p_FmPcdCcNode->sizeOfExtraction; 1834296177Sjhibbits p_FmPcdCcNodeTmp->glblMaskSize = p_FmPcdCcNode->glblMaskSize; 1835296177Sjhibbits p_FmPcdCcNodeTmp->p_GlblMask = p_FmPcdCcNode->p_GlblMask; 1836296177Sjhibbits 1837296177Sjhibbits if (p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC) 1838296177Sjhibbits FillAdOfTypeContLookup(p_Ad, 1839296177Sjhibbits p_FmPcdCcNode->h_FmPcd, 1840296177Sjhibbits p_FmPcdCcNodeTmp, 1841296177Sjhibbits#ifdef FM_PCD_CC_MANIP 1842296177Sjhibbits p_FmPcdCcNextEngineParams->h_Manip 1843296177Sjhibbits#else 1844296177Sjhibbits NULL 1845296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 1846296177Sjhibbits ); 1847296177Sjhibbits 1848296177Sjhibbits XX_Free(p_FmPcdCcNodeTmp); 1849296177Sjhibbits 1850296177Sjhibbits return p_Ad; 1851296177Sjhibbits} 1852296177Sjhibbits 1853296177Sjhibbitsstatic void UpdateAdPtrOfNodesWhichPointsOnCrntMdfNode(t_FmPcdCcNode *p_CrntMdfNode ,t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams, t_List *h_OldLst, t_List *h_NewLst) 1854296177Sjhibbits{ 1855296177Sjhibbits t_CcNodeInformation *p_CcNodeInformation; 1856296177Sjhibbits t_FmPcdCcNode *p_NodePtrOnCurrentMdfNode = NULL; 1857296177Sjhibbits t_List *p_Pos; 1858296177Sjhibbits int i = 0; 1859296177Sjhibbits t_Handle p_AdTablePtOnCrntCurrentMdfNode, p_AdTableNewModified; 1860296177Sjhibbits t_CcNodeInformation ccNodeInfo; 1861296177Sjhibbits 1862296177Sjhibbits LIST_FOR_EACH(p_Pos, &p_CrntMdfNode->ccPrevNodesLst) 1863296177Sjhibbits { 1864296177Sjhibbits p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos); 1865296177Sjhibbits p_NodePtrOnCurrentMdfNode = (t_FmPcdCcNode *)p_CcNodeInformation->h_CcNode; 1866296177Sjhibbits ASSERT_COND(p_NodePtrOnCurrentMdfNode); 1867296177Sjhibbits /*search in the prev node which exact index points on this current modified node for getting AD */ 1868296177Sjhibbits for(i = 0; i < p_NodePtrOnCurrentMdfNode->numOfKeys + 1; i++) 1869296177Sjhibbits { 1870296177Sjhibbits if(p_NodePtrOnCurrentMdfNode->nextEngineAndRequiredAction[i].nextEngineParams.nextEngine == e_FM_PCD_CC) 1871296177Sjhibbits { 1872296177Sjhibbits if(p_NodePtrOnCurrentMdfNode->nextEngineAndRequiredAction[i].nextEngineParams.params.ccParams.h_CcNode == (t_Handle)p_CrntMdfNode) 1873296177Sjhibbits { 1874296177Sjhibbits p_AdTablePtOnCrntCurrentMdfNode = PTR_MOVE(p_NodePtrOnCurrentMdfNode->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE); 1875296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 1876296177Sjhibbits ccNodeInfo.h_CcNode = p_AdTablePtOnCrntCurrentMdfNode; 1877296177Sjhibbits EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo); 1878296177Sjhibbits 1879296177Sjhibbits p_AdTableNewModified = BuildNewAd(p_FmPcdModifyCcKeyAdditionalParams, p_CrntMdfNode, &p_NodePtrOnCurrentMdfNode->nextEngineAndRequiredAction[i].nextEngineParams); 1880296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 1881296177Sjhibbits ccNodeInfo.h_CcNode = p_AdTableNewModified; 1882296177Sjhibbits EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo); 1883296177Sjhibbits } 1884296177Sjhibbits } 1885296177Sjhibbits } 1886296177Sjhibbits ASSERT_COND(i != p_NodePtrOnCurrentMdfNode->numOfKeys); 1887296177Sjhibbits } 1888296177Sjhibbits} 1889296177Sjhibbits 1890296177Sjhibbitsstatic void UpdateAdPtrOfTreesWhichPointsOnCrntMdfNode(t_FmPcdCcNode *p_CrntMdfNode ,t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams, t_List *h_OldLst, t_List *h_NewLst) 1891296177Sjhibbits{ 1892296177Sjhibbits t_CcNodeInformation *p_CcNodeInformation; 1893296177Sjhibbits t_FmPcdCcTree *p_TreePtrOnCurrentMdfNode = NULL; 1894296177Sjhibbits t_List *p_Pos; 1895296177Sjhibbits int i = 0; 1896296177Sjhibbits t_Handle p_AdTableTmp, p_AdTableTmp1; 1897296177Sjhibbits t_CcNodeInformation ccNodeInfo; 1898296177Sjhibbits 1899296177Sjhibbits LIST_FOR_EACH(p_Pos, &p_CrntMdfNode->ccTreeIdLst) 1900296177Sjhibbits { 1901296177Sjhibbits p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos); 1902296177Sjhibbits p_TreePtrOnCurrentMdfNode = (t_FmPcdCcTree *)p_CcNodeInformation->h_CcNode; 1903296177Sjhibbits 1904296177Sjhibbits ASSERT_COND(p_TreePtrOnCurrentMdfNode); 1905296177Sjhibbits /*search in the trees which exact index points on this current modified node for getting AD 1906296177Sjhibbits */ 1907296177Sjhibbits for(i = 0; i < p_TreePtrOnCurrentMdfNode->numOfEntries; i++) 1908296177Sjhibbits { 1909296177Sjhibbits if(p_TreePtrOnCurrentMdfNode->nextEngineAndRequiredAction[i].nextEngineParams.nextEngine == e_FM_PCD_CC) 1910296177Sjhibbits { 1911296177Sjhibbits if(p_TreePtrOnCurrentMdfNode->nextEngineAndRequiredAction[i].nextEngineParams.params.ccParams.h_CcNode == (t_Handle)p_CrntMdfNode) 1912296177Sjhibbits { 1913296177Sjhibbits p_AdTableTmp = UINT_TO_PTR(p_TreePtrOnCurrentMdfNode->ccTreeBaseAddr + i*FM_PCD_CC_AD_ENTRY_SIZE); 1914296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 1915296177Sjhibbits ccNodeInfo.h_CcNode = p_AdTableTmp; 1916296177Sjhibbits EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo); 1917296177Sjhibbits 1918296177Sjhibbits p_AdTableTmp1 = BuildNewAd(p_FmPcdModifyCcKeyAdditionalParams, p_CrntMdfNode, &p_TreePtrOnCurrentMdfNode->nextEngineAndRequiredAction[i].nextEngineParams); 1919296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 1920296177Sjhibbits ccNodeInfo.h_CcNode = p_AdTableTmp1; 1921296177Sjhibbits EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo); 1922296177Sjhibbits } 1923296177Sjhibbits } 1924296177Sjhibbits } 1925296177Sjhibbits ASSERT_COND(i == p_TreePtrOnCurrentMdfNode->numOfEntries); 1926296177Sjhibbits } 1927296177Sjhibbits} 1928296177Sjhibbits 1929296177Sjhibbitsstatic t_Error ModifyKeyCommonPart1(t_Handle h_FmPcdCcNodeOrTree, uint16_t keyIndex, t_Handle *h_Params, e_ModifyState modifyState, bool check, bool tree) 1930296177Sjhibbits{ 1931296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams; 1932296177Sjhibbits int i = 0, j = 0; 1933296177Sjhibbits bool wasUpdate = FALSE; 1934296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = NULL; 1935296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree; 1936296177Sjhibbits uint16_t numOfKeys; 1937296177Sjhibbits t_FmPcdCcNextEngineAndRequiredActionParams *p_nextEngineAndRequiredAction = NULL; 1938296177Sjhibbits 1939296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcdCcNodeOrTree,E_INVALID_HANDLE); 1940296177Sjhibbits 1941296177Sjhibbits p_nextEngineAndRequiredAction = XX_Malloc(FM_PCD_MAX_NUM_OF_KEYS * sizeof(*p_nextEngineAndRequiredAction)); 1942296177Sjhibbits if(!p_nextEngineAndRequiredAction) 1943296177Sjhibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("failed to allocate memory for p_nextEngineAndRequiredAction")); 1944296177Sjhibbits 1945296177Sjhibbits memset(p_nextEngineAndRequiredAction, 0, FM_PCD_MAX_NUM_OF_KEYS * sizeof(*p_nextEngineAndRequiredAction)); 1946296177Sjhibbits 1947296177Sjhibbits if(!tree) 1948296177Sjhibbits { 1949296177Sjhibbits p_FmPcdCcNode = (t_FmPcdCcNode *)h_FmPcdCcNodeOrTree; 1950296177Sjhibbits numOfKeys = p_FmPcdCcNode->numOfKeys; 1951296177Sjhibbits 1952296177Sjhibbits /*node has to be pointed by another node or tree*/ 1953296177Sjhibbits if (!LIST_NumOfObjs(&p_FmPcdCcNode->ccPrevNodesLst) && 1954296177Sjhibbits !LIST_NumOfObjs(&p_FmPcdCcNode->ccTreeIdLst)) 1955296177Sjhibbits { 1956296177Sjhibbits XX_Free(p_nextEngineAndRequiredAction); 1957296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("node has to be pointed by node or tree")); 1958296177Sjhibbits } 1959296177Sjhibbits 1960296177Sjhibbits if(!LIST_NumOfObjs(&p_FmPcdCcNode->ccTreesLst) || 1961296177Sjhibbits (LIST_NumOfObjs(&p_FmPcdCcNode->ccTreesLst) != 1)) 1962296177Sjhibbits { 1963296177Sjhibbits XX_Free(p_nextEngineAndRequiredAction); 1964296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("node has to be belonging to some tree and only to one tree")); 1965296177Sjhibbits } 1966296177Sjhibbits 1967296177Sjhibbits memcpy(p_nextEngineAndRequiredAction, 1968296177Sjhibbits p_FmPcdCcNode->nextEngineAndRequiredAction, 1969296177Sjhibbits FM_PCD_MAX_NUM_OF_KEYS * sizeof(t_FmPcdCcNextEngineAndRequiredActionParams)); 1970296177Sjhibbits 1971296177Sjhibbits if(check) 1972296177Sjhibbits { 1973296177Sjhibbits if((p_FmPcdCcNode->parseCode == CC_PC_FF_IPV4TTL) || 1974296177Sjhibbits (p_FmPcdCcNode->parseCode == CC_PC_FF_IPV6HOP_LIMIT) || 1975296177Sjhibbits (p_FmPcdCcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED)) 1976296177Sjhibbits { 1977296177Sjhibbits XX_Free(p_nextEngineAndRequiredAction); 1978296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("nodeId of CC_PC_FF_IPV4TTL or CC_PC_FF_IPV6HOP_LIMIT can not be used for addKey, removeKey, modifyKey")); 1979296177Sjhibbits } 1980296177Sjhibbits } 1981296177Sjhibbits } 1982296177Sjhibbits else 1983296177Sjhibbits { 1984296177Sjhibbits p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcNodeOrTree; 1985296177Sjhibbits numOfKeys = p_FmPcdCcTree->numOfEntries; 1986296177Sjhibbits memcpy(p_nextEngineAndRequiredAction, 1987296177Sjhibbits p_FmPcdCcTree->nextEngineAndRequiredAction, 1988296177Sjhibbits FM_PCD_MAX_NUM_OF_KEYS * sizeof(t_FmPcdCcNextEngineAndRequiredActionParams)); 1989296177Sjhibbits } 1990296177Sjhibbits 1991296177Sjhibbits p_FmPcdModifyCcKeyAdditionalParams = 1992296177Sjhibbits (t_FmPcdModifyCcKeyAdditionalParams *)XX_Malloc(sizeof(t_FmPcdModifyCcKeyAdditionalParams)); 1993296177Sjhibbits if(!p_FmPcdModifyCcKeyAdditionalParams) 1994296177Sjhibbits { 1995296177Sjhibbits XX_Free(p_nextEngineAndRequiredAction); 1996296177Sjhibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of internal data structure FAILED")); 1997296177Sjhibbits } 1998296177Sjhibbits memset(p_FmPcdModifyCcKeyAdditionalParams, 0, sizeof(t_FmPcdModifyCcKeyAdditionalParams)); 1999296177Sjhibbits 2000296177Sjhibbits p_FmPcdModifyCcKeyAdditionalParams->h_CurrentNode = h_FmPcdCcNodeOrTree; 2001296177Sjhibbits p_FmPcdModifyCcKeyAdditionalParams->keyIndex = keyIndex; 2002296177Sjhibbits 2003296177Sjhibbits while(i < numOfKeys) 2004296177Sjhibbits { 2005296177Sjhibbits if((j == keyIndex) && !wasUpdate) 2006296177Sjhibbits { 2007296177Sjhibbits if(modifyState == e_MODIFY_STATE_ADD) 2008296177Sjhibbits j++; 2009296177Sjhibbits else if(modifyState == e_MODIFY_STATE_REMOVE) 2010296177Sjhibbits i++; 2011296177Sjhibbits wasUpdate = TRUE; 2012296177Sjhibbits } 2013296177Sjhibbits else 2014296177Sjhibbits { 2015296177Sjhibbits memcpy(&p_FmPcdModifyCcKeyAdditionalParams->nextEngineAndRequiredAction[j], &p_nextEngineAndRequiredAction[i], sizeof(t_FmPcdCcNextEngineAndRequiredActionParams)); 2016296177Sjhibbits i++; 2017296177Sjhibbits j++; 2018296177Sjhibbits } 2019296177Sjhibbits } 2020296177Sjhibbits 2021296177Sjhibbits if (keyIndex == numOfKeys) 2022296177Sjhibbits { 2023296177Sjhibbits if (modifyState == e_MODIFY_STATE_ADD) 2024296177Sjhibbits j++; 2025296177Sjhibbits else if(modifyState == e_MODIFY_STATE_REMOVE) 2026296177Sjhibbits i++; 2027296177Sjhibbits } 2028296177Sjhibbits 2029296177Sjhibbits memcpy(&p_FmPcdModifyCcKeyAdditionalParams->nextEngineAndRequiredAction[j], &p_nextEngineAndRequiredAction[numOfKeys], sizeof(t_FmPcdCcNextEngineAndRequiredActionParams)); 2030296177Sjhibbits 2031296177Sjhibbits XX_Free(p_nextEngineAndRequiredAction); 2032296177Sjhibbits *h_Params = p_FmPcdModifyCcKeyAdditionalParams; 2033296177Sjhibbits 2034296177Sjhibbits return E_OK; 2035296177Sjhibbits} 2036296177Sjhibbits 2037296177Sjhibbitsstatic t_Error UpdatePtrWhichPointOnCrntMdfNode(t_FmPcdCcNode *p_FmPcdCcNode, t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams ,t_List *h_OldLst, t_List *h_NewLst) 2038296177Sjhibbits{ 2039296177Sjhibbits if(!LIST_IsEmpty(&p_FmPcdCcNode->ccPrevNodesLst)) 2040296177Sjhibbits UpdateAdPtrOfNodesWhichPointsOnCrntMdfNode(p_FmPcdCcNode, p_FmPcdModifyCcKeyAdditionalParams, h_OldLst, h_NewLst); 2041296177Sjhibbits 2042296177Sjhibbits if(!LIST_IsEmpty(&p_FmPcdCcNode->ccTreeIdLst)) 2043296177Sjhibbits UpdateAdPtrOfTreesWhichPointsOnCrntMdfNode(p_FmPcdCcNode, p_FmPcdModifyCcKeyAdditionalParams, h_OldLst, h_NewLst); 2044296177Sjhibbits 2045296177Sjhibbits return E_OK; 2046296177Sjhibbits} 2047296177Sjhibbits 2048296177Sjhibbitsstatic void FmPcdCcUpdateTreeOwner(t_FmPcdCcTree *p_FmPcdCcTree, bool add) 2049296177Sjhibbits{ 2050296177Sjhibbits ASSERT_COND(p_FmPcdCcTree); 2051296177Sjhibbits 2052296177Sjhibbits if(add) 2053296177Sjhibbits p_FmPcdCcTree->owners++; 2054296177Sjhibbits else 2055296177Sjhibbits { 2056296177Sjhibbits ASSERT_COND(p_FmPcdCcTree->owners); 2057296177Sjhibbits p_FmPcdCcTree->owners--; 2058296177Sjhibbits } 2059296177Sjhibbits} 2060296177Sjhibbits 2061296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2062296177Sjhibbitsstatic t_Error CheckAndSetManipParamsWithCcNodeParams(t_FmPcdCcNode *p_FmPcdCcNode) 2063296177Sjhibbits{ 2064296177Sjhibbits t_Error err = E_OK; 2065296177Sjhibbits int i = 0; 2066296177Sjhibbits 2067296177Sjhibbits for(i = 0; i < p_FmPcdCcNode->numOfKeys; i++) 2068296177Sjhibbits { 2069296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip) 2070296177Sjhibbits { 2071296177Sjhibbits err = FmPcdManipCheckParamsWithCcNodeParams(p_FmPcdCcNode->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip, (t_Handle)p_FmPcdCcNode); 2072296177Sjhibbits if(err) 2073296177Sjhibbits return err; 2074296177Sjhibbits } 2075296177Sjhibbits } 2076296177Sjhibbits 2077296177Sjhibbits return err; 2078296177Sjhibbits} 2079296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2080296177Sjhibbits 2081296177Sjhibbitsstatic t_Error CcUpdateParams(t_Handle h_FmPcd, 2082296177Sjhibbits t_Handle h_FmPort, 2083296177Sjhibbits t_Handle h_FmTree, 2084296177Sjhibbits bool validate) 2085296177Sjhibbits{ 2086296177Sjhibbits t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *) h_FmTree; 2087296177Sjhibbits 2088296177Sjhibbits return CcUpdateParam(h_FmPcd, 2089296177Sjhibbits h_FmPort, 2090296177Sjhibbits p_CcTree->nextEngineAndRequiredAction, 2091296177Sjhibbits p_CcTree->numOfEntries, 2092296177Sjhibbits UINT_TO_PTR(p_CcTree->ccTreeBaseAddr), 2093296177Sjhibbits validate, 2094296177Sjhibbits 0, 2095296177Sjhibbits h_FmTree, 2096296177Sjhibbits FALSE); 2097296177Sjhibbits} 2098296177Sjhibbits 2099296177Sjhibbitsstatic t_Error CheckParams(t_Handle h_FmPcd, 2100296177Sjhibbits t_FmPcdCcNodeParams *p_CcNodeParam, 2101296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode, 2102296177Sjhibbits bool *isKeyTblAlloc) 2103296177Sjhibbits{ 2104296177Sjhibbits int tmp = 0; 2105296177Sjhibbits t_FmPcdCcKeyParams *p_KeyParams; 2106296177Sjhibbits t_Error err; 2107296177Sjhibbits uint32_t requiredAction = 0; 2108296177Sjhibbits 2109296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss); 2110296177Sjhibbits if(err) 2111296177Sjhibbits RETURN_ERROR(MAJOR, err, ("For this node MissNextEngineParams are not valid")); 2112296177Sjhibbits 2113296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2114296177Sjhibbits if(p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.h_Manip) 2115296177Sjhibbits { 2116296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(&p_CcNodeParam->keysParams.ccNextEngineParamsForMiss, &requiredAction); 2117296177Sjhibbits if(err) 2118296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 2119296177Sjhibbits } 2120296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2121296177Sjhibbits 2122296177Sjhibbits memcpy(&p_FmPcdCcNode->nextEngineAndRequiredAction[p_FmPcdCcNode->numOfKeys].nextEngineParams,&p_CcNodeParam->keysParams.ccNextEngineParamsForMiss, sizeof(t_FmPcdCcNextEngineParams)); 2123296177Sjhibbits p_FmPcdCcNode->nextEngineAndRequiredAction[p_FmPcdCcNode->numOfKeys].requiredAction = requiredAction; 2124296177Sjhibbits 2125296177Sjhibbits for(tmp = 0 ; tmp < p_FmPcdCcNode->numOfKeys; tmp++) 2126296177Sjhibbits { 2127296177Sjhibbits p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp]; 2128296177Sjhibbits 2129296177Sjhibbits if(!p_KeyParams->p_Key) 2130296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("p_Key is not initialized")); 2131296177Sjhibbits 2132296177Sjhibbits 2133296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_KeyParams->ccNextEngineParams); 2134296177Sjhibbits if(err) 2135296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 2136296177Sjhibbits 2137296177Sjhibbits err = UpdateGblMask(p_FmPcdCcNode, 2138296177Sjhibbits p_CcNodeParam->keysParams.keySize, 2139296177Sjhibbits p_KeyParams->p_Mask); 2140296177Sjhibbits 2141296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2142296177Sjhibbits if(p_KeyParams->ccNextEngineParams.h_Manip) 2143296177Sjhibbits { 2144296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(&p_KeyParams->ccNextEngineParams, &requiredAction); 2145296177Sjhibbits if(err) 2146296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 2147296177Sjhibbits } 2148296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2149296177Sjhibbits 2150296177Sjhibbits memcpy(&p_FmPcdCcNode->nextEngineAndRequiredAction[tmp],&p_KeyParams->ccNextEngineParams, sizeof(t_FmPcdCcNextEngineParams)); 2151296177Sjhibbits p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].requiredAction = requiredAction; 2152296177Sjhibbits } 2153296177Sjhibbits 2154296177Sjhibbits *isKeyTblAlloc = TRUE; 2155296177Sjhibbits return E_OK; 2156296177Sjhibbits} 2157296177Sjhibbits 2158296177Sjhibbitsstatic t_Error Ipv4TtlOrIpv6HopLimiCheckParams( t_Handle h_FmPcd, 2159296177Sjhibbits t_FmPcdCcNodeParams *p_CcNodeParam, t_FmPcdCcNode *p_FmPcdCcNode, 2160296177Sjhibbits bool *isKeyTblAlloc) 2161296177Sjhibbits{ 2162296177Sjhibbits int tmp = 0; 2163296177Sjhibbits t_FmPcdCcKeyParams *p_KeyParams; 2164296177Sjhibbits t_Error err; 2165296177Sjhibbits uint8_t key = 0x01; 2166296177Sjhibbits uint32_t requiredAction = 0; 2167296177Sjhibbits 2168296177Sjhibbits if(p_FmPcdCcNode->numOfKeys != 1 ) 2169296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("for IPV4TTL and IPV6_HOP_LIMIT has to be only 1 key - TTL = 1, otherwise it's Miss")); 2170296177Sjhibbits 2171296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss); 2172296177Sjhibbits if(err) 2173296177Sjhibbits RETURN_ERROR(MAJOR, err, ("For this node MissNextEngineParams are not valid")); 2174296177Sjhibbits 2175296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2176296177Sjhibbits if(p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.h_Manip) 2177296177Sjhibbits { 2178296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(&p_CcNodeParam->keysParams.ccNextEngineParamsForMiss, &requiredAction); 2179296177Sjhibbits if(err) 2180296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 2181296177Sjhibbits } 2182296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2183296177Sjhibbits 2184296177Sjhibbits memcpy(&p_FmPcdCcNode->nextEngineAndRequiredAction[p_FmPcdCcNode->numOfKeys].nextEngineParams, &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss, sizeof(t_FmPcdCcNextEngineParams)); 2185296177Sjhibbits p_FmPcdCcNode->nextEngineAndRequiredAction[p_FmPcdCcNode->numOfKeys].requiredAction = requiredAction; 2186296177Sjhibbits 2187296177Sjhibbits for(tmp = 0 ; tmp < p_FmPcdCcNode->numOfKeys; tmp++) 2188296177Sjhibbits { 2189296177Sjhibbits p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp]; 2190296177Sjhibbits if(p_KeyParams->p_Mask) 2191296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("If node of the type IPV4_TTL or IPV6_HOP_LIMIT p_Mask can not be initialized")); 2192296177Sjhibbits if(memcmp(p_KeyParams->p_Key, &key, 1) != 0) 2193296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("If node of the type IPV4_TTL or IPV6_HOP_LIMIT p_Key has to be 1")); 2194296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_KeyParams->ccNextEngineParams); 2195296177Sjhibbits if(err) 2196296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 2197296177Sjhibbits 2198296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2199296177Sjhibbits if(p_KeyParams->ccNextEngineParams.h_Manip) 2200296177Sjhibbits { 2201296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(&p_KeyParams->ccNextEngineParams, &requiredAction); 2202296177Sjhibbits if(err) 2203296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 2204296177Sjhibbits } 2205296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2206296177Sjhibbits 2207296177Sjhibbits memcpy(&p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].nextEngineParams, &p_KeyParams->ccNextEngineParams, sizeof(t_FmPcdCcNextEngineParams)); 2208296177Sjhibbits p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].requiredAction = requiredAction; 2209296177Sjhibbits } 2210296177Sjhibbits 2211296177Sjhibbits *isKeyTblAlloc = FALSE; 2212296177Sjhibbits return E_OK; 2213296177Sjhibbits} 2214296177Sjhibbits 2215296177Sjhibbitsstatic t_Error IcHashIndexedCheckParams(t_Handle h_FmPcd, 2216296177Sjhibbits t_FmPcdCcNodeParams *p_CcNodeParam, 2217296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode, 2218296177Sjhibbits /*uint16_t *ccInfo,*/ 2219296177Sjhibbits /*t_List *ccNextDifferentNodesLst,*/ 2220296177Sjhibbits bool *isKeyTblAlloc) 2221296177Sjhibbits{ 2222296177Sjhibbits int tmp = 0, countOnes = 0; 2223296177Sjhibbits t_FmPcdCcKeyParams *p_KeyParams; 2224296177Sjhibbits t_Error err; 2225296177Sjhibbits uint16_t glblMask = p_CcNodeParam->extractCcParams.extractNonHdr.icIndxMask; 2226296177Sjhibbits uint16_t countMask = (uint16_t)(glblMask >> 4); 2227296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2228296177Sjhibbits uint32_t requiredAction; 2229296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2230296177Sjhibbits 2231296177Sjhibbits if (glblMask & 0x000f) 2232296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("icIndxMask has to be with last nibble 0")); 2233296177Sjhibbits 2234296177Sjhibbits while (countMask) 2235296177Sjhibbits { 2236296177Sjhibbits countOnes++; 2237296177Sjhibbits countMask=(uint16_t)(countMask>>1); 2238296177Sjhibbits } 2239296177Sjhibbits 2240296177Sjhibbits if (!POWER_OF_2(p_FmPcdCcNode->numOfKeys)) 2241296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Node of the type INDEXED numOfKeys has to be powerOfTwo")); 2242296177Sjhibbits if (p_FmPcdCcNode->numOfKeys != ((uint32_t)1<<countOnes )) 2243296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Node of the type IC_HASH_INDEXED numOfKeys has to be powerOfTwo")); 2244296177Sjhibbits 2245296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss); 2246296177Sjhibbits if(GET_ERROR_TYPE(err)!= E_NOT_SUPPORTED) 2247296177Sjhibbits RETURN_ERROR(MAJOR, err, ("MissNextEngineParams for the node of the type IC_INDEX_HASH has to be UnInitialized")); 2248296177Sjhibbits 2249296177Sjhibbits for(tmp = 0 ; tmp < p_FmPcdCcNode->numOfKeys; tmp++) 2250296177Sjhibbits { 2251296177Sjhibbits p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp]; 2252296177Sjhibbits if(p_KeyParams->p_Mask || p_KeyParams->p_Key) 2253296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Node of the type IC_HASH_INDEXED p_Key or p_Mask has to be NULL")); 2254296177Sjhibbits 2255296177Sjhibbits if((glblMask & (tmp * 16)) == (tmp * 16)) 2256296177Sjhibbits { 2257296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_KeyParams->ccNextEngineParams); 2258296177Sjhibbits if(err) 2259296177Sjhibbits RETURN_ERROR(MAJOR, err, ("This index has to be initialized for the node of the type IC_INDEX_HASH according to settings of GlobalMask ")); 2260296177Sjhibbits 2261296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2262296177Sjhibbits if(p_KeyParams->ccNextEngineParams.h_Manip) 2263296177Sjhibbits { 2264296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(&p_KeyParams->ccNextEngineParams, &requiredAction); 2265296177Sjhibbits if(err) 2266296177Sjhibbits RETURN_ERROR(MAJOR, err, (NO_MSG)); 2267296177Sjhibbits } 2268296177Sjhibbits p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].requiredAction = requiredAction; 2269296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2270296177Sjhibbits 2271296177Sjhibbits memcpy(&p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].nextEngineParams,&p_KeyParams->ccNextEngineParams, sizeof(t_FmPcdCcNextEngineParams)); 2272296177Sjhibbits } 2273296177Sjhibbits else 2274296177Sjhibbits { 2275296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd, &p_KeyParams->ccNextEngineParams); 2276296177Sjhibbits if(GET_ERROR_TYPE(err)!= E_NOT_SUPPORTED) 2277296177Sjhibbits RETURN_ERROR(MAJOR, err, ("This index has to be UnInitialized for the node of the type IC_INDEX_HASH according to settings of GlobalMask")); 2278296177Sjhibbits } 2279296177Sjhibbits } 2280296177Sjhibbits *isKeyTblAlloc = FALSE; 2281296177Sjhibbits memcpy(PTR_MOVE(p_FmPcdCcNode->p_GlblMask, 2), &glblMask, 2); 2282296177Sjhibbits 2283296177Sjhibbits return E_OK; 2284296177Sjhibbits} 2285296177Sjhibbits 2286296177Sjhibbitst_Error FmPcdCcModifyNextEngineParamTree(t_Handle h_FmPcd, t_Handle h_FmPcdCcTree, uint8_t grpId, uint8_t index, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams, t_List *h_OldLst, t_List *h_NewLst, t_Handle *h_AdditionalParams) 2287296177Sjhibbits{ 2288296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree; 2289296177Sjhibbits t_Error err = E_OK; 2290296177Sjhibbits uint16_t keyIndex; 2291296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams; 2292296177Sjhibbits 2293296177Sjhibbits SANITY_CHECK_RETURN_ERROR((grpId <= 7),E_INVALID_VALUE); 2294296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree,E_INVALID_VALUE); 2295296177Sjhibbits 2296296177Sjhibbits if(grpId >= p_FmPcdCcTree->numOfGrps) 2297296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("grpId you asked > numOfGroup of relevant tree")); 2298296177Sjhibbits 2299296177Sjhibbits if(index >= p_FmPcdCcTree->fmPcdGroupParam[grpId].numOfEntriesInGroup) 2300296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("index > numOfEntriesInGroup")); 2301296177Sjhibbits 2302296177Sjhibbits keyIndex = (uint16_t)(p_FmPcdCcTree->fmPcdGroupParam[grpId].baseGroupEntry + index); 2303296177Sjhibbits 2304296177Sjhibbits err = ModifyKeyCommonPart1(h_FmPcdCcTree, keyIndex, h_AdditionalParams, e_MODIFY_STATE_CHANGE, TRUE, TRUE); 2305296177Sjhibbits if(err) 2306296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2307296177Sjhibbits 2308296177Sjhibbits p_ModifyKeyParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_AdditionalParams; 2309296177Sjhibbits p_ModifyKeyParams->tree = TRUE; 2310296177Sjhibbits 2311296177Sjhibbits err = BuildNewNodeModifyNextEngine (h_FmPcd, h_FmPcdCcTree, keyIndex,p_FmPcdCcNextEngineParams, h_OldLst, h_NewLst, p_ModifyKeyParams); 2312296177Sjhibbits if(err) 2313296177Sjhibbits { 2314296177Sjhibbits XX_Free(p_ModifyKeyParams); 2315296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2316296177Sjhibbits } 2317296177Sjhibbits return E_OK; 2318296177Sjhibbits 2319296177Sjhibbits} 2320296177Sjhibbits 2321296177Sjhibbitst_Error FmPcdCcRemoveKey(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode, uint8_t keyIndex, t_List *h_OldLst, t_List *h_NewLst, t_Handle *h_AdditionalParams) 2322296177Sjhibbits{ 2323296177Sjhibbits 2324296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *) h_FmPcdCcNode; 2325296177Sjhibbits t_Error err = E_OK; 2326296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams; 2327296177Sjhibbits 2328296177Sjhibbits if(keyIndex >= p_FmPcdCcNode->numOfKeys) 2329296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("impossible to remove key when numOfKeys <= keyIndex")); 2330296177Sjhibbits 2331296177Sjhibbits if(!p_FmPcdCcNode->numOfKeys) 2332296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("keyIndex you asked > numOfKeys of relevant node that was initialized")); 2333296177Sjhibbits 2334296177Sjhibbits if(p_FmPcdCcNode->h_FmPcd != h_FmPcd) 2335296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is diferent from one which was assigned to the node in the Init time")); 2336296177Sjhibbits 2337296177Sjhibbits err = ModifyKeyCommonPart1(p_FmPcdCcNode, keyIndex, h_AdditionalParams, e_MODIFY_STATE_REMOVE, TRUE, FALSE); 2338296177Sjhibbits if(err) 2339296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2340296177Sjhibbits 2341296177Sjhibbits p_ModifyKeyParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_AdditionalParams; 2342296177Sjhibbits err = BuildNewNodeRemoveKey (p_FmPcdCcNode, keyIndex, p_ModifyKeyParams); 2343296177Sjhibbits if(err) 2344296177Sjhibbits { 2345296177Sjhibbits XX_Free(p_ModifyKeyParams); 2346296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2347296177Sjhibbits } 2348296177Sjhibbits 2349296177Sjhibbits err = UpdatePtrWhichPointOnCrntMdfNode(p_FmPcdCcNode, p_ModifyKeyParams, h_OldLst, h_NewLst); 2350296177Sjhibbits if(err) 2351296177Sjhibbits { 2352296177Sjhibbits ReleaseNewNodeCommonPart(p_ModifyKeyParams); 2353296177Sjhibbits XX_Free(p_ModifyKeyParams); 2354296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2355296177Sjhibbits } 2356296177Sjhibbits 2357296177Sjhibbits return E_OK; 2358296177Sjhibbits 2359296177Sjhibbits} 2360296177Sjhibbits 2361296177Sjhibbitst_Error FmPcdCcModifyKey(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode, uint8_t keyIndex, uint8_t keySize, uint8_t *p_Key, uint8_t *p_Mask, t_List *h_OldLst, t_List *h_NewLst,t_Handle *h_AdditionalParams) 2362296177Sjhibbits{ 2363296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_FmPcdCcNode; 2364296177Sjhibbits t_Error err = E_OK; 2365296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams; 2366296177Sjhibbits 2367296177Sjhibbits if(keyIndex >= p_FmPcdCcNode->numOfKeys) 2368296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex > previousely cleared last index + 1")); 2369296177Sjhibbits 2370296177Sjhibbits if((p_FmPcdCcNode->numOfKeys + 1) > FM_PCD_MAX_NUM_OF_CC_NODES) 2371296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfKeys with new key can not be larger than 255")); 2372296177Sjhibbits 2373296177Sjhibbits if(keySize != p_FmPcdCcNode->userSizeOfExtraction) 2374296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("size for ModifyKey has to be the same as defined in SetNode")); 2375296177Sjhibbits 2376296177Sjhibbits if(p_FmPcdCcNode->h_FmPcd != h_FmPcd) 2377296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is diferent from one which was assigned to the node in the Init time")); 2378296177Sjhibbits 2379296177Sjhibbits err = ModifyKeyCommonPart1(p_FmPcdCcNode, keyIndex, h_AdditionalParams, e_MODIFY_STATE_CHANGE, TRUE, FALSE); 2380296177Sjhibbits if(err) 2381296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2382296177Sjhibbits 2383296177Sjhibbits p_ModifyKeyParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_AdditionalParams; 2384296177Sjhibbits 2385296177Sjhibbits err = BuildNewNodeModifyKey (p_FmPcdCcNode, keyIndex, p_Key, p_Mask, p_ModifyKeyParams); 2386296177Sjhibbits if(err) 2387296177Sjhibbits { 2388296177Sjhibbits XX_Free(p_ModifyKeyParams); 2389296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2390296177Sjhibbits } 2391296177Sjhibbits 2392296177Sjhibbits err = UpdatePtrWhichPointOnCrntMdfNode(p_FmPcdCcNode, p_ModifyKeyParams, h_OldLst, h_NewLst); 2393296177Sjhibbits if(err) 2394296177Sjhibbits { 2395296177Sjhibbits ReleaseNewNodeCommonPart(p_ModifyKeyParams); 2396296177Sjhibbits XX_Free(p_ModifyKeyParams); 2397296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2398296177Sjhibbits } 2399296177Sjhibbits return E_OK; 2400296177Sjhibbits} 2401296177Sjhibbits 2402296177Sjhibbits 2403296177Sjhibbitst_Error FmPcdCcModiyNextEngineParamNode(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode, uint8_t keyIndex,t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,t_List *h_OldPointer, t_List *h_NewPointer,t_Handle *h_AdditionalParams) 2404296177Sjhibbits{ 2405296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_FmPcdCcNode; 2406296177Sjhibbits t_Error err = E_OK; 2407296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams; 2408296177Sjhibbits 2409296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_VALUE); 2410296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNode,E_INVALID_HANDLE); 2411296177Sjhibbits 2412296177Sjhibbits if(keyIndex >= p_FmPcdCcNode->numOfKeys) 2413296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex > previousely cleared last index + 1")); 2414296177Sjhibbits 2415296177Sjhibbits if((p_FmPcdCcNode->numOfKeys + 1) > FM_PCD_MAX_NUM_OF_CC_NODES) 2416296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfKeys with new key can not be larger than 255")); 2417296177Sjhibbits 2418296177Sjhibbits err = ModifyKeyCommonPart1(p_FmPcdCcNode, keyIndex, h_AdditionalParams, e_MODIFY_STATE_CHANGE, FALSE, FALSE); 2419296177Sjhibbits if(err) 2420296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2421296177Sjhibbits 2422296177Sjhibbits p_ModifyKeyParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_AdditionalParams; 2423296177Sjhibbits 2424296177Sjhibbits err = BuildNewNodeModifyNextEngine (h_FmPcd, p_FmPcdCcNode, keyIndex,p_FmPcdCcNextEngineParams, h_OldPointer, h_NewPointer, p_ModifyKeyParams); 2425296177Sjhibbits if(err) 2426296177Sjhibbits { 2427296177Sjhibbits XX_Free(p_ModifyKeyParams); 2428296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2429296177Sjhibbits } 2430296177Sjhibbits return E_OK; 2431296177Sjhibbits} 2432296177Sjhibbits 2433296177Sjhibbitst_Error FmPcdCcModifyMissNextEngineParamNode(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,t_List *h_OldPointer, t_List *h_NewPointer,t_Handle *h_AdditionalParams) 2434296177Sjhibbits{ 2435296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_FmPcdCcNode; 2436296177Sjhibbits t_Error err = E_OK; 2437296177Sjhibbits uint16_t keyIndex; 2438296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams; 2439296177Sjhibbits 2440296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNode,E_INVALID_VALUE); 2441296177Sjhibbits 2442296177Sjhibbits keyIndex = p_FmPcdCcNode->numOfKeys; 2443296177Sjhibbits 2444296177Sjhibbits err = ModifyKeyCommonPart1(p_FmPcdCcNode, keyIndex, h_AdditionalParams, e_MODIFY_STATE_CHANGE, TRUE, FALSE); 2445296177Sjhibbits if(err) 2446296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2447296177Sjhibbits 2448296177Sjhibbits p_ModifyKeyParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_AdditionalParams; 2449296177Sjhibbits 2450296177Sjhibbits err = BuildNewNodeModifyNextEngine (h_FmPcd, p_FmPcdCcNode, keyIndex,p_FmPcdCcNextEngineParams, h_OldPointer, h_NewPointer, p_ModifyKeyParams); 2451296177Sjhibbits if(err) 2452296177Sjhibbits { 2453296177Sjhibbits XX_Free(p_ModifyKeyParams); 2454296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2455296177Sjhibbits } 2456296177Sjhibbits 2457296177Sjhibbits return E_OK; 2458296177Sjhibbits} 2459296177Sjhibbits 2460296177Sjhibbitst_Error FmPcdCcAddKey(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode, uint8_t keyIndex, uint8_t keySize, t_FmPcdCcKeyParams *p_FmPcdCcKeyParams, t_List *h_OldLst, t_List *h_NewLst, t_Handle *h_AdditionalParams) 2461296177Sjhibbits{ 2462296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_FmPcdCcNode; 2463296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams; 2464296177Sjhibbits t_Error err = E_OK; 2465296177Sjhibbits 2466296177Sjhibbits if(keyIndex > p_FmPcdCcNode->numOfKeys) 2467296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex > previousely cleared last index + 1")); 2468296177Sjhibbits 2469296177Sjhibbits if((p_FmPcdCcNode->numOfKeys + 1) > FM_PCD_MAX_NUM_OF_CC_NODES) 2470296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfKeys with new key can not be larger than 255")); 2471296177Sjhibbits 2472296177Sjhibbits if(keySize != p_FmPcdCcNode->userSizeOfExtraction) 2473296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be defined as it was defined in initialization step.")); 2474296177Sjhibbits 2475296177Sjhibbits if(p_FmPcdCcNode->h_FmPcd != h_FmPcd) 2476296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is diferent from one which was assigned to the node in the Init time")); 2477296177Sjhibbits 2478296177Sjhibbits err = ModifyKeyCommonPart1(p_FmPcdCcNode, keyIndex, h_AdditionalParams, e_MODIFY_STATE_ADD, TRUE, FALSE); 2479296177Sjhibbits if(err) 2480296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2481296177Sjhibbits 2482296177Sjhibbits p_ModifyKeyParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_AdditionalParams; 2483296177Sjhibbits err = BuildNewNodeAddOrMdfyKeyAndNextEngine (h_FmPcd, p_FmPcdCcNode, keyIndex, p_FmPcdCcKeyParams, p_ModifyKeyParams, TRUE); 2484296177Sjhibbits if(err) 2485296177Sjhibbits { 2486296177Sjhibbits XX_Free(p_ModifyKeyParams); 2487296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2488296177Sjhibbits } 2489296177Sjhibbits 2490296177Sjhibbits err = UpdatePtrWhichPointOnCrntMdfNode(p_FmPcdCcNode, p_ModifyKeyParams, h_OldLst, h_NewLst); 2491296177Sjhibbits if(err) 2492296177Sjhibbits { 2493296177Sjhibbits ReleaseNewNodeCommonPart(p_ModifyKeyParams); 2494296177Sjhibbits XX_Free(p_ModifyKeyParams); 2495296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2496296177Sjhibbits } 2497296177Sjhibbits 2498296177Sjhibbits return E_OK; 2499296177Sjhibbits} 2500296177Sjhibbits 2501296177Sjhibbitst_Error FmPcdCcModifyKeyAndNextEngine(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode, uint8_t keyIndex, uint8_t keySize, t_FmPcdCcKeyParams *p_FmPcdCcKeyParams, t_List *h_OldLst, t_List *h_NewLst, t_Handle *h_AdditionalParams) 2502296177Sjhibbits{ 2503296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_FmPcdCcNode; 2504296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams; 2505296177Sjhibbits t_Error err = E_OK; 2506296177Sjhibbits 2507296177Sjhibbits if(keyIndex > p_FmPcdCcNode->numOfKeys) 2508296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex > previousely cleared last index + 1")); 2509296177Sjhibbits 2510296177Sjhibbits if((p_FmPcdCcNode->numOfKeys + 1) > FM_PCD_MAX_NUM_OF_CC_NODES) 2511296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfKeys with new key can not be larger than 255")); 2512296177Sjhibbits 2513296177Sjhibbits if(keySize != p_FmPcdCcNode->userSizeOfExtraction) 2514296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be defined as it was defined in initialization step")); 2515296177Sjhibbits 2516296177Sjhibbits if(p_FmPcdCcNode->h_FmPcd != h_FmPcd) 2517296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is diferent from one which was assigned to the node in the Init time")); 2518296177Sjhibbits 2519296177Sjhibbits err = ModifyKeyCommonPart1(p_FmPcdCcNode, keyIndex, h_AdditionalParams, e_MODIFY_STATE_CHANGE, TRUE, FALSE); 2520296177Sjhibbits if(err) 2521296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2522296177Sjhibbits 2523296177Sjhibbits p_ModifyKeyParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_AdditionalParams; 2524296177Sjhibbits 2525296177Sjhibbits err = BuildNewNodeAddOrMdfyKeyAndNextEngine (h_FmPcd, p_FmPcdCcNode, keyIndex, p_FmPcdCcKeyParams, p_ModifyKeyParams, FALSE); 2526296177Sjhibbits if(err) 2527296177Sjhibbits { 2528296177Sjhibbits ReleaseNewNodeCommonPart(p_ModifyKeyParams); 2529296177Sjhibbits XX_Free(p_ModifyKeyParams); 2530296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2531296177Sjhibbits } 2532296177Sjhibbits 2533296177Sjhibbits err = UpdatePtrWhichPointOnCrntMdfNode(p_FmPcdCcNode, p_ModifyKeyParams, h_OldLst, h_NewLst); 2534296177Sjhibbits if(err) 2535296177Sjhibbits { 2536296177Sjhibbits ReleaseNewNodeCommonPart(p_ModifyKeyParams); 2537296177Sjhibbits XX_Free(p_ModifyKeyParams); 2538296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 2539296177Sjhibbits } 2540296177Sjhibbits 2541296177Sjhibbits return E_OK; 2542296177Sjhibbits} 2543296177Sjhibbits 2544296177Sjhibbitst_Error FmPcdCcReleaseModifiedDataStructure(t_Handle h_FmPcd, t_List *h_FmPcdOldPointersLst, t_List *h_FmPcdNewPointersLst, uint16_t numOfGoodChanges, t_Handle *h_Params) 2545296177Sjhibbits{ 2546296177Sjhibbits t_FmPcdModifyCcKeyAdditionalParams *p_CcNewModifyAdditionalParams = (t_FmPcdModifyCcKeyAdditionalParams *)*h_Params; 2547296177Sjhibbits t_List *p_Pos; 2548296177Sjhibbits t_Error err = E_OK; 2549296177Sjhibbits t_CcNodeInformation ccNodeInfo, *p_CcNodeInformation; 2550296177Sjhibbits t_Handle h_Muram; 2551296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNextNode; 2552296177Sjhibbits t_List *p_UpdateLst; 2553296177Sjhibbits 2554296177Sjhibbits UNUSED(numOfGoodChanges); 2555296177Sjhibbits 2556296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_HANDLE); 2557296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_CcNewModifyAdditionalParams->h_CurrentNode,E_INVALID_HANDLE); 2558296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcdOldPointersLst,E_INVALID_HANDLE); 2559296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcdNewPointersLst,E_INVALID_HANDLE); 2560296177Sjhibbits SANITY_CHECK_RETURN_ERROR((numOfGoodChanges == LIST_NumOfObjs(h_FmPcdOldPointersLst)),E_INVALID_STATE); 2561296177Sjhibbits SANITY_CHECK_RETURN_ERROR((numOfGoodChanges == LIST_NumOfObjs(h_FmPcdNewPointersLst)),E_INVALID_STATE); 2562296177Sjhibbits SANITY_CHECK_RETURN_ERROR((LIST_NumOfObjs(h_FmPcdOldPointersLst) == LIST_NumOfObjs(h_FmPcdNewPointersLst)),E_INVALID_STATE); 2563296177Sjhibbits 2564296177Sjhibbits /*we don't update subtree of the new node with new tree because it was done in the previose stage*/ 2565296177Sjhibbits if(p_CcNewModifyAdditionalParams->h_NodeForAdd) 2566296177Sjhibbits { 2567296177Sjhibbits p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_CcNewModifyAdditionalParams->h_NodeForAdd; 2568296177Sjhibbits if(!p_CcNewModifyAdditionalParams->tree) 2569296177Sjhibbits p_UpdateLst = &p_FmPcdCcNextNode->ccPrevNodesLst; 2570296177Sjhibbits else 2571296177Sjhibbits p_UpdateLst = &p_FmPcdCcNextNode->ccTreeIdLst; 2572296177Sjhibbits p_CcNodeInformation = FindNodeInfoInReleventLst(p_UpdateLst, p_CcNewModifyAdditionalParams->h_CurrentNode); 2573296177Sjhibbits if(p_CcNodeInformation) 2574296177Sjhibbits p_CcNodeInformation->index++; 2575296177Sjhibbits else 2576296177Sjhibbits { 2577296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 2578296177Sjhibbits ccNodeInfo.h_CcNode = (t_Handle)p_CcNewModifyAdditionalParams->h_CurrentNode; 2579296177Sjhibbits ccNodeInfo.index = 1; 2580296177Sjhibbits EnqueueNodeInfoToRelevantLst(p_UpdateLst, &ccNodeInfo); 2581296177Sjhibbits } 2582296177Sjhibbits } 2583296177Sjhibbits 2584296177Sjhibbits if(p_CcNewModifyAdditionalParams->h_NodeForRmv) 2585296177Sjhibbits { 2586296177Sjhibbits 2587296177Sjhibbits p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_CcNewModifyAdditionalParams->h_NodeForRmv; 2588296177Sjhibbits if(!p_CcNewModifyAdditionalParams->tree) 2589296177Sjhibbits { 2590296177Sjhibbits p_UpdateLst = &p_FmPcdCcNextNode->ccPrevNodesLst; 2591296177Sjhibbits LIST_FOR_EACH(p_Pos, &p_FmPcdCcNextNode->ccTreesLst) 2592296177Sjhibbits { 2593296177Sjhibbits p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos); 2594296177Sjhibbits ASSERT_COND(p_CcNodeInformation->h_CcNode); 2595296177Sjhibbits err = FmPcdCcSetRequiredAction(h_FmPcd, 2596296177Sjhibbits UPDATE_CC_WITH_DELETE_TREE, 2597296177Sjhibbits &((t_FmPcdCcNode *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->nextEngineAndRequiredAction[p_CcNewModifyAdditionalParams->keyIndex], 2598296177Sjhibbits PTR_MOVE(((t_FmPcdCcNode *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->h_AdTable, p_CcNewModifyAdditionalParams->keyIndex*FM_PCD_CC_AD_ENTRY_SIZE), 2599296177Sjhibbits 1, 2600296177Sjhibbits p_CcNodeInformation->h_CcNode); 2601296177Sjhibbits } 2602296177Sjhibbits } 2603296177Sjhibbits else 2604296177Sjhibbits { 2605296177Sjhibbits p_UpdateLst = &p_FmPcdCcNextNode->ccTreeIdLst; 2606296177Sjhibbits err = FmPcdCcSetRequiredAction(h_FmPcd, 2607296177Sjhibbits UPDATE_CC_WITH_DELETE_TREE, 2608296177Sjhibbits &((t_FmPcdCcTree *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->nextEngineAndRequiredAction[p_CcNewModifyAdditionalParams->keyIndex], 2609296177Sjhibbits UINT_TO_PTR(((t_FmPcdCcTree *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->ccTreeBaseAddr + p_CcNewModifyAdditionalParams->keyIndex*FM_PCD_CC_AD_ENTRY_SIZE), 2610296177Sjhibbits 1, 2611296177Sjhibbits p_CcNewModifyAdditionalParams->h_CurrentNode); 2612296177Sjhibbits } 2613296177Sjhibbits if(err) 2614296177Sjhibbits return err; 2615296177Sjhibbits 2616296177Sjhibbits /*we remove from the subtree of the removed node tree because it wasn't done in the previose stage*/ 2617296177Sjhibbits /*update ccPrevNodesLst or ccTreeIdLst of the removed node*/ 2618296177Sjhibbits /*update of the nodeOwner*/ 2619296177Sjhibbits p_CcNodeInformation = FindNodeInfoInReleventLst(p_UpdateLst, p_CcNewModifyAdditionalParams->h_CurrentNode); 2620296177Sjhibbits ASSERT_COND(p_CcNodeInformation); 2621296177Sjhibbits ASSERT_COND(p_CcNodeInformation->index); 2622296177Sjhibbits p_CcNodeInformation->index--; 2623296177Sjhibbits if(p_CcNodeInformation->index == 0) 2624296177Sjhibbits DequeueNodeInfoFromRelevantLst(p_UpdateLst,p_CcNewModifyAdditionalParams->h_CurrentNode); 2625296177Sjhibbits ASSERT_COND(LIST_NumOfObjs(&p_FmPcdCcNextNode->ccTreesLst) == 1); 2626296177Sjhibbits UpdateNodeOwner(p_FmPcdCcNextNode, FALSE); 2627296177Sjhibbits } 2628296177Sjhibbits 2629296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2630296177Sjhibbits if(p_CcNewModifyAdditionalParams->h_ManipForRmv) 2631296177Sjhibbits FmPcdManipUpdateOwner(p_CcNewModifyAdditionalParams->h_ManipForRmv, FALSE); 2632296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2633296177Sjhibbits 2634296177Sjhibbits h_Muram = FmPcdGetMuramHandle(h_FmPcd); 2635296177Sjhibbits ASSERT_COND(h_Muram); 2636296177Sjhibbits 2637296177Sjhibbits /*we release new AD which was allocated and updated for copy from to actual AD*/ 2638296177Sjhibbits LIST_FOR_EACH(p_Pos, h_FmPcdNewPointersLst) 2639296177Sjhibbits { 2640296177Sjhibbits p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos); 2641296177Sjhibbits ASSERT_COND(p_CcNodeInformation->h_CcNode); 2642296177Sjhibbits FM_MURAM_FreeMem(h_Muram, p_CcNodeInformation->h_CcNode); 2643296177Sjhibbits 2644296177Sjhibbits } 2645296177Sjhibbits 2646296177Sjhibbits /*free Old data structure if it has to be freed - new data structure was allocated*/ 2647296177Sjhibbits if(p_CcNewModifyAdditionalParams->p_AdTableOld) 2648296177Sjhibbits FM_MURAM_FreeMem(h_Muram,p_CcNewModifyAdditionalParams->p_AdTableOld); 2649296177Sjhibbits if(p_CcNewModifyAdditionalParams->p_KeysMatchTableOld) 2650296177Sjhibbits FM_MURAM_FreeMem(h_Muram,p_CcNewModifyAdditionalParams->p_KeysMatchTableOld); 2651296177Sjhibbits 2652296177Sjhibbits /*update current modified node with changed fields if it's required*/ 2653296177Sjhibbits if(!p_CcNewModifyAdditionalParams->tree) 2654296177Sjhibbits { 2655296177Sjhibbits if(p_CcNewModifyAdditionalParams->p_AdTableNew) 2656296177Sjhibbits ((t_FmPcdCcNode *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->h_AdTable = p_CcNewModifyAdditionalParams->p_AdTableNew; 2657296177Sjhibbits if(p_CcNewModifyAdditionalParams->numOfKeys) 2658296177Sjhibbits ((t_FmPcdCcNode *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->numOfKeys = p_CcNewModifyAdditionalParams->numOfKeys; 2659296177Sjhibbits if(p_CcNewModifyAdditionalParams->p_KeysMatchTableNew) 2660296177Sjhibbits ((t_FmPcdCcNode *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->h_KeysMatchTable = p_CcNewModifyAdditionalParams->p_KeysMatchTableNew; 2661296177Sjhibbits memcpy(((t_FmPcdCcNode *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->nextEngineAndRequiredAction, &p_CcNewModifyAdditionalParams->nextEngineAndRequiredAction, sizeof(t_FmPcdCcNextEngineAndRequiredActionParams) * (FM_PCD_MAX_NUM_OF_KEYS)); 2662296177Sjhibbits } 2663296177Sjhibbits else 2664296177Sjhibbits memcpy(&((t_FmPcdCcTree *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->nextEngineAndRequiredAction, &p_CcNewModifyAdditionalParams->nextEngineAndRequiredAction, sizeof(t_FmPcdCcNextEngineAndRequiredActionParams) * (((t_FmPcdCcTree *)(p_CcNewModifyAdditionalParams->h_CurrentNode))->numOfEntries)); 2665296177Sjhibbits 2666296177Sjhibbits ReleaseLst(h_FmPcdOldPointersLst); 2667296177Sjhibbits ReleaseLst(h_FmPcdNewPointersLst); 2668296177Sjhibbits XX_Free(p_CcNewModifyAdditionalParams); 2669296177Sjhibbits 2670296177Sjhibbits return E_OK; 2671296177Sjhibbits} 2672296177Sjhibbits 2673296177Sjhibbitsuint32_t FmPcdCcGetNodeAddrOffsetFromNodeInfo(t_Handle h_FmPcd, t_Handle h_Pointer) 2674296177Sjhibbits{ 2675296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 2676296177Sjhibbits t_CcNodeInformation *p_CcNodeInfo; 2677296177Sjhibbits 2678296177Sjhibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE, (uint32_t)ILLEGAL_BASE); 2679296177Sjhibbits 2680296177Sjhibbits p_CcNodeInfo = CC_NODE_F_OBJECT(h_Pointer); 2681296177Sjhibbits return (uint32_t)(XX_VirtToPhys(p_CcNodeInfo->h_CcNode) - p_FmPcd->physicalMuramBase); 2682296177Sjhibbits} 2683296177Sjhibbits 2684296177Sjhibbitst_Error FmPcdCcGetGrpParams(t_Handle h_FmPcdCcTree, uint8_t grpId, uint32_t *p_GrpBits, uint8_t *p_GrpBase) 2685296177Sjhibbits{ 2686296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *) h_FmPcdCcTree; 2687296177Sjhibbits 2688296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree, E_INVALID_HANDLE); 2689296177Sjhibbits 2690296177Sjhibbits if(grpId >= p_FmPcdCcTree->numOfGrps) 2691296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("grpId you asked > numOfGroup of relevant tree")); 2692296177Sjhibbits *p_GrpBits = p_FmPcdCcTree->fmPcdGroupParam[grpId].totalBitsMask; 2693296177Sjhibbits *p_GrpBase = p_FmPcdCcTree->fmPcdGroupParam[grpId].baseGroupEntry; 2694296177Sjhibbits return E_OK; 2695296177Sjhibbits} 2696296177Sjhibbits 2697296177Sjhibbitst_Error FmPcdCcBindTree(t_Handle h_FmPcd, t_Handle h_FmPcdCcTree, uint32_t *p_Offset, t_Handle h_FmPort) 2698296177Sjhibbits{ 2699296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 2700296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree; 2701296177Sjhibbits t_Error err = E_OK; 2702296177Sjhibbits 2703296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd,E_INVALID_HANDLE); 2704296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcdCcTree,E_INVALID_STATE); 2705296177Sjhibbits 2706296177Sjhibbits FmPcdCcUpdateTreeOwner(p_FmPcdCcTree, TRUE); 2707296177Sjhibbits 2708296177Sjhibbits *p_Offset = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr)) - 2709296177Sjhibbits p_FmPcd->physicalMuramBase); 2710296177Sjhibbits 2711296177Sjhibbits err = CcUpdateParams(h_FmPcd, h_FmPort, h_FmPcdCcTree, TRUE); 2712296177Sjhibbits 2713296177Sjhibbits return err; 2714296177Sjhibbits} 2715296177Sjhibbits 2716296177Sjhibbitst_Error FmPcdCcUnbindTree(t_Handle h_FmPcd, t_Handle h_FmPcdCcTree) 2717296177Sjhibbits{ 2718296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree; 2719296177Sjhibbits 2720296177Sjhibbits UNUSED(h_FmPcd); 2721296177Sjhibbits 2722296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcdCcTree,E_INVALID_HANDLE); 2723296177Sjhibbits 2724296177Sjhibbits FmPcdCcUpdateTreeOwner(p_FmPcdCcTree, FALSE); 2725296177Sjhibbits 2726296177Sjhibbits return E_OK; 2727296177Sjhibbits} 2728296177Sjhibbits 2729296177Sjhibbitst_Error FmPcdCcTreeTryLock(t_Handle h_FmPcdCcTree) 2730296177Sjhibbits{ 2731296177Sjhibbits if (TRY_LOCK(NULL, &((t_FmPcdCcTree *)h_FmPcdCcTree)->lock)) 2732296177Sjhibbits return E_OK; 2733296177Sjhibbits return ERROR_CODE(E_BUSY); 2734296177Sjhibbits} 2735296177Sjhibbits 2736296177Sjhibbitst_Error FmPcdCcNodeTreeTryLock(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode, t_List *p_List) 2737296177Sjhibbits{ 2738296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_FmPcdCcNode; 2739296177Sjhibbits t_List *p_Pos; 2740296177Sjhibbits t_CcNodeInformation *p_CcNodeInfo, nodeInfo; 2741296177Sjhibbits t_Error err = E_OK; 2742296177Sjhibbits 2743296177Sjhibbits UNUSED(h_FmPcd); 2744296177Sjhibbits 2745296177Sjhibbits if(LIST_IsEmpty(&p_FmPcdCcNode->ccTreesLst)) 2746296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("asked for more nodes in CC than MAX")) ; 2747296177Sjhibbits LIST_FOR_EACH(p_Pos, &p_FmPcdCcNode->ccTreesLst) 2748296177Sjhibbits { 2749296177Sjhibbits p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos); 2750296177Sjhibbits ASSERT_COND(p_CcNodeInfo->h_CcNode); 2751296177Sjhibbits err = FmPcdCcTreeTryLock(p_CcNodeInfo->h_CcNode); 2752296177Sjhibbits if(err == E_OK) 2753296177Sjhibbits { 2754296177Sjhibbits memset(&nodeInfo, 0, sizeof(t_CcNodeInformation)); 2755296177Sjhibbits nodeInfo.h_CcNode = p_CcNodeInfo->h_CcNode; 2756296177Sjhibbits EnqueueNodeInfoToRelevantLst(p_List, &nodeInfo); 2757296177Sjhibbits } 2758296177Sjhibbits else 2759296177Sjhibbits FmPcdCcNodeTreeReleaseLock(p_List); 2760296177Sjhibbits } 2761296177Sjhibbits 2762296177Sjhibbits return err; 2763296177Sjhibbits} 2764296177Sjhibbits 2765296177Sjhibbitst_Handle FM_PCD_CcBuildTree(t_Handle h_FmPcd, t_FmPcdCcTreeParams *p_PcdGroupsParam) 2766296177Sjhibbits{ 2767296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 2768296177Sjhibbits t_Error err = E_OK; 2769296177Sjhibbits int i = 0, j = 0, k = 0; 2770296177Sjhibbits t_FmPcdCcTree *p_FmPcdCcTree; 2771296177Sjhibbits uint8_t numOfEntries; 2772296177Sjhibbits t_Handle p_CcTreeTmp; 2773296177Sjhibbits t_FmPcdCcGrpParams *p_FmPcdCcGroupParams; 2774296177Sjhibbits t_FmPcdCcNextEngineAndRequiredActionParams params[16]; 2775296177Sjhibbits t_NetEnvParams netEnvParams; 2776296177Sjhibbits uint8_t lastOne = 0; 2777296177Sjhibbits uint32_t requiredAction = 0; 2778296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNextNode; 2779296177Sjhibbits t_CcNodeInformation ccNodeInfo, *p_CcInformation; 2780296177Sjhibbits 2781296177Sjhibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE, NULL); 2782296177Sjhibbits SANITY_CHECK_RETURN_VALUE(p_PcdGroupsParam,E_INVALID_HANDLE, NULL); 2783296177Sjhibbits 2784296177Sjhibbits if (p_PcdGroupsParam->numOfGrps > FM_PCD_MAX_NUM_OF_CC_GROUPS) 2785296177Sjhibbits { 2786296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("numOfGrps should not exceed %d", FM_PCD_MAX_NUM_OF_CC_GROUPS)); 2787296177Sjhibbits return NULL; 2788296177Sjhibbits } 2789296177Sjhibbits 2790296177Sjhibbits p_FmPcdCcTree = (t_FmPcdCcTree*)XX_Malloc(sizeof(t_FmPcdCcTree)); 2791296177Sjhibbits if(!p_FmPcdCcTree) 2792296177Sjhibbits { 2793296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("PCD tree structure")); 2794296177Sjhibbits return NULL; 2795296177Sjhibbits } 2796296177Sjhibbits memset(p_FmPcdCcTree, 0, sizeof(t_FmPcdCcTree)) ; 2797296177Sjhibbits memset(params, 0, 16 * sizeof(t_FmPcdCcNextEngineParams)); 2798296177Sjhibbits 2799296177Sjhibbits INIT_LIST(&p_FmPcdCcTree->fmPortsLst); 2800296177Sjhibbits 2801296177Sjhibbits numOfEntries = 0; 2802296177Sjhibbits p_FmPcdCcTree->netEnvId = (uint8_t)(PTR_TO_UINT(p_PcdGroupsParam->h_NetEnv)-1); 2803296177Sjhibbits for(i = 0; i < p_PcdGroupsParam->numOfGrps; i++) 2804296177Sjhibbits { 2805296177Sjhibbits p_FmPcdCcGroupParams = &p_PcdGroupsParam->ccGrpParams[i]; 2806296177Sjhibbits 2807296177Sjhibbits if (p_FmPcdCcGroupParams->numOfDistinctionUnits > FM_PCD_MAX_NUM_OF_CC_UNITS) 2808296177Sjhibbits { 2809296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2810296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, 2811296177Sjhibbits ("numOfDistinctionUnits (group %d) should not exceed %d", i, FM_PCD_MAX_NUM_OF_CC_UNITS)); 2812296177Sjhibbits return NULL; 2813296177Sjhibbits } 2814296177Sjhibbits 2815296177Sjhibbits p_FmPcdCcTree->fmPcdGroupParam[i].baseGroupEntry = numOfEntries; 2816296177Sjhibbits p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup =(uint8_t)( 0x01 << p_FmPcdCcGroupParams->numOfDistinctionUnits); 2817296177Sjhibbits numOfEntries += p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup; 2818296177Sjhibbits if(numOfEntries > 16) 2819296177Sjhibbits { 2820296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2821296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("numOfEntries can not be larger than 16")); 2822296177Sjhibbits return NULL; 2823296177Sjhibbits } 2824296177Sjhibbits if(lastOne) 2825296177Sjhibbits { 2826296177Sjhibbits if(p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup > lastOne) 2827296177Sjhibbits { 2828296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2829296177Sjhibbits REPORT_ERROR(MAJOR, E_CONFLICT, ("numOfEntries per group must be set in descending order")); 2830296177Sjhibbits return NULL; 2831296177Sjhibbits } 2832296177Sjhibbits } 2833296177Sjhibbits 2834296177Sjhibbits lastOne = p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup; 2835296177Sjhibbits 2836296177Sjhibbits netEnvParams.netEnvId = p_FmPcdCcTree->netEnvId; 2837296177Sjhibbits netEnvParams.numOfDistinctionUnits = p_FmPcdCcGroupParams->numOfDistinctionUnits; 2838296177Sjhibbits memcpy(netEnvParams.unitIds, &p_FmPcdCcGroupParams->unitIds, (sizeof(uint8_t)) * p_FmPcdCcGroupParams->numOfDistinctionUnits); 2839296177Sjhibbits err = PcdGetUnitsVector(p_FmPcd, &netEnvParams); 2840296177Sjhibbits if(err) 2841296177Sjhibbits { 2842296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2843296177Sjhibbits REPORT_ERROR(MAJOR, err, NO_MSG); 2844296177Sjhibbits return NULL; 2845296177Sjhibbits } 2846296177Sjhibbits 2847296177Sjhibbits p_FmPcdCcTree->fmPcdGroupParam[i].totalBitsMask = netEnvParams.vector; 2848296177Sjhibbits for(j = 0; j < p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup; j++) 2849296177Sjhibbits { 2850296177Sjhibbits err = ValidateNextEngineParams(h_FmPcd,&p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j]); 2851296177Sjhibbits if(err) 2852296177Sjhibbits { 2853296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2854296177Sjhibbits REPORT_ERROR(MAJOR, err, (NO_MSG)); 2855296177Sjhibbits return NULL; 2856296177Sjhibbits } 2857296177Sjhibbits 2858296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2859296177Sjhibbits if(p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j].h_Manip) 2860296177Sjhibbits { 2861296177Sjhibbits err = FmPcdManipCheckParamsForCcNextEgine(&p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j], &requiredAction); 2862296177Sjhibbits if(err) 2863296177Sjhibbits { 2864296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2865296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 2866296177Sjhibbits return NULL; 2867296177Sjhibbits } 2868296177Sjhibbits } 2869296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2870296177Sjhibbits 2871296177Sjhibbits memcpy(¶ms[k].nextEngineParams, &p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j], sizeof(t_FmPcdCcNextEngineParams)); 2872296177Sjhibbits requiredAction |= UPDATE_CC_WITH_TREE; 2873296177Sjhibbits params[k].requiredAction = requiredAction; 2874296177Sjhibbits k++; 2875296177Sjhibbits } 2876296177Sjhibbits } 2877296177Sjhibbits 2878296177Sjhibbits p_FmPcdCcTree->numOfEntries = (uint8_t)k; 2879296177Sjhibbits p_FmPcdCcTree->numOfGrps = p_PcdGroupsParam->numOfGrps; 2880296177Sjhibbits p_FmPcdCcTree->ccTreeBaseAddr = 2881296177Sjhibbits PTR_TO_UINT(FM_MURAM_AllocMem(FmPcdGetMuramHandle(h_FmPcd), 2882296177Sjhibbits (uint32_t)( k * FM_PCD_CC_AD_ENTRY_SIZE), 2883296177Sjhibbits FM_PCD_CC_AD_TABLE_ALIGN)); 2884296177Sjhibbits 2885296177Sjhibbits if(!p_FmPcdCcTree->ccTreeBaseAddr) 2886296177Sjhibbits { 2887296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2888296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory")); 2889296177Sjhibbits return NULL; 2890296177Sjhibbits } 2891296177Sjhibbits IOMemSet32(UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr), 0, (uint32_t)(k * FM_PCD_CC_AD_ENTRY_SIZE)); 2892296177Sjhibbits 2893296177Sjhibbits p_CcTreeTmp = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr); 2894296177Sjhibbits 2895296177Sjhibbits j = 0; 2896296177Sjhibbits for(i = 0; i < numOfEntries; i++) 2897296177Sjhibbits { 2898296177Sjhibbits NextStepAd(p_CcTreeTmp,¶ms[i].nextEngineParams,p_FmPcd); 2899296177Sjhibbits p_CcTreeTmp = PTR_MOVE(p_CcTreeTmp, FM_PCD_CC_AD_ENTRY_SIZE); 2900296177Sjhibbits memcpy(&p_FmPcdCcTree->nextEngineAndRequiredAction[i], ¶ms[i], sizeof(t_FmPcdCcNextEngineAndRequiredActionParams)); 2901296177Sjhibbits if(p_FmPcdCcTree->nextEngineAndRequiredAction[i].nextEngineParams.nextEngine== e_FM_PCD_CC) 2902296177Sjhibbits { 2903296177Sjhibbits p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_FmPcdCcTree->nextEngineAndRequiredAction[i].nextEngineParams.params.ccParams.h_CcNode; 2904296177Sjhibbits if(!IsNodeInModifiedState((t_Handle)p_FmPcdCcNextNode)) 2905296177Sjhibbits { 2906296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 2907296177Sjhibbits ccNodeInfo.h_CcNode = (t_Handle)p_FmPcdCcTree; 2908296177Sjhibbits ccNodeInfo.index = 1; 2909296177Sjhibbits EnqueueNodeInfoToRelevantLst(&p_FmPcdCcNextNode->ccTreeIdLst, &ccNodeInfo); 2910296177Sjhibbits UpdateNodeWithModifiedState((t_Handle)p_FmPcdCcNextNode, TRUE); 2911296177Sjhibbits } 2912296177Sjhibbits else 2913296177Sjhibbits { 2914296177Sjhibbits p_CcInformation = FindNodeInfoInReleventLst(&p_FmPcdCcNextNode->ccTreeIdLst,(t_Handle)p_FmPcdCcTree); 2915296177Sjhibbits ASSERT_COND(p_CcInformation); 2916296177Sjhibbits p_CcInformation->index++; 2917296177Sjhibbits } 2918296177Sjhibbits } 2919296177Sjhibbits } 2920296177Sjhibbits 2921296177Sjhibbits FmPcdIncNetEnvOwners(h_FmPcd, p_FmPcdCcTree->netEnvId); 2922296177Sjhibbits p_CcTreeTmp = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr); 2923296177Sjhibbits 2924296177Sjhibbits for(i = 0; i < p_FmPcdCcTree->numOfEntries ; i++) 2925296177Sjhibbits { 2926296177Sjhibbits if(p_FmPcdCcTree->nextEngineAndRequiredAction[i].nextEngineParams.nextEngine == e_FM_PCD_CC) 2927296177Sjhibbits { 2928296177Sjhibbits p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_FmPcdCcTree->nextEngineAndRequiredAction[i].nextEngineParams.params.ccParams.h_CcNode; 2929296177Sjhibbits 2930296177Sjhibbits if(IsNodeInModifiedState((t_Handle)p_FmPcdCcNextNode)) 2931296177Sjhibbits UpdateNodeWithModifiedState((t_Handle)p_FmPcdCcNextNode, FALSE); 2932296177Sjhibbits } 2933296177Sjhibbits } 2934296177Sjhibbits 2935296177Sjhibbits for(i = 0; i < numOfEntries; i++) 2936296177Sjhibbits { 2937296177Sjhibbits if(p_FmPcdCcTree->nextEngineAndRequiredAction[i].requiredAction) 2938296177Sjhibbits { 2939296177Sjhibbits err = FmPcdCcSetRequiredAction(h_FmPcd, p_FmPcdCcTree->nextEngineAndRequiredAction[i].requiredAction, &p_FmPcdCcTree->nextEngineAndRequiredAction[i], p_CcTreeTmp,1, p_FmPcdCcTree); 2940296177Sjhibbits if(err) 2941296177Sjhibbits { 2942296177Sjhibbits DeleteTree(p_FmPcdCcTree,p_FmPcd); 2943296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory")); 2944296177Sjhibbits return NULL; 2945296177Sjhibbits } 2946296177Sjhibbits p_CcTreeTmp = PTR_MOVE(p_CcTreeTmp, FM_PCD_CC_AD_ENTRY_SIZE); 2947296177Sjhibbits } 2948296177Sjhibbits } 2949296177Sjhibbits 2950296177Sjhibbits return p_FmPcdCcTree; 2951296177Sjhibbits} 2952296177Sjhibbits 2953296177Sjhibbitst_Error FM_PCD_CcDeleteTree(t_Handle h_FmPcd, t_Handle h_CcTree) 2954296177Sjhibbits{ 2955296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 2956296177Sjhibbits t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *)h_CcTree; 2957296177Sjhibbits int i= 0; 2958296177Sjhibbits 2959296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE); 2960296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_CcTree,E_INVALID_STATE); 2961296177Sjhibbits 2962296177Sjhibbits FmPcdDecNetEnvOwners(h_FmPcd, p_CcTree->netEnvId); 2963296177Sjhibbits 2964296177Sjhibbits if(p_CcTree->owners) 2965296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("the tree with this ID can not be removed because this tree is occupied, first - unbind this tree")); 2966296177Sjhibbits 2967296177Sjhibbits for(i = 0; i <p_CcTree->numOfEntries; i++) 2968296177Sjhibbits { 2969296177Sjhibbits if(p_CcTree->nextEngineAndRequiredAction[i].nextEngineParams.nextEngine == e_FM_PCD_CC) 2970296177Sjhibbits UpdateNodeOwner(p_CcTree->nextEngineAndRequiredAction[i].nextEngineParams.params.ccParams.h_CcNode, FALSE); 2971296177Sjhibbits } 2972296177Sjhibbits 2973296177Sjhibbits#ifdef FM_PCD_CC_MANIP 2974296177Sjhibbits for(i = 0; i < p_CcTree->numOfEntries; i++) 2975296177Sjhibbits { 2976296177Sjhibbits if(p_CcTree->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip) 2977296177Sjhibbits FmPcdManipUpdateOwner(p_CcTree->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip, FALSE); 2978296177Sjhibbits } 2979296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 2980296177Sjhibbits 2981296177Sjhibbits DeleteTree(p_CcTree, p_FmPcd); 2982296177Sjhibbits return E_OK; 2983296177Sjhibbits} 2984296177Sjhibbits 2985296177Sjhibbitst_Handle FM_PCD_CcSetNode(t_Handle h_FmPcd, t_FmPcdCcNodeParams *p_CcNodeParam) 2986296177Sjhibbits{ 2987296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *) h_FmPcd; 2988296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode, *p_FmPcdCcNextNode; 2989296177Sjhibbits t_Error err = E_OK; 2990296177Sjhibbits int tmp, size; 2991296177Sjhibbits bool glblMask = FALSE; 2992296177Sjhibbits t_FmPcdCcKeyParams *p_KeyParams; 2993296177Sjhibbits t_Handle p_KeysMatchTblTmp; 2994296177Sjhibbits t_Handle p_AdTableTmp; 2995296177Sjhibbits bool fullField = FALSE; 2996296177Sjhibbits ccPrivateInfo_t icCode = CC_PRIVATE_INFO_NONE; 2997296177Sjhibbits bool isKeyTblAlloc, fromIc = FALSE; 2998296177Sjhibbits t_CcNodeInformation ccNodeInfo, *p_CcInformation; 2999296177Sjhibbits 3000296177Sjhibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE,NULL); 3001296177Sjhibbits 3002296177Sjhibbits /* 3003296177Sjhibbits if (!p_CcNodeParam->keysParams.keySize || 3004296177Sjhibbits !p_CcNodeParam->keysParams.numOfKeys) 3005296177Sjhibbits { 3006296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("At least one key of keySize > 0 must be defined.")); 3007296177Sjhibbits return NULL; 3008296177Sjhibbits } 3009296177Sjhibbits */ 3010296177Sjhibbits p_FmPcdCcNode = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode)); 3011296177Sjhibbits if(!p_FmPcdCcNode) 3012296177Sjhibbits { 3013296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory")); 3014296177Sjhibbits return NULL; 3015296177Sjhibbits } 3016296177Sjhibbits memset(p_FmPcdCcNode, 0, sizeof(t_FmPcdCcNode)); 3017296177Sjhibbits 3018296177Sjhibbits p_FmPcdCcNode->p_GlblMask = (t_Handle)XX_Malloc(CC_GLBL_MASK_SIZE * sizeof(uint8_t)); 3019296177Sjhibbits memset(p_FmPcdCcNode->p_GlblMask, 0, CC_GLBL_MASK_SIZE * sizeof(uint8_t)); 3020296177Sjhibbits 3021296177Sjhibbits p_FmPcdCcNode->numOfKeys = p_CcNodeParam->keysParams.numOfKeys; 3022296177Sjhibbits 3023296177Sjhibbits p_FmPcdCcNode->h_FmPcd = h_FmPcd; 3024296177Sjhibbits 3025296177Sjhibbits INIT_LIST(&p_FmPcdCcNode->ccPrevNodesLst); 3026296177Sjhibbits INIT_LIST(&p_FmPcdCcNode->ccTreeIdLst); 3027296177Sjhibbits INIT_LIST(&p_FmPcdCcNode->ccTreesLst); 3028296177Sjhibbits 3029296177Sjhibbits if((p_CcNodeParam->extractCcParams.type == e_FM_PCD_EXTRACT_BY_HDR) && 3030296177Sjhibbits ((p_CcNodeParam->extractCcParams.extractByHdr.hdr == HEADER_TYPE_IPv4) || 3031296177Sjhibbits (p_CcNodeParam->extractCcParams.extractByHdr.hdr == HEADER_TYPE_IPv6)) && 3032296177Sjhibbits (p_CcNodeParam->extractCcParams.extractByHdr.type == e_FM_PCD_EXTRACT_FULL_FIELD) && 3033296177Sjhibbits ((p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField.ipv6 == NET_HEADER_FIELD_IPv6_HOP_LIMIT) || 3034296177Sjhibbits (p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField.ipv4 == NET_HEADER_FIELD_IPv4_TTL))) 3035296177Sjhibbits { 3036296177Sjhibbits err = Ipv4TtlOrIpv6HopLimiCheckParams(h_FmPcd, p_CcNodeParam, p_FmPcdCcNode, &isKeyTblAlloc); 3037296177Sjhibbits glblMask = FALSE; 3038296177Sjhibbits 3039296177Sjhibbits } 3040296177Sjhibbits else if((p_CcNodeParam->extractCcParams.type == e_FM_PCD_EXTRACT_NON_HDR) && 3041296177Sjhibbits ((p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_KEY) || 3042296177Sjhibbits (p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_HASH) || 3043296177Sjhibbits (p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_FLOW_ID))) 3044296177Sjhibbits { 3045296177Sjhibbits if((p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_FLOW_ID) && 3046296177Sjhibbits (p_CcNodeParam->extractCcParams.extractNonHdr.offset != 0)) 3047296177Sjhibbits { 3048296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("In the case of the extraction from e_FM_PCD_EXTRACT_FROM_FLOW_ID offset has to be 0")); 3049296177Sjhibbits return NULL; 3050296177Sjhibbits } 3051296177Sjhibbits 3052296177Sjhibbits icCode = IcDefineCode(p_CcNodeParam); 3053296177Sjhibbits fromIc = TRUE; 3054296177Sjhibbits if(icCode == CC_PRIVATE_INFO_NONE) 3055296177Sjhibbits { 3056296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("user asked extraction from IC and field in internal context or action wasn't initialized in the right way")); 3057296177Sjhibbits return NULL; 3058296177Sjhibbits } 3059296177Sjhibbits 3060296177Sjhibbits if((icCode == CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP) || (icCode == CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP)) 3061296177Sjhibbits { 3062296177Sjhibbits err = IcHashIndexedCheckParams(h_FmPcd, p_CcNodeParam, p_FmPcdCcNode, &isKeyTblAlloc); 3063296177Sjhibbits 3064296177Sjhibbits glblMask = TRUE; 3065296177Sjhibbits } 3066296177Sjhibbits else 3067296177Sjhibbits { 3068296177Sjhibbits err = CheckParams(h_FmPcd, p_CcNodeParam,p_FmPcdCcNode, &isKeyTblAlloc); 3069296177Sjhibbits if(p_FmPcdCcNode->glblMaskSize) 3070296177Sjhibbits glblMask = TRUE; 3071296177Sjhibbits } 3072296177Sjhibbits } 3073296177Sjhibbits else 3074296177Sjhibbits { 3075296177Sjhibbits err = CheckParams(h_FmPcd, p_CcNodeParam,p_FmPcdCcNode, &isKeyTblAlloc); 3076296177Sjhibbits if(p_FmPcdCcNode->glblMaskSize) 3077296177Sjhibbits glblMask = TRUE; 3078296177Sjhibbits } 3079296177Sjhibbits 3080296177Sjhibbits if(err) 3081296177Sjhibbits { 3082296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3083296177Sjhibbits REPORT_ERROR(MAJOR, err, NO_MSG); 3084296177Sjhibbits return NULL; 3085296177Sjhibbits } 3086296177Sjhibbits 3087296177Sjhibbits switch(p_CcNodeParam->extractCcParams.type) 3088296177Sjhibbits { 3089296177Sjhibbits case(e_FM_PCD_EXTRACT_BY_HDR): 3090296177Sjhibbits switch(p_CcNodeParam->extractCcParams.extractByHdr.type) 3091296177Sjhibbits { 3092296177Sjhibbits case(e_FM_PCD_EXTRACT_FULL_FIELD): 3093296177Sjhibbits p_FmPcdCcNode->parseCode = GetFullFieldParseCode(p_CcNodeParam->extractCcParams.extractByHdr.hdr, p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex, 3094296177Sjhibbits p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField); 3095296177Sjhibbits GetSizeHeaderField(p_CcNodeParam->extractCcParams.extractByHdr.hdr, p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField, &p_FmPcdCcNode->sizeOfExtraction); 3096296177Sjhibbits fullField = TRUE; 3097296177Sjhibbits if((p_FmPcdCcNode->parseCode != CC_PC_FF_TCI1) && (p_FmPcdCcNode->parseCode != CC_PC_FF_TCI2) && 3098296177Sjhibbits (p_FmPcdCcNode->parseCode != CC_PC_FF_MPLS1) && (p_FmPcdCcNode->parseCode != CC_PC_FF_MPLS1) && 3099296177Sjhibbits (p_FmPcdCcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC1) && (p_FmPcdCcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC2) && 3100296177Sjhibbits (p_FmPcdCcNode->parseCode != CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1) && (p_FmPcdCcNode->parseCode != CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2) && 3101296177Sjhibbits glblMask) 3102296177Sjhibbits { 3103296177Sjhibbits glblMask = FALSE; 3104296177Sjhibbits p_FmPcdCcNode->glblMaskSize = 4; 3105296177Sjhibbits p_FmPcdCcNode->lclMask = TRUE; 3106296177Sjhibbits } 3107296177Sjhibbits break; 3108296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_HDR): 3109296177Sjhibbits p_FmPcdCcNode->sizeOfExtraction = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.size; 3110296177Sjhibbits p_FmPcdCcNode->offset = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.offset; 3111296177Sjhibbits p_FmPcdCcNode->parseCode = GetPrParseCode(p_CcNodeParam->extractCcParams.extractByHdr.hdr, p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex, 3112296177Sjhibbits p_FmPcdCcNode->offset,glblMask, &p_FmPcdCcNode->prsArrayOffset); 3113296177Sjhibbits break; 3114296177Sjhibbits case(e_FM_PCD_EXTRACT_FROM_FIELD): 3115296177Sjhibbits p_FmPcdCcNode->offset = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.offset; 3116296177Sjhibbits p_FmPcdCcNode->sizeOfExtraction = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.size; 3117296177Sjhibbits p_FmPcdCcNode->parseCode = GetFieldParseCode(p_CcNodeParam->extractCcParams.extractByHdr.hdr, p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.field, 3118296177Sjhibbits p_FmPcdCcNode->offset,&p_FmPcdCcNode->prsArrayOffset, 3119296177Sjhibbits p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex); 3120296177Sjhibbits break; 3121296177Sjhibbits default: 3122296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3123296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG); 3124296177Sjhibbits return NULL; 3125296177Sjhibbits } 3126296177Sjhibbits break; 3127296177Sjhibbits case(e_FM_PCD_EXTRACT_NON_HDR): 3128296177Sjhibbits /* get the field code for the generic extract */ 3129296177Sjhibbits p_FmPcdCcNode->sizeOfExtraction = p_CcNodeParam->extractCcParams.extractNonHdr.size; 3130296177Sjhibbits p_FmPcdCcNode->offset = p_CcNodeParam->extractCcParams.extractNonHdr.offset; 3131296177Sjhibbits p_FmPcdCcNode->parseCode = GetGenParseCode(p_CcNodeParam->extractCcParams.extractNonHdr.src, p_FmPcdCcNode->offset, glblMask, &p_FmPcdCcNode->prsArrayOffset, fromIc,icCode); 3132296177Sjhibbits 3133296177Sjhibbits if(p_FmPcdCcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED) 3134296177Sjhibbits { 3135296177Sjhibbits if((p_FmPcdCcNode->offset + p_FmPcdCcNode->sizeOfExtraction) > 64) 3136296177Sjhibbits { 3137296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3138296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_SELECTION,("when node of the type CC_PC_GENERIC_IC_HASH_INDEXED offset + size can not be bigger then size of HASH 64 bits (8 bytes)")); 3139296177Sjhibbits return NULL; 3140296177Sjhibbits } 3141296177Sjhibbits } 3142296177Sjhibbits if((p_FmPcdCcNode->parseCode == CC_PC_GENERIC_IC_GMASK) || (p_FmPcdCcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED)) 3143296177Sjhibbits { 3144296177Sjhibbits p_FmPcdCcNode->offset += p_FmPcdCcNode->prsArrayOffset; 3145296177Sjhibbits p_FmPcdCcNode->prsArrayOffset = 0; 3146296177Sjhibbits } 3147296177Sjhibbits break; 3148296177Sjhibbits 3149296177Sjhibbits default: 3150296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3151296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG); 3152296177Sjhibbits return NULL; 3153296177Sjhibbits } 3154296177Sjhibbits 3155296177Sjhibbits if(p_FmPcdCcNode->parseCode == CC_PC_ILLEGAL) 3156296177Sjhibbits { 3157296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3158296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("illeagl extraction type")); 3159296177Sjhibbits return NULL; 3160296177Sjhibbits } 3161296177Sjhibbits 3162296177Sjhibbits if((p_FmPcdCcNode->sizeOfExtraction > FM_PCD_MAX_SIZE_OF_KEY) || !p_FmPcdCcNode->sizeOfExtraction) 3163296177Sjhibbits { 3164296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3165296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("sizeOfExatrction can not be greater than 56 and not 0")); 3166296177Sjhibbits return NULL; 3167296177Sjhibbits } 3168296177Sjhibbits 3169296177Sjhibbits if(p_CcNodeParam->keysParams.keySize != p_FmPcdCcNode->sizeOfExtraction) 3170296177Sjhibbits { 3171296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3172296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be equal to sizeOfExtraction")); 3173296177Sjhibbits return NULL; 3174296177Sjhibbits } 3175296177Sjhibbits 3176296177Sjhibbits 3177296177Sjhibbits p_FmPcdCcNode->userSizeOfExtraction = p_FmPcdCcNode->sizeOfExtraction; 3178296177Sjhibbits 3179296177Sjhibbits if(!glblMask) 3180296177Sjhibbits memset(p_FmPcdCcNode->p_GlblMask, 0xff, CC_GLBL_MASK_SIZE * sizeof(uint8_t)); 3181296177Sjhibbits 3182296177Sjhibbits#ifdef FM_PCD_CC_MANIP 3183296177Sjhibbits err = CheckAndSetManipParamsWithCcNodeParams(p_FmPcdCcNode); 3184296177Sjhibbits if(err != E_OK) 3185296177Sjhibbits { 3186296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3187296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be equal to sizeOfExtraction")); 3188296177Sjhibbits return NULL; 3189296177Sjhibbits } 3190296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 3191296177Sjhibbits 3192296177Sjhibbits GetCcExtractKeySize(p_FmPcdCcNode->sizeOfExtraction, &p_FmPcdCcNode->ccKeySizeAccExtraction); 3193296177Sjhibbits 3194296177Sjhibbits if(p_FmPcdCcNode->lclMask) 3195296177Sjhibbits size = 2 * p_FmPcdCcNode->ccKeySizeAccExtraction; 3196296177Sjhibbits else 3197296177Sjhibbits size = p_FmPcdCcNode->ccKeySizeAccExtraction; 3198296177Sjhibbits 3199296177Sjhibbits if(isKeyTblAlloc) 3200296177Sjhibbits { 3201296177Sjhibbits p_FmPcdCcNode->h_KeysMatchTable =(t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcdCcNode->h_FmPcd), 3202296177Sjhibbits (uint32_t)(size * sizeof(uint8_t) * (p_FmPcdCcNode->numOfKeys + 1)), 3203296177Sjhibbits FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN); 3204296177Sjhibbits if(!p_FmPcdCcNode->h_KeysMatchTable) 3205296177Sjhibbits { 3206296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3207296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory in MURAM for KEY MATCH table")); 3208296177Sjhibbits return NULL; 3209296177Sjhibbits } 3210296177Sjhibbits IOMemSet32((uint8_t *)p_FmPcdCcNode->h_KeysMatchTable, 0, size * sizeof(uint8_t) * (p_FmPcdCcNode->numOfKeys + 1)); 3211296177Sjhibbits } 3212296177Sjhibbits 3213296177Sjhibbits p_FmPcdCcNode->h_AdTable = (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcdCcNode->h_FmPcd), 3214296177Sjhibbits (uint32_t)( (p_FmPcdCcNode->numOfKeys+1) * FM_PCD_CC_AD_ENTRY_SIZE), 3215296177Sjhibbits FM_PCD_CC_AD_TABLE_ALIGN); 3216296177Sjhibbits if(!p_FmPcdCcNode->h_AdTable) 3217296177Sjhibbits { 3218296177Sjhibbits DeleteNode(p_FmPcdCcNode); 3219296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory in MURAM for AD table ")); 3220296177Sjhibbits return NULL; 3221296177Sjhibbits } 3222296177Sjhibbits IOMemSet32((uint8_t *)p_FmPcdCcNode->h_AdTable, 0, (uint32_t)((p_FmPcdCcNode->numOfKeys+1) * FM_PCD_CC_AD_ENTRY_SIZE)); 3223296177Sjhibbits 3224296177Sjhibbits p_KeysMatchTblTmp = p_FmPcdCcNode->h_KeysMatchTable; 3225296177Sjhibbits p_AdTableTmp = p_FmPcdCcNode->h_AdTable; 3226296177Sjhibbits for(tmp = 0 ; tmp < p_FmPcdCcNode->numOfKeys; tmp++) 3227296177Sjhibbits { 3228296177Sjhibbits p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp]; 3229296177Sjhibbits 3230296177Sjhibbits if(p_KeysMatchTblTmp) 3231296177Sjhibbits { 3232296177Sjhibbits Mem2IOCpy32((void*)p_KeysMatchTblTmp, p_KeyParams->p_Key, p_FmPcdCcNode->sizeOfExtraction); 3233296177Sjhibbits 3234296177Sjhibbits if(p_FmPcdCcNode->lclMask && p_KeyParams->p_Mask) 3235296177Sjhibbits Mem2IOCpy32(PTR_MOVE(p_KeysMatchTblTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), p_KeyParams->p_Mask, p_FmPcdCcNode->sizeOfExtraction); 3236296177Sjhibbits else if(p_FmPcdCcNode->lclMask) 3237296177Sjhibbits IOMemSet32(PTR_MOVE(p_KeysMatchTblTmp, p_FmPcdCcNode->ccKeySizeAccExtraction), 0xff, p_FmPcdCcNode->sizeOfExtraction); 3238296177Sjhibbits p_KeysMatchTblTmp = PTR_MOVE(p_KeysMatchTblTmp, size * sizeof(uint8_t)); 3239296177Sjhibbits } 3240296177Sjhibbits NextStepAd(p_AdTableTmp,&p_KeyParams->ccNextEngineParams, p_FmPcd); 3241296177Sjhibbits 3242296177Sjhibbits p_AdTableTmp = PTR_MOVE(p_AdTableTmp, FM_PCD_CC_AD_ENTRY_SIZE); 3243296177Sjhibbits 3244296177Sjhibbits } 3245296177Sjhibbits NextStepAd(p_AdTableTmp,&p_CcNodeParam->keysParams.ccNextEngineParamsForMiss, p_FmPcd); 3246296177Sjhibbits 3247296177Sjhibbits if(fullField == TRUE) 3248296177Sjhibbits p_FmPcdCcNode->sizeOfExtraction = 0; 3249296177Sjhibbits 3250296177Sjhibbits 3251296177Sjhibbits for(tmp = 0; tmp < p_FmPcdCcNode->numOfKeys + 1; tmp++) 3252296177Sjhibbits { 3253296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].nextEngineParams.nextEngine == e_FM_PCD_CC) 3254296177Sjhibbits { 3255296177Sjhibbits p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].nextEngineParams.params.ccParams.h_CcNode; 3256296177Sjhibbits 3257296177Sjhibbits if(!IsNodeInModifiedState((t_Handle)p_FmPcdCcNextNode)) 3258296177Sjhibbits { 3259296177Sjhibbits memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation)); 3260296177Sjhibbits ccNodeInfo.h_CcNode = (t_Handle)p_FmPcdCcNode; 3261296177Sjhibbits ccNodeInfo.index = 1; 3262296177Sjhibbits EnqueueNodeInfoToRelevantLst(&p_FmPcdCcNextNode->ccPrevNodesLst, &ccNodeInfo); 3263296177Sjhibbits UpdateNodeWithModifiedState((t_Handle)p_FmPcdCcNextNode, TRUE); 3264296177Sjhibbits } 3265296177Sjhibbits else 3266296177Sjhibbits { 3267296177Sjhibbits p_CcInformation = FindNodeInfoInReleventLst(&p_FmPcdCcNextNode->ccPrevNodesLst,(t_Handle)p_FmPcdCcNode); 3268296177Sjhibbits ASSERT_COND(p_CcInformation); 3269296177Sjhibbits p_CcInformation->index++; 3270296177Sjhibbits } 3271296177Sjhibbits } 3272296177Sjhibbits 3273296177Sjhibbits } 3274296177Sjhibbits 3275296177Sjhibbits for(tmp = 0; tmp < p_FmPcdCcNode->numOfKeys + 1; tmp++) 3276296177Sjhibbits { 3277296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].nextEngineParams.nextEngine == e_FM_PCD_CC) 3278296177Sjhibbits { 3279296177Sjhibbits p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].nextEngineParams.params.ccParams.h_CcNode; 3280296177Sjhibbits 3281296177Sjhibbits if(IsNodeInModifiedState((t_Handle)p_FmPcdCcNextNode)) 3282296177Sjhibbits UpdateNodeWithModifiedState((t_Handle)p_FmPcdCcNextNode, FALSE); 3283296177Sjhibbits } 3284296177Sjhibbits } 3285296177Sjhibbits 3286296177Sjhibbits p_AdTableTmp = p_FmPcdCcNode->h_AdTable; 3287296177Sjhibbits for(tmp = 0; tmp < p_FmPcdCcNode->numOfKeys; tmp++) 3288296177Sjhibbits { 3289296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].requiredAction) 3290296177Sjhibbits { 3291296177Sjhibbits 3292296177Sjhibbits err = FmPcdCcSetRequiredAction(h_FmPcd, p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].requiredAction, &p_FmPcdCcNode->nextEngineAndRequiredAction[tmp], p_AdTableTmp,1, NULL); 3293296177Sjhibbits if(err) 3294296177Sjhibbits { 3295296177Sjhibbits FM_PCD_CcDeleteNode(h_FmPcd, (t_Handle)p_FmPcdCcNode); 3296296177Sjhibbits REPORT_ERROR(MAJOR, err, NO_MSG); 3297296177Sjhibbits return NULL; 3298296177Sjhibbits } 3299296177Sjhibbits p_AdTableTmp = PTR_MOVE(p_AdTableTmp, FM_PCD_CC_AD_ENTRY_SIZE); 3300296177Sjhibbits } 3301296177Sjhibbits } 3302296177Sjhibbits if(p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].requiredAction) 3303296177Sjhibbits { 3304296177Sjhibbits err = FmPcdCcSetRequiredAction(h_FmPcd, p_FmPcdCcNode->nextEngineAndRequiredAction[tmp].requiredAction, &p_FmPcdCcNode->nextEngineAndRequiredAction[tmp], p_AdTableTmp,1, NULL); 3305296177Sjhibbits if(err) 3306296177Sjhibbits { 3307296177Sjhibbits FM_PCD_CcDeleteNode(h_FmPcd, (t_Handle)p_FmPcdCcNode); 3308296177Sjhibbits REPORT_ERROR(MAJOR, err, NO_MSG); 3309296177Sjhibbits return NULL; 3310296177Sjhibbits } 3311296177Sjhibbits 3312296177Sjhibbits } 3313296177Sjhibbits 3314296177Sjhibbits 3315296177Sjhibbits return p_FmPcdCcNode; 3316296177Sjhibbits} 3317296177Sjhibbits 3318296177Sjhibbitst_Error FM_PCD_CcDeleteNode(t_Handle h_FmPcd, t_Handle h_CcNode) 3319296177Sjhibbits{ 3320296177Sjhibbits t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode; 3321296177Sjhibbits int i = 0; 3322296177Sjhibbits 3323296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3324296177Sjhibbits 3325296177Sjhibbits UNUSED(h_FmPcd); 3326296177Sjhibbits if(!p_CcNode) 3327296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("the node with this ID is not initialized")); 3328296177Sjhibbits 3329296177Sjhibbits if(p_CcNode->owners) 3330296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("the node with this ID can not be removed because this node is occupied, first - unbind this node")); 3331296177Sjhibbits 3332296177Sjhibbits for(i = 0; i < p_CcNode->numOfKeys; i++) 3333296177Sjhibbits { 3334296177Sjhibbits if(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.nextEngine == e_FM_PCD_CC) 3335296177Sjhibbits UpdateNodeOwner(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.params.ccParams.h_CcNode, FALSE); 3336296177Sjhibbits 3337296177Sjhibbits } 3338296177Sjhibbits if(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.nextEngine == e_FM_PCD_CC) 3339296177Sjhibbits UpdateNodeOwner(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.params.ccParams.h_CcNode, FALSE); 3340296177Sjhibbits 3341296177Sjhibbits#ifdef FM_PCD_CC_MANIP 3342296177Sjhibbits for(i = 0; i < p_CcNode->numOfKeys; i++) 3343296177Sjhibbits { 3344296177Sjhibbits if(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip) 3345296177Sjhibbits FmPcdManipUpdateOwner(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip, FALSE); 3346296177Sjhibbits } 3347296177Sjhibbits if(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip) 3348296177Sjhibbits FmPcdManipUpdateOwner(p_CcNode->nextEngineAndRequiredAction[i].nextEngineParams.h_Manip, FALSE); 3349296177Sjhibbits#endif /* FM_PCD_CC_MANIP */ 3350296177Sjhibbits 3351296177Sjhibbits DeleteNode(p_CcNode); 3352296177Sjhibbits 3353296177Sjhibbits return E_OK; 3354296177Sjhibbits} 3355296177Sjhibbits 3356296177Sjhibbitst_Error FM_PCD_CcNodeAddKey(t_Handle h_FmPcd, t_Handle h_CcNode, uint8_t keyIndex, uint8_t keySize, t_FmPcdCcKeyParams *p_KeyParams) 3357296177Sjhibbits{ 3358296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 3359296177Sjhibbits 3360296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3361296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE); 3362296177Sjhibbits 3363296177Sjhibbits return FmHcPcdCcAddKey(p_FmPcd->h_Hc, h_CcNode, keyIndex, keySize, p_KeyParams); 3364296177Sjhibbits} 3365296177Sjhibbits 3366296177Sjhibbitst_Error FM_PCD_CcNodeRemoveKey(t_Handle h_FmPcd, t_Handle h_CcNode, uint8_t keyIndex) 3367296177Sjhibbits{ 3368296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 3369296177Sjhibbits 3370296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3371296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE); 3372296177Sjhibbits 3373296177Sjhibbits return FmHcPcdCcRemoveKey(p_FmPcd->h_Hc, h_CcNode, keyIndex); 3374296177Sjhibbits} 3375296177Sjhibbits 3376296177Sjhibbitst_Error FM_PCD_CcNodeModifyKey(t_Handle h_FmPcd, t_Handle h_CcNode, uint8_t keyIndex, uint8_t keySize, uint8_t *p_Key, uint8_t *p_Mask) 3377296177Sjhibbits{ 3378296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 3379296177Sjhibbits 3380296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3381296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE); 3382296177Sjhibbits 3383296177Sjhibbits return FmHcPcdCcModifyKey(p_FmPcd->h_Hc, h_CcNode, keyIndex, keySize, p_Key, p_Mask); 3384296177Sjhibbits} 3385296177Sjhibbits 3386296177Sjhibbitst_Error FM_PCD_CcNodeModifyNextEngine(t_Handle h_FmPcd, t_Handle h_CcNode, uint8_t keyIndex, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams) 3387296177Sjhibbits{ 3388296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 3389296177Sjhibbits 3390296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3391296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE); 3392296177Sjhibbits 3393296177Sjhibbits return FmHcPcdCcModifyNodeNextEngine(p_FmPcd->h_Hc, h_CcNode, keyIndex, p_FmPcdCcNextEngineParams); 3394296177Sjhibbits} 3395296177Sjhibbits 3396296177Sjhibbitst_Error FM_PCD_CcNodeModifyMissNextEngine(t_Handle h_FmPcd, t_Handle h_CcNode, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams) 3397296177Sjhibbits{ 3398296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 3399296177Sjhibbits 3400296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3401296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE); 3402296177Sjhibbits 3403296177Sjhibbits return FmHcPcdCcModifyNodeMissNextEngine(p_FmPcd->h_Hc, h_CcNode, p_FmPcdCcNextEngineParams); 3404296177Sjhibbits} 3405296177Sjhibbits 3406296177Sjhibbitst_Error FM_PCD_CcTreeModifyNextEngine(t_Handle h_FmPcd, t_Handle h_CcTree, uint8_t grpId, uint8_t index, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams) 3407296177Sjhibbits{ 3408296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 3409296177Sjhibbits 3410296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3411296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE); 3412296177Sjhibbits 3413296177Sjhibbits return FmHcPcdCcModifyTreeNextEngine(p_FmPcd->h_Hc, h_CcTree, grpId, index, p_FmPcdCcNextEngineParams); 3414296177Sjhibbits} 3415296177Sjhibbits 3416296177Sjhibbitst_Error FM_PCD_CcNodeModifyKeyAndNextEngine(t_Handle h_FmPcd, t_Handle h_CcNode, uint8_t keyIndex, uint8_t keySize, t_FmPcdCcKeyParams *p_KeyParams) 3417296177Sjhibbits{ 3418296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd; 3419296177Sjhibbits 3420296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3421296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE); 3422296177Sjhibbits 3423296177Sjhibbits return FmHcPcdCcModifyKeyAndNextEngine(p_FmPcd->h_Hc, h_CcNode, keyIndex, keySize, p_KeyParams); 3424296177Sjhibbits} 3425296177Sjhibbits 3426296177Sjhibbitsuint32_t FM_PCD_CcNodeGetKeyCounter(t_Handle h_FmPcd, t_Handle h_CcNode, uint8_t keyIndex) 3427296177Sjhibbits{ 3428296177Sjhibbits t_FmPcdCcNode *p_FmPcdCcNode = (t_FmPcdCcNode *)h_CcNode; 3429296177Sjhibbits t_AdOfTypeResult *p_AdResult = NULL; 3430296177Sjhibbits 3431296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 3432296177Sjhibbits SANITY_CHECK_RETURN_VALUE(h_CcNode, E_INVALID_HANDLE, 0); 3433296177Sjhibbits#ifdef DISABLE_SANITY_CHECKS 3434296177SjhibbitsUNUSED(h_FmPcd); 3435296177Sjhibbits#endif /* DISABLE_SANITY_CHECKS */ 3436296177Sjhibbits 3437296177Sjhibbits if (keyIndex >= p_FmPcdCcNode->numOfKeys) 3438296177Sjhibbits { 3439296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, 3440296177Sjhibbits ("keyIndex > numOfKeys defined for this node")); 3441296177Sjhibbits return 0; 3442296177Sjhibbits } 3443296177Sjhibbits 3444296177Sjhibbits p_AdResult = PTR_MOVE(p_FmPcdCcNode->h_AdTable, keyIndex*FM_PCD_CC_AD_ENTRY_SIZE); 3445296177Sjhibbits ASSERT_COND(p_AdResult); 3446296177Sjhibbits 3447296177Sjhibbits if (p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC) 3448296177Sjhibbits { 3449296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, 3450296177Sjhibbits ("statistics updated only for entries where next engine not CC")); 3451296177Sjhibbits return 0; 3452296177Sjhibbits } 3453296177Sjhibbits 3454296177Sjhibbits if(((p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_DONE) && 3455296177Sjhibbits !p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.params.enqueueParams.statisticsEn) || 3456296177Sjhibbits ((p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_KG) && 3457296177Sjhibbits !p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.params.kgParams.statisticsEn) || 3458296177Sjhibbits ((p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_PLCR) && 3459296177Sjhibbits !p_FmPcdCcNode->nextEngineAndRequiredAction[keyIndex].nextEngineParams.params.plcrParams.statisticsEn)) 3460296177Sjhibbits { 3461296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, 3462296177Sjhibbits ("statistics wasn't enable")); 3463296177Sjhibbits return 0; 3464296177Sjhibbits } 3465296177Sjhibbits 3466296177Sjhibbits return GET_UINT32(p_AdResult->res); 3467296177Sjhibbits} 3468