Path: blob/main/sys/contrib/ncsw/Peripherals/FM/Pcd/fm_manip.c
48524 views
/*1* Copyright 2008-2012 Freescale Semiconductor Inc.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions are met:5* * Redistributions of source code must retain the above copyright6* notice, this list of conditions and the following disclaimer.7* * Redistributions in binary form must reproduce the above copyright8* notice, this list of conditions and the following disclaimer in the9* documentation and/or other materials provided with the distribution.10* * Neither the name of Freescale Semiconductor nor the11* names of its contributors may be used to endorse or promote products12* derived from this software without specific prior written permission.13*14*15* ALTERNATIVELY, this software may be distributed under the terms of the16* GNU General Public License ("GPL") as published by the Free Software17* Foundation, either version 2 of that License or (at your option) any18* later version.19*20* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY21* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED22* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE23* DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY24* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES25* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;26* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND27* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT28* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/313233/******************************************************************************34@File fm_manip.c3536@Description FM PCD manip ...37*//***************************************************************************/38#include "std_ext.h"39#include "error_ext.h"40#include "string_ext.h"41#include "debug_ext.h"42#include "fm_pcd_ext.h"43#include "fm_port_ext.h"44#include "fm_muram_ext.h"45#include "memcpy_ext.h"4647#include "fm_common.h"48#include "fm_hc.h"49#include "fm_manip.h"5051/****************************************/52/* static functions */53/****************************************/54static t_Handle GetManipInfo(t_FmPcdManip *p_Manip, e_ManipInfo manipInfo)55{56t_FmPcdManip *p_CurManip = p_Manip;5758if (!MANIP_IS_UNIFIED(p_Manip))59p_CurManip = p_Manip;60else61{62/* go to first unified */63while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))64p_CurManip = p_CurManip->h_PrevManip;65}6667switch (manipInfo)68{69case (e_MANIP_HMCT):70return p_CurManip->p_Hmct;71case (e_MANIP_HMTD):72return p_CurManip->h_Ad;73case (e_MANIP_HANDLER_TABLE_OWNER):74return (t_Handle)p_CurManip;75default:76return NULL;77}78}7980static uint16_t GetHmctSize(t_FmPcdManip *p_Manip)81{82uint16_t size = 0;83t_FmPcdManip *p_CurManip = p_Manip;8485if (!MANIP_IS_UNIFIED(p_Manip))86return p_Manip->tableSize;8788/* accumulate sizes, starting with the first node */89while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))90p_CurManip = p_CurManip->h_PrevManip;9192while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))93{94size += p_CurManip->tableSize;95p_CurManip = (t_FmPcdManip *)p_CurManip->h_NextManip;96}97size += p_CurManip->tableSize; /* add last size */9899return (size);100}101102static uint16_t GetDataSize(t_FmPcdManip *p_Manip)103{104uint16_t size = 0;105t_FmPcdManip *p_CurManip = p_Manip;106107if (!MANIP_IS_UNIFIED(p_Manip))108return p_Manip->dataSize;109110/* accumulate sizes, starting with the first node */111while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))112p_CurManip = p_CurManip->h_PrevManip;113114while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))115{116size += p_CurManip->dataSize;117p_CurManip = (t_FmPcdManip *)p_CurManip->h_NextManip;118}119size += p_CurManip->dataSize; /* add last size */120121return (size);122}123124static t_Error CalculateTableSize(t_FmPcdManipParams *p_FmPcdManipParams,125uint16_t *p_TableSize, uint8_t *p_DataSize)126{127uint8_t localDataSize, remain, tableSize = 0, dataSize = 0;128129if (p_FmPcdManipParams->u.hdr.rmv)130{131switch (p_FmPcdManipParams->u.hdr.rmvParams.type)132{133case (e_FM_PCD_MANIP_RMV_GENERIC):134tableSize += HMCD_BASIC_SIZE;135break;136case (e_FM_PCD_MANIP_RMV_BY_HDR):137switch (p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.type)138{139case (e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2):140#if (DPAA_VERSION >= 11)141case (e_FM_PCD_MANIP_RMV_BY_HDR_CAPWAP):142case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START):143#endif /* (DPAA_VERSION >= 11) */144tableSize += HMCD_BASIC_SIZE;145break;146default:147RETURN_ERROR(MINOR, E_INVALID_SELECTION,148("Unknown byHdr.type"));149}150break;151default:152RETURN_ERROR(MINOR, E_INVALID_SELECTION,153("Unknown rmvParams.type"));154}155}156157if (p_FmPcdManipParams->u.hdr.insrt)158{159switch (p_FmPcdManipParams->u.hdr.insrtParams.type)160{161case (e_FM_PCD_MANIP_INSRT_GENERIC):162remain =163(uint8_t)(p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size164% 4);165if (remain)166localDataSize =167(uint8_t)(p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size168+ 4 - remain);169else170localDataSize =171p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size;172tableSize += (uint8_t)(HMCD_BASIC_SIZE + localDataSize);173break;174case (e_FM_PCD_MANIP_INSRT_BY_HDR):175{176switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.type)177{178179case (e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2):180tableSize += HMCD_BASIC_SIZE + HMCD_PTR_SIZE;181switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.specificL2)182{183case (e_FM_PCD_MANIP_HDR_INSRT_MPLS):184case (e_FM_PCD_MANIP_HDR_INSRT_PPPOE):185dataSize +=186p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.size;187break;188default:189RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);190}191break;192#if (DPAA_VERSION >= 11)193case (e_FM_PCD_MANIP_INSRT_BY_HDR_IP):194tableSize +=195(HMCD_BASIC_SIZE + HMCD_PTR_SIZE196+ HMCD_PARAM_SIZE197+ p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size);198dataSize += 2;199break;200201case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP):202case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE):203tableSize += (HMCD_BASIC_SIZE + HMCD_L4_HDR_SIZE);204205break;206207case (e_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP):208tableSize +=209(HMCD_BASIC_SIZE210+ p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size);211break;212#endif /* (DPAA_VERSION >= 11) */213default:214RETURN_ERROR(MINOR, E_INVALID_SELECTION,215("Unknown byHdr.type"));216}217}218break;219default:220RETURN_ERROR(MINOR, E_INVALID_SELECTION,221("Unknown insrtParams.type"));222}223}224225if (p_FmPcdManipParams->u.hdr.fieldUpdate)226{227switch (p_FmPcdManipParams->u.hdr.fieldUpdateParams.type)228{229case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN):230tableSize += HMCD_BASIC_SIZE;231if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType232== e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)233{234tableSize += HMCD_PTR_SIZE;235dataSize += DSCP_TO_VLAN_TABLE_SIZE;236}237break;238case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4):239tableSize += HMCD_BASIC_SIZE;240if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates241& HDR_MANIP_IPV4_ID)242{243tableSize += HMCD_PARAM_SIZE;244dataSize += 2;245}246if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates247& HDR_MANIP_IPV4_SRC)248tableSize += HMCD_IPV4_ADDR_SIZE;249if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates250& HDR_MANIP_IPV4_DST)251tableSize += HMCD_IPV4_ADDR_SIZE;252break;253case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6):254tableSize += HMCD_BASIC_SIZE;255if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates256& HDR_MANIP_IPV6_SRC)257tableSize += HMCD_IPV6_ADDR_SIZE;258if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates259& HDR_MANIP_IPV6_DST)260tableSize += HMCD_IPV6_ADDR_SIZE;261break;262case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP):263if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates264== HDR_MANIP_TCP_UDP_CHECKSUM)265/* we implement this case with the update-checksum descriptor */266tableSize += HMCD_BASIC_SIZE;267else268/* we implement this case with the TCP/UDP-update descriptor */269tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE;270break;271default:272RETURN_ERROR(MINOR, E_INVALID_SELECTION,273("Unknown fieldUpdateParams.type"));274}275}276277if (p_FmPcdManipParams->u.hdr.custom)278{279switch (p_FmPcdManipParams->u.hdr.customParams.type)280{281case (e_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE):282{283tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE + HMCD_PARAM_SIZE;284dataSize +=285p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdrSize;286if ((p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType287== e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4)288&& (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id))289dataSize += 2;290}291break;292case (e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE):293tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE;294break;295default:296RETURN_ERROR(MINOR, E_INVALID_SELECTION,297("Unknown customParams.type"));298}299}300301*p_TableSize = tableSize;302*p_DataSize = dataSize;303304return E_OK;305}306307static t_Error GetPrOffsetByHeaderOrField(t_FmManipHdrInfo *p_HdrInfo,308uint8_t *parseArrayOffset)309{310e_NetHeaderType hdr = p_HdrInfo->hdr;311e_FmPcdHdrIndex hdrIndex = p_HdrInfo->hdrIndex;312bool byField = p_HdrInfo->byField;313t_FmPcdFields field;314315if (byField)316field = p_HdrInfo->fullField;317318if (byField)319{320switch (hdr)321{322case (HEADER_TYPE_ETH):323switch (field.eth)324{325case (NET_HEADER_FIELD_ETH_TYPE):326*parseArrayOffset = CC_PC_PR_ETYPE_LAST_OFFSET;327break;328default:329RETURN_ERROR(330MAJOR,331E_NOT_SUPPORTED,332("Header manipulation of the type Ethernet with this field not supported"));333}334break;335case (HEADER_TYPE_VLAN):336switch (field.vlan)337{338case (NET_HEADER_FIELD_VLAN_TCI):339if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)340|| (hdrIndex == e_FM_PCD_HDR_INDEX_1))341*parseArrayOffset = CC_PC_PR_VLAN1_OFFSET;342else343if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)344*parseArrayOffset = CC_PC_PR_VLAN2_OFFSET;345break;346default:347RETURN_ERROR(348MAJOR,349E_NOT_SUPPORTED,350("Header manipulation of the type VLAN with this field not supported"));351}352break;353default:354RETURN_ERROR(355MAJOR,356E_NOT_SUPPORTED,357("Header manipulation of this header by field not supported"));358}359}360else361{362switch (hdr)363{364case (HEADER_TYPE_ETH):365*parseArrayOffset = (uint8_t)CC_PC_PR_ETH_OFFSET;366break;367case (HEADER_TYPE_USER_DEFINED_SHIM1):368*parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM1_OFFSET;369break;370case (HEADER_TYPE_USER_DEFINED_SHIM2):371*parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM2_OFFSET;372break;373case (HEADER_TYPE_LLC_SNAP):374*parseArrayOffset = CC_PC_PR_USER_LLC_SNAP_OFFSET;375break;376case (HEADER_TYPE_PPPoE):377*parseArrayOffset = CC_PC_PR_PPPOE_OFFSET;378break;379case (HEADER_TYPE_MPLS):380if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)381|| (hdrIndex == e_FM_PCD_HDR_INDEX_1))382*parseArrayOffset = CC_PC_PR_MPLS1_OFFSET;383else384if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)385*parseArrayOffset = CC_PC_PR_MPLS_LAST_OFFSET;386break;387case (HEADER_TYPE_IPv4):388case (HEADER_TYPE_IPv6):389if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)390|| (hdrIndex == e_FM_PCD_HDR_INDEX_1))391*parseArrayOffset = CC_PC_PR_IP1_OFFSET;392else393if (hdrIndex == e_FM_PCD_HDR_INDEX_2)394*parseArrayOffset = CC_PC_PR_IP_LAST_OFFSET;395break;396case (HEADER_TYPE_MINENCAP):397*parseArrayOffset = CC_PC_PR_MINENC_OFFSET;398break;399case (HEADER_TYPE_GRE):400*parseArrayOffset = CC_PC_PR_GRE_OFFSET;401break;402case (HEADER_TYPE_TCP):403case (HEADER_TYPE_UDP):404case (HEADER_TYPE_IPSEC_AH):405case (HEADER_TYPE_IPSEC_ESP):406case (HEADER_TYPE_DCCP):407case (HEADER_TYPE_SCTP):408*parseArrayOffset = CC_PC_PR_L4_OFFSET;409break;410case (HEADER_TYPE_CAPWAP):411case (HEADER_TYPE_CAPWAP_DTLS):412*parseArrayOffset = CC_PC_PR_NEXT_HEADER_OFFSET;413break;414default:415RETURN_ERROR(416MAJOR,417E_NOT_SUPPORTED,418("Header manipulation of this header is not supported"));419}420}421return E_OK;422}423424static t_Error BuildHmct(t_FmPcdManip *p_Manip,425t_FmPcdManipParams *p_FmPcdManipParams,426uint8_t *p_DestHmct, uint8_t *p_DestData, bool new)427{428uint32_t *p_TmpHmct = (uint32_t*)p_DestHmct, *p_LocalData;429uint32_t tmpReg = 0, *p_Last = NULL, tmp_ipv6_addr;430uint8_t remain, i, size = 0, origSize, *p_UsrData = NULL, *p_TmpData =431p_DestData;432t_Handle h_FmPcd = p_Manip->h_FmPcd;433uint8_t j = 0;434435if (p_FmPcdManipParams->u.hdr.rmv)436{437if (p_FmPcdManipParams->u.hdr.rmvParams.type438== e_FM_PCD_MANIP_RMV_GENERIC)439{440/* initialize HMCD */441tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_RMV) << HMCD_OC_SHIFT;442/* tmp, should be conditional */443tmpReg |= p_FmPcdManipParams->u.hdr.rmvParams.u.generic.offset444<< HMCD_RMV_OFFSET_SHIFT;445tmpReg |= p_FmPcdManipParams->u.hdr.rmvParams.u.generic.size446<< HMCD_RMV_SIZE_SHIFT;447}448else449if (p_FmPcdManipParams->u.hdr.rmvParams.type450== e_FM_PCD_MANIP_RMV_BY_HDR)451{452switch (p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.type)453{454case (e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2):455{456uint8_t hmcdOpt;457458/* initialize HMCD */459tmpReg = (uint32_t)(HMCD_OPCODE_L2_RMV) << HMCD_OC_SHIFT;460461switch (p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.u.specificL2)462{463case (e_FM_PCD_MANIP_HDR_RMV_ETHERNET):464hmcdOpt = HMCD_RMV_L2_ETHERNET;465break;466case (e_FM_PCD_MANIP_HDR_RMV_STACKED_QTAGS):467hmcdOpt = HMCD_RMV_L2_STACKED_QTAGS;468break;469case (e_FM_PCD_MANIP_HDR_RMV_ETHERNET_AND_MPLS):470hmcdOpt = HMCD_RMV_L2_ETHERNET_AND_MPLS;471break;472case (e_FM_PCD_MANIP_HDR_RMV_MPLS):473hmcdOpt = HMCD_RMV_L2_MPLS;474break;475case (e_FM_PCD_MANIP_HDR_RMV_PPPOE):476hmcdOpt = HMCD_RMV_L2_PPPOE;477break;478default:479RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);480}481tmpReg |= hmcdOpt << HMCD_L2_MODE_SHIFT;482break;483}484#if (DPAA_VERSION >= 11)485case (e_FM_PCD_MANIP_RMV_BY_HDR_CAPWAP):486tmpReg = (uint32_t)(HMCD_OPCODE_CAPWAP_RMV)487<< HMCD_OC_SHIFT;488break;489case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START):490{491uint8_t prsArrayOffset;492t_Error err = E_OK;493494tmpReg = (uint32_t)(HMCD_OPCODE_RMV_TILL)495<< HMCD_OC_SHIFT;496497err =498GetPrOffsetByHeaderOrField(499&p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.u.hdrInfo,500&prsArrayOffset);501ASSERT_COND(!err);502/* was previously checked */503504tmpReg |= ((uint32_t)prsArrayOffset << 16);505}506break;507#endif /* (DPAA_VERSION >= 11) */508default:509RETURN_ERROR(MINOR, E_NOT_SUPPORTED,510("manip header remove by hdr type!"));511}512}513514WRITE_UINT32(*p_TmpHmct, tmpReg);515/* save a pointer to the "last" indication word */516p_Last = p_TmpHmct;517/* advance to next command */518p_TmpHmct += HMCD_BASIC_SIZE / 4;519}520521if (p_FmPcdManipParams->u.hdr.insrt)522{523if (p_FmPcdManipParams->u.hdr.insrtParams.type524== e_FM_PCD_MANIP_INSRT_GENERIC)525{526/* initialize HMCD */527if (p_FmPcdManipParams->u.hdr.insrtParams.u.generic.replace)528tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_REPLACE)529<< HMCD_OC_SHIFT;530else531tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_INSRT) << HMCD_OC_SHIFT;532533tmpReg |= p_FmPcdManipParams->u.hdr.insrtParams.u.generic.offset534<< HMCD_INSRT_OFFSET_SHIFT;535tmpReg |= p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size536<< HMCD_INSRT_SIZE_SHIFT;537538size = p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size;539p_UsrData = p_FmPcdManipParams->u.hdr.insrtParams.u.generic.p_Data;540541WRITE_UINT32(*p_TmpHmct, tmpReg);542/* save a pointer to the "last" indication word */543p_Last = p_TmpHmct;544545p_TmpHmct += HMCD_BASIC_SIZE / 4;546547/* initialize data to be inserted */548/* if size is not a multiple of 4, padd with 0's */549origSize = size;550remain = (uint8_t)(size % 4);551if (remain)552{553size += (uint8_t)(4 - remain);554p_LocalData = (uint32_t *)XX_Malloc(size);555memset((uint8_t *)p_LocalData, 0, size);556memcpy((uint8_t *)p_LocalData, p_UsrData, origSize);557}558else559p_LocalData = (uint32_t*)p_UsrData;560561/* initialize data and advance pointer to next command */562MemCpy8(p_TmpHmct, p_LocalData, size);563p_TmpHmct += size / sizeof(uint32_t);564565if (remain)566XX_Free(p_LocalData);567}568569else570if (p_FmPcdManipParams->u.hdr.insrtParams.type571== e_FM_PCD_MANIP_INSRT_BY_HDR)572{573switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.type)574{575case (e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2):576{577uint8_t hmcdOpt;578579/* initialize HMCD */580tmpReg = (uint32_t)(HMCD_OPCODE_L2_INSRT)581<< HMCD_OC_SHIFT;582583switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.specificL2)584{585case (e_FM_PCD_MANIP_HDR_INSRT_MPLS):586if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.update)587hmcdOpt = HMCD_INSRT_N_UPDATE_L2_MPLS;588else589hmcdOpt = HMCD_INSRT_L2_MPLS;590break;591case (e_FM_PCD_MANIP_HDR_INSRT_PPPOE):592hmcdOpt = HMCD_INSRT_L2_PPPOE;593break;594default:595RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);596}597tmpReg |= hmcdOpt << HMCD_L2_MODE_SHIFT;598599WRITE_UINT32(*p_TmpHmct, tmpReg);600/* save a pointer to the "last" indication word */601p_Last = p_TmpHmct;602603p_TmpHmct += HMCD_BASIC_SIZE / 4;604605/* set size and pointer of user's data */606size =607(uint8_t)p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.size;608609ASSERT_COND(p_TmpData);610MemCpy8(611p_TmpData,612p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.p_Data,613size);614tmpReg =615(size << HMCD_INSRT_L2_SIZE_SHIFT)616| (uint32_t)(XX_VirtToPhys(p_TmpData)617- (((t_FmPcd*)h_FmPcd)->physicalMuramBase));618WRITE_UINT32(*p_TmpHmct, tmpReg);619p_TmpHmct += HMCD_PTR_SIZE / 4;620p_TmpData += size;621}622break;623#if (DPAA_VERSION >= 11)624case (e_FM_PCD_MANIP_INSRT_BY_HDR_IP):625tmpReg = (uint32_t)(HMCD_OPCODE_IP_INSRT)626<< HMCD_OC_SHIFT;627if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.calcL4Checksum)628tmpReg |= HMCD_IP_L4_CS_CALC;629if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.mappingMode630== e_FM_PCD_MANIP_HDR_QOS_MAPPING_AS_IS)631tmpReg |= HMCD_IP_OR_QOS;632tmpReg |=633p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.lastPidOffset634& HMCD_IP_LAST_PID_MASK;635tmpReg |=636((p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size637<< HMCD_IP_SIZE_SHIFT)638& HMCD_IP_SIZE_MASK);639if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.dontFragOverwrite)640tmpReg |= HMCD_IP_DF_MODE;641642WRITE_UINT32(*p_TmpHmct, tmpReg);643644/* save a pointer to the "last" indication word */645p_Last = p_TmpHmct;646647p_TmpHmct += HMCD_BASIC_SIZE / 4;648649/* set IP id */650ASSERT_COND(p_TmpData);651WRITE_UINT16(652*(uint16_t*)p_TmpData,653p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.id);654WRITE_UINT32(655*p_TmpHmct,656(uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));657p_TmpData += 2;658p_TmpHmct += HMCD_PTR_SIZE / 4;659660WRITE_UINT8(*p_TmpHmct, p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.lastDstOffset);661p_TmpHmct += HMCD_PARAM_SIZE / 4;662663MemCpy8(664p_TmpHmct,665p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.p_Data,666p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size);667p_TmpHmct +=668p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size669/ 4;670break;671case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE):672tmpReg = HMCD_INSRT_UDP_LITE;673case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP):674tmpReg |= (uint32_t)(HMCD_OPCODE_UDP_INSRT)675<< HMCD_OC_SHIFT;676677WRITE_UINT32(*p_TmpHmct, tmpReg);678679/* save a pointer to the "last" indication word */680p_Last = p_TmpHmct;681682p_TmpHmct += HMCD_BASIC_SIZE / 4;683684MemCpy8(685p_TmpHmct,686p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.p_Data,687p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size);688p_TmpHmct +=689p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size690/ 4;691break;692case (e_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP):693tmpReg = (uint32_t)(HMCD_OPCODE_CAPWAP_INSRT)694<< HMCD_OC_SHIFT;695tmpReg |= HMCD_CAPWAP_INSRT;696697WRITE_UINT32(*p_TmpHmct, tmpReg);698699/* save a pointer to the "last" indication word */700p_Last = p_TmpHmct;701702p_TmpHmct += HMCD_BASIC_SIZE / 4;703704MemCpy8(705p_TmpHmct,706p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.p_Data,707p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size);708p_TmpHmct +=709p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size710/ 4;711break;712#endif /* (DPAA_VERSION >= 11) */713default:714RETURN_ERROR(MINOR, E_NOT_SUPPORTED,715("manip header insert by header type!"));716717}718}719}720721if (p_FmPcdManipParams->u.hdr.fieldUpdate)722{723switch (p_FmPcdManipParams->u.hdr.fieldUpdateParams.type)724{725case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN):726/* set opcode */727tmpReg = (uint32_t)(HMCD_OPCODE_VLAN_PRI_UPDATE)728<< HMCD_OC_SHIFT;729730/* set mode & table pointer */731if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType732== e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)733{734/* set Mode */735tmpReg |= (uint32_t)(HMCD_VLAN_PRI_UPDATE_DSCP_TO_VPRI)736<< HMCD_VLAN_PRI_REP_MODE_SHIFT;737/* set VPRI default */738tmpReg |=739p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.vpriDefVal;740WRITE_UINT32(*p_TmpHmct, tmpReg);741/* save a pointer to the "last" indication word */742p_Last = p_TmpHmct;743/* write the table pointer into the Manip descriptor */744p_TmpHmct += HMCD_BASIC_SIZE / 4;745746tmpReg = 0;747ASSERT_COND(p_TmpData);748for (i = 0; i < HMCD_DSCP_VALUES; i++)749{750/* first we build from each 8 values a 32bit register */751tmpReg |=752(p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.dscpToVpriTable[i])753<< (32 - 4 * (j + 1));754j++;755/* Than we write this register to the next table word756* (i=7-->word 0, i=15-->word 1,... i=63-->word 7) */757if ((i % 8) == 7)758{759WRITE_UINT32(*((uint32_t*)p_TmpData + (i+1)/8-1),760tmpReg);761tmpReg = 0;762j = 0;763}764}765766WRITE_UINT32(767*p_TmpHmct,768(uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase)));769p_TmpHmct += HMCD_PTR_SIZE / 4;770771p_TmpData += DSCP_TO_VLAN_TABLE_SIZE;772}773else774if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType775== e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_VPRI)776{777/* set Mode */778/* line commented out as it has no-side-effect ('0' value). */779/*tmpReg |= HMCD_VLAN_PRI_UPDATE << HMCD_VLAN_PRI_REP_MODE_SHIFT*/;780/* set VPRI parameter */781tmpReg |=782p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.vpri;783WRITE_UINT32(*p_TmpHmct, tmpReg);784/* save a pointer to the "last" indication word */785p_Last = p_TmpHmct;786p_TmpHmct += HMCD_BASIC_SIZE / 4;787}788break;789790case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4):791/* set opcode */792tmpReg = (uint32_t)(HMCD_OPCODE_IPV4_UPDATE) << HMCD_OC_SHIFT;793if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates794& HDR_MANIP_IPV4_TTL)795tmpReg |= HMCD_IPV4_UPDATE_TTL;796if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates797& HDR_MANIP_IPV4_TOS)798{799tmpReg |= HMCD_IPV4_UPDATE_TOS;800tmpReg |=801p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.tos802<< HMCD_IPV4_UPDATE_TOS_SHIFT;803}804if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates805& HDR_MANIP_IPV4_ID)806tmpReg |= HMCD_IPV4_UPDATE_ID;807if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates808& HDR_MANIP_IPV4_SRC)809tmpReg |= HMCD_IPV4_UPDATE_SRC;810if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates811& HDR_MANIP_IPV4_DST)812tmpReg |= HMCD_IPV4_UPDATE_DST;813/* write the first 4 bytes of the descriptor */814WRITE_UINT32(*p_TmpHmct, tmpReg);815/* save a pointer to the "last" indication word */816p_Last = p_TmpHmct;817818p_TmpHmct += HMCD_BASIC_SIZE / 4;819820if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates821& HDR_MANIP_IPV4_ID)822{823ASSERT_COND(p_TmpData);824WRITE_UINT16(825*(uint16_t*)p_TmpData,826p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.id);827WRITE_UINT32(828*p_TmpHmct,829(uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));830p_TmpData += 2;831p_TmpHmct += HMCD_PTR_SIZE / 4;832}833834if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates835& HDR_MANIP_IPV4_SRC)836{837WRITE_UINT32(838*p_TmpHmct,839p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.src);840p_TmpHmct += HMCD_IPV4_ADDR_SIZE / 4;841}842843if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates844& HDR_MANIP_IPV4_DST)845{846WRITE_UINT32(847*p_TmpHmct,848p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.dst);849p_TmpHmct += HMCD_IPV4_ADDR_SIZE / 4;850}851break;852853case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6):854/* set opcode */855tmpReg = (uint32_t)(HMCD_OPCODE_IPV6_UPDATE) << HMCD_OC_SHIFT;856if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates857& HDR_MANIP_IPV6_HL)858tmpReg |= HMCD_IPV6_UPDATE_HL;859if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates860& HDR_MANIP_IPV6_TC)861{862tmpReg |= HMCD_IPV6_UPDATE_TC;863tmpReg |=864p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.trafficClass865<< HMCD_IPV6_UPDATE_TC_SHIFT;866}867if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates868& HDR_MANIP_IPV6_SRC)869tmpReg |= HMCD_IPV6_UPDATE_SRC;870if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates871& HDR_MANIP_IPV6_DST)872tmpReg |= HMCD_IPV6_UPDATE_DST;873/* write the first 4 bytes of the descriptor */874WRITE_UINT32(*p_TmpHmct, tmpReg);875/* save a pointer to the "last" indication word */876p_Last = p_TmpHmct;877878p_TmpHmct += HMCD_BASIC_SIZE / 4;879if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates880& HDR_MANIP_IPV6_SRC)881{882for (i = 0; i < NET_HEADER_FIELD_IPv6_ADDR_SIZE; i += 4)883{884memcpy(&tmp_ipv6_addr,885&p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.src[i],886sizeof(uint32_t));887WRITE_UINT32(*p_TmpHmct, tmp_ipv6_addr);888p_TmpHmct += HMCD_PTR_SIZE / 4;889}890}891if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates892& HDR_MANIP_IPV6_DST)893{894for (i = 0; i < NET_HEADER_FIELD_IPv6_ADDR_SIZE; i += 4)895{896memcpy(&tmp_ipv6_addr,897&p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.dst[i],898sizeof(uint32_t));899WRITE_UINT32(*p_TmpHmct, tmp_ipv6_addr);900p_TmpHmct += HMCD_PTR_SIZE / 4;901}902}903break;904905case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP):906if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates907== HDR_MANIP_TCP_UDP_CHECKSUM)908{909/* we implement this case with the update-checksum descriptor */910/* set opcode */911tmpReg = (uint32_t)(HMCD_OPCODE_TCP_UDP_CHECKSUM)912<< HMCD_OC_SHIFT;913/* write the first 4 bytes of the descriptor */914WRITE_UINT32(*p_TmpHmct, tmpReg);915/* save a pointer to the "last" indication word */916p_Last = p_TmpHmct;917918p_TmpHmct += HMCD_BASIC_SIZE / 4;919}920else921{922/* we implement this case with the TCP/UDP update descriptor */923/* set opcode */924tmpReg = (uint32_t)(HMCD_OPCODE_TCP_UDP_UPDATE)925<< HMCD_OC_SHIFT;926if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates927& HDR_MANIP_TCP_UDP_DST)928tmpReg |= HMCD_TCP_UDP_UPDATE_DST;929if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates930& HDR_MANIP_TCP_UDP_SRC)931tmpReg |= HMCD_TCP_UDP_UPDATE_SRC;932/* write the first 4 bytes of the descriptor */933WRITE_UINT32(*p_TmpHmct, tmpReg);934/* save a pointer to the "last" indication word */935p_Last = p_TmpHmct;936937p_TmpHmct += HMCD_BASIC_SIZE / 4;938939tmpReg = 0;940if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates941& HDR_MANIP_TCP_UDP_SRC)942tmpReg |=943((uint32_t)p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.src)944<< HMCD_TCP_UDP_UPDATE_SRC_SHIFT;945if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates946& HDR_MANIP_TCP_UDP_DST)947tmpReg |=948((uint32_t)p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.dst);949WRITE_UINT32(*p_TmpHmct, tmpReg);950p_TmpHmct += HMCD_PTR_SIZE / 4;951}952break;953954default:955RETURN_ERROR(MINOR, E_INVALID_SELECTION,956("Unknown fieldUpdateParams.type"));957}958}959960if (p_FmPcdManipParams->u.hdr.custom)961{962switch (p_FmPcdManipParams->u.hdr.customParams.type)963{964case (e_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE):965/* set opcode */966tmpReg = (uint32_t)(HMCD_OPCODE_REPLACE_IP) << HMCD_OC_SHIFT;967968if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.decTtlHl)969tmpReg |= HMCD_IP_REPLACE_TTL_HL;970if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType971== e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV4_BY_IPV6)972/* line commented out as it has no-side-effect ('0' value). */973/*tmpReg |= HMCD_IP_REPLACE_REPLACE_IPV4*/;974else975if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType976== e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4)977{978tmpReg |= HMCD_IP_REPLACE_REPLACE_IPV6;979if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id)980tmpReg |= HMCD_IP_REPLACE_ID;981}982else983RETURN_ERROR(984MINOR,985E_NOT_SUPPORTED,986("One flag out of HDR_MANIP_IP_REPLACE_IPV4, HDR_MANIP_IP_REPLACE_IPV6 - must be set."));987988/* write the first 4 bytes of the descriptor */989WRITE_UINT32(*p_TmpHmct, tmpReg);990/* save a pointer to the "last" indication word */991p_Last = p_TmpHmct;992993p_TmpHmct += HMCD_BASIC_SIZE / 4;994995size =996p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdrSize;997ASSERT_COND(p_TmpData);998MemCpy8(999p_TmpData,1000p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdr,1001size);1002tmpReg = (uint32_t)(size << HMCD_IP_REPLACE_L3HDRSIZE_SHIFT);1003tmpReg |= (uint32_t)(XX_VirtToPhys(p_TmpData)1004- (((t_FmPcd*)h_FmPcd)->physicalMuramBase));1005WRITE_UINT32(*p_TmpHmct, tmpReg);1006p_TmpHmct += HMCD_PTR_SIZE / 4;1007p_TmpData += size;10081009if ((p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType1010== e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4)1011&& (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id))1012{1013WRITE_UINT16(1014*(uint16_t*)p_TmpData,1015p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.id);1016WRITE_UINT32(1017*p_TmpHmct,1018(uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase)));1019p_TmpData += 2;1020}1021p_TmpHmct += HMCD_PTR_SIZE / 4;1022break;1023case (e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE):1024/* set opcode */1025tmpReg = (uint32_t)(HMCD_OPCODE_GEN_FIELD_REPLACE) << HMCD_OC_SHIFT;1026tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.size << HMCD_GEN_FIELD_SIZE_SHIFT;1027tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset << HMCD_GEN_FIELD_SRC_OFF_SHIFT;1028tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.dstOffset << HMCD_GEN_FIELD_DST_OFF_SHIFT;1029if (p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask)1030tmpReg |= HMCD_GEN_FIELD_MASK_EN;10311032/* write the first 4 bytes of the descriptor */1033WRITE_UINT32(*p_TmpHmct, tmpReg);1034/* save a pointer to the "last" indication word */1035p_Last = p_TmpHmct;10361037p_TmpHmct += HMCD_BASIC_SIZE/4;10381039if (p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask)1040{1041tmpReg = p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.mask << HMCD_GEN_FIELD_MASK_SHIFT;1042tmpReg |= p_FmPcdManipParams->u.hdr.customParams.u.genFieldReplace.maskOffset << HMCD_GEN_FIELD_MASK_OFF_SHIFT;1043/* write the next 4 bytes of the descriptor */1044WRITE_UINT32(*p_TmpHmct, tmpReg);1045}1046p_TmpHmct += HMCD_PARAM_SIZE/4;1047break;1048default:1049RETURN_ERROR(MINOR, E_INVALID_SELECTION,1050("Unknown customParams.type"));1051}1052}10531054/* If this node has a nextManip, and no parsing is required, the old table must be copied to the new table1055the old table and should be freed */1056if (p_FmPcdManipParams->h_NextManip1057&& (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR)1058&& (MANIP_DONT_REPARSE(p_Manip)))1059{1060if (new)1061{1062/* If this is the first time this manip is created we need to free unused memory. If it1063* is a dynamic changes case, the memory used is either the CC shadow or the existing1064* table - no allocation, no free */1065MANIP_UPDATE_UNIFIED_POSITION(p_FmPcdManipParams->h_NextManip);10661067p_Manip->unifiedPosition = e_MANIP_UNIFIED_FIRST;1068}1069}1070else1071{1072ASSERT_COND(p_Last);1073/* set the "last" indication on the last command of the current table */1074WRITE_UINT32(*p_Last, GET_UINT32(*p_Last) | HMCD_LAST);1075}10761077return E_OK;1078}10791080static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip,1081t_FmPcdManipParams *p_FmPcdManipParams)1082{1083t_FmPcdManip *p_CurManip;1084t_Error err;1085uint32_t nextSize = 0, totalSize;1086uint16_t tmpReg;1087uint8_t *p_OldHmct, *p_TmpHmctPtr, *p_TmpDataPtr;10881089/* set Manip structure */10901091p_Manip->dontParseAfterManip =1092p_FmPcdManipParams->u.hdr.dontParseAfterManip;10931094if (p_FmPcdManipParams->h_NextManip)1095{ /* Next Header manipulation exists */1096p_Manip->nextManipType = MANIP_GET_TYPE(p_FmPcdManipParams->h_NextManip);10971098if ((p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) && p_Manip->dontParseAfterManip)1099nextSize = (uint32_t)(GetHmctSize(p_FmPcdManipParams->h_NextManip)1100+ GetDataSize(p_FmPcdManipParams->h_NextManip));1101else /* either parsing is required or next manip is Frag; no table merging. */1102p_Manip->cascaded = TRUE;1103/* pass up the "cascaded" attribute. The whole chain is cascaded1104* if something is cascaded along the way. */1105if (MANIP_IS_CASCADED(p_FmPcdManipParams->h_NextManip))1106p_Manip->cascaded = TRUE;1107}11081109/* Allocate new table */1110/* calculate table size according to manip parameters */1111err = CalculateTableSize(p_FmPcdManipParams, &p_Manip->tableSize,1112&p_Manip->dataSize);1113if (err)1114RETURN_ERROR(MINOR, err, NO_MSG);11151116totalSize = (uint16_t)(p_Manip->tableSize + p_Manip->dataSize + nextSize);11171118p_Manip->p_Hmct = (uint8_t*)FM_MURAM_AllocMem(1119((t_FmPcd *)p_Manip->h_FmPcd)->h_FmMuram, totalSize, 4);1120if (!p_Manip->p_Hmct)1121RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc failed"));11221123if (p_Manip->dataSize)1124p_Manip->p_Data =1125(uint8_t*)PTR_MOVE(p_Manip->p_Hmct, (p_Manip->tableSize + nextSize));11261127/* update shadow size to allow runtime replacement of Header manipulation */1128/* The allocated shadow is divided as follows:11290 . . . 16 . . .1130--------------------------------1131| Shadow | Shadow HMTD |1132| HMTD | Match Table |1133| (16 bytes) | (maximal size) |1134--------------------------------1135*/11361137err = FmPcdUpdateCcShadow(p_Manip->h_FmPcd, (uint32_t)(totalSize + 16),1138(uint16_t)FM_PCD_CC_AD_TABLE_ALIGN);1139if (err != E_OK)1140{1141FM_MURAM_FreeMem(p_Manip->h_FmPcd, p_Manip->p_Hmct);1142RETURN_ERROR(MAJOR, E_NO_MEMORY,1143("MURAM allocation for HdrManip node shadow"));1144}11451146if (p_FmPcdManipParams->h_NextManip1147&& (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR)1148&& (MANIP_DONT_REPARSE(p_Manip)))1149{1150p_OldHmct = (uint8_t *)GetManipInfo(p_FmPcdManipParams->h_NextManip,1151e_MANIP_HMCT);1152p_CurManip = p_FmPcdManipParams->h_NextManip;1153/* Run till the last Manip (which is the first to configure) */1154while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))1155p_CurManip = p_CurManip->h_NextManip;11561157while (p_CurManip)1158{1159/* If this is a unified table, point to the part of the table1160* which is the relative offset in HMCT.1161*/1162p_TmpHmctPtr = (uint8_t*)PTR_MOVE(p_Manip->p_Hmct,1163(p_Manip->tableSize +1164(PTR_TO_UINT(p_CurManip->p_Hmct) -1165PTR_TO_UINT(p_OldHmct))));1166if (p_CurManip->p_Data)1167p_TmpDataPtr = (uint8_t*)PTR_MOVE(p_Manip->p_Hmct,1168(p_Manip->tableSize +1169(PTR_TO_UINT(p_CurManip->p_Data) -1170PTR_TO_UINT(p_OldHmct))));1171else1172p_TmpDataPtr = NULL;11731174BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr,1175p_TmpDataPtr, FALSE);1176/* update old manip table pointer */1177MANIP_SET_HMCT_PTR(p_CurManip, p_TmpHmctPtr);1178MANIP_SET_DATA_PTR(p_CurManip, p_TmpDataPtr);11791180p_CurManip = p_CurManip->h_PrevManip;1181}1182/* We copied the HMCT to create a new large HMCT so we can free the old one */1183FM_MURAM_FreeMem(MANIP_GET_MURAM(p_FmPcdManipParams->h_NextManip),1184p_OldHmct);1185}11861187/* Fill table */1188err = BuildHmct(p_Manip, p_FmPcdManipParams, p_Manip->p_Hmct,1189p_Manip->p_Data, TRUE);1190if (err)1191{1192FM_MURAM_FreeMem(p_Manip->h_FmPcd, p_Manip->p_Hmct);1193RETURN_ERROR(MINOR, err, NO_MSG);1194}11951196/* Build HMTD (table descriptor) */1197tmpReg = HMTD_CFG_TYPE; /* NADEN = 0 */11981199/* add parseAfterManip */1200if (!p_Manip->dontParseAfterManip)1201tmpReg |= HMTD_CFG_PRS_AFTER_HM;12021203/* create cascade */1204/*if (p_FmPcdManipParams->h_NextManip1205&& (!MANIP_DONT_REPARSE(p_Manip) || (p_Manip->nextManipType != e_FM_PCD_MANIP_HDR)))*/1206if (p_Manip->cascaded)1207{1208uint16_t nextAd;1209/* indicate that there's another HM table descriptor */1210tmpReg |= HMTD_CFG_NEXT_AD_EN;1211/* get address of next HMTD (table descriptor; h_Ad).1212* If the next HMTD was removed due to table unifing, get the address1213* of the "next next" as written in the h_Ad of the next h_Manip node.1214*/1215if (p_Manip->unifiedPosition != e_MANIP_UNIFIED_FIRST)1216nextAd = (uint16_t)((uint32_t)(XX_VirtToPhys(MANIP_GET_HMTD_PTR(p_FmPcdManipParams->h_NextManip)) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4);1217else1218nextAd = ((t_Hmtd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad)->nextAdIdx;12191220WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->nextAdIdx, nextAd);1221}12221223WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->cfg, tmpReg);1224WRITE_UINT32(1225((t_Hmtd *)p_Manip->h_Ad)->hmcdBasePtr,1226(uint32_t)(XX_VirtToPhys(p_Manip->p_Hmct) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));12271228WRITE_UINT8(((t_Hmtd *)p_Manip->h_Ad)->opCode, HMAN_OC);12291230if (p_Manip->unifiedPosition == e_MANIP_UNIFIED_FIRST)1231{1232/* The HMTD of the next Manip is never going to be used */1233if (((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->muramAllocate)1234FM_MURAM_FreeMem(1235((t_FmPcd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_FmPcd)->h_FmMuram,1236((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);1237else1238XX_Free(((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);1239((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL;1240}12411242return E_OK;1243}12441245static t_Error CreateManipActionShadow(t_FmPcdManip *p_Manip,1246t_FmPcdManipParams *p_FmPcdManipParams)1247{1248uint8_t *p_WholeHmct, *p_TmpHmctPtr, newDataSize, *p_TmpDataPtr = NULL;1249uint16_t newSize;1250t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;1251t_Error err;1252t_FmPcdManip *p_CurManip = p_Manip;12531254err = CalculateTableSize(p_FmPcdManipParams, &newSize, &newDataSize);1255if (err)1256RETURN_ERROR(MINOR, err, NO_MSG);12571258/* check coherency of new table parameters */1259if (newSize > p_Manip->tableSize)1260RETURN_ERROR(1261MINOR,1262E_INVALID_VALUE,1263("New Hdr Manip configuration requires larger size than current one (command table)."));1264if (newDataSize > p_Manip->dataSize)1265RETURN_ERROR(1266MINOR,1267E_INVALID_VALUE,1268("New Hdr Manip configuration requires larger size than current one (data)."));1269if (p_FmPcdManipParams->h_NextManip)1270RETURN_ERROR(1271MINOR, E_INVALID_VALUE,1272("New Hdr Manip configuration can not contain h_NextManip."));1273if (MANIP_IS_UNIFIED(p_Manip) && (newSize != p_Manip->tableSize))1274RETURN_ERROR(1275MINOR,1276E_INVALID_VALUE,1277("New Hdr Manip configuration in a chained manipulation requires different size than current one."));1278if (p_Manip->dontParseAfterManip1279!= p_FmPcdManipParams->u.hdr.dontParseAfterManip)1280RETURN_ERROR(1281MINOR,1282E_INVALID_VALUE,1283("New Hdr Manip configuration differs in dontParseAfterManip value."));12841285p_Manip->tableSize = newSize;1286p_Manip->dataSize = newDataSize;12871288/* Build the new table in the shadow */1289if (!MANIP_IS_UNIFIED(p_Manip))1290{1291p_TmpHmctPtr = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow, 16);1292if (p_Manip->p_Data)1293p_TmpDataPtr =1294(uint8_t*)PTR_MOVE(p_TmpHmctPtr,1295(PTR_TO_UINT(p_Manip->p_Data) - PTR_TO_UINT(p_Manip->p_Hmct)));12961297BuildHmct(p_Manip, p_FmPcdManipParams, p_TmpHmctPtr, p_Manip->p_Data,1298FALSE);1299}1300else1301{1302p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);1303ASSERT_COND(p_WholeHmct);13041305/* Run till the last Manip (which is the first to configure) */1306while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))1307p_CurManip = p_CurManip->h_NextManip;13081309while (p_CurManip)1310{1311/* If this is a non-head node in a unified table, point to the part of the shadow1312* which is the relative offset in HMCT.1313* else, point to the beginning of the1314* shadow table (we save 16 for the HMTD.1315*/1316p_TmpHmctPtr =1317(uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow,1318(16 + PTR_TO_UINT(p_CurManip->p_Hmct) - PTR_TO_UINT(p_WholeHmct)));1319if (p_CurManip->p_Data)1320p_TmpDataPtr =1321(uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow,1322(16 + PTR_TO_UINT(p_CurManip->p_Data) - PTR_TO_UINT(p_WholeHmct)));13231324BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr,1325p_TmpDataPtr, FALSE);1326p_CurManip = p_CurManip->h_PrevManip;1327}1328}13291330return E_OK;1331}13321333static t_Error CreateManipActionBackToOrig(1334t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_FmPcdManipParams)1335{1336uint8_t *p_WholeHmct = NULL, *p_TmpHmctPtr, *p_TmpDataPtr;1337t_FmPcdManip *p_CurManip = p_Manip;13381339/* Build the new table in the shadow */1340if (!MANIP_IS_UNIFIED(p_Manip))1341BuildHmct(p_Manip, p_FmPcdManipParams, p_Manip->p_Hmct, p_Manip->p_Data,1342FALSE);1343else1344{1345p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);1346ASSERT_COND(p_WholeHmct);13471348/* Run till the last Manip (which is the first to configure) */1349while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))1350p_CurManip = p_CurManip->h_NextManip;13511352while (p_CurManip)1353{1354/* If this is a unified table, point to the part of the table1355* which is the relative offset in HMCT.1356*/1357p_TmpHmctPtr = p_CurManip->p_Hmct; /*- (uint32_t)p_WholeHmct*/1358p_TmpDataPtr = p_CurManip->p_Data; /*- (uint32_t)p_WholeHmct*/13591360BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr,1361p_TmpDataPtr, FALSE);13621363p_CurManip = p_CurManip->h_PrevManip;1364}1365}13661367return E_OK;1368}13691370#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))1371static t_Error UpdateManipIc(t_Handle h_Manip, uint8_t icOffset)1372{1373t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;1374t_Handle p_Ad;1375uint32_t tmpReg32 = 0;1376SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);1377SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);13781379switch (p_Manip->opcode)1380{1381case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):1382p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;1383if (p_Manip->updateParams & INTERNAL_CONTEXT_OFFSET)1384{1385tmpReg32 =1386*(uint32_t *)&((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets;1387tmpReg32 |= (uint32_t)((uint32_t)icOffset << 16);1388*(uint32_t *)&((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets =1389tmpReg32;1390p_Manip->updateParams &= ~INTERNAL_CONTEXT_OFFSET;1391p_Manip->icOffset = icOffset;1392}1393else1394{1395if (p_Manip->icOffset != icOffset)1396RETURN_ERROR(1397MAJOR,1398E_INVALID_VALUE,1399("this manipulation was updated previously by different value"););1400}1401break;1402case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):1403if (p_Manip->h_Frag)1404{1405if (p_Manip->updateParams & INTERNAL_CONTEXT_OFFSET)1406{1407p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;1408tmpReg32 |= GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets);1409tmpReg32 |= (uint32_t)((uint32_t)icOffset << 16);1410WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets, tmpReg32);1411p_Manip->updateParams &= ~INTERNAL_CONTEXT_OFFSET;1412p_Manip->icOffset = icOffset;1413}1414else1415{1416if (p_Manip->icOffset != icOffset)1417RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("this manipulation was updated previousely by different value"););1418}1419}1420break;1421}14221423return E_OK;1424}14251426static t_Error UpdateInitMvIntFrameHeaderFromFrameToBufferPrefix(1427t_Handle h_FmPort, t_FmPcdManip *p_Manip, t_Handle h_Ad, bool validate)1428{14291430t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)h_Ad;1431t_FmPortGetSetCcParams fmPortGetSetCcParams;1432t_Error err;1433uint32_t tmpReg32;14341435memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));14361437SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);1438SANITY_CHECK_RETURN_ERROR(1439(p_Manip->opcode & HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX),1440E_INVALID_STATE);1441SANITY_CHECK_RETURN_ERROR(!p_Manip->muramAllocate, E_INVALID_STATE);14421443if (p_Manip->updateParams)1444{1445if ((!(p_Manip->updateParams & OFFSET_OF_PR))1446|| (p_Manip->shadowUpdateParams & OFFSET_OF_PR))1447RETURN_ERROR(1448MAJOR, E_INVALID_STATE,1449("in this stage parameters from Port has not be updated"));14501451fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;1452fmPortGetSetCcParams.setCcParams.type = UPDATE_PSO;1453fmPortGetSetCcParams.setCcParams.psoSize = 16;14541455err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);1456if (err)1457RETURN_ERROR(MAJOR, err, NO_MSG);1458if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR)1459RETURN_ERROR(1460MAJOR, E_INVALID_STATE,1461("Parser result offset wasn't configured previousely"));1462#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW0041463ASSERT_COND(!(fmPortGetSetCcParams.getCcParams.prOffset % 16));1464#endif1465}1466else1467if (validate)1468{1469if ((!(p_Manip->shadowUpdateParams & OFFSET_OF_PR))1470|| (p_Manip->updateParams & OFFSET_OF_PR))1471RETURN_ERROR(1472MAJOR, E_INVALID_STATE,1473("in this stage parameters from Port has be updated"));1474fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;1475fmPortGetSetCcParams.setCcParams.type = UPDATE_PSO;1476fmPortGetSetCcParams.setCcParams.psoSize = 16;14771478err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);1479if (err)1480RETURN_ERROR(MAJOR, err, NO_MSG);1481if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR)1482RETURN_ERROR(1483MAJOR, E_INVALID_STATE,1484("Parser result offset wasn't configured previousely"));14851486}14871488ASSERT_COND(p_Ad);14891490if (p_Manip->updateParams & OFFSET_OF_PR)1491{1492tmpReg32 = 0;1493tmpReg32 |= fmPortGetSetCcParams.getCcParams.prOffset;1494WRITE_UINT32(p_Ad->matchTblPtr,1495(GET_UINT32(p_Ad->matchTblPtr) | tmpReg32));1496p_Manip->updateParams &= ~OFFSET_OF_PR;1497p_Manip->shadowUpdateParams |= OFFSET_OF_PR;1498}1499else1500if (validate)1501{1502tmpReg32 = GET_UINT32(p_Ad->matchTblPtr);1503if ((uint8_t)tmpReg32 != fmPortGetSetCcParams.getCcParams.prOffset)1504RETURN_ERROR(1505MAJOR,1506E_INVALID_STATE,1507("this manipulation was updated previousely by different value"););1508}15091510return E_OK;1511}15121513static t_Error UpdateModifyCapwapFragmenation(t_FmPcdManip *p_Manip, t_Handle h_Ad, bool validate,t_Handle h_FmTree)1514{1515t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)h_Ad;1516t_FmPcdCcSavedManipParams *p_SavedManipParams = NULL;1517uint32_t tmpReg32 = 0;15181519SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);1520SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);1521SANITY_CHECK_RETURN_ERROR(p_Manip->frag,E_INVALID_HANDLE);1522SANITY_CHECK_RETURN_ERROR(((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION) || (p_Manip->opcode == HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER)), E_INVALID_STATE);15231524p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;15251526if (p_Manip->updateParams)1527{15281529if ((!(p_Manip->updateParams & OFFSET_OF_DATA)) ||1530((p_Manip->shadowUpdateParams & OFFSET_OF_DATA)))1531RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));1532p_SavedManipParams = FmPcdCcTreeGetSavedManipParams(h_FmTree);1533if (!p_SavedManipParams)1534RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("for this manipulation tree has to be configured previosely with this type"));1535p_Manip->capwapFragParams.dataOffset = p_SavedManipParams->capwapParams.dataOffset;15361537tmpReg32 = GET_UINT32(p_Ad->pcAndOffsets);1538tmpReg32 |= ((uint32_t)p_Manip->capwapFragParams.dataOffset<< 16);1539WRITE_UINT32(p_Ad->pcAndOffsets,tmpReg32);15401541p_Manip->updateParams &= ~OFFSET_OF_DATA;1542p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;1543}1544else if (validate)1545{15461547p_SavedManipParams = FmPcdCcTreeGetSavedManipParams(h_FmTree);1548if (!p_SavedManipParams)1549RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("for this manipulation tree has to be configured previosely with this type"));1550if (p_Manip->capwapFragParams.dataOffset != p_SavedManipParams->capwapParams.dataOffset)1551RETURN_ERROR(MAJOR, E_INVALID_STATE, ("this manipulation was updated previousely by different value"));1552}15531554return E_OK;1555}15561557static t_Error UpdateInitCapwapFragmentation(t_Handle h_FmPort,1558t_FmPcdManip *p_Manip,1559t_Handle h_Ad,1560bool validate,1561t_Handle h_FmTree)1562{1563t_AdOfTypeContLookup *p_Ad;1564t_FmPortGetSetCcParams fmPortGetSetCcParams;1565t_Error err;1566uint32_t tmpReg32 = 0;1567t_FmPcdCcSavedManipParams *p_SavedManipParams;15681569UNUSED(h_Ad);15701571SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);1572SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);1573SANITY_CHECK_RETURN_ERROR(p_Manip->frag,E_INVALID_HANDLE);1574SANITY_CHECK_RETURN_ERROR(((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION) ||1575(p_Manip->opcode == HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER)), E_INVALID_STATE);15761577p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;15781579if (p_Manip->updateParams)1580{1581if ((!(p_Manip->updateParams & OFFSET_OF_DATA)) ||1582((p_Manip->shadowUpdateParams & OFFSET_OF_DATA)))1583RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));1584fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;1585fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN | UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY;1586fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;1587/* For CAPWAP Rassembly used FMAN_CTRL2 hardcoded - so for fragmentation its better to use FMAN_CTRL1 */1588fmPortGetSetCcParams.setCcParams.orFmanCtrl = FPM_PORT_FM_CTL1;15891590err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);1591if (err)1592RETURN_ERROR(MAJOR, err, NO_MSG);15931594if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)1595RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Data offset wasn't configured previousely"));15961597p_SavedManipParams = (t_FmPcdCcSavedManipParams *)XX_Malloc(sizeof(t_FmPcdCcSavedManipParams));1598p_SavedManipParams->capwapParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;15991600#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW0041601ASSERT_COND(!(p_SavedManipParams->capwapParams.dataOffset % 16));1602#endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */16031604FmPcdCcTreeSetSavedManipParams(h_FmTree, (t_Handle)p_SavedManipParams);1605}1606else if (validate)1607{1608if ((!(p_Manip->shadowUpdateParams & OFFSET_OF_DATA)) ||1609((p_Manip->updateParams & OFFSET_OF_DATA)))1610RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));1611fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;1612fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN | UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY;1613fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;1614err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);1615if (err)1616RETURN_ERROR(MAJOR, err, NO_MSG);16171618if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)1619RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Data offset wasn't configured previousely"));1620}16211622if (p_Manip->updateParams)1623{1624tmpReg32 = GET_UINT32(p_Ad->pcAndOffsets);1625tmpReg32 |= ((uint32_t)fmPortGetSetCcParams.getCcParams.dataOffset<< 16);1626WRITE_UINT32(p_Ad->pcAndOffsets,tmpReg32);16271628p_Manip->updateParams &= ~OFFSET_OF_DATA;1629p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;1630p_Manip->capwapFragParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;1631}1632else if (validate)1633{1634if (p_Manip->capwapFragParams.dataOffset != fmPortGetSetCcParams.getCcParams.dataOffset)1635RETURN_ERROR(MAJOR, E_INVALID_STATE, ("this manipulation was updated previousely by different value"));1636}16371638return E_OK;1639}16401641static t_Error UpdateInitCapwapReasm(t_Handle h_FmPcd,1642t_Handle h_FmPort,1643t_FmPcdManip *p_Manip,1644t_Handle h_Ad,1645bool validate)1646{1647t_CapwapReasmPram *p_ReassmTbl;1648t_Error err;1649t_FmPortGetSetCcParams fmPortGetSetCcParams;1650uint8_t i = 0;1651uint16_t size;1652uint32_t tmpReg32;1653t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;1654t_FmPcdCcCapwapReassmTimeoutParams ccCapwapReassmTimeoutParams;16551656SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);1657SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);1658SANITY_CHECK_RETURN_ERROR(!p_Manip->frag,E_INVALID_HANDLE);1659SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST), E_INVALID_STATE);1660SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_HANDLE);1661SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc,E_INVALID_HANDLE);16621663if (p_Manip->h_FmPcd != h_FmPcd)1664RETURN_ERROR(MAJOR, E_INVALID_STATE,1665("handler of PCD previously was initiated by different value"));16661667UNUSED(h_Ad);16681669memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));1670p_ReassmTbl = (t_CapwapReasmPram *)p_Manip->h_Frag;16711672if (p_Manip->updateParams)1673{1674if ((!(p_Manip->updateParams & NUM_OF_TASKS) &&1675!(p_Manip->updateParams & OFFSET_OF_DATA) &&1676!(p_Manip->updateParams & OFFSET_OF_PR) &&1677!(p_Manip->updateParams & HW_PORT_ID)) ||1678((p_Manip->shadowUpdateParams & NUM_OF_TASKS) ||1679(p_Manip->shadowUpdateParams & OFFSET_OF_DATA) || (p_Manip->shadowUpdateParams & OFFSET_OF_PR) ||1680(p_Manip->shadowUpdateParams & HW_PORT_ID)))1681RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));16821683fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;1684fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN;1685fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;16861687err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);1688if (err)1689RETURN_ERROR(MAJOR, err, NO_MSG);16901691if (fmPortGetSetCcParams.getCcParams.type & NUM_OF_TASKS)1692RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Num of tasks wasn't configured previousely"));1693if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)1694RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previousely"));1695if (fmPortGetSetCcParams.getCcParams.type & HW_PORT_ID)1696RETURN_ERROR(MAJOR, E_INVALID_STATE, ("hwPortId wasn't updated"));1697#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW0041698ASSERT_COND((fmPortGetSetCcParams.getCcParams.dataOffset % 16) == 0);1699#endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */1700}1701else if (validate)1702{1703if ((!(p_Manip->shadowUpdateParams & NUM_OF_TASKS) &&1704!(p_Manip->shadowUpdateParams & OFFSET_OF_DATA) &&1705!(p_Manip->shadowUpdateParams & OFFSET_OF_PR) &&1706!(p_Manip->shadowUpdateParams & HW_PORT_ID)) &&1707((p_Manip->updateParams & NUM_OF_TASKS) ||1708(p_Manip->updateParams & OFFSET_OF_DATA) || (p_Manip->updateParams & OFFSET_OF_PR) ||1709(p_Manip->updateParams & HW_PORT_ID)))1710RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));17111712fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;1713fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN;1714fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_POP_TO_N_STEP | NIA_ENG_FM_CTL;17151716err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);1717if (err)1718RETURN_ERROR(MAJOR, err, NO_MSG);17191720if (fmPortGetSetCcParams.getCcParams.type & NUM_OF_TASKS)1721RETURN_ERROR(MAJOR, E_INVALID_STATE, ("NumOfTasks wasn't configured previously"));1722if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)1723RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previously"));1724if (fmPortGetSetCcParams.getCcParams.type & HW_PORT_ID)1725RETURN_ERROR(MAJOR, E_INVALID_STATE, ("hwPortId wasn't updated"));1726}17271728if (p_Manip->updateParams)1729{1730if (p_Manip->updateParams & NUM_OF_TASKS)1731{1732/*recommendation of Microcode team - (maxNumFramesInProcess * 2) */1733size = (uint16_t)(p_Manip->capwapFragParams.maxNumFramesInProcess*2 + fmPortGetSetCcParams.getCcParams.numOfTasks);1734if (size > 255)1735RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("numOfOpenReassmEntries + numOfTasks per port can not be greater than 256"));17361737p_Manip->capwapFragParams.numOfTasks = fmPortGetSetCcParams.getCcParams.numOfTasks;17381739/*p_ReassmFrmDescrIndxPoolTbl*/1740p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl =1741(t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,1742(uint32_t)(size + 1),17434);1744if (!p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl)1745RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly frame buffer index pool table"));17461747MemSet8(p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl, 0, (uint32_t)(size + 1));17481749for ( i = 0; i < size; i++)1750WRITE_UINT8(*(uint8_t *)PTR_MOVE(p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl, i), (uint8_t)(i+1));17511752tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl) - p_FmPcd->physicalMuramBase);17531754WRITE_UINT32(p_ReassmTbl->reasmFrmDescIndexPoolTblPtr, tmpReg32);17551756/*p_ReassmFrmDescrPoolTbl*/1757p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl =1758(t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,1759(uint32_t)((size + 1) * FM_PCD_MANIP_CAPWAP_REASM_RFD_SIZE),17604);17611762if (!p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl)1763RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly frame buffer pool table"));17641765MemSet8(p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl, 0, (uint32_t)((size +1)* FM_PCD_MANIP_CAPWAP_REASM_RFD_SIZE));17661767tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl) - p_FmPcd->physicalMuramBase);17681769WRITE_UINT32(p_ReassmTbl->reasmFrmDescPoolTblPtr, tmpReg32);17701771/*p_TimeOutTbl*/17721773p_Manip->capwapFragParams.p_TimeOutTbl =1774(t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,1775(uint32_t)((size + 1)* FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_ENTRY_SIZE),17764);17771778if (!p_Manip->capwapFragParams.p_TimeOutTbl)1779RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly timeout table"));17801781MemSet8(p_Manip->capwapFragParams.p_TimeOutTbl, 0, (uint16_t)((size + 1)*FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_ENTRY_SIZE));17821783tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_TimeOutTbl) - p_FmPcd->physicalMuramBase);1784WRITE_UINT32(p_ReassmTbl->timeOutTblPtr, tmpReg32);17851786p_Manip->updateParams &= ~NUM_OF_TASKS;1787p_Manip->shadowUpdateParams |= NUM_OF_TASKS;1788}17891790if (p_Manip->updateParams & OFFSET_OF_DATA)1791{1792p_Manip->capwapFragParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;1793tmpReg32 = GET_UINT32(p_ReassmTbl->mode);1794tmpReg32|= p_Manip->capwapFragParams.dataOffset;1795WRITE_UINT32(p_ReassmTbl->mode, tmpReg32);1796p_Manip->updateParams &= ~OFFSET_OF_DATA;1797p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;1798}17991800if (!(fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR))1801{1802p_Manip->capwapFragParams.prOffset = fmPortGetSetCcParams.getCcParams.prOffset;18031804tmpReg32 = GET_UINT32(p_ReassmTbl->mode);1805tmpReg32|= FM_PCD_MANIP_CAPWAP_REASM_PR_COPY;1806WRITE_UINT32(p_ReassmTbl->mode, tmpReg32);18071808tmpReg32 = GET_UINT32(p_ReassmTbl->intStatsTblPtr);1809tmpReg32 |= (uint32_t)p_Manip->capwapFragParams.prOffset << 24;1810WRITE_UINT32(p_ReassmTbl->intStatsTblPtr, tmpReg32);1811p_Manip->updateParams &= ~OFFSET_OF_PR;1812p_Manip->shadowUpdateParams |= OFFSET_OF_PR;1813}1814else1815{1816p_Manip->capwapFragParams.prOffset = 0xff;1817p_Manip->updateParams &= ~OFFSET_OF_PR;1818p_Manip->shadowUpdateParams |= OFFSET_OF_PR;1819}18201821p_Manip->capwapFragParams.hwPortId = fmPortGetSetCcParams.getCcParams.hardwarePortId;1822p_Manip->updateParams &= ~HW_PORT_ID;1823p_Manip->shadowUpdateParams |= HW_PORT_ID;18241825/*timeout hc */1826ccCapwapReassmTimeoutParams.fqidForTimeOutFrames = p_Manip->capwapFragParams.fqidForTimeOutFrames;1827ccCapwapReassmTimeoutParams.portIdAndCapwapReassmTbl = (uint32_t)p_Manip->capwapFragParams.hwPortId << 24;1828ccCapwapReassmTimeoutParams.portIdAndCapwapReassmTbl |= (uint32_t)((XX_VirtToPhys(p_ReassmTbl) - p_FmPcd->physicalMuramBase));1829ccCapwapReassmTimeoutParams.timeoutRequestTime = (((uint32_t)1<<p_Manip->capwapFragParams.bitFor1Micro) * p_Manip->capwapFragParams.timeoutRoutineRequestTime)/2;1830return FmHcPcdCcCapwapTimeoutReassm(p_FmPcd->h_Hc,&ccCapwapReassmTimeoutParams);1831}18321833else if (validate)1834{1835if (fmPortGetSetCcParams.getCcParams.hardwarePortId != p_Manip->capwapFragParams.hwPortId)1836RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Reassembly manipulation previously was assigned to another port"));1837if (fmPortGetSetCcParams.getCcParams.numOfTasks != p_Manip->capwapFragParams.numOfTasks)1838RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfTasks for this manipulation previously was defined by another value "));18391840if (!(fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR))1841{1842if (p_Manip->capwapFragParams.prOffset != fmPortGetSetCcParams.getCcParams.prOffset)1843RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Parse result offset previously was defined by another value "));1844}1845else1846{1847if (p_Manip->capwapFragParams.prOffset != 0xff)1848RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Parse result offset previously was defined by another value "));1849}1850if (fmPortGetSetCcParams.getCcParams.dataOffset != p_Manip->capwapFragParams.dataOffset)1851RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Data offset previously was defined by another value "));1852}18531854return E_OK;1855}1856#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */18571858t_Error FmPcdRegisterReassmPort(t_Handle h_FmPcd, t_Handle h_ReasmCommonPramTbl)1859{1860t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1861t_FmPcdCcReassmTimeoutParams ccReassmTimeoutParams = { 0 };1862t_Error err = E_OK;1863uint8_t result;1864uint32_t bitFor1Micro, tsbs, log2num;18651866ASSERT_COND(p_FmPcd);1867ASSERT_COND(h_ReasmCommonPramTbl);18681869bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);1870if (bitFor1Micro == 0)1871RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("Timestamp scale"));18721873bitFor1Micro = 32 - bitFor1Micro;1874LOG2(FM_PCD_MANIP_REASM_TIMEOUT_THREAD_THRESH, log2num);1875tsbs = bitFor1Micro - log2num;18761877ccReassmTimeoutParams.iprcpt = (uint32_t)(XX_VirtToPhys(1878h_ReasmCommonPramTbl) - p_FmPcd->physicalMuramBase);1879ccReassmTimeoutParams.tsbs = (uint8_t)tsbs;1880ccReassmTimeoutParams.activate = TRUE;1881if ((err = FmHcPcdCcTimeoutReassm(p_FmPcd->h_Hc, &ccReassmTimeoutParams,1882&result)) != E_OK)1883RETURN_ERROR(MAJOR, err, NO_MSG);18841885switch (result)1886{1887case (0):1888return E_OK;1889case (1):1890RETURN_ERROR(MAJOR, E_NO_MEMORY, ("failed to allocate TNUM"));1891case (2):1892RETURN_ERROR(1893MAJOR, E_NO_MEMORY,1894("failed to allocate internal buffer from the HC-Port"));1895case (3):1896RETURN_ERROR(MAJOR, E_INVALID_VALUE,1897("'Disable Timeout Task' with invalid IPRCPT"));1898case (4):1899RETURN_ERROR(MAJOR, E_FULL, ("too many timeout tasks"));1900case (5):1901RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("invalid sub command"));1902default:1903RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);1904}1905return E_OK;1906}19071908static t_Error CreateReassCommonTable(t_FmPcdManip *p_Manip)1909{1910uint32_t tmpReg32 = 0, i, bitFor1Micro;1911uint64_t tmpReg64, size;1912t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;1913t_Error err = E_OK;19141915bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);1916if (bitFor1Micro == 0)1917RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("Timestamp scale"));19181919/* Allocation of the Reassembly Common Parameters table. This table is located in the1920MURAM. Its size is 64 bytes and its base address should be 8-byte aligned. */1921p_Manip->reassmParams.p_ReassCommonTbl =1922(t_ReassCommonTbl *)FM_MURAM_AllocMem(1923p_FmPcd->h_FmMuram,1924FM_PCD_MANIP_REASM_COMMON_PARAM_TABLE_SIZE,1925FM_PCD_MANIP_REASM_COMMON_PARAM_TABLE_ALIGN);19261927if (!p_Manip->reassmParams.p_ReassCommonTbl)1928RETURN_ERROR(MAJOR, E_NO_MEMORY,1929("MURAM alloc for Reassembly common parameters table"));19301931MemSet8(p_Manip->reassmParams.p_ReassCommonTbl, 0,1932FM_PCD_MANIP_REASM_COMMON_PARAM_TABLE_SIZE);19331934/* Setting the TimeOut Mode.*/1935tmpReg32 = 0;1936if (p_Manip->reassmParams.timeOutMode1937== e_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAMES)1938tmpReg32 |= FM_PCD_MANIP_REASM_TIME_OUT_BETWEEN_FRAMES;19391940/* Setting TimeOut FQID - Frames that time out are enqueued to this FQID.1941In order to cause TimeOut frames to be discarded, this queue should be configured accordingly*/1942tmpReg32 |= p_Manip->reassmParams.fqidForTimeOutFrames;1943WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->timeoutModeAndFqid,1944tmpReg32);19451946/* Calculation the size of IP Reassembly Frame Descriptor - number of frames that are allowed to be reassembled simultaneously + 129.*/1947size = p_Manip->reassmParams.maxNumFramesInProcess + 129;19481949/*Allocation of IP Reassembly Frame Descriptor Indexes Pool - This pool resides in the MURAM */1950p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr =1951PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,1952(uint32_t)(size * 2),1953256));1954if (!p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr)1955RETURN_ERROR(1956MAJOR, E_NO_MEMORY,1957("MURAM alloc for Reassembly frame descriptor indexes pool"));19581959MemSet8(UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr),19600, (uint32_t)(size * 2));19611962/* The entries in IP Reassembly Frame Descriptor Indexes Pool contains indexes starting with 1 up to1963the maximum number of frames that are allowed to be reassembled simultaneously + 128.1964The last entry in this pool must contain the index zero*/1965for (i = 0; i < (size - 1); i++)1966WRITE_UINT16(1967*(uint16_t *)PTR_MOVE(UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr), (i<<1)),1968(uint16_t)(i+1));19691970/* Sets the IP Reassembly Frame Descriptor Indexes Pool offset from MURAM */1971tmpReg32 = (uint32_t)(XX_VirtToPhys(1972UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr))1973- p_FmPcd->physicalMuramBase);1974WRITE_UINT32(1975p_Manip->reassmParams.p_ReassCommonTbl->reassFrmDescIndexPoolTblPtr,1976tmpReg32);19771978/* Allocation of the Reassembly Frame Descriptors Pool - This pool resides in external memory.1979The number of entries in this pool should be equal to the number of entries in IP Reassembly Frame Descriptor Indexes Pool.*/1980p_Manip->reassmParams.reassFrmDescrPoolTblAddr =1981PTR_TO_UINT(XX_MallocSmart((uint32_t)(size * 64), p_Manip->reassmParams.dataMemId, 64));19821983if (!p_Manip->reassmParams.reassFrmDescrPoolTblAddr)1984RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));19851986MemSet8(UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrPoolTblAddr), 0,1987(uint32_t)(size * 64));19881989/* Sets the Reassembly Frame Descriptors Pool and liodn offset*/1990tmpReg64 = (uint64_t)(XX_VirtToPhys(1991UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrPoolTblAddr)));1992tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset1993& FM_PCD_MANIP_REASM_LIODN_MASK)1994<< (uint64_t)FM_PCD_MANIP_REASM_LIODN_SHIFT);1995tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset1996& FM_PCD_MANIP_REASM_ELIODN_MASK)1997<< (uint64_t)FM_PCD_MANIP_REASM_ELIODN_SHIFT);1998WRITE_UINT32(1999p_Manip->reassmParams.p_ReassCommonTbl->liodnAndReassFrmDescPoolPtrHi,2000(uint32_t)(tmpReg64 >> 32));2001WRITE_UINT32(2002p_Manip->reassmParams.p_ReassCommonTbl->reassFrmDescPoolPtrLow,2003(uint32_t)tmpReg64);20042005/*Allocation of the TimeOut table - This table resides in the MURAM.2006The number of entries in this table is identical to the number of entries in the Reassembly Frame Descriptors Pool*/2007p_Manip->reassmParams.timeOutTblAddr =2008PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, (uint32_t)(size * 8),8));20092010if (!p_Manip->reassmParams.timeOutTblAddr)2011RETURN_ERROR(MAJOR, E_NO_MEMORY,2012("MURAM alloc for Reassembly timeout table"));20132014MemSet8(UINT_TO_PTR(p_Manip->reassmParams.timeOutTblAddr), 0,2015(uint16_t)(size * 8));20162017/* Sets the TimeOut table offset from MURAM */2018tmpReg32 = (uint32_t)(XX_VirtToPhys(2019UINT_TO_PTR(p_Manip->reassmParams.timeOutTblAddr))2020- p_FmPcd->physicalMuramBase);2021WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->timeOutTblPtr,2022tmpReg32);20232024/* Sets the Expiration Delay */2025tmpReg32 = 0;2026tmpReg32 |= (((uint32_t)(1 << bitFor1Micro))2027* p_Manip->reassmParams.timeoutThresholdForReassmProcess);2028WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->expirationDelay,2029tmpReg32);20302031err = FmPcdRegisterReassmPort(p_FmPcd,2032p_Manip->reassmParams.p_ReassCommonTbl);2033if (err != E_OK)2034{2035FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2036p_Manip->reassmParams.p_ReassCommonTbl);2037RETURN_ERROR(MAJOR, err, ("port registration"));2038}20392040return err;2041}20422043static t_Error CreateReassTable(t_FmPcdManip *p_Manip, e_NetHeaderType hdr)2044{2045t_FmPcd *p_FmPcd = p_Manip->h_FmPcd;2046uint32_t tmpReg32, autoLearnHashTblSize;2047uint32_t numOfWays, setSize, setSizeCode, keySize;2048uint32_t waySize, numOfSets, numOfEntries;2049uint64_t tmpReg64;2050uint16_t minFragSize;2051uint16_t maxReassemSize;2052uintptr_t *p_AutoLearnHashTblAddr, *p_AutoLearnSetLockTblAddr;2053t_ReassTbl **p_ReassTbl;20542055switch (hdr)2056{2057case HEADER_TYPE_IPv4:2058p_ReassTbl = &p_Manip->reassmParams.ip.p_Ipv4ReassTbl;2059p_AutoLearnHashTblAddr =2060&p_Manip->reassmParams.ip.ipv4AutoLearnHashTblAddr;2061p_AutoLearnSetLockTblAddr =2062&p_Manip->reassmParams.ip.ipv4AutoLearnSetLockTblAddr;2063minFragSize = p_Manip->reassmParams.ip.minFragSize[0];2064maxReassemSize = 0;2065numOfWays = p_Manip->reassmParams.ip.numOfFramesPerHashEntry[0];2066keySize = 4 + 4 + 1 + 2; /* 3-tuple + IP-Id */2067break;2068case HEADER_TYPE_IPv6:2069p_ReassTbl = &p_Manip->reassmParams.ip.p_Ipv6ReassTbl;2070p_AutoLearnHashTblAddr =2071&p_Manip->reassmParams.ip.ipv6AutoLearnHashTblAddr;2072p_AutoLearnSetLockTblAddr =2073&p_Manip->reassmParams.ip.ipv6AutoLearnSetLockTblAddr;2074minFragSize = p_Manip->reassmParams.ip.minFragSize[1];2075maxReassemSize = 0;2076numOfWays = p_Manip->reassmParams.ip.numOfFramesPerHashEntry[1];2077keySize = 16 + 16 + 4; /* 2-tuple + IP-Id */2078if (numOfWays > e_FM_PCD_MANIP_SIX_WAYS_HASH)2079RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("num of ways"));2080break;2081case HEADER_TYPE_CAPWAP:2082p_ReassTbl = &p_Manip->reassmParams.capwap.p_ReassTbl;2083p_AutoLearnHashTblAddr =2084&p_Manip->reassmParams.capwap.autoLearnHashTblAddr;2085p_AutoLearnSetLockTblAddr =2086&p_Manip->reassmParams.capwap.autoLearnSetLockTblAddr;2087minFragSize = 0;2088maxReassemSize = p_Manip->reassmParams.capwap.maxRessembledsSize;2089numOfWays = p_Manip->reassmParams.capwap.numOfFramesPerHashEntry;2090keySize = 4;2091break;2092default:2093RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("header type"));2094}2095keySize += 2; /* 2 bytes reserved for RFDIndex */2096#if (DPAA_VERSION >= 11)2097keySize += 2; /* 2 bytes reserved */2098#endif /* (DPAA_VERSION >= 11) */2099waySize = ROUND_UP(keySize, 8);21002101/* Allocates the Reassembly Parameters Table - This table is located in the MURAM.*/2102*p_ReassTbl = (t_ReassTbl *)FM_MURAM_AllocMem(2103p_FmPcd->h_FmMuram, FM_PCD_MANIP_REASM_TABLE_SIZE,2104FM_PCD_MANIP_REASM_TABLE_ALIGN);2105if (!*p_ReassTbl)2106RETURN_ERROR( MAJOR, E_NO_MEMORY,2107("MURAM alloc for Reassembly specific parameters table"));2108memset(*p_ReassTbl, 0, sizeof(t_ReassTbl));21092110/* Sets the Reassembly common Parameters table offset from MURAM in the Reassembly Table descriptor*/2111tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->reassmParams.p_ReassCommonTbl)2112- p_FmPcd->physicalMuramBase);2113WRITE_UINT32((*p_ReassTbl)->reassCommonPrmTblPtr, tmpReg32);21142115/* Calculate set size (set size is rounded-up to next power of 2) */2116NEXT_POWER_OF_2(numOfWays * waySize, setSize);21172118/* Get set size code */2119LOG2(setSize, setSizeCode);21202121/* Sets ways number and set size code */2122WRITE_UINT16((*p_ReassTbl)->waysNumAndSetSize,2123(uint16_t)((numOfWays << 8) | setSizeCode));21242125/* It is recommended that the total number of entries in this table2126(number of sets * number of ways) will be twice the number of frames that2127are expected to be reassembled simultaneously.*/2128numOfEntries = (uint32_t)(p_Manip->reassmParams.maxNumFramesInProcess * 2);21292130/* sets number calculation - number of entries = number of sets * number of ways */2131numOfSets = numOfEntries / numOfWays;21322133/* Sets AutoLearnHashKeyMask*/2134NEXT_POWER_OF_2(numOfSets, numOfSets);21352136WRITE_UINT16((*p_ReassTbl)->autoLearnHashKeyMask,2137(uint16_t)(numOfSets - 1));21382139/* Allocation of Reassembly Automatic Learning Hash Table - This table resides in external memory.2140The size of this table is determined by the number of sets and the set size.2141Table size = set size * number of sets2142This table base address should be aligned to SetSize.*/2143autoLearnHashTblSize = numOfSets * setSize;21442145*p_AutoLearnHashTblAddr =2146PTR_TO_UINT(XX_MallocSmart(autoLearnHashTblSize, p_Manip->reassmParams.dataMemId, setSize));2147if (!*p_AutoLearnHashTblAddr)2148{2149FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, *p_ReassTbl);2150*p_ReassTbl = NULL;2151RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));2152}2153MemSet8(UINT_TO_PTR(*p_AutoLearnHashTblAddr), 0, autoLearnHashTblSize);21542155/* Sets the Reassembly Automatic Learning Hash Table and liodn offset */2156tmpReg64 = ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset2157& FM_PCD_MANIP_REASM_LIODN_MASK)2158<< (uint64_t)FM_PCD_MANIP_REASM_LIODN_SHIFT);2159tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset2160& FM_PCD_MANIP_REASM_ELIODN_MASK)2161<< (uint64_t)FM_PCD_MANIP_REASM_ELIODN_SHIFT);2162tmpReg64 |= XX_VirtToPhys(UINT_TO_PTR(*p_AutoLearnHashTblAddr));2163WRITE_UINT32( (*p_ReassTbl)->liodnAlAndAutoLearnHashTblPtrHi,2164(uint32_t)(tmpReg64 >> 32));2165WRITE_UINT32((*p_ReassTbl)->autoLearnHashTblPtrLow, (uint32_t)tmpReg64);21662167/* Allocation of the Set Lock table - This table resides in external memory2168The size of this table is (number of sets in the Reassembly Automatic Learning Hash table)*4 bytes.2169This table resides in external memory and its base address should be 4-byte aligned */2170*p_AutoLearnSetLockTblAddr =2171PTR_TO_UINT(XX_MallocSmart((uint32_t)(numOfSets * 4), p_Manip->reassmParams.dataMemId, 4));2172if (!*p_AutoLearnSetLockTblAddr)2173{2174FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, *p_ReassTbl);2175*p_ReassTbl = NULL;2176XX_FreeSmart(UINT_TO_PTR(*p_AutoLearnHashTblAddr));2177*p_AutoLearnHashTblAddr = 0;2178RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));2179}2180MemSet8(UINT_TO_PTR(*p_AutoLearnSetLockTblAddr), 0, (numOfSets * 4));21812182/* sets Set Lock table pointer and liodn offset*/2183tmpReg64 = ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset2184& FM_PCD_MANIP_REASM_LIODN_MASK)2185<< (uint64_t)FM_PCD_MANIP_REASM_LIODN_SHIFT);2186tmpReg64 |= ((uint64_t)(p_Manip->reassmParams.dataLiodnOffset2187& FM_PCD_MANIP_REASM_ELIODN_MASK)2188<< (uint64_t)FM_PCD_MANIP_REASM_ELIODN_SHIFT);2189tmpReg64 |= XX_VirtToPhys(UINT_TO_PTR(*p_AutoLearnSetLockTblAddr));2190WRITE_UINT32( (*p_ReassTbl)->liodnSlAndAutoLearnSetLockTblPtrHi,2191(uint32_t)(tmpReg64 >> 32));2192WRITE_UINT32((*p_ReassTbl)->autoLearnSetLockTblPtrLow, (uint32_t)tmpReg64);21932194/* Sets user's requested minimum fragment size (in Bytes) for First/Middle fragment */2195WRITE_UINT16((*p_ReassTbl)->minFragSize, minFragSize);21962197WRITE_UINT16((*p_ReassTbl)->maxReassemblySize, maxReassemSize);21982199return E_OK;2200}22012202static t_Error UpdateInitReasm(t_Handle h_FmPcd, t_Handle h_PcdParams,2203t_Handle h_FmPort, t_FmPcdManip *p_Manip,2204t_Handle h_Ad, bool validate)2205{2206t_FmPortGetSetCcParams fmPortGetSetCcParams;2207uint32_t tmpReg32;2208t_Error err;2209t_FmPortPcdParams *p_PcdParams = (t_FmPortPcdParams *)h_PcdParams;2210#if (DPAA_VERSION >= 11)2211t_FmPcdCtrlParamsPage *p_ParamsPage;2212#endif /* (DPAA_VERSION >= 11) */22132214SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);2215SANITY_CHECK_RETURN_ERROR(!p_Manip->frag, E_INVALID_HANDLE);2216SANITY_CHECK_RETURN_ERROR(2217(p_Manip->opcode == HMAN_OC_IP_REASSEMBLY) || (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY),2218E_INVALID_STATE);2219SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);2220SANITY_CHECK_RETURN_ERROR(!p_Manip->updateParams || h_PcdParams,2221E_INVALID_HANDLE);22222223UNUSED(h_Ad);22242225if (!p_Manip->updateParams)2226return E_OK;22272228if (p_Manip->h_FmPcd != h_FmPcd)2229RETURN_ERROR(2230MAJOR, E_INVALID_STATE,2231("handler of PCD previously was initiated by different value"));22322233if (p_Manip->updateParams)2234{2235if ((!(p_Manip->updateParams2236& (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK)))2237|| ((p_Manip->shadowUpdateParams2238& (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK))))2239RETURN_ERROR(2240MAJOR, E_INVALID_STATE,2241("in this stage parameters from Port has not be updated"));22422243fmPortGetSetCcParams.setCcParams.type = 0;2244if (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY)2245{2246fmPortGetSetCcParams.setCcParams.type |= UPDATE_OFP_DPTE;2247fmPortGetSetCcParams.setCcParams.ofpDpde = 0xF;2248}2249fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams | FM_REV;2250if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams))2251!= E_OK)2252RETURN_ERROR(MAJOR, err, NO_MSG);2253if (fmPortGetSetCcParams.getCcParams.type2254& (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK | FM_REV))2255RETURN_ERROR(MAJOR, E_INVALID_STATE,2256("offset of the data wasn't configured previously"));2257if (p_Manip->updateParams2258& (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK))2259{2260t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;2261uint8_t *p_Ptr, i, totalNumOfTnums;22622263totalNumOfTnums =2264(uint8_t)(fmPortGetSetCcParams.getCcParams.numOfTasks2265+ fmPortGetSetCcParams.getCcParams.numOfExtraTasks);22662267p_Manip->reassmParams.internalBufferPoolAddr =2268PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,2269(uint32_t)(totalNumOfTnums * BMI_FIFO_UNITS),2270BMI_FIFO_UNITS));2271if (!p_Manip->reassmParams.internalBufferPoolAddr)2272RETURN_ERROR(2273MAJOR, E_NO_MEMORY,2274("MURAM alloc for Reassembly internal buffers pool"));2275MemSet8(2276UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolAddr),22770, (uint32_t)(totalNumOfTnums * BMI_FIFO_UNITS));22782279p_Manip->reassmParams.internalBufferPoolManagementIndexAddr =2280PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,2281(uint32_t)(5 + totalNumOfTnums),22824));2283if (!p_Manip->reassmParams.internalBufferPoolManagementIndexAddr)2284RETURN_ERROR(2285MAJOR,2286E_NO_MEMORY,2287("MURAM alloc for Reassembly internal buffers management"));22882289p_Ptr =2290(uint8_t*)UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolManagementIndexAddr);2291WRITE_UINT32(2292*(uint32_t*)p_Ptr,2293(uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolAddr)) - p_FmPcd->physicalMuramBase));2294for (i = 0, p_Ptr += 4; i < totalNumOfTnums; i++, p_Ptr++)2295WRITE_UINT8(*p_Ptr, i);2296WRITE_UINT8(*p_Ptr, 0xFF);22972298tmpReg32 =2299(4 << FM_PCD_MANIP_REASM_COMMON_INT_BUFFER_IDX_SHIFT)2300| ((uint32_t)(XX_VirtToPhys(2301UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolManagementIndexAddr))2302- p_FmPcd->physicalMuramBase));2303WRITE_UINT32(2304p_Manip->reassmParams.p_ReassCommonTbl->internalBufferManagement,2305tmpReg32);23062307p_Manip->updateParams &= ~(NUM_OF_TASKS | NUM_OF_EXTRA_TASKS2308| DISCARD_MASK);2309p_Manip->shadowUpdateParams |= (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS2310| DISCARD_MASK);2311}2312}23132314if (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY)2315{2316if (p_Manip->reassmParams.capwap.h_Scheme)2317{2318p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] =2319p_Manip->reassmParams.capwap.h_Scheme;2320p_PcdParams->p_KgParams->numOfSchemes++;2321}23222323}2324else2325{2326if (p_Manip->reassmParams.ip.h_Ipv4Scheme)2327{2328p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] =2329p_Manip->reassmParams.ip.h_Ipv4Scheme;2330p_PcdParams->p_KgParams->numOfSchemes++;2331}2332if (p_Manip->reassmParams.ip.h_Ipv6Scheme)2333{2334p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] =2335p_Manip->reassmParams.ip.h_Ipv6Scheme;2336p_PcdParams->p_KgParams->numOfSchemes++;2337}2338#if (DPAA_VERSION >= 11)2339if (fmPortGetSetCcParams.getCcParams.revInfo.majorRev >= 6)2340{2341if ((err = FmPortSetGprFunc(h_FmPort, e_FM_PORT_GPR_MURAM_PAGE,2342(void**)&p_ParamsPage)) != E_OK)2343RETURN_ERROR(MAJOR, err, NO_MSG);23442345tmpReg32 = NIA_ENG_KG;2346if (p_Manip->reassmParams.ip.h_Ipv4Scheme)2347{2348tmpReg32 |= NIA_KG_DIRECT;2349tmpReg32 |= NIA_KG_CC_EN;2350tmpReg32 |= FmPcdKgGetSchemeId(2351p_Manip->reassmParams.ip.h_Ipv4Scheme);2352WRITE_UINT32(p_ParamsPage->iprIpv4Nia, tmpReg32);2353}2354if (p_Manip->reassmParams.ip.h_Ipv6Scheme)2355{2356tmpReg32 &= ~NIA_AC_MASK;2357tmpReg32 |= NIA_KG_DIRECT;2358tmpReg32 |= NIA_KG_CC_EN;2359tmpReg32 |= FmPcdKgGetSchemeId(2360p_Manip->reassmParams.ip.h_Ipv6Scheme);2361WRITE_UINT32(p_ParamsPage->iprIpv6Nia, tmpReg32);2362}2363}2364#else2365if (fmPortGetSetCcParams.getCcParams.revInfo.majorRev < 6)2366{2367WRITE_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->discardMask,2368fmPortGetSetCcParams.getCcParams.discardMask);2369}2370#endif /* (DPAA_VERSION >= 11) */2371}2372return E_OK;2373}23742375#if (DPAA_VERSION == 10)2376static t_Error FmPcdFragHcScratchPoolFill(t_Handle h_FmPcd, uint8_t scratchBpid)2377{2378t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;2379t_FmPcdCcFragScratchPoolCmdParams fmPcdCcFragScratchPoolCmdParams;2380t_Error err;23812382SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);23832384memset(&fmPcdCcFragScratchPoolCmdParams, 0, sizeof(t_FmPcdCcFragScratchPoolCmdParams));23852386fmPcdCcFragScratchPoolCmdParams.numOfBuffers = NUM_OF_SCRATCH_POOL_BUFFERS;2387fmPcdCcFragScratchPoolCmdParams.bufferPoolId = scratchBpid;2388if ((err = FmHcPcdCcIpFragScratchPollCmd(p_FmPcd->h_Hc, TRUE, &fmPcdCcFragScratchPoolCmdParams)) != E_OK)2389RETURN_ERROR(MAJOR, err, NO_MSG);23902391if (fmPcdCcFragScratchPoolCmdParams.numOfBuffers != 0)2392RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Fill scratch pool failed,"2393"Failed to release %d buffers to the BM (missing FBPRs)",2394fmPcdCcFragScratchPoolCmdParams.numOfBuffers));23952396return E_OK;2397}23982399static t_Error FmPcdFragHcScratchPoolEmpty(t_Handle h_FmPcd, uint8_t scratchBpid)2400{2401t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;2402t_FmPcdCcFragScratchPoolCmdParams fmPcdCcFragScratchPoolCmdParams;2403t_Error err;24042405SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);24062407memset(&fmPcdCcFragScratchPoolCmdParams, 0, sizeof(t_FmPcdCcFragScratchPoolCmdParams));24082409fmPcdCcFragScratchPoolCmdParams.bufferPoolId = scratchBpid;2410if ((err = FmHcPcdCcIpFragScratchPollCmd(p_FmPcd->h_Hc, FALSE, &fmPcdCcFragScratchPoolCmdParams)) != E_OK)2411RETURN_ERROR(MAJOR, err, NO_MSG);24122413return E_OK;2414}2415#endif /* (DPAA_VERSION == 10) */24162417static void ReleaseManipHandler(t_FmPcdManip *p_Manip, t_FmPcd *p_FmPcd)2418{2419if (p_Manip->h_Ad)2420{2421if (p_Manip->muramAllocate)2422FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->h_Ad);2423else2424XX_Free(p_Manip->h_Ad);2425p_Manip->h_Ad = NULL;2426}2427if (p_Manip->p_Template)2428{2429FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->p_Template);2430p_Manip->p_Template = NULL;2431}2432#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))2433if (p_Manip->h_Frag)2434{2435if (p_Manip->capwapFragParams.p_AutoLearnHashTbl)2436FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2437p_Manip->capwapFragParams.p_AutoLearnHashTbl);2438if (p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl)2439FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2440p_Manip->capwapFragParams.p_ReassmFrmDescrPoolTbl);2441if (p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl)2442FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2443p_Manip->capwapFragParams.p_ReassmFrmDescrIndxPoolTbl);2444if (p_Manip->capwapFragParams.p_TimeOutTbl)2445FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2446p_Manip->capwapFragParams.p_TimeOutTbl);2447FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->h_Frag);24482449}2450#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */2451if (p_Manip->frag)2452{2453if (p_Manip->fragParams.p_Frag)2454{2455#if (DPAA_VERSION == 10)2456FmPcdFragHcScratchPoolEmpty((t_Handle)p_FmPcd, p_Manip->fragParams.scratchBpid);2457#endif /* (DPAA_VERSION == 10) */24582459FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_Frag);2460}2461}2462else2463if (p_Manip->reassm)2464{2465FmPcdUnregisterReassmPort(p_FmPcd,2466p_Manip->reassmParams.p_ReassCommonTbl);24672468if (p_Manip->reassmParams.timeOutTblAddr)2469FM_MURAM_FreeMem(2470p_FmPcd->h_FmMuram,2471UINT_TO_PTR(p_Manip->reassmParams.timeOutTblAddr));2472if (p_Manip->reassmParams.reassFrmDescrPoolTblAddr)2473XX_FreeSmart(2474UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrPoolTblAddr));2475if (p_Manip->reassmParams.p_ReassCommonTbl)2476FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2477p_Manip->reassmParams.p_ReassCommonTbl);2478if (p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr)2479FM_MURAM_FreeMem(2480p_FmPcd->h_FmMuram,2481UINT_TO_PTR(p_Manip->reassmParams.reassFrmDescrIndxPoolTblAddr));2482if (p_Manip->reassmParams.internalBufferPoolManagementIndexAddr)2483FM_MURAM_FreeMem(2484p_FmPcd->h_FmMuram,2485UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolManagementIndexAddr));2486if (p_Manip->reassmParams.internalBufferPoolAddr)2487FM_MURAM_FreeMem(2488p_FmPcd->h_FmMuram,2489UINT_TO_PTR(p_Manip->reassmParams.internalBufferPoolAddr));2490if (p_Manip->reassmParams.hdr == HEADER_TYPE_CAPWAP)2491{24922493}2494else2495{2496if (p_Manip->reassmParams.ip.ipv4AutoLearnHashTblAddr)2497XX_FreeSmart(2498UINT_TO_PTR(p_Manip->reassmParams.ip.ipv4AutoLearnHashTblAddr));2499if (p_Manip->reassmParams.ip.ipv6AutoLearnHashTblAddr)2500XX_FreeSmart(2501UINT_TO_PTR(p_Manip->reassmParams.ip.ipv6AutoLearnHashTblAddr));2502if (p_Manip->reassmParams.ip.ipv4AutoLearnSetLockTblAddr)2503XX_FreeSmart(2504UINT_TO_PTR(p_Manip->reassmParams.ip.ipv4AutoLearnSetLockTblAddr));2505if (p_Manip->reassmParams.ip.ipv6AutoLearnSetLockTblAddr)2506XX_FreeSmart(2507UINT_TO_PTR(p_Manip->reassmParams.ip.ipv6AutoLearnSetLockTblAddr));2508if (p_Manip->reassmParams.ip.p_Ipv4ReassTbl)2509FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2510p_Manip->reassmParams.ip.p_Ipv4ReassTbl);2511if (p_Manip->reassmParams.ip.p_Ipv6ReassTbl)2512FM_MURAM_FreeMem(p_FmPcd->h_FmMuram,2513p_Manip->reassmParams.ip.p_Ipv6ReassTbl);2514if (p_Manip->reassmParams.ip.h_Ipv6Ad)2515XX_FreeSmart(p_Manip->reassmParams.ip.h_Ipv6Ad);2516if (p_Manip->reassmParams.ip.h_Ipv4Ad)2517XX_FreeSmart(p_Manip->reassmParams.ip.h_Ipv4Ad);2518}2519}25202521if (p_Manip->p_StatsTbl)2522FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->p_StatsTbl);2523}25242525#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))2526static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_ManipParams)2527{2528if (p_ManipParams->u.hdr.rmv)2529{2530switch (p_ManipParams->u.hdr.rmvParams.type)2531{2532case (e_FM_PCD_MANIP_RMV_BY_HDR):2533switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.type)2534{2535case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START) :2536if (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.include)2537{2538switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.hdrInfo.hdr)2539{2540case (HEADER_TYPE_CAPWAP_DTLS) :2541p_Manip->opcode = HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;2542p_Manip->muramAllocate = TRUE;2543if (p_ManipParams->u.hdr.insrt)2544RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for CAPWAP_DTLS_HDR remove can not be insrt manipualtion after"));2545if (p_ManipParams->fragOrReasm)2546{2547if (!p_ManipParams->fragOrReasmParams.frag)2548{2549switch (p_ManipParams->fragOrReasmParams.hdr)2550{2551case (HEADER_TYPE_CAPWAP):2552p_Manip->opcode = HMAN_OC_CAPWAP_REASSEMBLY;2553break;2554default:2555RETURN_ERROR(MAJOR, E_INVALID_STATE, ("unsupported header for Reassembly"));2556}2557}2558else2559RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for this type of manipulation frag can not be TRUE"));2560}2561break;2562default:2563RETURN_ERROR(MAJOR, E_INVALID_STATE, ("non valid net header of remove location"));2564}2565}2566else2567{2568switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.hdrInfo.hdr)2569{2570case (HEADER_TYPE_CAPWAP_DTLS) :2571case (HEADER_TYPE_CAPWAP) :2572if (p_ManipParams->fragOrReasm || p_ManipParams->u.hdr.insrt)2573RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for the type of remove e_FM_PCD_MANIP_RMV_FROM_START_OF_FRAME_TILL_CAPWAP can not be insert or fragOrReasm TRUE"));2574p_Manip->opcode = HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR;2575p_Manip->muramAllocate = TRUE;2576p_ManipParams->u.hdr.insrt = TRUE; //internal frame header2577break;2578default :2579RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));2580}2581}2582break;2583default :2584RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));2585}2586break;2587default:2588RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));2589}2590}2591else if (p_ManipParams->u.hdr.insrt)2592{2593switch (p_ManipParams->u.hdr.insrtParams.type)2594{2595case (e_FM_PCD_MANIP_INSRT_BY_TEMPLATE) :25962597p_Manip->opcode = HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;2598p_Manip->muramAllocate = FALSE;2599if (p_ManipParams->fragOrReasm)2600{2601if (p_ManipParams->fragOrReasmParams.frag)2602{2603switch (p_ManipParams->fragOrReasmParams.hdr)2604{2605case (HEADER_TYPE_CAPWAP):2606p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;2607break;2608default:2609RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid header for fragmentation"));2610}2611}2612else2613RETURN_ERROR(MAJOR, E_INVALID_STATE,("can not reach this point"));2614}2615break;26162617default:2618RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for only isert manipulation unsupported type"));2619}2620}2621else if (p_ManipParams->fragOrReasm)2622{2623if (p_ManipParams->fragOrReasmParams.frag)2624{2625switch (p_ManipParams->fragOrReasmParams.hdr)2626{2627case (HEADER_TYPE_CAPWAP):2628p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;2629p_Manip->muramAllocate = FALSE;2630break;2631default:2632RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported header for fragmentation"));2633}2634}2635else2636{2637switch (p_ManipParams->fragOrReasmParams.hdr)2638{2639case (HEADER_TYPE_CAPWAP):2640RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Reassembly has to be with additional operation - rmv = TRUE, type of remove - e_FM_PCD_MANIP_RMV_FROM_START_OF_FRAME_INCLUDE_SPECIFIC_LOCATION,type = e_FM_PCD_MANIP_LOC_BY_HDR, hdr = HEADER_TYPE_CAPWAP_DTLS"));2641default:2642RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported header for reassembly"));2643}2644}26452646}2647else2648RETURN_ERROR(MAJOR, E_INVALID_STATE, ("User didn't ask for any manipulation"));26492650p_Manip->insrt = p_ManipParams->u.hdr.insrt;2651p_Manip->rmv = p_ManipParams->u.hdr.rmv;26522653return E_OK;2654}26552656#else /* not (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */2657static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip,2658t_FmPcdManipParams *p_ManipParams)2659{2660switch (p_ManipParams->type)2661{2662case e_FM_PCD_MANIP_HDR:2663/* Check that next-manip is not already used */2664if (p_ManipParams->h_NextManip)2665{2666if (!MANIP_IS_FIRST(p_ManipParams->h_NextManip))2667RETURN_ERROR(2668MAJOR, E_INVALID_STATE,2669("h_NextManip is already a part of another chain"));2670if ((MANIP_GET_TYPE(p_ManipParams->h_NextManip)2671!= e_FM_PCD_MANIP_HDR) &&2672(MANIP_GET_TYPE(p_ManipParams->h_NextManip)2673!= e_FM_PCD_MANIP_FRAG))2674RETURN_ERROR(2675MAJOR,2676E_NOT_SUPPORTED,2677("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation or Fragmentation."));2678}26792680if (p_ManipParams->u.hdr.rmv)2681{2682switch (p_ManipParams->u.hdr.rmvParams.type)2683{2684case (e_FM_PCD_MANIP_RMV_BY_HDR):2685switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.type)2686{2687case (e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2):2688break;2689#if (DPAA_VERSION >= 11)2690case (e_FM_PCD_MANIP_RMV_BY_HDR_CAPWAP):2691break;2692case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START):2693{2694t_Error err;2695uint8_t prsArrayOffset;26962697err =2698GetPrOffsetByHeaderOrField(2699&p_ManipParams->u.hdr.rmvParams.u.byHdr.u.hdrInfo,2700&prsArrayOffset);2701if (err)2702RETURN_ERROR(MAJOR, err, NO_MSG);2703break;2704}2705#endif /* (DPAA_VERSION >= 11) */2706default:2707RETURN_ERROR(2708MAJOR,2709E_INVALID_STATE,2710("invalid type of remove manipulation"));2711}2712break;2713case (e_FM_PCD_MANIP_RMV_GENERIC):2714break;2715default:2716RETURN_ERROR(MAJOR, E_INVALID_STATE,2717("invalid type of remove manipulation"));2718}2719p_Manip->opcode = HMAN_OC;2720p_Manip->muramAllocate = TRUE;2721p_Manip->rmv = TRUE;2722}2723else2724if (p_ManipParams->u.hdr.insrt)2725{2726switch (p_ManipParams->u.hdr.insrtParams.type)2727{2728case (e_FM_PCD_MANIP_INSRT_BY_HDR):2729{2730switch (p_ManipParams->u.hdr.insrtParams.u.byHdr.type)2731{2732case (e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2):2733/* nothing to check */2734break;2735#if (DPAA_VERSION >= 11)2736case (e_FM_PCD_MANIP_INSRT_BY_HDR_IP):2737if (p_ManipParams->u.hdr.insrtParams.u.byHdr.u.ipParams.insrt.size2738% 4)2739RETURN_ERROR(2740MAJOR,2741E_INVALID_VALUE,2742("IP inserted header must be of size which is a multiple of four bytes"));2743break;2744case (e_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP):2745if (p_ManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size2746% 4)2747RETURN_ERROR(2748MAJOR,2749E_INVALID_VALUE,2750("CAPWAP inserted header must be of size which is a multiple of four bytes"));2751break;2752case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP):2753case (e_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE):2754if (p_ManipParams->u.hdr.insrtParams.u.byHdr.u.insrt.size2755!= 8)2756RETURN_ERROR(2757MAJOR,2758E_INVALID_VALUE,2759("Inserted header must be of size 8"));2760break;2761#endif /* (DPAA_VERSION >= 11) */2762default:2763RETURN_ERROR(2764MAJOR,2765E_INVALID_STATE,2766("unsupported insert by header type"));2767}2768}2769case (e_FM_PCD_MANIP_INSRT_GENERIC):2770break;2771default:2772RETURN_ERROR(2773MAJOR,2774E_INVALID_STATE,2775("for only insert manipulation unsupported type"));2776}2777p_Manip->opcode = HMAN_OC;2778p_Manip->muramAllocate = TRUE;2779p_Manip->insrt = TRUE;2780}2781else2782if (p_ManipParams->u.hdr.fieldUpdate)2783{2784/* Check parameters */2785if (p_ManipParams->u.hdr.fieldUpdateParams.type2786== e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN)2787{2788if ((p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType2789== e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_VPRI)2790&& (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.vpri2791> 7))2792RETURN_ERROR(2793MAJOR, E_INVALID_VALUE,2794("vpri should get values of 0-7 "));2795if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType2796== e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)2797{2798int i;27992800if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.vpriDefVal2801> 7)2802RETURN_ERROR(2803MAJOR,2804E_INVALID_VALUE,2805("vpriDefVal should get values of 0-7 "));2806for (i = 0; i < FM_PCD_MANIP_DSCP_TO_VLAN_TRANS;2807i++)2808if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.dscpToVpriTable[i]2809& 0xf0)2810RETURN_ERROR(2811MAJOR,2812E_INVALID_VALUE,2813("dscpToVpriTabl value out of range (0-15)"));2814}28152816}28172818p_Manip->opcode = HMAN_OC;2819p_Manip->muramAllocate = TRUE;2820p_Manip->fieldUpdate = TRUE;2821}2822else2823if (p_ManipParams->u.hdr.custom)2824{2825if (p_ManipParams->u.hdr.customParams.type == e_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE)2826{28272828if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.size == 0) ||2829(p_ManipParams->u.hdr.customParams.u.genFieldReplace.size > 8))2830RETURN_ERROR(2831MAJOR, E_INVALID_VALUE,2832("size should get values of 1-8 "));28332834if (p_ManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset > 7)2835RETURN_ERROR(2836MAJOR, E_INVALID_VALUE,2837("srcOffset should be <= 7"));28382839if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.srcOffset +2840p_ManipParams->u.hdr.customParams.u.genFieldReplace.size) > 8)2841RETURN_ERROR(2842MAJOR, E_INVALID_VALUE,2843("(srcOffset + size) should be <= 8"));28442845if ((p_ManipParams->u.hdr.customParams.u.genFieldReplace.dstOffset +2846p_ManipParams->u.hdr.customParams.u.genFieldReplace.size) > 256)2847RETURN_ERROR(2848MAJOR, E_INVALID_VALUE,2849("(dstOffset + size) should be <= 256"));28502851}28522853p_Manip->opcode = HMAN_OC;2854p_Manip->muramAllocate = TRUE;2855p_Manip->custom = TRUE;2856}2857break;2858case e_FM_PCD_MANIP_REASSEM:2859if (p_ManipParams->h_NextManip)2860RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2861("next manip with reassembly"));2862switch (p_ManipParams->u.reassem.hdr)2863{2864case (HEADER_TYPE_IPv4):2865p_Manip->reassmParams.hdr = HEADER_TYPE_IPv4;2866p_Manip->opcode = HMAN_OC_IP_REASSEMBLY;2867break;2868case (HEADER_TYPE_IPv6):2869p_Manip->reassmParams.hdr = HEADER_TYPE_IPv6;2870p_Manip->opcode = HMAN_OC_IP_REASSEMBLY;2871break;2872#if (DPAA_VERSION >= 11)2873case (HEADER_TYPE_CAPWAP):2874p_Manip->reassmParams.hdr = HEADER_TYPE_CAPWAP;2875p_Manip->opcode = HMAN_OC_CAPWAP_REASSEMBLY;2876break;2877#endif /* (DPAA_VERSION >= 11) */2878default:2879RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2880("header for reassembly"));2881}2882break;2883case e_FM_PCD_MANIP_FRAG:2884if (p_ManipParams->h_NextManip)2885RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2886("next manip with fragmentation"));2887switch (p_ManipParams->u.frag.hdr)2888{2889case (HEADER_TYPE_IPv4):2890case (HEADER_TYPE_IPv6):2891p_Manip->opcode = HMAN_OC_IP_FRAGMENTATION;2892break;2893#if (DPAA_VERSION >= 11)2894case (HEADER_TYPE_CAPWAP):2895p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;2896break;2897#endif /* (DPAA_VERSION >= 11) */2898default:2899RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2900("header for fragmentation"));2901}2902p_Manip->muramAllocate = TRUE;2903break;2904case e_FM_PCD_MANIP_SPECIAL_OFFLOAD:2905switch (p_ManipParams->u.specialOffload.type)2906{2907case (e_FM_PCD_MANIP_SPECIAL_OFFLOAD_IPSEC):2908p_Manip->opcode = HMAN_OC_IPSEC_MANIP;2909p_Manip->muramAllocate = TRUE;2910break;2911#if (DPAA_VERSION >= 11)2912case (e_FM_PCD_MANIP_SPECIAL_OFFLOAD_CAPWAP):2913p_Manip->opcode = HMAN_OC_CAPWAP_MANIP;2914p_Manip->muramAllocate = TRUE;2915break;2916#endif /* (DPAA_VERSION >= 11) */2917default:2918RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2919("special offload type"));2920}2921break;2922default:2923RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("manip type"));2924}29252926return E_OK;2927}2928#endif /* not (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */29292930#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))29312932static t_Error UpdateIndxStats(t_Handle h_FmPcd,2933t_Handle h_FmPort,2934t_FmPcdManip *p_Manip)2935{2936t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;2937uint32_t tmpReg32 = 0;2938t_AdOfTypeContLookup *p_Ad;2939t_FmPortGetSetCcParams fmPortGetSetCcParams;2940t_Error err;29412942SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);2943SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);29442945p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;2946if (p_Manip->h_FmPcd != h_FmPcd)2947RETURN_ERROR(MAJOR, E_INVALID_STATE,2948("handler of PCD previously was initiated by different value"));29492950memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));29512952if (!p_Manip->p_StatsTbl)2953{29542955fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNDN;2956fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_CC;2957err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);2958if (err)2959RETURN_ERROR(MAJOR, err, NO_MSG);29602961tmpReg32 = GET_UINT32(p_Ad->ccAdBase);29622963p_Manip->p_StatsTbl =2964(t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,2965(uint32_t)p_Manip->owner * FM_PCD_MANIP_INDEXED_STATS_ENTRY_SIZE,29664);2967if (!p_Manip->p_StatsTbl)2968RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Manipulation indexed statistics table"));29692970MemSet8(p_Manip->p_StatsTbl, 0, (uint32_t)(p_Manip->owner * 4));29712972tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->p_StatsTbl) - p_FmPcd->physicalMuramBase);29732974if (p_Manip->cnia)2975tmpReg32 |= FM_PCD_MANIP_INDEXED_STATS_CNIA;29762977tmpReg32 |= FM_PCD_MANIP_INDEXED_STATS_DPD;2978WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);2979}2980else2981{2982fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNDN;2983fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_CC;2984err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);2985if (err)2986RETURN_ERROR(MAJOR, err, NO_MSG);2987}29882989return E_OK;2990}29912992static t_Error RmvHdrTillSpecLocNOrInsrtIntFrmHdr(t_FmPcdManipHdrRmvParams *p_ManipParams, t_FmPcdManip *p_Manip)2993{2994t_AdOfTypeContLookup *p_Ad;2995uint32_t tmpReg32 = 0;2996uint8_t prsArrayOffset = 0;2997t_Error err;29982999SANITY_CHECK_RETURN_ERROR(p_Manip,E_NULL_POINTER);3000SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_NULL_POINTER);3001SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);30023003p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;3004if (p_Manip->rmv)3005{3006err = GetPrOffsetByHeaderOrField(&p_ManipParams->u.byHdr.u.fromStartByHdr.hdrInfo, &prsArrayOffset);3007if (err)3008RETURN_ERROR(MAJOR, err, NO_MSG);30093010tmpReg32 |= (uint32_t)prsArrayOffset << 24;3011tmpReg32 |= HMAN_RMV_HDR;3012}30133014if (p_Manip->insrt)3015tmpReg32 |= HMAN_INSRT_INT_FRM_HDR;30163017tmpReg32 |= (uint32_t)HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR;30183019WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);30203021tmpReg32 = 0;3022tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;3023WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);30243025return E_OK;3026}30273028static t_Error MvIntFrameHeaderFromFrameToBufferPrefix(t_FmPcdManip *p_Manip,3029bool caamUsed)3030{3031t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;3032uint32_t tmpReg32 = 0;30333034SANITY_CHECK_RETURN_ERROR(p_Ad, E_INVALID_HANDLE);30353036p_Manip->updateParams |= OFFSET_OF_PR | INTERNAL_CONTEXT_OFFSET;30373038tmpReg32 = 0;3039tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;3040*(uint32_t *)&p_Ad->ccAdBase = tmpReg32;30413042tmpReg32 = 0;3043tmpReg32 |= HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX;3044tmpReg32 |= (uint32_t)0x16 << 16;3045*(uint32_t *)&p_Ad->pcAndOffsets = tmpReg32;30463047if (caamUsed)3048*(uint32_t *)&p_Ad->gmask = 0xf0000000;30493050return E_OK;3051}30523053static t_Error CapwapRmvDtlsHdr(t_FmPcd *p_FmPcd, t_FmPcdManip *p_Manip)3054{3055t_AdOfTypeContLookup *p_Ad;3056uint32_t tmpReg32 = 0;3057t_Error err = E_OK;30583059SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);30603061p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;30623063tmpReg32 = 0;3064tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;3065WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);30663067tmpReg32 = 0;3068tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;306930703071if (p_Manip->h_Frag)3072{3073p_Manip->updateParams |= INTERNAL_CONTEXT_OFFSET;3074tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->h_Frag) - (p_FmPcd->physicalMuramBase));3075}30763077WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);30783079return err;3080}30813082static t_Error CapwapReassembly(t_CapwapReassemblyParams *p_ManipParams,3083t_FmPcdManip *p_Manip,3084t_FmPcd *p_FmPcd,3085uint8_t poolId)3086{3087t_Handle p_Table;3088uint32_t tmpReg32 = 0;3089int i = 0;3090uint8_t log2Num;3091uint8_t numOfSets;3092uint32_t j = 0;3093uint32_t bitFor1Micro;30943095SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);3096SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);30973098if (!p_FmPcd->h_Hc)3099RETURN_ERROR(MAJOR, E_INVALID_VALUE,("hc port has to be initialized in this mode"));3100if (!POWER_OF_2(p_ManipParams->timeoutRoutineRequestTime))3101RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("timeoutRoutineRequestTime has to be power of 2"));3102if (!POWER_OF_2(p_ManipParams->maxNumFramesInProcess))3103RETURN_ERROR(MAJOR, E_INVALID_VALUE,("maxNumFramesInProcess has to be power of 2"));3104if (!p_ManipParams->timeoutRoutineRequestTime && p_ManipParams->timeoutThresholdForReassmProcess)3105DBG(WARNING, ("if timeoutRoutineRequestTime 0, timeoutThresholdForReassmProcess is uselessly"));3106if (p_ManipParams->numOfFramesPerHashEntry == e_FM_PCD_MANIP_FOUR_WAYS_HASH)3107{3108if ((p_ManipParams->maxNumFramesInProcess < 4) ||3109(p_ManipParams->maxNumFramesInProcess > 512))3110RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("In the case of numOfFramesPerHashEntry = e_FM_PCD_MANIP_EIGHT_WAYS_HASH maxNumFramesInProcess has to be in the range 4-512"));3111}3112else3113{3114if ((p_ManipParams->maxNumFramesInProcess < 8) ||3115(p_ManipParams->maxNumFramesInProcess > 2048))3116RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("In the case of numOfFramesPerHashEntry = e_FM_PCD_MANIP_FOUR_WAYS_HASH maxNumFramesInProcess has to be in the range 8-2048"));3117}31183119bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);3120if (bitFor1Micro == 0)3121RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("Timestamp scale"));31223123p_Manip->updateParams |= (NUM_OF_TASKS | OFFSET_OF_PR | OFFSET_OF_DATA | HW_PORT_ID);31243125p_Manip->h_Frag = (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,3126FM_PCD_MANIP_CAPWAP_REASM_TABLE_SIZE,3127FM_PCD_MANIP_CAPWAP_REASM_TABLE_ALIGN);3128if (!p_Manip->h_Frag)3129RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc CAPWAP reassembly parameters table"));31303131MemSet8(p_Manip->h_Frag, 0, FM_PCD_MANIP_CAPWAP_REASM_TABLE_SIZE);31323133p_Table = (t_CapwapReasmPram *)p_Manip->h_Frag;31343135p_Manip->capwapFragParams.p_AutoLearnHashTbl =3136(t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,3137(uint32_t)(p_ManipParams->maxNumFramesInProcess * 2 * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE),3138FM_PCD_MANIP_CAPWAP_REASM_TABLE_ALIGN);31393140if (!p_Manip->capwapFragParams.p_AutoLearnHashTbl)3141RETURN_ERROR(MAJOR, E_NO_MEMORY,("MURAM alloc for CAPWAP automatic learning hash table"));31423143MemSet8(p_Manip->capwapFragParams.p_AutoLearnHashTbl, 0, (uint32_t)(p_ManipParams->maxNumFramesInProcess * 2 * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE));31443145tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->capwapFragParams.p_AutoLearnHashTbl) - p_FmPcd->physicalMuramBase);31463147WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->autoLearnHashTblPtr, tmpReg32);31483149tmpReg32 = 0;3150if (p_ManipParams->timeOutMode == e_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAMES)3151tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_BETWEEN_FRAMES;3152if (p_ManipParams->haltOnDuplicationFrag)3153tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_HALT_ON_DUPLICATE_FRAG;3154if (p_ManipParams->numOfFramesPerHashEntry == e_FM_PCD_MANIP_EIGHT_WAYS_HASH)3155{3156i = 8;3157tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_AUTOMATIC_LEARNIN_HASH_8_WAYS;3158}3159else3160i = 4;31613162numOfSets = (uint8_t)((p_ManipParams->maxNumFramesInProcess * 2) / i);3163LOG2(numOfSets, log2Num);3164tmpReg32 |= (uint32_t)(log2Num - 1) << 24;31653166WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->mode, tmpReg32);31673168for (j=0; j<p_ManipParams->maxNumFramesInProcess*2; j++)3169if (((j / i) % 2)== 0)3170WRITE_UINT32(*(uint32_t *)PTR_MOVE(p_Manip->capwapFragParams.p_AutoLearnHashTbl, j * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE), 0x80000000);31713172tmpReg32 = 0x00008000;3173tmpReg32 |= (uint32_t)poolId << 16;3174WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->bufferPoolIdAndRisc1SetIndexes, tmpReg32);3175WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->risc23SetIndexes, 0x80008000);3176WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->risc4SetIndexesAndExtendedStatsTblPtr, 0x80000000);31773178p_Manip->capwapFragParams.maxNumFramesInProcess = p_ManipParams->maxNumFramesInProcess;31793180p_Manip->capwapFragParams.sgBpid = poolId;31813182p_Manip->capwapFragParams.fqidForTimeOutFrames = p_ManipParams->fqidForTimeOutFrames;3183p_Manip->capwapFragParams.timeoutRoutineRequestTime = p_ManipParams->timeoutRoutineRequestTime;3184p_Manip->capwapFragParams.bitFor1Micro = bitFor1Micro;31853186tmpReg32 = 0;3187tmpReg32 |= (((uint32_t)1<<p_Manip->capwapFragParams.bitFor1Micro) * p_ManipParams->timeoutThresholdForReassmProcess);3188WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->expirationDelay, tmpReg32);31893190return E_OK;3191}31923193static t_Error CapwapFragmentation(t_CapwapFragmentationParams *p_ManipParams,3194t_FmPcdManip *p_Manip,3195t_FmPcd *p_FmPcd,3196uint8_t poolId)3197{3198t_AdOfTypeContLookup *p_Ad;3199uint32_t tmpReg32 = 0;32003201SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);32023203p_Manip->updateParams |= OFFSET_OF_DATA;32043205p_Manip->frag = TRUE;32063207p_Manip->h_Frag = (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,3208FM_PCD_CC_AD_ENTRY_SIZE,3209FM_PCD_CC_AD_TABLE_ALIGN);3210if (!p_Manip->h_Frag)3211RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP fragmentation table descriptor"));32123213MemSet8(p_Manip->h_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);32143215p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;32163217tmpReg32 = 0;3218tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_FRAGMENTATION;32193220if (p_ManipParams->headerOptionsCompr)3221tmpReg32 |= FM_PCD_MANIP_CAPWAP_FRAG_COMPR_OPTION_FIELD_EN;3222tmpReg32 |= ((uint32_t)poolId << 8);3223WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);32243225tmpReg32 = 0;3226tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;3227WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);32283229p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;3230p_Manip->capwapFragParams.sgBpid = poolId;32313232return E_OK;3233}32343235static t_Error IndxStats(t_FmPcdStatsParams *p_StatsParams,t_FmPcdManip *p_Manip,t_FmPcd *p_FmPcd)3236{3237t_AdOfTypeContLookup *p_Ad;3238uint32_t tmpReg32 = 0;32393240SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);32413242UNUSED(p_FmPcd);32433244p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;32453246tmpReg32 = 0;3247tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_INDEXED_STATS;3248if (p_StatsParams->type == e_FM_PCD_STATS_PER_FLOWID)3249tmpReg32 |= (uint32_t)0x16 << 16;3250WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);32513252tmpReg32 = 0;3253tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;3254WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);32553256return E_OK;3257}32583259static t_Error InsrtHdrByTempl(t_FmPcdManipHdrInsrtParams *p_ManipParams, t_FmPcdManip *p_Manip, t_FmPcd *p_FmPcd)3260{3261t_FmPcdManipHdrInsrtByTemplateParams *p_InsrtByTemplate = &p_ManipParams->u.byTemplate;3262uint8_t tmpReg8 = 0xff;3263t_AdOfTypeContLookup *p_Ad;3264bool ipModify = FALSE;3265uint32_t tmpReg32 = 0, tmpRegNia = 0;3266uint16_t tmpReg16 = 0;3267t_Error err = E_OK;3268uint8_t extraAddedBytes = 0, blockSize = 0, extraAddedBytesAlignedToBlockSize = 0, log2Num = 0;3269uint8_t *p_Template = NULL;32703271SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_NULL_POINTER);3272SANITY_CHECK_RETURN_ERROR(p_Manip,E_NULL_POINTER);3273SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);3274SANITY_CHECK_RETURN_ERROR(p_FmPcd,E_NULL_POINTER);32753276p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;3277if (p_Manip->insrt)3278{3279if ((!p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterIp) ||3280(!p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterVlan))3281RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : asking for header template modifications with no template for insertion (template size)"));32823283if (p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterIp && (p_InsrtByTemplate->size <= p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset))3284RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : size of template < ipOuterOffset"));32853286if (p_InsrtByTemplate->size > 128)3287RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Size of header template for insertion can not be more than 128"));32883289if (p_InsrtByTemplate->size)3290{3291p_Manip->p_Template = (uint8_t *)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,3292p_InsrtByTemplate->size,3293FM_PCD_CC_AD_TABLE_ALIGN);3294if(!p_Manip->p_Template)3295RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation in MURAM FAILED"));32963297tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->p_Template) - (p_FmPcd->physicalMuramBase));3298tmpReg32 |= (uint32_t)p_InsrtByTemplate->size << 24;3299*(uint32_t *)&p_Ad->matchTblPtr = tmpReg32;3300}33013302tmpReg32 = 0;33033304p_Template = (uint8_t *)XX_Malloc(p_InsrtByTemplate->size * sizeof(uint8_t));33053306if (!p_Template)3307RETURN_ERROR(MAJOR, E_NO_MEMORY, ("XX_Malloc allocation FAILED"));33083309memcpy(p_Template, p_InsrtByTemplate->hdrTemplate, p_InsrtByTemplate->size * sizeof(uint8_t));33103311if (p_InsrtByTemplate->modifyOuterIp)3312{3313ipModify = TRUE;33143315tmpReg8 = (uint8_t)p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset];33163317if((tmpReg8 & 0xf0) == 0x40)3318tmpReg8 = 4;3319else if((tmpReg8 & 0xf0) == 0x60)3320tmpReg8 = 6;3321else3322tmpReg8 = 0xff;33233324if (tmpReg8 != 0xff)3325{3326if(p_InsrtByTemplate->modifyOuterIpParams.dscpEcn & 0xff00)3327RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : IPV4 present in header template, dscpEcn has to be only 1 byte"));3328if(p_InsrtByTemplate->modifyOuterIpParams.recalculateLength)3329{33303331if((p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize + p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedNotAlignedToBlockSize) > 255)3332RETURN_ERROR(MAJOR, E_INVALID_STATE, ("extra Byte added can not be more than 256 bytes"));3333extraAddedBytes = (uint8_t) (p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize + p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedNotAlignedToBlockSize);3334blockSize = p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.blockSize;3335extraAddedBytesAlignedToBlockSize = p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize;3336/*IP header template - IP totalLength -3337(1 byte) extraByteForIp = headerTemplateSize - ipOffset + insertedBytesAfterThisStage ,3338in the case of SEC insertedBytesAfterThisStage - SEC trailer (21/31) + header(13)3339second byte - extraByteForIp = headerTemplate - ipOffset + insertedBytesAfterThisStage*/3340}3341if (blockSize)3342{3343if (!POWER_OF_2(blockSize))3344RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("inputFrmPaddingUpToBlockSize has to be power of 2"));3345}33463347}3348if (tmpReg8 == 4)3349{3350if ((IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP + p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset) > p_InsrtByTemplate->size)3351RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : IP present in header template, user asked for IP modifications but ipOffset + ipTotalLengthFieldOffset in header template bigger than template size"));33523353p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_DSCECN_FIELD_OFFSET_FROM_IP] = (uint8_t)p_InsrtByTemplate->modifyOuterIpParams.dscpEcn;33543355if (blockSize)3356blockSize -= 1;33573358if ((p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes) > 255)3359RETURN_ERROR(MAJOR, E_INVALID_STATE, ("p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes has to be less than 255"));33603361p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_TOTALLENGTH_FIELD_OFFSET_FROM_IP + 1] = blockSize; // IPV6 - in AD instead of SEQ IND3362p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_TOTALLENGTH_FIELD_OFFSET_FROM_IP] = (uint8_t)(p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes);// for IPV6 decrement additional 40 bytes of IPV6 heade size33633364p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_ID_FIELD_OFFSET_FROM_IP] = 0x00;3365p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_ID_FIELD_OFFSET_FROM_IP + 1] = extraAddedBytesAlignedToBlockSize;33663367/*IP header template - relevant only for ipv4 CheckSum = 0*/3368p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP] = 0x00;3369p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP + 1] = 0x00;33703371/*UDP checksum has to be 0*/3372if (p_InsrtByTemplate->modifyOuterIpParams.udpPresent)3373{3374if ((p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + UDP_CHECKSUM_FIELD_SIZE) > p_InsrtByTemplate->size)3375RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : UDP present according to user but (UDP offset + UDP header size) < size of header template"));33763377p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP ] = 0x00;3378p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + 1] = 0x00;33793380}33813382if (p_InsrtByTemplate->modifyOuterIpParams.ipIdentGenId > 7)3383RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("ipIdentGenId has to be one out of 8 sequence number generators (0 - 7) for IP identification field"));33843385tmpRegNia |= (uint32_t)p_InsrtByTemplate->modifyOuterIpParams.ipIdentGenId<<24;3386}3387else if (tmpReg8 == 6)3388{3389/*TODO - add check for maximum value of blockSize;*/3390if (blockSize)3391LOG2(blockSize, log2Num);3392tmpRegNia |= (uint32_t)log2Num << 24;33933394// for IPV6 decrement additional 40 bytes of IPV6 heade size - because IPV6 header size is not included in payloadLength3395p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_PAYLOAD_LENGTH_OFFSET_FROM_IP] = (uint8_t)(p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes - 40);3396p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_PAYLOAD_LENGTH_OFFSET_FROM_IP + 1] = extraAddedBytesAlignedToBlockSize;3397if (p_InsrtByTemplate->modifyOuterIpParams.udpPresent)3398{3399if ((p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + UDP_CHECKSUM_FIELD_SIZE) > p_InsrtByTemplate->size)3400RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : UDP present according to user but (UDP offset + UDP header size) < size of header template"));3401if (p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_NEXT_HEADER_OFFSET_FROM_IP] != 0x88)3402RETURN_ERROR(MAJOR, E_INVALID_STATE, ("OUr suppport is only IPv6/UDPLite"));3403p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_LENGTH_FIELD_OFFSET_FROM_UDP] = 0x00;3404p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_LENGTH_FIELD_OFFSET_FROM_UDP + 1] = 0x08;3405p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP] = 0x00;3406p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + 1] = 0x00;3407}3408}3409else3410RETURN_ERROR(MAJOR, E_INVALID_STATE, ("IP version supported only IPV4"));3411}34123413tmpReg32 = tmpReg16 = tmpReg8 = 0;3414/*TODO - check it*/3415if (p_InsrtByTemplate->modifyOuterVlan)3416{3417if (p_InsrtByTemplate->modifyOuterVlanParams.vpri & ~0x07)3418RETURN_ERROR(MAJOR, E_INVALID_STATE,("Inconsistent parameters : user asked for VLAN modifications but VPRI more than 3 bits"));34193420memcpy(&tmpReg16, &p_Template[VLAN_TAG_FIELD_OFFSET_FROM_ETH], 2*(sizeof(uint8_t)));3421if ((tmpReg16 != 0x9100) && (tmpReg16!= 0x9200) && (tmpReg16 != 0x8100))3422RETURN_ERROR(MAJOR, E_INVALID_STATE,("Inconsistent parameters : user asked for VLAN modifications but Tag Protocol identifier is not VLAN "));34233424memcpy(&tmpReg8, &p_Template[14],1*(sizeof(uint8_t)));3425tmpReg8 &= 0x1f;3426tmpReg8 |= (uint8_t)(p_InsrtByTemplate->modifyOuterVlanParams.vpri << 5);34273428p_Template[14] = tmpReg8;3429}34303431MemCpy8(p_Manip->p_Template, p_Template, p_InsrtByTemplate->size);34323433XX_Free(p_Template);3434}34353436tmpReg32 = 0;3437if (p_Manip->h_Frag)3438{3439tmpRegNia |= (uint32_t)(XX_VirtToPhys(p_Manip->h_Frag) - (p_FmPcd->physicalMuramBase));3440tmpReg32 |= (uint32_t)p_Manip->sizeForFragmentation << 16;3441}3442else3443tmpReg32 = 0xffff0000;34443445if (ipModify)3446tmpReg32 |= (uint32_t)p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset << 8;3447else3448tmpReg32 |= (uint32_t)0x0000ff00;34493450tmpReg32 |= (uint32_t)HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;3451*(uint32_t *)&p_Ad->pcAndOffsets = tmpReg32;34523453tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;3454*(uint32_t *)&p_Ad->ccAdBase = tmpRegNia;34553456return err;3457}34583459static t_Error CheckStatsParamsAndSetType(t_FmPcdManip *p_Manip, t_FmPcdStatsParams *p_StatsParams)3460{34613462switch (p_StatsParams->type)3463{3464case (e_FM_PCD_STATS_PER_FLOWID):3465p_Manip->opcode = HMAN_OC_CAPWAP_INDEXED_STATS;3466p_Manip->muramAllocate = TRUE;3467break;3468default:3469RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported statistics type"));3470}34713472return E_OK;3473}3474#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */34753476static t_Error FillReassmManipParams(t_FmPcdManip *p_Manip, e_NetHeaderType hdr)3477{3478t_AdOfTypeContLookup *p_Ad;3479t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;3480uint32_t tmpReg32;3481t_Error err = E_OK;34823483/* Creates the Reassembly Parameters table. It contains parameters that are specific to either the IPv4 reassembly3484function or to the IPv6 reassembly function. If both IPv4 reassembly and IPv6 reassembly are required, then3485two separate IP Reassembly Parameter tables are required.*/3486if ((err = CreateReassTable(p_Manip, hdr)) != E_OK)3487RETURN_ERROR(MAJOR, err, NO_MSG);34883489/* Sets the first Ad register (ccAdBase) - Action Descriptor Type and Pointer to the Reassembly Parameters Table offset from MURAM*/3490tmpReg32 = 0;3491tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;34923493/* Gets the required Action descriptor table pointer */3494switch (hdr)3495{3496case HEADER_TYPE_IPv4:3497p_Ad = (t_AdOfTypeContLookup *)p_Manip->reassmParams.ip.h_Ipv4Ad;3498tmpReg32 |= (uint32_t)(XX_VirtToPhys(3499p_Manip->reassmParams.ip.p_Ipv4ReassTbl)3500- (p_FmPcd->physicalMuramBase));3501break;3502case HEADER_TYPE_IPv6:3503p_Ad = (t_AdOfTypeContLookup *)p_Manip->reassmParams.ip.h_Ipv6Ad;3504tmpReg32 |= (uint32_t)(XX_VirtToPhys(3505p_Manip->reassmParams.ip.p_Ipv6ReassTbl)3506- (p_FmPcd->physicalMuramBase));3507break;3508case HEADER_TYPE_CAPWAP:3509p_Ad = (t_AdOfTypeContLookup *)p_Manip->reassmParams.capwap.h_Ad;3510tmpReg32 |= (uint32_t)(XX_VirtToPhys(3511p_Manip->reassmParams.capwap.p_ReassTbl)3512- (p_FmPcd->physicalMuramBase));3513break;3514default:3515RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("header type"));3516}35173518WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);35193520/* Sets the second Ad register (matchTblPtr) - Buffer pool ID (BPID for V2) and Scatter/Gather table offset*/3521/* mark the Scatter/Gather table offset to be set later on when the port will be known */3522p_Manip->updateParams = (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS | DISCARD_MASK);35233524if ((hdr == HEADER_TYPE_IPv6) || (hdr == HEADER_TYPE_IPv4))3525{3526#if (DPAA_VERSION == 10)3527tmpReg32 = (uint32_t)(p_Manip->reassmParams.sgBpid << 8);3528WRITE_UINT32(p_Ad->matchTblPtr, tmpReg32);3529#endif /* (DPAA_VERSION == 10) */3530#if (DPAA_VERSION >= 11)3531if (p_Manip->reassmParams.ip.nonConsistentSpFqid != 0)3532{3533tmpReg32 = FM_PCD_AD_NCSPFQIDM_MASK3534| (uint32_t)(p_Manip->reassmParams.ip.nonConsistentSpFqid);3535WRITE_UINT32(p_Ad->gmask, tmpReg32);3536}3537#endif /* (DPAA_VERSION >= 11) */3538/* Sets the third Ad register (pcAndOffsets)- IP Reassemble Operation Code*/3539tmpReg32 = 0;3540tmpReg32 |= (uint32_t)HMAN_OC_IP_REASSEMBLY;3541}3542#if (DPAA_VERSION >= 11)3543else3544if (hdr == HEADER_TYPE_CAPWAP)3545{3546tmpReg32 = 0;3547tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_REASSEMBLY;3548}3549#endif /* (DPAA_VERSION >= 11) */35503551WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);35523553p_Manip->reassm = TRUE;35543555return E_OK;3556}35573558static t_Error SetIpv4ReassmManip(t_FmPcdManip *p_Manip)3559{3560t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;35613562/* Allocation if IPv4 Action descriptor */3563p_Manip->reassmParams.ip.h_Ipv4Ad = (t_Handle)XX_MallocSmart(3564FM_PCD_CC_AD_ENTRY_SIZE, p_Manip->reassmParams.dataMemId,3565FM_PCD_CC_AD_TABLE_ALIGN);3566if (!p_Manip->reassmParams.ip.h_Ipv4Ad)3567{3568ReleaseManipHandler(p_Manip, p_FmPcd);3569RETURN_ERROR(MAJOR, E_NO_MEMORY,3570("Allocation of IPv4 table descriptor"));3571}35723573memset(p_Manip->reassmParams.ip.h_Ipv4Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);35743575/* Fill reassembly manipulation parameter in the IP Reassembly Action Descriptor */3576return FillReassmManipParams(p_Manip, HEADER_TYPE_IPv4);3577}35783579static t_Error SetIpv6ReassmManip(t_FmPcdManip *p_Manip)3580{3581t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;35823583/* Allocation if IPv6 Action descriptor */3584p_Manip->reassmParams.ip.h_Ipv6Ad = (t_Handle)XX_MallocSmart(3585FM_PCD_CC_AD_ENTRY_SIZE, p_Manip->reassmParams.dataMemId,3586FM_PCD_CC_AD_TABLE_ALIGN);3587if (!p_Manip->reassmParams.ip.h_Ipv6Ad)3588{3589ReleaseManipHandler(p_Manip, p_FmPcd);3590RETURN_ERROR(MAJOR, E_NO_MEMORY,3591("Allocation of IPv6 table descriptor"));3592}35933594memset(p_Manip->reassmParams.ip.h_Ipv6Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);35953596/* Fill reassembly manipulation parameter in the IP Reassembly Action Descriptor */3597return FillReassmManipParams(p_Manip, HEADER_TYPE_IPv6);3598}35993600static t_Error IpReassembly(t_FmPcdManipReassemParams *p_ManipReassmParams,3601t_FmPcdManip *p_Manip)3602{3603uint32_t maxSetNumber = 10000;3604t_FmPcdManipReassemIpParams reassmManipParams =3605p_ManipReassmParams->u.ipReassem;3606t_Error res;36073608SANITY_CHECK_RETURN_ERROR(p_Manip->h_FmPcd, E_INVALID_HANDLE);3609SANITY_CHECK_RETURN_ERROR(((t_FmPcd *)p_Manip->h_FmPcd)->h_Hc,3610E_INVALID_HANDLE);36113612/* Check validation of user's parameter.*/3613if ((reassmManipParams.timeoutThresholdForReassmProcess < 1000)3614|| (reassmManipParams.timeoutThresholdForReassmProcess > 8000000))3615RETURN_ERROR(3616MAJOR, E_INVALID_VALUE,3617("timeoutThresholdForReassmProcess should be 1msec - 8sec"));3618/* It is recommended that the total number of entries in this table (number of sets * number of ways)3619will be twice the number of frames that are expected to be reassembled simultaneously.*/3620if (reassmManipParams.maxNumFramesInProcess3621> (reassmManipParams.maxNumFramesInProcess * maxSetNumber / 2))3622RETURN_ERROR(3623MAJOR,3624E_INVALID_VALUE,3625("maxNumFramesInProcess has to be less than (maximun set number * number of ways / 2)"));36263627if ((p_ManipReassmParams->hdr == HEADER_TYPE_IPv6)3628&& (reassmManipParams.minFragSize[1] < 256))3629RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("minFragSize[1] must be >= 256"));36303631/* Saves user's reassembly manipulation parameters */3632p_Manip->reassmParams.ip.relativeSchemeId[0] =3633reassmManipParams.relativeSchemeId[0];3634p_Manip->reassmParams.ip.relativeSchemeId[1] =3635reassmManipParams.relativeSchemeId[1];3636p_Manip->reassmParams.ip.numOfFramesPerHashEntry[0] =3637reassmManipParams.numOfFramesPerHashEntry[0];3638p_Manip->reassmParams.ip.numOfFramesPerHashEntry[1] =3639reassmManipParams.numOfFramesPerHashEntry[1];3640p_Manip->reassmParams.ip.minFragSize[0] = reassmManipParams.minFragSize[0];3641p_Manip->reassmParams.ip.minFragSize[1] = reassmManipParams.minFragSize[1];3642p_Manip->reassmParams.maxNumFramesInProcess =3643reassmManipParams.maxNumFramesInProcess;3644p_Manip->reassmParams.timeOutMode = reassmManipParams.timeOutMode;3645p_Manip->reassmParams.fqidForTimeOutFrames =3646reassmManipParams.fqidForTimeOutFrames;3647p_Manip->reassmParams.timeoutThresholdForReassmProcess =3648reassmManipParams.timeoutThresholdForReassmProcess;3649p_Manip->reassmParams.dataMemId = reassmManipParams.dataMemId;3650p_Manip->reassmParams.dataLiodnOffset = reassmManipParams.dataLiodnOffset;3651#if (DPAA_VERSION == 10)3652p_Manip->reassmParams.sgBpid = reassmManipParams.sgBpid;3653#endif /* (DPAA_VERSION == 10) */3654#if (DPAA_VERSION >= 11)3655if (reassmManipParams.nonConsistentSpFqid != 0)3656{3657p_Manip->reassmParams.ip.nonConsistentSpFqid =3658reassmManipParams.nonConsistentSpFqid;3659}3660#endif /* (DPAA_VERSION >= 11) */36613662/* Creates and initializes the IP Reassembly common parameter table */3663CreateReassCommonTable(p_Manip);36643665/* Creation of IPv4 reassembly manipulation */3666if ((p_Manip->reassmParams.hdr == HEADER_TYPE_IPv6)3667|| (p_Manip->reassmParams.hdr == HEADER_TYPE_IPv4))3668{3669res = SetIpv4ReassmManip(p_Manip);3670if (res != E_OK)3671return res;3672}36733674/* Creation of IPv6 reassembly manipulation */3675if (p_Manip->reassmParams.hdr == HEADER_TYPE_IPv6)3676{3677res = SetIpv6ReassmManip(p_Manip);3678if (res != E_OK)3679return res;3680}36813682return E_OK;3683}36843685static void setIpReassmSchemeParams(t_FmPcd* p_FmPcd,3686t_FmPcdKgSchemeParams *p_Scheme,3687t_Handle h_CcTree, bool ipv4,3688uint8_t groupId)3689{3690uint32_t j;3691uint8_t res;36923693/* Configures scheme's network environment parameters */3694p_Scheme->netEnvParams.numOfDistinctionUnits = 2;3695if (ipv4)3696res = FmPcdNetEnvGetUnitId(3697p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),3698HEADER_TYPE_IPv4, FALSE, 0);3699else3700res = FmPcdNetEnvGetUnitId(3701p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),3702HEADER_TYPE_IPv6, FALSE, 0);3703ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);3704p_Scheme->netEnvParams.unitIds[0] = res;37053706res = FmPcdNetEnvGetUnitId(3707p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),3708HEADER_TYPE_USER_DEFINED_SHIM2, FALSE, 0);3709ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);3710p_Scheme->netEnvParams.unitIds[1] = res;37113712/* Configures scheme's next engine parameters*/3713p_Scheme->nextEngine = e_FM_PCD_CC;3714p_Scheme->kgNextEngineParams.cc.h_CcTree = h_CcTree;3715p_Scheme->kgNextEngineParams.cc.grpId = groupId;3716p_Scheme->useHash = TRUE;37173718/* Configures scheme's key*/3719if (ipv4 == TRUE)3720{3721p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 4;3722p_Scheme->keyExtractAndHashParams.extractArray[0].type =3723e_FM_PCD_EXTRACT_BY_HDR;3724p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.type =3725e_FM_PCD_EXTRACT_FULL_FIELD;3726p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.hdr =3727HEADER_TYPE_IPv4;3728p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.extractByHdrType.fullField.ipv4 =3729NET_HEADER_FIELD_IPv4_DST_IP;3730p_Scheme->keyExtractAndHashParams.extractArray[1].type =3731e_FM_PCD_EXTRACT_BY_HDR;3732p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.type =3733e_FM_PCD_EXTRACT_FULL_FIELD;3734p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.hdr =3735HEADER_TYPE_IPv4;3736p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.extractByHdrType.fullField.ipv4 =3737NET_HEADER_FIELD_IPv4_SRC_IP;3738p_Scheme->keyExtractAndHashParams.extractArray[2].type =3739e_FM_PCD_EXTRACT_BY_HDR;3740p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.type =3741e_FM_PCD_EXTRACT_FULL_FIELD;3742p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.hdr =3743HEADER_TYPE_IPv4;3744p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fullField.ipv4 =3745NET_HEADER_FIELD_IPv4_PROTO;3746p_Scheme->keyExtractAndHashParams.extractArray[3].type =3747e_FM_PCD_EXTRACT_BY_HDR;3748p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.hdr =3749HEADER_TYPE_IPv4;3750p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.type =3751e_FM_PCD_EXTRACT_FROM_HDR;3752p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.ignoreProtocolValidation =3753FALSE;3754p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.extractByHdrType.fromHdr.size =37552;3756p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.extractByHdrType.fromHdr.offset =37574;3758}3759else /* IPv6 */3760{3761p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 3;3762p_Scheme->keyExtractAndHashParams.extractArray[0].type =3763e_FM_PCD_EXTRACT_BY_HDR;3764p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.type =3765e_FM_PCD_EXTRACT_FULL_FIELD;3766p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.hdr =3767HEADER_TYPE_IPv6;3768p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.extractByHdrType.fullField.ipv6 =3769NET_HEADER_FIELD_IPv6_DST_IP;3770p_Scheme->keyExtractAndHashParams.extractArray[1].type =3771e_FM_PCD_EXTRACT_BY_HDR;3772p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.type =3773e_FM_PCD_EXTRACT_FULL_FIELD;3774p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.hdr =3775HEADER_TYPE_IPv6;3776p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.extractByHdrType.fullField.ipv6 =3777NET_HEADER_FIELD_IPv6_SRC_IP;3778p_Scheme->keyExtractAndHashParams.extractArray[2].type =3779e_FM_PCD_EXTRACT_BY_HDR;3780p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.hdr =3781HEADER_TYPE_USER_DEFINED_SHIM2;3782p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.type =3783e_FM_PCD_EXTRACT_FROM_HDR;3784p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fromHdr.size =37854;3786p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fromHdr.offset =37874;3788p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.ignoreProtocolValidation =3789TRUE;3790}37913792p_Scheme->keyExtractAndHashParams.privateDflt0 = 0x01020304;3793p_Scheme->keyExtractAndHashParams.privateDflt1 = 0x11121314;3794p_Scheme->keyExtractAndHashParams.numOfUsedDflts =3795FM_PCD_KG_NUM_OF_DEFAULT_GROUPS;3796for (j = 0; j < FM_PCD_KG_NUM_OF_DEFAULT_GROUPS; j++)3797{3798p_Scheme->keyExtractAndHashParams.dflts[j].type =3799(e_FmPcdKgKnownFieldsDfltTypes)j; /* all types */3800p_Scheme->keyExtractAndHashParams.dflts[j].dfltSelect =3801e_FM_PCD_KG_DFLT_GBL_0;3802}3803}38043805static t_Error IpReassemblyStats(t_FmPcdManip *p_Manip,3806t_FmPcdManipReassemIpStats *p_Stats)3807{3808ASSERT_COND(p_Manip);3809ASSERT_COND(p_Stats);3810ASSERT_COND(p_Manip->reassmParams.p_ReassCommonTbl);38113812p_Stats->timeout =3813GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalTimeOutCounter);3814p_Stats->rfdPoolBusy =3815GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalRfdPoolBusyCounter);3816p_Stats->internalBufferBusy =3817GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalInternalBufferBusy);3818p_Stats->externalBufferBusy =3819GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalExternalBufferBusy);3820p_Stats->sgFragments =3821GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalSgFragmentCounter);3822p_Stats->dmaSemaphoreDepletion =3823GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalDmaSemaphoreDepletionCounter);3824#if (DPAA_VERSION >= 11)3825p_Stats->nonConsistentSp =3826GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalNCSPCounter);3827#endif /* (DPAA_VERSION >= 11) */38283829if (p_Manip->reassmParams.ip.p_Ipv4ReassTbl)3830{3831p_Stats->specificHdrStatistics[0].successfullyReassembled =3832GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalSuccessfullyReasmFramesCounter);3833p_Stats->specificHdrStatistics[0].validFragments =3834GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalValidFragmentCounter);3835p_Stats->specificHdrStatistics[0].processedFragments =3836GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalProcessedFragCounter);3837p_Stats->specificHdrStatistics[0].malformedFragments =3838GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalMalformdFragCounter);3839p_Stats->specificHdrStatistics[0].autoLearnBusy =3840GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalSetBusyCounter);3841p_Stats->specificHdrStatistics[0].discardedFragments =3842GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalDiscardedFragsCounter);3843p_Stats->specificHdrStatistics[0].moreThan16Fragments =3844GET_UINT32(p_Manip->reassmParams.ip.p_Ipv4ReassTbl->totalMoreThan16FramesCounter);3845}3846if (p_Manip->reassmParams.ip.p_Ipv6ReassTbl)3847{3848p_Stats->specificHdrStatistics[1].successfullyReassembled =3849GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalSuccessfullyReasmFramesCounter);3850p_Stats->specificHdrStatistics[1].validFragments =3851GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalValidFragmentCounter);3852p_Stats->specificHdrStatistics[1].processedFragments =3853GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalProcessedFragCounter);3854p_Stats->specificHdrStatistics[1].malformedFragments =3855GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalMalformdFragCounter);3856p_Stats->specificHdrStatistics[1].autoLearnBusy =3857GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalSetBusyCounter);3858p_Stats->specificHdrStatistics[1].discardedFragments =3859GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalDiscardedFragsCounter);3860p_Stats->specificHdrStatistics[1].moreThan16Fragments =3861GET_UINT32(p_Manip->reassmParams.ip.p_Ipv6ReassTbl->totalMoreThan16FramesCounter);3862}3863return E_OK;3864}38653866static t_Error IpFragmentationStats(t_FmPcdManip *p_Manip,3867t_FmPcdManipFragIpStats *p_Stats)3868{3869t_AdOfTypeContLookup *p_Ad;38703871ASSERT_COND(p_Manip);3872ASSERT_COND(p_Stats);3873ASSERT_COND(p_Manip->h_Ad);3874ASSERT_COND(p_Manip->fragParams.p_Frag);38753876p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;38773878p_Stats->totalFrames = GET_UINT32(p_Ad->gmask);3879p_Stats->fragmentedFrames = GET_UINT32(p_Manip->fragParams.p_Frag->ccAdBase)3880& 0x00ffffff;3881p_Stats->generatedFragments =3882GET_UINT32(p_Manip->fragParams.p_Frag->matchTblPtr);38833884return E_OK;3885}38863887static t_Error IpFragmentation(t_FmPcdManipFragIpParams *p_ManipParams,3888t_FmPcdManip *p_Manip)3889{3890uint32_t pcAndOffsetsReg = 0, ccAdBaseReg = 0, gmaskReg = 0;3891t_FmPcd *p_FmPcd;3892#if (DPAA_VERSION == 10)3893t_Error err = E_OK;3894#endif /* (DPAA_VERSION == 10) */38953896SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);3897SANITY_CHECK_RETURN_ERROR(p_ManipParams->sizeForFragmentation != 0xFFFF,3898E_INVALID_VALUE);38993900p_FmPcd = p_Manip->h_FmPcd;3901/* Allocation of fragmentation Action Descriptor */3902p_Manip->fragParams.p_Frag = (t_AdOfTypeContLookup *)FM_MURAM_AllocMem(3903p_FmPcd->h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE,3904FM_PCD_CC_AD_TABLE_ALIGN);3905if (!p_Manip->fragParams.p_Frag)3906RETURN_ERROR(MAJOR, E_NO_MEMORY,3907("MURAM alloc for Fragmentation table descriptor"));3908MemSet8(p_Manip->fragParams.p_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);39093910/* Prepare the third Ad register (pcAndOffsets)- OperationCode */3911pcAndOffsetsReg = (uint32_t)HMAN_OC_IP_FRAGMENTATION;39123913/* Prepare the first Ad register (ccAdBase) - Don't frag action and Action descriptor type*/3914ccAdBaseReg = FM_PCD_AD_CONT_LOOKUP_TYPE;3915ccAdBaseReg |= (p_ManipParams->dontFragAction3916<< FM_PCD_MANIP_IP_FRAG_DF_SHIFT);391739183919/* Set Scatter/Gather BPid */3920if (p_ManipParams->sgBpidEn)3921{3922ccAdBaseReg |= FM_PCD_MANIP_IP_FRAG_SG_BDID_EN;3923pcAndOffsetsReg |= ((p_ManipParams->sgBpid3924<< FM_PCD_MANIP_IP_FRAG_SG_BDID_SHIFT)3925& FM_PCD_MANIP_IP_FRAG_SG_BDID_MASK);3926}39273928/* Prepare the first Ad register (gmask) - scratch buffer pool id and Pointer to fragment ID */3929gmaskReg = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr))3930- p_FmPcd->physicalMuramBase);3931#if (DPAA_VERSION == 10)3932gmaskReg |= p_ManipParams->scratchBpid << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;3933#else3934gmaskReg |= (0xFF) << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;3935#endif /* (DPAA_VERSION == 10) */39363937/* Set all Ad registers */3938WRITE_UINT32(p_Manip->fragParams.p_Frag->pcAndOffsets, pcAndOffsetsReg);3939WRITE_UINT32(p_Manip->fragParams.p_Frag->ccAdBase, ccAdBaseReg);3940WRITE_UINT32(p_Manip->fragParams.p_Frag->gmask, gmaskReg);39413942/* Saves user's fragmentation manipulation parameters */3943p_Manip->frag = TRUE;3944p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;39453946#if (DPAA_VERSION == 10)3947p_Manip->fragParams.scratchBpid = p_ManipParams->scratchBpid;39483949/* scratch buffer pool initialization */3950if ((err = FmPcdFragHcScratchPoolFill((t_Handle)p_FmPcd, p_ManipParams->scratchBpid)) != E_OK)3951{3952FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_Frag);3953p_Manip->fragParams.p_Frag = NULL;3954RETURN_ERROR(MAJOR, err, NO_MSG);3955}3956#endif /* (DPAA_VERSION == 10) */39573958return E_OK;3959}39603961static t_Error IPManip(t_FmPcdManip *p_Manip)3962{3963t_Error err = E_OK;3964t_FmPcd *p_FmPcd;3965t_AdOfTypeContLookup *p_Ad;3966uint32_t tmpReg32 = 0, tmpRegNia = 0;39673968SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);3969p_FmPcd = p_Manip->h_FmPcd;3970SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);39713972p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;39733974tmpReg32 = FM_PCD_MANIP_IP_NO_FRAGMENTATION;3975if (p_Manip->frag == TRUE)3976{3977tmpRegNia = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_Frag)3978- (p_FmPcd->physicalMuramBase));3979tmpReg32 = (uint32_t)p_Manip->sizeForFragmentation3980<< FM_PCD_MANIP_IP_MTU_SHIFT;3981}39823983tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;3984tmpReg32 |= HMAN_OC_IP_MANIP;39853986#if (DPAA_VERSION >= 11)3987tmpRegNia |= FM_PCD_MANIP_IP_CNIA;3988#endif /* (DPAA_VERSION >= 11) */39893990WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);3991WRITE_UINT32(p_Ad->ccAdBase, tmpRegNia);3992WRITE_UINT32(p_Ad->gmask, 0);3993/* Total frame counter - MUST be initialized to zero.*/39943995return err;3996}39973998static t_Error UpdateInitIpFrag(t_Handle h_FmPcd, t_Handle h_PcdParams,3999t_Handle h_FmPort, t_FmPcdManip *p_Manip,4000t_Handle h_Ad, bool validate)4001{4002t_FmPortGetSetCcParams fmPortGetSetCcParams;4003t_Error err;40044005SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);4006SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_IP_FRAGMENTATION),4007E_INVALID_STATE);4008SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);4009SANITY_CHECK_RETURN_ERROR(h_FmPort, E_INVALID_HANDLE);40104011UNUSED(h_FmPcd);4012UNUSED(h_Ad);4013UNUSED(h_PcdParams);4014UNUSED(validate);4015UNUSED(p_Manip);40164017fmPortGetSetCcParams.setCcParams.type = 0;4018fmPortGetSetCcParams.getCcParams.type = MANIP_EXTRA_SPACE;4019if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams)) != E_OK)4020RETURN_ERROR(MAJOR, err, NO_MSG);40214022if (!fmPortGetSetCcParams.getCcParams.internalBufferOffset)4023DBG(WARNING, ("manipExtraSpace must be larger than '0'"));40244025return E_OK;4026}40274028static t_Error IPSecManip(t_FmPcdManipParams *p_ManipParams,4029t_FmPcdManip *p_Manip)4030{4031t_AdOfTypeContLookup *p_Ad;4032t_FmPcdManipSpecialOffloadIPSecParams *p_IPSecParams;4033t_Error err = E_OK;4034uint32_t tmpReg32 = 0;4035uint32_t power;40364037SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);4038SANITY_CHECK_RETURN_ERROR(p_ManipParams, E_INVALID_HANDLE);40394040p_IPSecParams = &p_ManipParams->u.specialOffload.u.ipsec;40414042SANITY_CHECK_RETURN_ERROR(4043!p_IPSecParams->variableIpHdrLen || p_IPSecParams->decryption,4044E_INVALID_VALUE);4045SANITY_CHECK_RETURN_ERROR(4046!p_IPSecParams->variableIpVersion || !p_IPSecParams->decryption,4047E_INVALID_VALUE);4048SANITY_CHECK_RETURN_ERROR(4049!p_IPSecParams->variableIpVersion || p_IPSecParams->outerIPHdrLen,4050E_INVALID_VALUE);4051SANITY_CHECK_RETURN_ERROR(4052!p_IPSecParams->arwSize || p_IPSecParams->arwAddr,4053E_INVALID_VALUE);4054SANITY_CHECK_RETURN_ERROR(4055!p_IPSecParams->arwSize || p_IPSecParams->decryption,4056E_INVALID_VALUE);4057SANITY_CHECK_RETURN_ERROR((p_IPSecParams->arwSize % 16) == 0, E_INVALID_VALUE);40584059p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;40604061tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;4062tmpReg32 |= (p_IPSecParams->decryption) ? FM_PCD_MANIP_IPSEC_DEC : 0;4063tmpReg32 |= (p_IPSecParams->ecnCopy) ? FM_PCD_MANIP_IPSEC_ECN_EN : 0;4064tmpReg32 |= (p_IPSecParams->dscpCopy) ? FM_PCD_MANIP_IPSEC_DSCP_EN : 0;4065tmpReg32 |=4066(p_IPSecParams->variableIpHdrLen) ? FM_PCD_MANIP_IPSEC_VIPL_EN : 0;4067tmpReg32 |=4068(p_IPSecParams->variableIpVersion) ? FM_PCD_MANIP_IPSEC_VIPV_EN : 0;4069if (p_IPSecParams->arwSize)4070tmpReg32 |= (uint32_t)((XX_VirtToPhys(UINT_TO_PTR(p_IPSecParams->arwAddr))-FM_MM_MURAM)4071& (FM_MURAM_SIZE-1));4072WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);40734074tmpReg32 = 0;4075if (p_IPSecParams->arwSize) {4076NEXT_POWER_OF_2((p_IPSecParams->arwSize + 32), power);4077LOG2(power, power);4078tmpReg32 = (p_IPSecParams->arwSize | (power - 5)) << FM_PCD_MANIP_IPSEC_ARW_SIZE_SHIFT;4079}40804081if (p_ManipParams->h_NextManip)4082tmpReg32 |=4083(uint32_t)(XX_VirtToPhys(((t_FmPcdManip *)p_ManipParams->h_NextManip)->h_Ad)-4084(((t_FmPcd *)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4;4085WRITE_UINT32(p_Ad->matchTblPtr, tmpReg32);40864087tmpReg32 = HMAN_OC_IPSEC_MANIP;4088tmpReg32 |= p_IPSecParams->outerIPHdrLen4089<< FM_PCD_MANIP_IPSEC_IP_HDR_LEN_SHIFT;4090if (p_ManipParams->h_NextManip)4091tmpReg32 |= FM_PCD_MANIP_IPSEC_NADEN;4092WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);40934094return err;4095}40964097static t_Error SetCapwapReassmManip(t_FmPcdManip *p_Manip)4098{4099t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;41004101/* Allocation if CAPWAP Action descriptor */4102p_Manip->reassmParams.capwap.h_Ad = (t_Handle)XX_MallocSmart(4103FM_PCD_CC_AD_ENTRY_SIZE, p_Manip->reassmParams.dataMemId,4104FM_PCD_CC_AD_TABLE_ALIGN);4105if (!p_Manip->reassmParams.capwap.h_Ad)4106{4107ReleaseManipHandler(p_Manip, p_FmPcd);4108RETURN_ERROR(MAJOR, E_NO_MEMORY,4109("Allocation of CAPWAP table descriptor"));4110}41114112memset(p_Manip->reassmParams.capwap.h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);41134114/* Fill reassembly manipulation parameter in the Reassembly Action Descriptor */4115return FillReassmManipParams(p_Manip, HEADER_TYPE_CAPWAP);4116}41174118static void setCapwapReassmSchemeParams(t_FmPcd* p_FmPcd,4119t_FmPcdKgSchemeParams *p_Scheme,4120t_Handle h_CcTree, uint8_t groupId)4121{4122uint8_t res;41234124/* Configures scheme's network environment parameters */4125p_Scheme->netEnvParams.numOfDistinctionUnits = 1;4126res = FmPcdNetEnvGetUnitId(4127p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv),4128HEADER_TYPE_USER_DEFINED_SHIM2, FALSE, 0);4129ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);4130p_Scheme->netEnvParams.unitIds[0] = res;41314132/* Configures scheme's next engine parameters*/4133p_Scheme->nextEngine = e_FM_PCD_CC;4134p_Scheme->kgNextEngineParams.cc.h_CcTree = h_CcTree;4135p_Scheme->kgNextEngineParams.cc.grpId = groupId;4136p_Scheme->useHash = TRUE;41374138/* Configures scheme's key*/4139p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 2;4140p_Scheme->keyExtractAndHashParams.extractArray[0].type =4141e_FM_PCD_EXTRACT_NON_HDR;4142p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.src =4143e_FM_PCD_EXTRACT_FROM_PARSE_RESULT;4144p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.action =4145e_FM_PCD_ACTION_NONE;4146p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.offset = 20;4147p_Scheme->keyExtractAndHashParams.extractArray[0].extractNonHdr.size = 4;4148p_Scheme->keyExtractAndHashParams.extractArray[1].type =4149e_FM_PCD_EXTRACT_NON_HDR;4150p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.src =4151e_FM_PCD_EXTRACT_FROM_DFLT_VALUE;4152p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.action =4153e_FM_PCD_ACTION_NONE;4154p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.offset = 0;4155p_Scheme->keyExtractAndHashParams.extractArray[1].extractNonHdr.size = 1;41564157p_Scheme->keyExtractAndHashParams.privateDflt0 = 0x0;4158p_Scheme->keyExtractAndHashParams.privateDflt1 = 0x0;4159p_Scheme->keyExtractAndHashParams.numOfUsedDflts = 1;4160p_Scheme->keyExtractAndHashParams.dflts[0].type = e_FM_PCD_KG_GENERIC_NOT_FROM_DATA;4161p_Scheme->keyExtractAndHashParams.dflts[0].dfltSelect = e_FM_PCD_KG_DFLT_PRIVATE_0;4162}41634164#if (DPAA_VERSION >= 11)4165static t_Error CapwapReassemblyStats(t_FmPcdManip *p_Manip,4166t_FmPcdManipReassemCapwapStats *p_Stats)4167{4168ASSERT_COND(p_Manip);4169ASSERT_COND(p_Stats);4170ASSERT_COND(p_Manip->reassmParams.p_ReassCommonTbl);41714172p_Stats->timeout =4173GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalTimeOutCounter);4174p_Stats->rfdPoolBusy =4175GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalRfdPoolBusyCounter);4176p_Stats->internalBufferBusy =4177GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalInternalBufferBusy);4178p_Stats->externalBufferBusy =4179GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalExternalBufferBusy);4180p_Stats->sgFragments =4181GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalSgFragmentCounter);4182p_Stats->dmaSemaphoreDepletion =4183GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalDmaSemaphoreDepletionCounter);4184p_Stats->exceedMaxReassemblyFrameLen =4185GET_UINT32(p_Manip->reassmParams.p_ReassCommonTbl->totalNCSPCounter);41864187p_Stats->successfullyReassembled =4188GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalSuccessfullyReasmFramesCounter);4189p_Stats->validFragments =4190GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalValidFragmentCounter);4191p_Stats->processedFragments =4192GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalProcessedFragCounter);4193p_Stats->malformedFragments =4194GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalMalformdFragCounter);4195p_Stats->autoLearnBusy =4196GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalSetBusyCounter);4197p_Stats->discardedFragments =4198GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalDiscardedFragsCounter);4199p_Stats->moreThan16Fragments =4200GET_UINT32(p_Manip->reassmParams.capwap.p_ReassTbl->totalMoreThan16FramesCounter);42014202return E_OK;4203}42044205static t_Error CapwapFragmentationStats(t_FmPcdManip *p_Manip,4206t_FmPcdManipFragCapwapStats *p_Stats)4207{4208t_AdOfTypeContLookup *p_Ad;42094210ASSERT_COND(p_Manip);4211ASSERT_COND(p_Stats);4212ASSERT_COND(p_Manip->h_Ad);4213ASSERT_COND(p_Manip->fragParams.p_Frag);42144215p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;42164217p_Stats->totalFrames = GET_UINT32(p_Ad->gmask);42184219return E_OK;4220}42214222static t_Error CapwapReassembly(t_FmPcdManipReassemParams *p_ManipReassmParams,4223t_FmPcdManip *p_Manip)4224{4225uint32_t maxSetNumber = 10000;4226t_FmPcdManipReassemCapwapParams reassmManipParams =4227p_ManipReassmParams->u.capwapReassem;4228t_Error res;42294230SANITY_CHECK_RETURN_ERROR(p_Manip->h_FmPcd, E_INVALID_HANDLE);4231SANITY_CHECK_RETURN_ERROR(((t_FmPcd *)p_Manip->h_FmPcd)->h_Hc,4232E_INVALID_HANDLE);42334234/* Check validation of user's parameter.*/4235if ((reassmManipParams.timeoutThresholdForReassmProcess < 1000)4236|| (reassmManipParams.timeoutThresholdForReassmProcess > 8000000))4237RETURN_ERROR(4238MAJOR, E_INVALID_VALUE,4239("timeoutThresholdForReassmProcess should be 1msec - 8sec"));4240/* It is recommended that the total number of entries in this table (number of sets * number of ways)4241will be twice the number of frames that are expected to be reassembled simultaneously.*/4242if (reassmManipParams.maxNumFramesInProcess4243> (reassmManipParams.maxNumFramesInProcess * maxSetNumber / 2))4244RETURN_ERROR(4245MAJOR,4246E_INVALID_VALUE,4247("maxNumFramesInProcess has to be less than (maximun set number * number of ways / 2)"));42484249/* Saves user's reassembly manipulation parameters */4250p_Manip->reassmParams.capwap.relativeSchemeId =4251reassmManipParams.relativeSchemeId;4252p_Manip->reassmParams.capwap.numOfFramesPerHashEntry =4253reassmManipParams.numOfFramesPerHashEntry;4254p_Manip->reassmParams.capwap.maxRessembledsSize =4255reassmManipParams.maxReassembledFrameLength;4256p_Manip->reassmParams.maxNumFramesInProcess =4257reassmManipParams.maxNumFramesInProcess;4258p_Manip->reassmParams.timeOutMode = reassmManipParams.timeOutMode;4259p_Manip->reassmParams.fqidForTimeOutFrames =4260reassmManipParams.fqidForTimeOutFrames;4261p_Manip->reassmParams.timeoutThresholdForReassmProcess =4262reassmManipParams.timeoutThresholdForReassmProcess;4263p_Manip->reassmParams.dataMemId = reassmManipParams.dataMemId;4264p_Manip->reassmParams.dataLiodnOffset = reassmManipParams.dataLiodnOffset;42654266/* Creates and initializes the Reassembly common parameter table */4267CreateReassCommonTable(p_Manip);42684269res = SetCapwapReassmManip(p_Manip);4270if (res != E_OK)4271return res;42724273return E_OK;4274}42754276static t_Error CapwapFragmentation(t_FmPcdManipFragCapwapParams *p_ManipParams,4277t_FmPcdManip *p_Manip)4278{4279t_FmPcd *p_FmPcd;4280t_AdOfTypeContLookup *p_Ad;4281uint32_t pcAndOffsetsReg = 0, ccAdBaseReg = 0, gmaskReg = 0;4282uint32_t tmpReg32 = 0, tmpRegNia = 0;42834284SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);4285SANITY_CHECK_RETURN_ERROR(p_ManipParams->sizeForFragmentation != 0xFFFF,4286E_INVALID_VALUE);4287p_FmPcd = p_Manip->h_FmPcd;4288SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);42894290/* Allocation of fragmentation Action Descriptor */4291p_Manip->fragParams.p_Frag = (t_AdOfTypeContLookup *)FM_MURAM_AllocMem(4292p_FmPcd->h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE,4293FM_PCD_CC_AD_TABLE_ALIGN);4294if (!p_Manip->fragParams.p_Frag)4295RETURN_ERROR(MAJOR, E_NO_MEMORY,4296("MURAM alloc for Fragmentation table descriptor"));4297MemSet8(p_Manip->fragParams.p_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);42984299/* Prepare the third Ad register (pcAndOffsets)- OperationCode */4300pcAndOffsetsReg = (uint32_t)HMAN_OC_CAPWAP_FRAGMENTATION;43014302/* Prepare the first Ad register (ccAdBase) - Don't frag action and Action descriptor type*/4303ccAdBaseReg = FM_PCD_AD_CONT_LOOKUP_TYPE;4304ccAdBaseReg |=4305(p_ManipParams->compressModeEn) ? FM_PCD_MANIP_CAPWAP_FRAG_COMPRESS_EN :43060;43074308/* Set Scatter/Gather BPid */4309if (p_ManipParams->sgBpidEn)4310{4311ccAdBaseReg |= FM_PCD_MANIP_CAPWAP_FRAG_SG_BDID_EN;4312pcAndOffsetsReg |= ((p_ManipParams->sgBpid4313<< FM_PCD_MANIP_CAPWAP_FRAG_SG_BDID_SHIFT)4314& FM_PCD_MANIP_CAPWAP_FRAG_SG_BDID_MASK);4315}43164317/* Prepare the first Ad register (gmask) - scratch buffer pool id and Pointer to fragment ID */4318gmaskReg = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr))4319- p_FmPcd->physicalMuramBase);4320gmaskReg |= (0xFF) << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;43214322/* Set all Ad registers */4323WRITE_UINT32(p_Manip->fragParams.p_Frag->pcAndOffsets, pcAndOffsetsReg);4324WRITE_UINT32(p_Manip->fragParams.p_Frag->ccAdBase, ccAdBaseReg);4325WRITE_UINT32(p_Manip->fragParams.p_Frag->gmask, gmaskReg);43264327/* Saves user's fragmentation manipulation parameters */4328p_Manip->frag = TRUE;4329p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;43304331p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;43324333tmpRegNia = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_Frag)4334- (p_FmPcd->physicalMuramBase));4335tmpReg32 = (uint32_t)p_Manip->sizeForFragmentation4336<< FM_PCD_MANIP_CAPWAP_FRAG_CHECK_MTU_SHIFT;43374338tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;4339tmpReg32 |= HMAN_OC_CAPWAP_FRAG_CHECK;43404341tmpRegNia |= FM_PCD_MANIP_CAPWAP_FRAG_CHECK_CNIA;43424343WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);4344WRITE_UINT32(p_Ad->ccAdBase, tmpRegNia);4345WRITE_UINT32(p_Ad->gmask, 0);4346/* Total frame counter - MUST be initialized to zero.*/43474348return E_OK;4349}43504351static t_Error UpdateInitCapwapFrag(t_Handle h_FmPcd, t_Handle h_PcdParams,4352t_Handle h_FmPort, t_FmPcdManip *p_Manip,4353t_Handle h_Ad, bool validate)4354{4355t_FmPortGetSetCcParams fmPortGetSetCcParams;4356t_Error err;43574358SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);4359SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION),4360E_INVALID_STATE);4361SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);4362SANITY_CHECK_RETURN_ERROR(h_FmPort, E_INVALID_HANDLE);43634364UNUSED(h_FmPcd);4365UNUSED(h_Ad);4366UNUSED(h_PcdParams);4367UNUSED(validate);4368UNUSED(p_Manip);43694370fmPortGetSetCcParams.setCcParams.type = 0;4371fmPortGetSetCcParams.getCcParams.type = MANIP_EXTRA_SPACE;4372if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams)) != E_OK)4373RETURN_ERROR(MAJOR, err, NO_MSG);43744375if (!fmPortGetSetCcParams.getCcParams.internalBufferOffset)4376DBG(WARNING, ("manipExtraSpace must be larger than '0'"));43774378return E_OK;4379}43804381static t_Error CapwapManip(t_FmPcdManipParams *p_ManipParams,4382t_FmPcdManip *p_Manip)4383{4384t_AdOfTypeContLookup *p_Ad;4385t_FmPcdManipSpecialOffloadCapwapParams *p_Params;4386t_Error err = E_OK;4387uint32_t tmpReg32 = 0;43884389SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);4390SANITY_CHECK_RETURN_ERROR(p_ManipParams, E_INVALID_HANDLE);43914392p_Params = &p_ManipParams->u.specialOffload.u.capwap;43934394p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;4395tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;4396tmpReg32 |= (p_Params->dtls) ? FM_PCD_MANIP_CAPWAP_DTLS : 0;4397/* TODO - add 'qosSrc' */4398WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);43994400tmpReg32 = HMAN_OC_CAPWAP_MANIP;4401if (p_ManipParams->h_NextManip)4402{4403WRITE_UINT32(4404p_Ad->matchTblPtr,4405(uint32_t)(XX_VirtToPhys(((t_FmPcdManip *)p_ManipParams->h_NextManip)->h_Ad)- (((t_FmPcd *)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4);44064407tmpReg32 |= FM_PCD_MANIP_CAPWAP_NADEN;4408}44094410WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);44114412return err;4413}4414#endif /* (DPAA_VERSION >= 11) */44154416static t_Handle ManipOrStatsSetNode(t_Handle h_FmPcd, t_Handle *p_Params,4417bool stats)4418{4419t_FmPcdManip *p_Manip;4420t_Error err;4421t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;44224423p_Manip = (t_FmPcdManip*)XX_Malloc(sizeof(t_FmPcdManip));4424if (!p_Manip)4425{4426REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));4427return NULL;4428}4429memset(p_Manip, 0, sizeof(t_FmPcdManip));44304431p_Manip->type = ((t_FmPcdManipParams *)p_Params)->type;4432memcpy((uint8_t*)&p_Manip->manipParams, p_Params,4433sizeof(p_Manip->manipParams));44344435if (!stats)4436err = CheckManipParamsAndSetType(p_Manip,4437(t_FmPcdManipParams *)p_Params);4438#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4439else4440err = CheckStatsParamsAndSetType(p_Manip, (t_FmPcdStatsParams *)p_Params);4441#else /* not (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4442else4443{4444REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Statistics node!"));4445XX_Free(p_Manip);4446return NULL;4447}4448#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4449if (err)4450{4451REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Invalid header manipulation type"));4452XX_Free(p_Manip);4453return NULL;4454}44554456if ((p_Manip->opcode != HMAN_OC_IP_REASSEMBLY) && (p_Manip->opcode != HMAN_OC_CAPWAP_REASSEMBLY))4457{4458/* In Case of reassembly manipulation the reassembly action descriptor will4459be defines later on */4460if (p_Manip->muramAllocate)4461{4462p_Manip->h_Ad = (t_Handle)FM_MURAM_AllocMem(4463p_FmPcd->h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE,4464FM_PCD_CC_AD_TABLE_ALIGN);4465if (!p_Manip->h_Ad)4466{4467REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Manipulation action descriptor"));4468ReleaseManipHandler(p_Manip, p_FmPcd);4469XX_Free(p_Manip);4470return NULL;4471}44724473MemSet8(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);4474}4475else4476{4477p_Manip->h_Ad = (t_Handle)XX_Malloc(4478FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));4479if (!p_Manip->h_Ad)4480{4481REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of Manipulation action descriptor"));4482ReleaseManipHandler(p_Manip, p_FmPcd);4483XX_Free(p_Manip);4484return NULL;4485}44864487memset(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));4488}4489}44904491p_Manip->h_FmPcd = h_FmPcd;44924493return p_Manip;4494}44954496static void UpdateAdPtrOfNodesWhichPointsOnCrntMdfManip(4497t_FmPcdManip *p_CrntMdfManip, t_List *h_NodesLst)4498{4499t_CcNodeInformation *p_CcNodeInformation;4500t_FmPcdCcNode *p_NodePtrOnCurrentMdfManip = NULL;4501t_List *p_Pos;4502int i = 0;4503t_Handle p_AdTablePtOnCrntCurrentMdfNode/*, p_AdTableNewModified*/;4504t_CcNodeInformation ccNodeInfo;45054506NCSW_LIST_FOR_EACH(p_Pos, &p_CrntMdfManip->nodesLst)4507{4508p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);4509p_NodePtrOnCurrentMdfManip =4510(t_FmPcdCcNode *)p_CcNodeInformation->h_CcNode;45114512ASSERT_COND(p_NodePtrOnCurrentMdfManip);45134514/* Search in the previous node which exact index points on this current modified node for getting AD */4515for (i = 0; i < p_NodePtrOnCurrentMdfManip->numOfKeys + 1; i++)4516{4517if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].nextEngineParams.nextEngine4518== e_FM_PCD_CC)4519{4520if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].nextEngineParams.h_Manip4521== (t_Handle)p_CrntMdfManip)4522{4523if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].p_StatsObj)4524p_AdTablePtOnCrntCurrentMdfNode =4525p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].p_StatsObj->h_StatsAd;4526else4527p_AdTablePtOnCrntCurrentMdfNode =4528PTR_MOVE(p_NodePtrOnCurrentMdfManip->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE);45294530memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));4531ccNodeInfo.h_CcNode = p_AdTablePtOnCrntCurrentMdfNode;4532EnqueueNodeInfoToRelevantLst(h_NodesLst, &ccNodeInfo, NULL);4533}4534}4535}45364537ASSERT_COND(i != p_NodePtrOnCurrentMdfManip->numOfKeys);4538}4539}45404541static void BuildHmtd(uint8_t *p_Dest, uint8_t *p_Src, uint8_t *p_Hmcd,4542t_FmPcd *p_FmPcd)4543{4544t_Error err;45454546/* Copy the HMTD */4547MemCpy8(p_Dest, (uint8_t*)p_Src, 16);4548/* Replace the HMCT table pointer */4549WRITE_UINT32(4550((t_Hmtd *)p_Dest)->hmcdBasePtr,4551(uint32_t)(XX_VirtToPhys(p_Hmcd) - ((t_FmPcd*)p_FmPcd)->physicalMuramBase));4552/* Call Host Command to replace HMTD by a new HMTD */4553err = FmHcPcdCcDoDynamicChange(4554p_FmPcd->h_Hc,4555(uint32_t)(XX_VirtToPhys(p_Src) - p_FmPcd->physicalMuramBase),4556(uint32_t)(XX_VirtToPhys(p_Dest) - p_FmPcd->physicalMuramBase));4557if (err)4558REPORT_ERROR(MINOR, err, ("Failed in dynamic manip change, continued to the rest of the owners."));4559}45604561static t_Error FmPcdManipInitUpdate(t_Handle h_FmPcd, t_Handle h_PcdParams,4562t_Handle h_FmPort, t_Handle h_Manip,4563t_Handle h_Ad, bool validate, int level,4564t_Handle h_FmTree)4565{4566t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;4567t_Error err = E_OK;45684569SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);45704571UNUSED(level);4572UNUSED(h_FmTree);45734574switch (p_Manip->opcode)4575{4576#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4577case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):4578err = UpdateInitMvIntFrameHeaderFromFrameToBufferPrefix(h_FmPort,4579p_Manip,4580h_Ad,4581validate);4582break;4583case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):4584if (!p_Manip->h_Frag)4585break;4586case (HMAN_OC_CAPWAP_FRAGMENTATION):4587err = UpdateInitCapwapFragmentation(h_FmPort, p_Manip, h_Ad, validate, h_FmTree);4588break;4589case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):4590if (p_Manip->h_Frag)4591err = UpdateInitCapwapReasm(h_FmPcd, h_FmPort, p_Manip, h_Ad, validate);4592break;4593case (HMAN_OC_CAPWAP_INDEXED_STATS):4594err = UpdateIndxStats(h_FmPcd, h_FmPort, p_Manip);4595break;4596#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4597case (HMAN_OC_IP_REASSEMBLY):4598err = UpdateInitReasm(h_FmPcd, h_PcdParams, h_FmPort, p_Manip, h_Ad,4599validate);4600break;4601case (HMAN_OC_IP_FRAGMENTATION):4602err = UpdateInitIpFrag(h_FmPcd, h_PcdParams, h_FmPort, p_Manip,4603h_Ad, validate);4604break;4605#if (DPAA_VERSION >= 11)4606case (HMAN_OC_CAPWAP_FRAGMENTATION):4607err = UpdateInitCapwapFrag(h_FmPcd, h_PcdParams, h_FmPort, p_Manip,4608h_Ad, validate);4609break;4610case (HMAN_OC_CAPWAP_REASSEMBLY):4611err = UpdateInitReasm(h_FmPcd, h_PcdParams, h_FmPort, p_Manip, h_Ad,4612validate);4613break;4614#endif /* (DPAA_VERSION >= 11) */4615default:4616return E_OK;4617}46184619return err;4620}46214622static t_Error FmPcdManipModifyUpdate(t_Handle h_Manip, t_Handle h_Ad,4623bool validate, int level,4624t_Handle h_FmTree)4625{46264627t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;4628t_Error err = E_OK;46294630UNUSED(level);46314632switch (p_Manip->opcode)4633{4634#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4635case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):4636RETURN_ERROR(4637MAJOR,4638E_INVALID_STATE,4639("modify node with this type of manipulation is not suppported"));4640case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):46414642if (p_Manip->h_Frag)4643{4644if (!(p_Manip->shadowUpdateParams & NUM_OF_TASKS)4645&& !(p_Manip->shadowUpdateParams & OFFSET_OF_DATA)4646&& !(p_Manip->shadowUpdateParams & OFFSET_OF_PR))4647RETURN_ERROR(4648MAJOR,4649E_INVALID_STATE,4650("modify node with this type of manipulation requires manipulation be updated previously in SetPcd function"));4651}4652break;4653case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):4654if (p_Manip->h_Frag)4655err = UpdateModifyCapwapFragmenation(p_Manip, h_Ad, validate, h_FmTree);4656break;4657#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4658default:4659return E_OK;4660}46614662return err;4663}46644665/*****************************************************************************/4666/* Inter-module API routines */4667/*****************************************************************************/46684669t_Error FmPcdManipUpdate(t_Handle h_FmPcd, t_Handle h_PcdParams,4670t_Handle h_FmPort, t_Handle h_Manip, t_Handle h_Ad,4671bool validate, int level, t_Handle h_FmTree,4672bool modify)4673{4674t_Error err;46754676if (!modify)4677err = FmPcdManipInitUpdate(h_FmPcd, h_PcdParams, h_FmPort, h_Manip,4678h_Ad, validate, level, h_FmTree);4679else4680err = FmPcdManipModifyUpdate(h_Manip, h_Ad, validate, level, h_FmTree);46814682return err;4683}46844685void FmPcdManipUpdateOwner(t_Handle h_Manip, bool add)4686{46874688uint32_t intFlags;46894690intFlags = XX_LockIntrSpinlock(((t_FmPcdManip *)h_Manip)->h_Spinlock);4691if (add)4692((t_FmPcdManip *)h_Manip)->owner++;4693else4694{4695ASSERT_COND(((t_FmPcdManip *)h_Manip)->owner);4696((t_FmPcdManip *)h_Manip)->owner--;4697}4698XX_UnlockIntrSpinlock(((t_FmPcdManip *)h_Manip)->h_Spinlock, intFlags);4699}47004701t_List *FmPcdManipGetNodeLstPointedOnThisManip(t_Handle h_Manip)4702{4703ASSERT_COND(h_Manip);4704return &((t_FmPcdManip *)h_Manip)->nodesLst;4705}47064707t_List *FmPcdManipGetSpinlock(t_Handle h_Manip)4708{4709ASSERT_COND(h_Manip);4710return ((t_FmPcdManip *)h_Manip)->h_Spinlock;4711}47124713t_Error FmPcdManipCheckParamsForCcNextEngine(4714t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,4715uint32_t *requiredAction)4716{4717t_FmPcdManip *p_Manip;4718#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4719t_Error err = E_OK;4720#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))*/4721bool pointFromCc = TRUE;47224723SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);4724SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams->h_Manip,4725E_NULL_POINTER);47264727p_Manip = (t_FmPcdManip *)(p_FmPcdCcNextEngineParams->h_Manip);4728*requiredAction = 0;47294730while (p_Manip)4731{4732switch (p_Manip->opcode)4733{4734#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4735case (HMAN_OC_CAPWAP_INDEXED_STATS):4736if (p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)4737RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE"));4738if (p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)4739p_Manip->cnia = TRUE;4740case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):4741*requiredAction = UPDATE_NIA_ENQ_WITHOUT_DMA;4742case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):4743p_Manip->ownerTmp++;4744break;4745case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):4746if ((p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)4747&& !p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)4748RETURN_ERROR(4749MAJOR,4750E_INVALID_STATE,4751("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE with fqidForCtrlFlow FALSE"));4752p_Manip->ownerTmp++;4753break;4754case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):4755if ((p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_CC)4756&& (FmPcdCcGetParseCode(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode)4757!= CC_PC_GENERIC_IC_HASH_INDEXED))4758RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation next engine has to be CC and action = e_FM_PCD_ACTION_INDEXED_LOOKUP"));4759err = UpdateManipIc(p_FmPcdCcNextEngineParams->h_Manip,4760FmPcdCcGetOffset(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode));4761if (err)4762RETURN_ERROR(MAJOR, err, NO_MSG);4763*requiredAction = UPDATE_NIA_ENQ_WITHOUT_DMA;4764break;4765#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4766case (HMAN_OC_IP_FRAGMENTATION):4767case (HMAN_OC_IP_REASSEMBLY):4768#if (DPAA_VERSION >= 11)4769case (HMAN_OC_CAPWAP_REASSEMBLY):4770case (HMAN_OC_CAPWAP_FRAGMENTATION):4771#endif /* (DPAA_VERSION >= 11) */4772if (p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)4773RETURN_ERROR(4774MAJOR,4775E_INVALID_STATE,4776("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE"));4777p_Manip->ownerTmp++;4778break;4779case (HMAN_OC_IPSEC_MANIP):4780#if (DPAA_VERSION >= 11)4781case (HMAN_OC_CAPWAP_MANIP):4782#endif /* (DPAA_VERSION >= 11) */4783p_Manip->ownerTmp++;4784break;4785case (HMAN_OC):4786if ((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC)4787&& MANIP_IS_CASCADED(p_Manip))4788RETURN_ERROR(4789MINOR,4790E_INVALID_STATE,4791("Can't have a cascaded manipulation when and Next Engine is CC"));4792if (!MANIP_IS_FIRST(p_Manip) && pointFromCc)4793RETURN_ERROR(4794MAJOR,4795E_INVALID_STATE,4796("h_Manip is already used and may not be shared (no sharing of non-head manip nodes)"));4797break;4798default:4799RETURN_ERROR(4800MAJOR, E_INVALID_STATE,4801("invalid type of header manipulation for this state"));4802}4803p_Manip = p_Manip->h_NextManip;4804pointFromCc = FALSE;4805}4806return E_OK;4807}480848094810t_Error FmPcdManipCheckParamsWithCcNodeParams(t_Handle h_Manip,4811t_Handle h_FmPcdCcNode)4812{4813t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;4814t_Error err = E_OK;48154816SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);4817SANITY_CHECK_RETURN_ERROR(h_FmPcdCcNode, E_INVALID_HANDLE);48184819switch (p_Manip->opcode)4820{4821#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4822case (HMAN_OC_CAPWAP_INDEXED_STATS):4823if (p_Manip->ownerTmp != FmPcdCcGetNumOfKeys(h_FmPcdCcNode))4824RETURN_ERROR(4825MAJOR,4826E_INVALID_VALUE,4827("The manipulation of the type statistics flowId if exist has to be pointed by all numOfKeys"));4828break;4829case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):4830if (p_Manip->h_Frag)4831{4832if (p_Manip->ownerTmp != FmPcdCcGetNumOfKeys(h_FmPcdCcNode))4833RETURN_ERROR(4834MAJOR,4835E_INVALID_VALUE,4836("The manipulation of the type remove DTLS if exist has to be pointed by all numOfKeys"));4837err = UpdateManipIc(h_Manip, FmPcdCcGetOffset(h_FmPcdCcNode));4838if (err)4839RETURN_ERROR(MAJOR, err, NO_MSG);4840}4841break;4842#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4843default:4844break;4845}48464847return err;4848}48494850void FmPcdManipUpdateAdResultForCc(4851t_Handle h_Manip, t_FmPcdCcNextEngineParams *p_CcNextEngineParams,4852t_Handle p_Ad, t_Handle *p_AdNewPtr)4853{4854t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;48554856/* This routine creates a Manip AD and can return in "p_AdNewPtr"4857* either the new descriptor or NULL if it writes the Manip AD into p_AD (into the match table) */48584859ASSERT_COND(p_Manip);4860ASSERT_COND(p_CcNextEngineParams);4861ASSERT_COND(p_Ad);4862ASSERT_COND(p_AdNewPtr);48634864FmPcdManipUpdateOwner(h_Manip, TRUE);48654866/* According to "type", either build & initialize a new AD (p_AdNew) or initialize4867* p_Ad ( the AD in the match table) and set p_AdNew = NULL. */4868switch (p_Manip->opcode)4869{4870#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4871case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):4872case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):4873case (HMAN_OC_CAPWAP_INDEXED_STATS):4874*p_AdNewPtr = p_Manip->h_Ad;4875break;4876case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):4877case (HMAN_OC_CAPWAP_FRAGMENTATION):4878WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->fqid,4879((t_AdOfTypeResult *)(p_Manip->h_Ad))->fqid);4880WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->plcrProfile,4881((t_AdOfTypeResult *)(p_Manip->h_Ad))->plcrProfile);4882WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->nia,4883((t_AdOfTypeResult *)(p_Manip->h_Ad))->nia);4884*p_AdNewPtr = NULL;4885break;4886#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4887case (HMAN_OC_IPSEC_MANIP):4888#if (DPAA_VERSION >= 11)4889case (HMAN_OC_CAPWAP_MANIP):4890#endif /* (DPAA_VERSION >= 11) */4891*p_AdNewPtr = p_Manip->h_Ad;4892break;4893case (HMAN_OC_IP_FRAGMENTATION):4894#if (DPAA_VERSION >= 11)4895case (HMAN_OC_CAPWAP_FRAGMENTATION):4896#endif /* (DPAA_VERSION >= 11) */4897if ((p_CcNextEngineParams->nextEngine == e_FM_PCD_DONE)4898&& (!p_CcNextEngineParams->params.enqueueParams.overrideFqid))4899{4900memcpy((uint8_t *)p_Ad, (uint8_t *)p_Manip->h_Ad,4901sizeof(t_AdOfTypeContLookup));4902#if (DPAA_VERSION >= 11)4903WRITE_UINT32(4904((t_AdOfTypeContLookup *)p_Ad)->ccAdBase,4905GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase) & ~FM_PCD_MANIP_IP_CNIA);4906#endif /* (DPAA_VERSION >= 11) */4907*p_AdNewPtr = NULL;4908}4909else4910*p_AdNewPtr = p_Manip->h_Ad;4911break;4912case (HMAN_OC_IP_REASSEMBLY):4913if (FmPcdManipIpReassmIsIpv6Hdr(p_Manip))4914{4915if (!p_Manip->reassmParams.ip.ipv6Assigned)4916{4917*p_AdNewPtr = p_Manip->reassmParams.ip.h_Ipv6Ad;4918p_Manip->reassmParams.ip.ipv6Assigned = TRUE;4919FmPcdManipUpdateOwner(h_Manip, FALSE);4920}4921else4922{4923*p_AdNewPtr = p_Manip->reassmParams.ip.h_Ipv4Ad;4924p_Manip->reassmParams.ip.ipv6Assigned = FALSE;4925}4926}4927else4928*p_AdNewPtr = p_Manip->reassmParams.ip.h_Ipv4Ad;4929memcpy((uint8_t *)p_Ad, (uint8_t *)*p_AdNewPtr,4930sizeof(t_AdOfTypeContLookup));4931*p_AdNewPtr = NULL;4932break;4933#if (DPAA_VERSION >= 11)4934case (HMAN_OC_CAPWAP_REASSEMBLY):4935*p_AdNewPtr = p_Manip->reassmParams.capwap.h_Ad;4936memcpy((uint8_t *)p_Ad, (uint8_t *)*p_AdNewPtr,4937sizeof(t_AdOfTypeContLookup));4938*p_AdNewPtr = NULL;4939break;4940#endif /* (DPAA_VERSION >= 11) */4941case (HMAN_OC):4942/* Allocate and initialize HMTD */4943*p_AdNewPtr = p_Manip->h_Ad;4944break;4945default:4946break;4947}4948}49494950void FmPcdManipUpdateAdContLookupForCc(t_Handle h_Manip, t_Handle p_Ad,4951t_Handle *p_AdNewPtr,4952uint32_t adTableOffset)4953{4954t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;49554956/* This routine creates a Manip AD and can return in "p_AdNewPtr"4957* either the new descriptor or NULL if it writes the Manip AD into p_AD (into the match table) */4958ASSERT_COND(p_Manip);49594960FmPcdManipUpdateOwner(h_Manip, TRUE);49614962switch (p_Manip->opcode)4963{4964#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))4965case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):4966WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase,4967((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->ccAdBase);4968WRITE_UINT32(4969((t_AdOfTypeContLookup *)p_Ad)->matchTblPtr,4970((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->matchTblPtr);4971WRITE_UINT32(4972((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets,4973((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->pcAndOffsets);4974WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->gmask,4975((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->gmask);4976WRITE_UINT32(4977((t_AdOfTypeContLookup *)p_Ad)->ccAdBase,4978(GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase) | adTableOffset));4979*p_AdNewPtr = NULL;4980break;4981#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */4982case (HMAN_OC):4983/* Initialize HMTD within the match table*/4984MemSet8(p_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);4985/* copy the existing HMTD *//* ask Alla - memcpy??? */4986memcpy((uint8_t*)p_Ad, p_Manip->h_Ad, sizeof(t_Hmtd));4987/* update NADEN to be "1"*/4988WRITE_UINT16(4989((t_Hmtd *)p_Ad)->cfg,4990(uint16_t)(GET_UINT16(((t_Hmtd *)p_Ad)->cfg) | HMTD_CFG_NEXT_AD_EN));4991/* update next action descriptor */4992WRITE_UINT16(((t_Hmtd *)p_Ad)->nextAdIdx,4993(uint16_t)(adTableOffset >> 4));4994/* mark that Manip's HMTD is not used */4995*p_AdNewPtr = NULL;4996break;49974998default:4999break;5000}5001}50025003t_Error FmPcdManipBuildIpReassmScheme(t_FmPcd *p_FmPcd, t_Handle h_NetEnv,5004t_Handle h_CcTree, t_Handle h_Manip,5005bool isIpv4, uint8_t groupId)5006{5007t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;5008t_FmPcdKgSchemeParams *p_SchemeParams = NULL;5009t_Handle h_Scheme;50105011ASSERT_COND(p_FmPcd);5012ASSERT_COND(h_NetEnv);5013ASSERT_COND(p_Manip);50145015/* scheme was already build, no need to check for IPv6 */5016if (p_Manip->reassmParams.ip.h_Ipv4Scheme)5017return E_OK;50185019if (isIpv4) {5020h_Scheme = FmPcdKgGetSchemeHandle(p_FmPcd, p_Manip->reassmParams.ip.relativeSchemeId[0]);5021if (h_Scheme) {5022/* scheme was found */5023p_Manip->reassmParams.ip.h_Ipv4Scheme = h_Scheme;5024return E_OK;5025}5026} else {5027h_Scheme = FmPcdKgGetSchemeHandle(p_FmPcd, p_Manip->reassmParams.ip.relativeSchemeId[1]);5028if (h_Scheme) {5029/* scheme was found */5030p_Manip->reassmParams.ip.h_Ipv6Scheme = h_Scheme;5031return E_OK;5032}5033}50345035p_SchemeParams = XX_Malloc(sizeof(t_FmPcdKgSchemeParams));5036if (!p_SchemeParams)5037RETURN_ERROR(MAJOR, E_NO_MEMORY,5038("Memory allocation failed for scheme"));50395040/* Configures the IPv4 or IPv6 scheme*/5041memset(p_SchemeParams, 0, sizeof(t_FmPcdKgSchemeParams));5042p_SchemeParams->netEnvParams.h_NetEnv = h_NetEnv;5043p_SchemeParams->id.relativeSchemeId = (uint8_t)(5044(isIpv4 == TRUE) ? p_Manip->reassmParams.ip.relativeSchemeId[0] :5045p_Manip->reassmParams.ip.relativeSchemeId[1]);5046p_SchemeParams->schemeCounter.update = TRUE;5047#if (DPAA_VERSION >= 11)5048p_SchemeParams->alwaysDirect = TRUE;5049p_SchemeParams->bypassFqidGeneration = TRUE;5050#else5051p_SchemeParams->keyExtractAndHashParams.hashDistributionNumOfFqids = 1;5052p_SchemeParams->baseFqid = 0xFFFFFF; /*TODO- baseFqid*/5053#endif /* (DPAA_VERSION >= 11) */50545055setIpReassmSchemeParams(p_FmPcd, p_SchemeParams, h_CcTree, isIpv4, groupId);50565057/* Sets the new scheme */5058if (isIpv4)5059p_Manip->reassmParams.ip.h_Ipv4Scheme = FM_PCD_KgSchemeSet(5060p_FmPcd, p_SchemeParams);5061else5062p_Manip->reassmParams.ip.h_Ipv6Scheme = FM_PCD_KgSchemeSet(5063p_FmPcd, p_SchemeParams);50645065XX_Free(p_SchemeParams);50665067return E_OK;5068}50695070t_Error FmPcdManipDeleteIpReassmSchemes(t_Handle h_Manip)5071{5072t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;50735074ASSERT_COND(p_Manip);50755076if ((p_Manip->reassmParams.ip.h_Ipv4Scheme) &&5077!FmPcdKgIsSchemeHasOwners(p_Manip->reassmParams.ip.h_Ipv4Scheme))5078FM_PCD_KgSchemeDelete(p_Manip->reassmParams.ip.h_Ipv4Scheme);50795080if ((p_Manip->reassmParams.ip.h_Ipv6Scheme) &&5081!FmPcdKgIsSchemeHasOwners(p_Manip->reassmParams.ip.h_Ipv6Scheme))5082FM_PCD_KgSchemeDelete(p_Manip->reassmParams.ip.h_Ipv6Scheme);50835084return E_OK;5085}50865087bool FmPcdManipIpReassmIsIpv6Hdr(t_Handle h_Manip)5088{5089t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;50905091ASSERT_COND(p_Manip);50925093return (p_Manip->reassmParams.hdr == HEADER_TYPE_IPv6);5094}50955096t_Error FmPcdManipBuildCapwapReassmScheme(t_FmPcd *p_FmPcd, t_Handle h_NetEnv,5097t_Handle h_CcTree, t_Handle h_Manip,5098uint8_t groupId)5099{5100t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;5101t_FmPcdKgSchemeParams *p_SchemeParams = NULL;51025103ASSERT_COND(p_FmPcd);5104ASSERT_COND(h_NetEnv);5105ASSERT_COND(p_Manip);51065107/* scheme was already build, no need to check for IPv6 */5108if (p_Manip->reassmParams.capwap.h_Scheme)5109return E_OK;51105111p_SchemeParams = XX_Malloc(sizeof(t_FmPcdKgSchemeParams));5112if (!p_SchemeParams)5113RETURN_ERROR(MAJOR, E_NO_MEMORY,5114("Memory allocation failed for scheme"));51155116memset(p_SchemeParams, 0, sizeof(t_FmPcdKgSchemeParams));5117p_SchemeParams->netEnvParams.h_NetEnv = h_NetEnv;5118p_SchemeParams->id.relativeSchemeId =5119(uint8_t)p_Manip->reassmParams.capwap.relativeSchemeId;5120p_SchemeParams->schemeCounter.update = TRUE;5121p_SchemeParams->bypassFqidGeneration = TRUE;51225123setCapwapReassmSchemeParams(p_FmPcd, p_SchemeParams, h_CcTree, groupId);51245125p_Manip->reassmParams.capwap.h_Scheme = FM_PCD_KgSchemeSet(p_FmPcd,5126p_SchemeParams);51275128XX_Free(p_SchemeParams);51295130return E_OK;5131}51325133t_Error FmPcdManipDeleteCapwapReassmSchemes(t_Handle h_Manip)5134{5135t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;51365137ASSERT_COND(p_Manip);51385139if (p_Manip->reassmParams.capwap.h_Scheme)5140FM_PCD_KgSchemeDelete(p_Manip->reassmParams.capwap.h_Scheme);51415142return E_OK;5143}51445145#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))5146t_Handle FmPcdManipApplSpecificBuild(void)5147{5148t_FmPcdManip *p_Manip;51495150p_Manip = (t_FmPcdManip*)XX_Malloc(sizeof(t_FmPcdManip));5151if (!p_Manip)5152{5153REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));5154return NULL;5155}5156memset(p_Manip, 0, sizeof(t_FmPcdManip));51575158p_Manip->opcode = HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX;5159p_Manip->muramAllocate = FALSE;51605161p_Manip->h_Ad = (t_Handle)XX_Malloc(FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));5162if (!p_Manip->h_Ad)5163{5164REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of Manipulation action descriptor"));5165XX_Free(p_Manip);5166return NULL;5167}51685169memset(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));51705171/*treatFdStatusFieldsAsErrors = TRUE hardcoded - assumption its always come after CAAM*/5172/*Application specific = type of flowId index, move internal frame header from data to IC,5173SEC errors check*/5174if (MvIntFrameHeaderFromFrameToBufferPrefix(p_Manip, TRUE)!= E_OK)5175{5176XX_Free(p_Manip->h_Ad);5177XX_Free(p_Manip);5178return NULL;5179}5180return p_Manip;5181}51825183bool FmPcdManipIsCapwapApplSpecific(t_Handle h_Manip)5184{5185t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;5186ASSERT_COND(h_Manip);51875188return (bool)((p_Manip->opcode == HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST) ? TRUE : FALSE);5189}5190#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */5191/*********************** End of inter-module routines ************************/51925193/****************************************/5194/* API Init unit functions */5195/****************************************/51965197t_Handle FM_PCD_ManipNodeSet(t_Handle h_FmPcd,5198t_FmPcdManipParams *p_ManipParams)5199{5200t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;5201t_FmPcdManip *p_Manip;5202t_Error err;52035204SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);5205SANITY_CHECK_RETURN_VALUE(p_ManipParams, E_INVALID_HANDLE, NULL);52065207p_Manip = ManipOrStatsSetNode(h_FmPcd, (t_Handle)p_ManipParams, FALSE);5208if (!p_Manip)5209return NULL;52105211if (((p_Manip->opcode == HMAN_OC_IP_REASSEMBLY)5212|| (p_Manip->opcode == HMAN_OC_IP_FRAGMENTATION)5213|| (p_Manip->opcode == HMAN_OC)5214|| (p_Manip->opcode == HMAN_OC_IPSEC_MANIP)5215#if (DPAA_VERSION >= 11)5216|| (p_Manip->opcode == HMAN_OC_CAPWAP_MANIP)5217|| (p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION)5218|| (p_Manip->opcode == HMAN_OC_CAPWAP_REASSEMBLY)5219#endif /* (DPAA_VERSION >= 11) */5220) && (!FmPcdIsAdvancedOffloadSupported(p_FmPcd)))5221{5222REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Advanced-offload must be enabled"));5223XX_Free(p_Manip);5224return NULL;5225}5226p_Manip->h_Spinlock = XX_InitSpinlock();5227if (!p_Manip->h_Spinlock)5228{5229REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));5230ReleaseManipHandler(p_Manip, p_FmPcd);5231XX_Free(p_Manip);5232return NULL;5233}INIT_LIST(&p_Manip->nodesLst);52345235switch (p_Manip->opcode)5236{5237case (HMAN_OC_IP_REASSEMBLY):5238/* IpReassembly */5239err = IpReassembly(&p_ManipParams->u.reassem, p_Manip);5240break;5241case (HMAN_OC_IP_FRAGMENTATION):5242/* IpFragmentation */5243err = IpFragmentation(&p_ManipParams->u.frag.u.ipFrag, p_Manip);5244if (err)5245break;5246err = IPManip(p_Manip);5247break;5248case (HMAN_OC_IPSEC_MANIP):5249err = IPSecManip(p_ManipParams, p_Manip);5250break;5251#if (DPAA_VERSION >= 11)5252case (HMAN_OC_CAPWAP_REASSEMBLY):5253/* CapwapReassembly */5254err = CapwapReassembly(&p_ManipParams->u.reassem, p_Manip);5255break;5256case (HMAN_OC_CAPWAP_FRAGMENTATION):5257/* CapwapFragmentation */5258err = CapwapFragmentation(&p_ManipParams->u.frag.u.capwapFrag,5259p_Manip);5260break;5261case (HMAN_OC_CAPWAP_MANIP):5262err = CapwapManip(p_ManipParams, p_Manip);5263break;5264#endif /* (DPAA_VERSION >= 11) */5265#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))5266case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):5267/* HmanType1 */5268err = RmvHdrTillSpecLocNOrInsrtIntFrmHdr(&p_ManipParams->u.hdr.rmvParams, p_Manip);5269break;5270case (HMAN_OC_CAPWAP_FRAGMENTATION):5271err = CapwapFragmentation(&p_ManipParams->fragOrReasmParams.u.capwapFragParams,5272p_Manip,5273p_FmPcd,5274p_ManipParams->fragOrReasmParams.sgBpid);5275if (err)5276{5277REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));5278ReleaseManipHandler(p_Manip, p_FmPcd);5279XX_Free(p_Manip);5280return NULL;5281}5282if (p_Manip->insrt)5283p_Manip->opcode = HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;5284case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):5285/* HmanType2 + if user asked only for fragmentation still need to allocate HmanType2 */5286err = InsrtHdrByTempl(&p_ManipParams->u.hdr.insrtParams, p_Manip, p_FmPcd);5287break;5288case (HMAN_OC_CAPWAP_REASSEMBLY):5289err = CapwapReassembly(&p_ManipParams->fragOrReasmParams.u.capwapReasmParams,5290p_Manip,5291p_FmPcd,5292p_ManipParams->fragOrReasmParams.sgBpid);5293if (err)5294{5295REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));5296ReleaseManipHandler(p_Manip, p_FmPcd);5297XX_Free(p_Manip);5298return NULL;5299}5300if (p_Manip->rmv)5301p_Manip->opcode = HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;5302case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):5303/*CAPWAP decapsulation + if user asked only for reassembly still need to allocate CAPWAP decapsulation*/5304err = CapwapRmvDtlsHdr(p_FmPcd, p_Manip);5305break;5306case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):5307/*Application Specific type 1*/5308err = MvIntFrameHeaderFromFrameToBufferPrefix(p_Manip, TRUE);5309break;5310#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */5311case (HMAN_OC):5312/* New Manip */5313err = CreateManipActionNew(p_Manip, p_ManipParams);5314break;5315default:5316REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));5317ReleaseManipHandler(p_Manip, p_FmPcd);5318XX_Free(p_Manip);5319return NULL;5320}53215322if (err)5323{5324REPORT_ERROR(MAJOR, err, NO_MSG);5325ReleaseManipHandler(p_Manip, p_FmPcd);5326XX_Free(p_Manip);5327return NULL;5328}53295330if (p_ManipParams->h_NextManip)5331{5332/* in the check routine we've verified that h_NextManip has no owners5333* and that only supported types are allowed. */5334p_Manip->h_NextManip = p_ManipParams->h_NextManip;5335/* save a "prev" pointer in h_NextManip */5336MANIP_SET_PREV(p_Manip->h_NextManip, p_Manip);5337FmPcdManipUpdateOwner(p_Manip->h_NextManip, TRUE);5338}53395340return p_Manip;5341}53425343t_Error FM_PCD_ManipNodeReplace(t_Handle h_Manip,5344t_FmPcdManipParams *p_ManipParams)5345{5346t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip, *p_FirstManip;5347t_FmPcd *p_FmPcd = (t_FmPcd *)(p_Manip->h_FmPcd);5348t_Error err;5349uint8_t *p_WholeHmct = NULL, *p_ShadowHmct = NULL, *p_Hmtd = NULL;5350t_List lstOfNodeshichPointsOnCrntMdfManip, *p_Pos;5351t_CcNodeInformation *p_CcNodeInfo;5352SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);5353SANITY_CHECK_RETURN_ERROR(p_ManipParams, E_INVALID_HANDLE);53545355INIT_LIST(&lstOfNodeshichPointsOnCrntMdfManip);53565357if ((p_ManipParams->type != e_FM_PCD_MANIP_HDR)5358|| (p_Manip->type != e_FM_PCD_MANIP_HDR))5359RETURN_ERROR(5360MINOR,5361E_NOT_SUPPORTED,5362("FM_PCD_ManipNodeReplace Functionality supported only for Header Manipulation."));53635364ASSERT_COND(p_Manip->opcode == HMAN_OC);5365ASSERT_COND(p_Manip->manipParams.h_NextManip == p_Manip->h_NextManip);5366memcpy((uint8_t*)&p_Manip->manipParams, p_ManipParams,5367sizeof(p_Manip->manipParams));5368p_Manip->manipParams.h_NextManip = p_Manip->h_NextManip;53695370/* The replacement of the HdrManip depends on the node type.*/5371/*5372* (1) If this is an independent node, all its owners should be updated.5373*5374* (2) If it is the head of a cascaded chain (it does not have a "prev" but5375* it has a "next" and it has a "cascaded" indication), the next5376* node remains unchanged, and the behavior is as in (1).5377*5378* (3) If it is not the head, but a part of a cascaded chain, in can be5379* also replaced as a regular node with just one owner.5380*5381* (4) If it is a part of a chain implemented as a unified table, the5382* whole table is replaced and the owners of the head node must be updated.5383*5384*/5385/* lock shadow */5386if (!p_FmPcd->p_CcShadow)5387RETURN_ERROR(MAJOR, E_NO_MEMORY, ("CC Shadow not allocated"));53885389if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))5390return ERROR_CODE(E_BUSY);53915392/* this routine creates a new manip action in the CC Shadow. */5393err = CreateManipActionShadow(p_Manip, p_ManipParams);5394if (err)5395RETURN_ERROR(MINOR, err, NO_MSG);53965397/* If the owners list is empty (these are NOT the "owners" counter, but pointers from CC)5398* replace only HMTD and no lcok is required. Otherwise5399* lock the whole PCD5400* In case 4 MANIP_IS_UNIFIED_NON_FIRST(p_Manip) - Use the head node instead. */5401if (!FmPcdLockTryLockAll(p_FmPcd))5402{5403DBG(TRACE, ("FmPcdLockTryLockAll failed"));5404return ERROR_CODE(E_BUSY);5405}54065407p_ShadowHmct = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow, 16);54085409p_FirstManip = (t_FmPcdManip*)GetManipInfo(p_Manip,5410e_MANIP_HANDLER_TABLE_OWNER);5411ASSERT_COND(p_FirstManip);54125413if (!NCSW_LIST_IsEmpty(&p_FirstManip->nodesLst))5414UpdateAdPtrOfNodesWhichPointsOnCrntMdfManip(5415p_FirstManip, &lstOfNodeshichPointsOnCrntMdfManip);54165417p_Hmtd = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMTD);5418ASSERT_COND(p_Hmtd);5419BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_Hmtd, p_ShadowHmct,5420((t_FmPcd*)(p_Manip->h_FmPcd)));54215422NCSW_LIST_FOR_EACH(p_Pos, &lstOfNodeshichPointsOnCrntMdfManip)5423{5424p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);5425BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_CcNodeInfo->h_CcNode,5426p_ShadowHmct, ((t_FmPcd*)(p_Manip->h_FmPcd)));5427}54285429p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);5430ASSERT_COND(p_WholeHmct);54315432/* re-build the HMCT n the original location */5433err = CreateManipActionBackToOrig(p_Manip, p_ManipParams);5434if (err)5435{5436RELEASE_LOCK(p_FmPcd->shadowLock);5437RETURN_ERROR(MINOR, err, NO_MSG);5438}54395440p_Hmtd = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMTD);5441ASSERT_COND(p_Hmtd);5442BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_Hmtd, p_WholeHmct,5443((t_FmPcd*)p_Manip->h_FmPcd));54445445/* If NCSW_LIST > 0, create a list of p_Ad's that point to the HMCT. Join also t_HMTD to this list.5446* For each p_Hmct (from list+fixed):5447* call Host Command to replace HMTD by a new one */NCSW_LIST_FOR_EACH(p_Pos, &lstOfNodeshichPointsOnCrntMdfManip)5448{5449p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);5450BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_CcNodeInfo->h_CcNode,5451p_WholeHmct, ((t_FmPcd*)(p_Manip->h_FmPcd)));5452}545354545455ReleaseLst(&lstOfNodeshichPointsOnCrntMdfManip);54565457FmPcdLockUnlockAll(p_FmPcd);54585459/* unlock shadow */5460RELEASE_LOCK(p_FmPcd->shadowLock);54615462return E_OK;5463}54645465t_Error FM_PCD_ManipNodeDelete(t_Handle h_ManipNode)5466{5467t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_ManipNode;54685469SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);54705471if (p_Manip->owner)5472RETURN_ERROR(5473MAJOR,5474E_INVALID_STATE,5475("This manipulation node not be removed because this node is occupied, first - unbind this node "));54765477if (p_Manip->h_NextManip)5478{5479MANIP_SET_PREV(p_Manip->h_NextManip, NULL);5480FmPcdManipUpdateOwner(p_Manip->h_NextManip, FALSE);5481}54825483if (p_Manip->p_Hmct5484&& (MANIP_IS_UNIFIED_FIRST(p_Manip) || !MANIP_IS_UNIFIED(p_Manip)))5485FM_MURAM_FreeMem(((t_FmPcd *)p_Manip->h_FmPcd)->h_FmMuram,5486p_Manip->p_Hmct);54875488if (p_Manip->h_Spinlock)5489{5490XX_FreeSpinlock(p_Manip->h_Spinlock);5491p_Manip->h_Spinlock = NULL;5492}54935494ReleaseManipHandler(p_Manip, p_Manip->h_FmPcd);54955496XX_Free(h_ManipNode);54975498return E_OK;5499}55005501t_Error FM_PCD_ManipGetStatistics(t_Handle h_ManipNode,5502t_FmPcdManipStats *p_FmPcdManipStats)5503{5504t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_ManipNode;55055506SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);5507SANITY_CHECK_RETURN_ERROR(p_FmPcdManipStats, E_NULL_POINTER);55085509switch (p_Manip->opcode)5510{5511case (HMAN_OC_IP_REASSEMBLY):5512return IpReassemblyStats(p_Manip,5513&p_FmPcdManipStats->u.reassem.u.ipReassem);5514case (HMAN_OC_IP_FRAGMENTATION):5515return IpFragmentationStats(p_Manip,5516&p_FmPcdManipStats->u.frag.u.ipFrag);5517#if (DPAA_VERSION >= 11)5518case (HMAN_OC_CAPWAP_REASSEMBLY):5519return CapwapReassemblyStats(5520p_Manip, &p_FmPcdManipStats->u.reassem.u.capwapReassem);5521case (HMAN_OC_CAPWAP_FRAGMENTATION):5522return CapwapFragmentationStats(5523p_Manip, &p_FmPcdManipStats->u.frag.u.capwapFrag);5524#endif /* (DPAA_VERSION >= 11) */5525default:5526RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,5527("no statistics to this type of manip"));5528}55295530return E_OK;5531}55325533#if (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10))5534t_Handle FM_PCD_StatisticsSetNode(t_Handle h_FmPcd, t_FmPcdStatsParams *p_StatsParams)5535{5536t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;5537t_FmPcdManip *p_Manip;5538t_Error err;55395540SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE,NULL);5541SANITY_CHECK_RETURN_VALUE(p_StatsParams,E_INVALID_HANDLE,NULL);55425543p_Manip = ManipOrStatsSetNode(h_FmPcd, (t_Handle)p_StatsParams, TRUE);5544if (!p_Manip)5545return NULL;55465547switch (p_Manip->opcode)5548{5549case (HMAN_OC_CAPWAP_INDEXED_STATS):5550/* Indexed statistics */5551err = IndxStats(p_StatsParams, p_Manip, p_FmPcd);5552break;5553default:5554REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED Statistics type"));5555ReleaseManipHandler(p_Manip, p_FmPcd);5556XX_Free(p_Manip);5557return NULL;5558}55595560if (err)5561{5562REPORT_ERROR(MAJOR, err, NO_MSG);5563ReleaseManipHandler(p_Manip, p_FmPcd);5564XX_Free(p_Manip);5565return NULL;5566}55675568return p_Manip;5569}5570#endif /* (defined(FM_CAPWAP_SUPPORT) && (DPAA_VERSION == 10)) */557155725573