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(&params[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,&params[i].nextEngineParams,p_FmPcd);
2899296177Sjhibbits        p_CcTreeTmp = PTR_MOVE(p_CcTreeTmp, FM_PCD_CC_AD_ENTRY_SIZE);
2900296177Sjhibbits        memcpy(&p_FmPcdCcTree->nextEngineAndRequiredAction[i], &params[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