packet header processing cache added

This commit is contained in:
Wiesner András 2023-02-28 12:18:43 +01:00
parent 57d41a823f
commit 30af96f4c9
3 changed files with 30 additions and 11 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;
}