mirror of
https://github.com/subhobhai943/SUB-OS.git
synced 2026-10-25 16:52:29 +00:00
77 lines
2.6 KiB
C
77 lines
2.6 KiB
C
#include <net/filter.h>
|
|
#include <lib/string.h>
|
|
#include <kernel/printk.h>
|
|
|
|
static filter_rule_t rules_table[FILTER_MAX_RULES];
|
|
static uint32_t next_rule_id = 1;
|
|
|
|
void filter_init(void) {
|
|
memset(rules_table, 0, sizeof(rules_table));
|
|
next_rule_id = 1;
|
|
|
|
// Add default baseline rules
|
|
filter_add_rule(FILTER_HOOK_LOCAL_IN, 1, 0, FILTER_ACTION_ACCEPT, "Accept ICMP Ping");
|
|
filter_add_rule(FILTER_HOOK_LOCAL_IN, 6, 80, FILTER_ACTION_ACCEPT, "Allow HTTP Port 80");
|
|
filter_add_rule(FILTER_HOOK_LOCAL_IN, 17, 53, FILTER_ACTION_ACCEPT, "Allow DNS UDP 53");
|
|
|
|
printk(KERN_INFO "NETFILTER: Stateful Packet Inspection & Firewall Subsystem online\n");
|
|
}
|
|
|
|
int filter_add_rule(filter_hook_t hook, uint8_t proto, uint16_t dst_port, filter_action_t action, const char* comment) {
|
|
for (size_t i = 0; i < FILTER_MAX_RULES; i++) {
|
|
if (!rules_table[i].in_use) {
|
|
filter_rule_t* r = &rules_table[i];
|
|
r->id = next_rule_id++;
|
|
r->in_use = true;
|
|
r->hook = hook;
|
|
r->protocol = proto;
|
|
r->dst_port = dst_port;
|
|
r->action = action;
|
|
r->packet_count = 0;
|
|
r->byte_count = 0;
|
|
strncpy(r->comment, comment ? comment : "User Rule", sizeof(r->comment) - 1);
|
|
r->comment[sizeof(r->comment) - 1] = '\0';
|
|
return (int)r->id;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int filter_delete_rule(uint32_t rule_id) {
|
|
for (size_t i = 0; i < FILTER_MAX_RULES; i++) {
|
|
if (rules_table[i].in_use && rules_table[i].id == rule_id) {
|
|
rules_table[i].in_use = false;
|
|
return 0;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
filter_action_t filter_evaluate(filter_hook_t hook, uint8_t proto, uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port, size_t len) {
|
|
(void)src_ip; (void)dst_ip; (void)src_port;
|
|
for (size_t i = 0; i < FILTER_MAX_RULES; i++) {
|
|
if (rules_table[i].in_use && rules_table[i].hook == hook) {
|
|
if (rules_table[i].protocol != 0 && rules_table[i].protocol != proto) continue;
|
|
if (rules_table[i].dst_port != 0 && rules_table[i].dst_port != dst_port) continue;
|
|
|
|
rules_table[i].packet_count++;
|
|
rules_table[i].byte_count += len;
|
|
return rules_table[i].action;
|
|
}
|
|
}
|
|
return FILTER_ACTION_ACCEPT;
|
|
}
|
|
|
|
size_t filter_get_rule_count(void) {
|
|
size_t count = 0;
|
|
for (size_t i = 0; i < FILTER_MAX_RULES; i++) {
|
|
if (rules_table[i].in_use) count++;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
const filter_rule_t* filter_get_rule(size_t index) {
|
|
if (index >= FILTER_MAX_RULES || !rules_table[index].in_use) return NULL;
|
|
return &rules_table[index];
|
|
}
|