upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/main/firewall.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/firewall.c')
-rw-r--r--main/firewall.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/main/firewall.c b/main/firewall.c
index 9ef3be0..8087b54 100644
--- a/main/firewall.c
+++ b/main/firewall.c
@@ -26,6 +26,20 @@ esp_err_t firewall_init(esp_ip4_addr_t ap_ip)
26 return ESP_OK; 26 return ESP_OK;
27} 27}
28 28
29static void update_nat(void)
30{
31 bool should_enable = (s_client_count > 0);
32 if (should_enable && !s_nat_enabled) {
33 ip_napt_enable(s_ap_ip.addr, 1);
34 s_nat_enabled = true;
35 ESP_LOGI(TAG, "NAT enabled (client authenticated)");
36 } else if (!should_enable && s_nat_enabled) {
37 ip_napt_enable(s_ap_ip.addr, 0);
38 s_nat_enabled = false;
39 ESP_LOGI(TAG, "NAT disabled (no authenticated clients)");
40 }
41}
42
29void firewall_enable_nat(void) 43void firewall_enable_nat(void)
30{ 44{
31 if (s_nat_enabled) return; 45 if (s_nat_enabled) return;
@@ -54,6 +68,7 @@ void firewall_grant_access(uint32_t client_ip)
54 s_clients[s_client_count].ip = client_ip; 68 s_clients[s_client_count].ip = client_ip;
55 s_client_count++; 69 s_client_count++;
56 dns_server_set_client_authenticated(client_ip, true); 70 dns_server_set_client_authenticated(client_ip, true);
71 update_nat();
57 72
58 esp_ip4_addr_t ip_addr = { .addr = client_ip }; 73 esp_ip4_addr_t ip_addr = { .addr = client_ip };
59 ESP_LOGI(TAG, "Access granted to " IPSTR, IP2STR(&ip_addr)); 74 ESP_LOGI(TAG, "Access granted to " IPSTR, IP2STR(&ip_addr));
@@ -66,6 +81,7 @@ void firewall_revoke_access(uint32_t client_ip)
66 s_clients[i] = s_clients[s_client_count - 1]; 81 s_clients[i] = s_clients[s_client_count - 1];
67 s_client_count--; 82 s_client_count--;
68 dns_server_set_client_authenticated(client_ip, false); 83 dns_server_set_client_authenticated(client_ip, false);
84 update_nat();
69 esp_ip4_addr_t ip_addr = { .addr = client_ip }; 85 esp_ip4_addr_t ip_addr = { .addr = client_ip };
70 ESP_LOGI(TAG, "Access revoked for " IPSTR, IP2STR(&ip_addr)); 86 ESP_LOGI(TAG, "Access revoked for " IPSTR, IP2STR(&ip_addr));
71 return; 87 return;
@@ -79,6 +95,7 @@ void firewall_revoke_all(void)
79 dns_server_set_client_authenticated(s_clients[i].ip, false); 95 dns_server_set_client_authenticated(s_clients[i].ip, false);
80 } 96 }
81 s_client_count = 0; 97 s_client_count = 0;
98 update_nat();
82 ESP_LOGI(TAG, "All client access revoked"); 99 ESP_LOGI(TAG, "All client access revoked");
83} 100}
84 101