diff options
Diffstat (limited to 'main/firewall.c')
| -rw-r--r-- | main/firewall.c | 17 |
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 | ||
| 29 | static 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 | |||
| 29 | void firewall_enable_nat(void) | 43 | void 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 | ||