ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
metrics.c File Reference

Ring consensus metrics collection and wire protocol implementation. More...

Go to the source code of this file.

Data Structures

struct  consensus_metrics_collection
 Metrics collection structure for participant quality measurements. More...
 

Macros

#define DEFAULT_BANDWIDTH_KBPS   50000
 
#define DEFAULT_RTT_MS   25
 
#define NUM_STUN_PROBES   10
 

Typedefs

typedef struct consensus_metrics_collection consensus_metrics_collection_t
 Metrics collection structure for participant quality measurements.
 

Functions

 __attribute__ ((unused))
 
asciichat_error_t consensus_metrics_measure (const uint8_t my_id[16], participant_metrics_t *out_metrics)
 
asciichat_error_t consensus_metrics_to_wire (const participant_metrics_t *metrics, participant_metrics_t *out_wire)
 
asciichat_error_t consensus_metrics_from_wire (const participant_metrics_t *wire_metrics, participant_metrics_t *out_metrics)
 
asciichat_error_t consensus_metrics_collection_create (consensus_metrics_collection_t **out_collection)
 
asciichat_error_t consensus_metrics_collection_add (consensus_metrics_collection_t *collection, const participant_metrics_t *metrics)
 
asciichat_error_t consensus_metrics_collection_get (const consensus_metrics_collection_t *collection, const participant_metrics_t **out_metrics, int *out_count)
 
void consensus_metrics_collection_destroy (consensus_metrics_collection_t *collection)
 

Detailed Description

Ring consensus metrics collection and wire protocol implementation.

Definition in file metrics.c.

Macro Definition Documentation

◆ DEFAULT_BANDWIDTH_KBPS

#define DEFAULT_BANDWIDTH_KBPS   50000

Default bandwidth estimate (50 Mbps = 50000 Kbps)

Definition at line 29 of file metrics.c.

◆ DEFAULT_RTT_MS

#define DEFAULT_RTT_MS   25

Default RTT estimate (25 milliseconds)

Definition at line 34 of file metrics.c.

◆ NUM_STUN_PROBES

#define NUM_STUN_PROBES   10

Number of STUN probes to send for success rate measurement

Definition at line 39 of file metrics.c.

Typedef Documentation

◆ consensus_metrics_collection_t

Metrics collection structure for participant quality measurements.

Dynamic array storing network quality metrics for all participants in a consensus session.

Function Documentation

◆ __attribute__()

__attribute__ ( (unused)  )

Convert NAT type to tier (0=best, 4=worst)

Mapping:

  • Open/LAN (no NAT) = 0
  • Full cone NAT = 1
  • Address-restricted NAT = 2
  • Port-restricted NAT = 3
  • Symmetric NAT = 4

Note: This function is reserved for future use when NAT detection is integrated. For now, we use a hardcoded default tier.

Definition at line 72 of file metrics.c.

72 {
73 // ACIP_NAT_TYPE_* enum values:
74 // 0 = Open (OPEN = no NAT, essentially LAN)
75 // 1 = Full cone (best NAT)
76 // 2 = Address-restricted
77 // 3 = Port-restricted
78 // 4 = Symmetric (worst NAT)
79
80 if (nat_type < 0 || nat_type > 4) {
81 return 4; // Default to worst case
82 }
83 return (uint8_t)nat_type;
84}

◆ consensus_metrics_collection_add()

asciichat_error_t consensus_metrics_collection_add ( consensus_metrics_collection_t collection,
const participant_metrics_t *  metrics 
)

Definition at line 179 of file metrics.c.

180 {
181 if (!collection || !metrics) {
182 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters to collection_add");
183 }
184
185 // Resize if needed
186 if (collection->count >= collection->capacity) {
187 int new_capacity = collection->capacity * 2;
188 participant_metrics_t *new_metrics =
189 SAFE_MALLOC(new_capacity * sizeof(participant_metrics_t), participant_metrics_t *);
190
191 if (!new_metrics) {
192 return SET_ERRNO(ERROR_MEMORY, "Failed to allocate metrics array");
193 }
194
195 // Copy existing metrics
196 if (collection->count > 0 && collection->metrics) {
197 memcpy(new_metrics, collection->metrics, collection->count * sizeof(participant_metrics_t));
198 SAFE_FREE(collection->metrics);
199 }
200
201 collection->metrics = new_metrics;
202 collection->capacity = new_capacity;
203 }
204
205 // Add new metrics
206 if (!collection->metrics) {
207 return SET_ERRNO(ERROR_MEMORY, "Collection metrics array is NULL");
208 }
209
210 memcpy(&collection->metrics[collection->count], metrics, sizeof(*metrics));
211 collection->count++;
212
213 return ASCIICHAT_OK;
214}
participant_metrics_t * metrics
Array of participant metrics.
Definition metrics.c:21
int count
Number of participants.
Definition metrics.c:22
int capacity
Allocated capacity.
Definition metrics.c:23

References consensus_metrics_collection::capacity, consensus_metrics_collection::count, and consensus_metrics_collection::metrics.

◆ consensus_metrics_collection_create()

asciichat_error_t consensus_metrics_collection_create ( consensus_metrics_collection_t **  out_collection)

Definition at line 163 of file metrics.c.

163 {
164 if (!out_collection) {
165 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid output parameter");
166 }
167
168 consensus_metrics_collection_t *collection = SAFE_MALLOC(sizeof(*collection), consensus_metrics_collection_t *);
169 memset(collection, 0, sizeof(*collection));
170
171 collection->capacity = 10; // Start with capacity for 10 participants
172 collection->metrics = SAFE_MALLOC(collection->capacity * sizeof(participant_metrics_t), participant_metrics_t *);
173 collection->count = 0;
174
175 *out_collection = collection;
176 return ASCIICHAT_OK;
177}
Metrics collection structure for participant quality measurements.
Definition metrics.c:20

