// // 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; } 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"); }