93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
//
|
|
// Created by epagris on 2023.01.30..
|
|
//
|
|
|
|
#include "cbd_table.h"
|
|
#include "dynmem.h"
|
|
#include "utils.h"
|
|
|
|
CbdTable *cbdt_new(uint8_t size) {
|
|
uint32_t allocSize = sizeof(CbdTable) + size * sizeof(ConnBlock);
|
|
CbdTable * cbdt = (CbdTable *) dynmem_alloc(allocSize);
|
|
memset(cbdt, 0, allocSize);
|
|
cbdt->maxEntries = size;
|
|
cbdt->level = 0;
|
|
return cbdt;
|
|
}
|
|
|
|
cbd cbdt_alloc_new(CbdTable *cbdt, const ConnBlock *connBlock) {
|
|
if (cbdt->level >= cbdt->maxEntries) {
|
|
return CBDT_ERR;
|
|
}
|
|
|
|
cbd i = 0;
|
|
while (cbdt->cbs[i].sieve != NULL) { // look for an empty slot
|
|
i++;
|
|
}
|
|
cbdt->cbs[i] = *connBlock; // store connblock
|
|
cbdt->level++; // increase allocation counter
|
|
|
|
return CBD_LOWEST_DESCRIPTOR + i; // return descriptor number
|
|
}
|
|
|
|
static bool cbdt_is_cbd_valid(CbdTable * cbdt, cbd d) {
|
|
cbd i = d - CBD_LOWEST_DESCRIPTOR;
|
|
return !((d < CBD_LOWEST_DESCRIPTOR) || ((i) >= cbdt->maxEntries) || (cbdt->cbs[i].sieve == NULL) || (cbdt->level == 0));
|
|
}
|
|
|
|
void cbdt_release(CbdTable *cbdt, cbd d) {
|
|
if (cbdt_is_cbd_valid(cbdt, d)) {
|
|
memset(cbdt->cbs + d - CBD_LOWEST_DESCRIPTOR, 0, sizeof(ConnBlock)); // clear connection block properties
|
|
cbdt->level--;
|
|
}
|
|
}
|
|
|
|
bool cbdt_get_connection_block(CbdTable *cbdt, cbd d, ConnBlock *connBlock) {
|
|
if (!cbdt_is_cbd_valid(cbdt, d)) {
|
|
return false;
|
|
}
|
|
*connBlock = cbdt->cbs[d - CBD_LOWEST_DESCRIPTOR];
|
|
return true;
|
|
}
|
|
|
|
bool cbdt_set_tag(CbdTable *cbdt, cbd d, PcktSieveLayerTag tag) {
|
|
ConnBlock connBlock;
|
|
if (cbdt_get_connection_block(cbdt, d, &connBlock)) {
|
|
connBlock.sieveLayer->tag = tag;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool cbdt_get_tag(CbdTable * cbdt, cbd d, PcktSieveLayerTag * tag) {
|
|
ConnBlock connBlock;
|
|
if (cbdt_get_connection_block(cbdt, d, &connBlock)) {
|
|
*tag = connBlock.sieveLayer->tag;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void cbdt_report(const CbdTable *cbdt) {
|
|
INFO("CBDT listing (%d/%d):\n---------------\n\n", cbdt->level, cbdt->maxEntries);
|
|
|
|
uint8_t cnt = 0;
|
|
while (cnt < cbdt->level) {
|
|
if (cbdt->cbs[cnt].sieve->intf != NULL) {
|
|
packsieve_layer_info(cbdt->cbs[cnt].sieve, cbdt->cbs[cnt].sieveLayer);
|
|
INFO("\n");
|
|
cnt++;
|
|
}
|
|
}
|
|
|
|
INFO("\n");
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|