References consensus_metrics_collection::capacity, consensus_metrics_collection::count, and consensus_metrics_collection::metrics.

◆ consensus_metrics_collection_destroy()

void consensus_metrics_collection_destroy ( consensus_metrics_collection_t collection)

Definition at line 228 of file metrics.c.

228 {
229 if (!collection) {
230 return;
231 }
232
233 if (collection->metrics) {
234 SAFE_FREE(collection->metrics);
235 }
236
237 SAFE_FREE(collection);
238}

References consensus_metrics_collection::metrics.

◆ consensus_metrics_collection_get()

asciichat_error_t consensus_metrics_collection_get ( const consensus_metrics_collection_t collection,
const participant_metrics_t **  out_metrics,
int *  out_count 
)

Definition at line 216 of file metrics.c.

217 {
218 if (!collection || !out_metrics || !out_count) {
219 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters to collection_get");
220 }
221
222 *out_metrics = collection->metrics;
223 *out_count = collection->count;
224
225 return ASCIICHAT_OK;
226}

References consensus_metrics_collection::count, and consensus_metrics_collection::metrics.

◆ consensus_metrics_from_wire()

asciichat_error_t consensus_metrics_from_wire ( const participant_metrics_t *  wire_metrics,
participant_metrics_t *  out_metrics 
)

Definition at line 144 of file metrics.c.

145 {
146 if (!wire_metrics || !out_metrics) {
147 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters to consensus_metrics_from_wire");
148 }
149
150 // Copy entire structure first
151 memcpy(out_metrics, wire_metrics, sizeof(*out_metrics));
152
153 // Convert multi-byte fields from network byte order
154 out_metrics->upload_kbps = endian_unpack_u32(wire_metrics->upload_kbps);
155 out_metrics->rtt_ns = endian_unpack_u32(wire_metrics->rtt_ns);
156 out_metrics->public_port = endian_unpack_u16(wire_metrics->public_port);
157 out_metrics->measurement_time_ns = endian_unpack_u64(wire_metrics->measurement_time_ns);
158 out_metrics->measurement_window_ns = endian_unpack_u64(wire_metrics->measurement_window_ns);
159
160 return ASCIICHAT_OK;
161}

◆ consensus_metrics_measure()

asciichat_error_t consensus_metrics_measure ( const uint8_t  my_id[16],
participant_metrics_t *  out_metrics 
)

Definition at line 86 of file metrics.c.

86 {
87 if (!my_id || !out_metrics) {
88 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters to consensus_metrics_measure");
89 }
90
91 // Initialize metrics structure
92 memset(out_metrics, 0, sizeof(*out_metrics));
93
94 // Copy participant ID
95 memcpy(out_metrics->participant_id, my_id, 16);
96
97 // NAT tier: Default to 1 (Public IP, no NAT needed)
98 // TODO: In production, query NAT detection module
99 out_metrics->nat_tier = 1;
100
101 // Upload bandwidth: Default 50 Mbps
102 out_metrics->upload_kbps = DEFAULT_BANDWIDTH_KBPS;
103
104 // RTT: Default 25ms (25,000,000 nanoseconds)
105 out_metrics->rtt_ns = DEFAULT_RTT_MS * NS_PER_MS;
106
107 // STUN probe success rate: Measure by sending probes
108 out_metrics->stun_probe_success_pct = measure_stun_probe_success();
109
110 // Public address and port: Placeholder values
111 snprintf(out_metrics->public_address, sizeof(out_metrics->public_address), "127.0.0.1");
112 out_metrics->public_port = 27224;
113
114 // Connection type: Default to direct
115 out_metrics->connection_type = 0; // Direct connection
116
117 // Measurement time: Current time in nanoseconds
118 out_metrics->measurement_time_ns = time_get_realtime_ns();
119
120 // Measurement window: 1 second in nanoseconds
121 out_metrics->measurement_window_ns = 1 * NS_PER_SEC;
122
123 return ASCIICHAT_OK;
124}
#define DEFAULT_RTT_MS
Definition metrics.c:34
#define DEFAULT_BANDWIDTH_KBPS
Definition metrics.c:29
uint64_t time_get_realtime_ns(void)
Definition util/time.c:59

References DEFAULT_BANDWIDTH_KBPS, DEFAULT_RTT_MS, and time_get_realtime_ns().

◆ consensus_metrics_to_wire()

asciichat_error_t consensus_metrics_to_wire ( const participant_metrics_t *  metrics,
participant_metrics_t *  out_wire 
)

Definition at line 126 of file metrics.c.

126 {
127 if (!metrics || !out_wire) {
128 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters to consensus_metrics_to_wire");
129 }
130
131 // Copy entire structure first
132 memcpy(out_wire, metrics, sizeof(*out_wire));
133
134 // Convert multi-byte fields to network byte order
135 out_wire->upload_kbps = endian_pack_u32(metrics->upload_kbps);
136 out_wire->rtt_ns = endian_pack_u32(metrics->rtt_ns);
137 out_wire->public_port = endian_pack_u16(metrics->public_port);
138 out_wire->measurement_time_ns = endian_pack_u64(metrics->measurement_time_ns);
139 out_wire->measurement_window_ns = endian_pack_u64(metrics->measurement_window_ns);
140
141 return ASCIICHAT_OK;
142}