EtherLib/cbd_table.c
Wiesner András e4d27454cd - add tag to CBD
- DHCP state separated
- link change handler added
- timer mutex added
2023-10-15 12:17:37 +02:00

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