set the prio
This commit is contained in:
parent
670f0e6a8f
commit
9d1a342b0c
34
macstorage.c
34
macstorage.c
|
@ -16,12 +16,33 @@ struct Entry
|
|||
{
|
||||
uint8_t mac[6];
|
||||
time_t timestamp;
|
||||
uint8_t prio;
|
||||
} storage[MAXENTRIES];
|
||||
|
||||
uint8_t usedPrio[MAXENTRIES];
|
||||
|
||||
size_t count = 0;
|
||||
|
||||
pthread_mutex_t mux;
|
||||
|
||||
uint8_t _getNextFreePrio()
|
||||
{
|
||||
for (size_t i=0; i<MAXENTRIES; i++)
|
||||
{
|
||||
if (usedPrio[i] == 0)
|
||||
{
|
||||
usedPrio[i] = 1;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 255;
|
||||
}
|
||||
|
||||
void _freePrio(uint8_t prio)
|
||||
{
|
||||
usedPrio[prio] = 0;
|
||||
}
|
||||
|
||||
void _addEntry(uint8_t mac[6])
|
||||
{
|
||||
for (size_t i=0; i<count; i++)
|
||||
|
@ -35,11 +56,13 @@ void _addEntry(uint8_t mac[6])
|
|||
|
||||
if (count != MAXENTRIES)
|
||||
{
|
||||
uint8_t prio = _getNextFreePrio();
|
||||
memcpy(storage[count].mac, mac, 6);
|
||||
storage[count].timestamp = time(NULL);
|
||||
storage[count].prio = prio;
|
||||
count++;
|
||||
|
||||
tc_allow_mac(mac);
|
||||
tc_allow_mac(mac, prio+1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -60,10 +83,12 @@ void _checkTimeout()
|
|||
{
|
||||
if (storage[i].timestamp < t)
|
||||
{
|
||||
tc_disallow_mac(storage[i].mac);
|
||||
tc_disallow_mac(storage[i].mac, storage[i].prio+1);
|
||||
_freePrio(storage[i].prio);
|
||||
count--;
|
||||
memcpy(storage[i].mac, storage[count].mac, 6);
|
||||
storage[i].timestamp = storage[count].timestamp;
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -80,6 +105,11 @@ void macStorage_run()
|
|||
{
|
||||
stop = 0;
|
||||
|
||||
for (size_t i=0; i<MAXENTRIES; i++)
|
||||
{
|
||||
usedPrio[i] = 0;
|
||||
}
|
||||
|
||||
while (!stop)
|
||||
{
|
||||
_checkTimeout();
|
||||
|
|
20
tc.c
20
tc.c
|
@ -52,32 +52,32 @@ void tc_block_all()
|
|||
system(cmd);
|
||||
}
|
||||
|
||||
void tc_allow_mac(const uint8_t mac[])
|
||||
void tc_allow_mac(const uint8_t mac[], uint8_t prio)
|
||||
{
|
||||
char cmd[2048];
|
||||
char mac32[9];
|
||||
char mac16[5];
|
||||
snprintf(mac32, 9, "%2x%2x%2x%2x", mac[0], mac[1], mac[2], mac[3]);
|
||||
snprintf(mac16, 5, "%2x%2x", mac[4], mac[5]);
|
||||
snprintf(cmd, 2048, "tc filter add dev %s protocol all parent ffff: prio 99 "
|
||||
snprintf(mac32, 9, "%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3]);
|
||||
snprintf(mac16, 5, "%02x%02x", mac[4], mac[5]);
|
||||
snprintf(cmd, 2048, "tc filter add dev %s protocol all parent ffff: prio %d "
|
||||
"basic match \"u32(u32 0x%s 0x%s at -8)\" "
|
||||
"and \"u32(u16 0x%s 0x%s at -4)\" flowid :1 action pass",
|
||||
g_interface, mac32, mac32, mac16, mac16);
|
||||
g_interface, prio, mac32, mac32, mac16, mac16);
|
||||
log_debug("CMD: %s\n", cmd);
|
||||
system(cmd);
|
||||
}
|
||||
|
||||
void tc_disallow_mac(const uint8_t mac[])
|
||||
void tc_disallow_mac(const uint8_t mac[], uint8_t prio)
|
||||
{
|
||||
char cmd[2048];
|
||||
char mac32[9];
|
||||
char mac16[5];
|
||||
snprintf(mac32, 9, "%2x%2x%2x%2x", mac[0], mac[1], mac[2], mac[3]);
|
||||
snprintf(mac16, 5, "%2x%2x", mac[4], mac[5]);
|
||||
snprintf(cmd, 2048, "tc filter delete dev %s protocol all parent ffff: prio 99 "
|
||||
snprintf(mac32, 9, "%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3]);
|
||||
snprintf(mac16, 5, "%02x%02x", mac[4], mac[5]);
|
||||
snprintf(cmd, 2048, "tc filter delete dev %s protocol all parent ffff: prio %d "
|
||||
"basic match \"u32(u32 0x%s 0x%s at -8)\" "
|
||||
"and \"u32(u16 0x%s 0x%s at -4)\" flowid :1 action pass",
|
||||
g_interface, mac32, mac32, mac16, mac16);
|
||||
g_interface, prio, mac32, mac32, mac16, mac16);
|
||||
log_debug("CMD: %s\n", cmd);
|
||||
system(cmd);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue