diff --git a/packet_registry.c b/packet_registry.c index e76398b..0be4e11 100644 --- a/packet_registry.c +++ b/packet_registry.c @@ -33,11 +33,15 @@ void packreg_add_class(PcktRegistry * packReg, const PcktClassDesc * classDesc) } // append new item - packReg->ents[packReg->entCnt] = *classDesc; + PcktClassDesc * newEntry = packReg->ents + packReg->entCnt; + *newEntry = *classDesc; + newEntry->cacheSize = 0; // initialize cache + newEntry->cacheArea = NULL; + packReg->entCnt++; } -const PcktClassDesc * packreg_get_by_class(const PcktRegistry * packReg, uint16_t ownClass, uint16_t containerClass) { +PcktClassDesc * packreg_get_by_class(const PcktRegistry * packReg, uint16_t ownClass, uint16_t containerClass) { uint32_t i; for (i = 0; i < packReg->entCnt; i++) { const PcktClassDesc * cdesc = packReg->ents + i; diff --git a/packet_registry.h b/packet_registry.h index c337587..391040b 100644 --- a/packet_registry.h +++ b/packet_registry.h @@ -78,6 +78,9 @@ typedef struct PcktClassDesc_ { PcktProcFn procFun; ///< Pckt processing function PcktHeaderInsertFn hdrInsFn; ///< Header insert function uint16_t propertySize; ///< Size of property structure + // ------------------- + uint16_t cacheSize; ///< Allocated cache size + uint8_t * cacheArea; ///< Allocated area for packet header (used as cache area when processing headers) } PcktClassDesc; /** @@ -110,7 +113,7 @@ void packreg_add_class(PcktRegistry *packReg, const PcktClassDesc *classDesc); * @param containerClass container packet's class (if 0, then search by container class is not considered) * @return pointer to descriptor on success or NULL on failure */ -const PcktClassDesc *packreg_get_by_class(const PcktRegistry *packReg, uint16_t ownClass, uint16_t containerClass); +PcktClassDesc *packreg_get_by_class(const PcktRegistry *packReg, uint16_t ownClass, uint16_t containerClass); diff --git a/packet_sieve.c b/packet_sieve.c index 882d771..2cac3d1 100644 --- a/packet_sieve.c +++ b/packet_sieve.c @@ -39,14 +39,26 @@ void packsieve_input(PcktSieve *sieve, const RawPckt *rawPckt) { do { // get packet descriptor - const PcktClassDesc *cdesc = packreg_get_by_class(E.pcktReg, ownClass, containerClass); + PcktClassDesc *cdesc = packreg_get_by_class(E.pcktReg, ownClass, containerClass); if (cdesc == NULL) { break; } // allocate property object uint32_t hdrSize = ETH_PCKT_HEADER_ELEMENT_HEAD_SIZE + cdesc->propertySize; - PcktHeaderElement *header = (PcktHeaderElement *) dynmem_alloc(hdrSize); + // look for possible former allocated cache area + PcktHeaderElement *header = NULL; + if (cdesc->cacheSize <= hdrSize) { // allocate cache area + if (cdesc->cacheArea != NULL) { + dynmem_free(cdesc->cacheArea); + } + cdesc->cacheArea = (uint8_t *)dynmem_alloc(hdrSize); + ASSERT_NULL(cdesc->cacheArea); + cdesc->cacheSize = hdrSize; + } + + header = (PcktHeaderElement *)cdesc->cacheArea; + memset(header, 0, hdrSize); header->props.ownPacketClass = ownClass; header->props.propSize = cdesc->propertySize; @@ -147,12 +159,12 @@ void packsieve_input(PcktSieve *sieve, const RawPckt *rawPckt) { // release header chain blocks header_release:; // empty line, solely for label placement - PcktHeaderElement *iter = outermostHeader; - while (iter != NULL) { - PcktHeaderElement *next = iter->next; - dynmem_free(iter); - iter = next; - } +// PcktHeaderElement *iter = outermostHeader; +// while (iter != NULL) { +// PcktHeaderElement *next = iter->next; +// dynmem_free(iter); +// iter = next; +// } if (procRet == PROC_FN_RET_REPRST) { // if a restart was requested, then run everything again! goto restart; }