upleb.uk

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

summaryrefslogtreecommitdiff
path: root/main/session.c
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-05-17 04:50:07 +0530
committerYour Name <you@example.com>2026-05-17 04:50:07 +0530
commitedd125d0e3fe5fe7c0edf30c429723f3b0120c68 (patch)
tree5b1134ad7a6cfce7adeb46f5069e33b509ce9751 /main/session.c
parentcb4bd7d7c10cadcb43f82c09b13ffed744e541f7 (diff)
feat(phase6): bytes-based billing - dual metric support
- session_create_bytes() + session_add_bytes() for bytes-metric sessions - session_is_expired() dispatches on config metric (bytes vs milliseconds) - cashu_calculate_allotment() unified dispatcher for both metrics - tollgate_api discovery/usage/session_event use configured metric - config: metric field defaults to 'bytes', step_size_bytes=22020096 (21MB) - 14 new unit tests (148 total passing) - ASSERT_EQ_UINT64 macro added to test framework
Diffstat (limited to 'main/session.c')
-rw-r--r--main/session.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/main/session.c b/main/session.c
index 521b74a..4854163 100644
--- a/main/session.c
+++ b/main/session.c
@@ -1,6 +1,7 @@
1#include "session.h" 1#include "session.h"
2#include "firewall.h" 2#include "firewall.h"
3#include "dns_server.h" 3#include "dns_server.h"
4#include "config.h"
4#include "esp_log.h" 5#include "esp_log.h"
5#include "freertos/FreeRTOS.h" 6#include "freertos/FreeRTOS.h"
6#include "freertos/task.h" 7#include "freertos/task.h"
@@ -103,6 +104,29 @@ session_t *session_create(uint32_t client_ip, uint64_t allotment_ms,
103 return NULL; 104 return NULL;
104} 105}
105 106
107session_t *session_create_bytes(uint32_t client_ip, uint64_t allotment_bytes,
108 const char *spent_secrets[], int secret_count)
109{
110 session_t *s = session_create(client_ip, 0, spent_secrets, secret_count);
111 if (s) {
112 s->allotment_bytes = allotment_bytes;
113 s->bytes_consumed = 0;
114 s->allotment_ms = INT64_MAX;
115 esp_ip4_addr_t ip = { .addr = client_ip };
116 ESP_LOGI(TAG, "Bytes session created: " IPSTR " allotment=%llu bytes", IP2STR(&ip),
117 (unsigned long long)allotment_bytes);
118 }
119 return s;
120}
121
122void session_add_bytes(uint32_t client_ip, uint64_t bytes)
123{
124 session_t *s = session_find_by_ip(client_ip);
125 if (s && s->active) {
126 s->bytes_consumed += bytes;
127 }
128}
129
106session_t *session_find_by_ip(uint32_t client_ip) 130session_t *session_find_by_ip(uint32_t client_ip)
107{ 131{
108 for (int i = 0; i < SESSION_MAX_CLIENTS; i++) { 132 for (int i = 0; i < SESSION_MAX_CLIENTS; i++) {
@@ -136,6 +160,12 @@ void session_extend(session_t *session, uint64_t additional_ms)
136bool session_is_expired(const session_t *session) 160bool session_is_expired(const session_t *session)
137{ 161{
138 if (!session || !session->active) return true; 162 if (!session || !session->active) return true;
163
164 const tollgate_config_t *cfg = tollgate_config_get();
165 if (cfg && strcmp(cfg->metric, "bytes") == 0) {
166 return session->bytes_consumed >= session->allotment_bytes;
167 }
168
139 int64_t elapsed = get_time_ms() - session->start_time_ms; 169 int64_t elapsed = get_time_ms() - session->start_time_ms;
140 return elapsed >= (int64_t)session->allotment_ms; 170 return elapsed >= (int64_t)session->allotment_ms;
141} 171}