ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
metrics.h File Reference

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

Go to the source code of this file.

Data Structures

struct  __attribute__
 Network quality metrics for a single participant. More...

Functions

asciichat_error_t consensus_metrics_measure (const uint8_t my_id[SESSION_ID_SIZE], participant_metrics_t *out_metrics)
 Measure participant network quality metrics.
asciichat_error_t consensus_metrics_to_wire (const participant_metrics_t *metrics, participant_metrics_t *out_wire)
 Serialize metrics to wire format with network byte order.
asciichat_error_t consensus_metrics_from_wire (const participant_metrics_t *wire_metrics, participant_metrics_t *out_metrics)
 Deserialize metrics from wire format.
asciichat_error_t consensus_metrics_collection_create (consensus_metrics_collection_t **out_collection)
 Create empty metrics collection.
asciichat_error_t consensus_metrics_collection_add (consensus_metrics_collection_t *collection, const participant_metrics_t *metrics)
 Add metrics to collection.
asciichat_error_t consensus_metrics_collection_get (const consensus_metrics_collection_t *collection, const participant_metrics_t **out_metrics, int *out_count)
 Get all accumulated metrics.
void consensus_metrics_collection_destroy (consensus_metrics_collection_t *collection)
 Destroy metrics collection.

Detailed Description

Ring consensus metrics collection and wire protocol.

Handles measurement, serialization, and deserialization of network quality metrics for transmission around the consensus ring. Metrics include:

  • NAT tier classification (0=LAN, 1=Public, 2=UPnP, 3=STUN, 4=TURN)
  • Upload bandwidth (Kbps)
  • Round-trip time (milliseconds)
  • STUN probe success rate (0-100%)
  • Public address and port information

Wire format uses network byte order (big-endian) for all multi-byte values.

Definition in file metrics.h.

Function Documentation

◆ consensus_metrics_collection_add()

asciichat_error_t consensus_metrics_collection_add ( consensus_metrics_collection_t * collection,
const participant_metrics_t * metrics )

Add metrics to collection.

Accumulates metrics from a participant into the collection. Metrics are stored in dynamically-allocated array.

Parameters
collectionCollection to add to
metricsMetrics to add
Returns
ASCIICHAT_OK on success, error code on failure

Definition at line 95 of file metrics.c.

96 {
97 if (!collection || !metrics) {
98 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters to collection_add");
99 }
100
101 // Resize if needed
102 if (collection->count >= collection->capacity) {
103 int new_capacity = collection->capacity * 2;
104 participant_metrics_t *new_metrics =
105 SAFE_MALLOC(new_capacity * sizeof(participant_metrics_t), participant_metrics_t *);
106
107 if (!new_metrics) {
108 return SET_ERRNO(ERROR_MEMORY, "Failed to allocate metrics array");
109 }
110
111 // Copy existing metrics
112 if (collection->count > 0 && collection->metrics) {
113 memcpy(new_metrics, collection->metrics, collection->count * sizeof(participant_metrics_t));
114 SAFE_FREE(collection->metrics);
115 }
116
117 collection->metrics = new_metrics;
118 collection->capacity = new_capacity;
119 }
120
121 // Add new metrics
122 if (!collection->metrics) {
123 return SET_ERRNO(ERROR_MEMORY, "Collection metrics array is NULL");
124 }
125
126 memcpy(&collection->metrics[collection->count], metrics, sizeof(*metrics));
127 collection->count++;
128
129 return ASCIICHAT_OK;
130}
#define SET_ERRNO(code,...)
#define SAFE_FREE(ptr)
Definition common.h:377
#define SAFE_MALLOC(size, cast)
Definition common.h:265
@ ERROR_MEMORY
Definition error_codes.h:51
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
participant_metrics_t * metrics
Array of participant metrics.
Definition metrics.c:28
int count
Number of participants.
Definition metrics.c:29
int capacity
Allocated capacity.
Definition metrics.c:30

References ASCIICHAT_OK, consensus_metrics_collection::capacity, consensus_metrics_collection::count, ERROR_INVALID_PARAM, ERROR_MEMORY, consensus_metrics_collection::metrics, SAFE_FREE, SAFE_MALLOC, and SET_ERRNO.

◆ consensus_metrics_collection_create()

asciichat_error_t consensus_metrics_collection_create ( consensus_metrics_collection_t ** out_collection)

Create empty metrics collection.

Allocates a collection structure for accumulating metrics from multiple participants during a collection round.

Parameters
out_collectionOutput collection handle
Returns
ASCIICHAT_OK on success, error code on failure
Note
Must be freed with consensus_metrics_destroy()

Definition at line 79 of file metrics.c.

79 {
80 if (!out_collection) {
81 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid output parameter");
82 }
83
85 memset(collection, 0, sizeof(*collection));
86
87 collection->capacity = CONSENSUS_METRICS_INITIAL_CAPACITY; // Start with capacity for 10 participants
88 collection->metrics = SAFE_MALLOC(collection->capacity * sizeof(participant_metrics_t), participant_metrics_t *);
89 collection->count = 0;
90
91 *out_collection = collection;
92 return ASCIICHAT_OK;
93}
struct consensus_metrics_collection consensus_metrics_collection_t
Growable collection of participant-quality measurements. metrics, count, and capacity form the pointe...
#define CONSENSUS_METRICS_INITIAL_CAPACITY
Definition metrics.c:7

References ASCIICHAT_OK, consensus_metrics_collection::capacity, CONSENSUS_METRICS_INITIAL_CAPACITY, consensus_metrics_collection::count, ERROR_INVALID_PARAM, consensus_metrics_collection::metrics, SAFE_MALLOC, and SET_ERRNO.

◆ consensus_metrics_collection_destroy()

void consensus_metrics_collection_destroy ( consensus_metrics_collection_t * collection)

Destroy metrics collection.

Frees all allocated memory in the collection, including the metrics array.

Parameters
collectionCollection to destroy (can be NULL)

Definition at line 144 of file metrics.c.

144 {
145 if (!collection) {
146 return;
147 }
148
149 if (collection->metrics) {
150 SAFE_FREE(collection->metrics);
151 }
152
153 SAFE_FREE(collection);
154}

References consensus_metrics_collection::metrics, and SAFE_FREE.

◆ 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 )

Get all accumulated metrics.

Retrieves the accumulated metrics array from collection.

Parameters
collectionCollection to query
out_metricsPointer to receive metrics array (not copied, owned by collection)
out_countPointer to receive number of metrics
Returns
ASCIICHAT_OK on success, error code on failure
Note
out_metrics points to internal collection storage - do not modify or free
Valid only until collection is destroyed

Definition at line 132 of file metrics.c.

133 {
134 if (!collection || !out_metrics || !out_count) {
135 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters to collection_get");
136 }
137
138 *out_metrics = collection->metrics;
139 *out_count = collection->count;
140
141 return ASCIICHAT_OK;
142}

References ASCIICHAT_OK, consensus_metrics_collection::count, ERROR_INVALID_PARAM, consensus_metrics_collection::metrics, and SET_ERRNO.

◆ consensus_metrics_from_wire()

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

Deserialize metrics from wire format.

Converts network byte order values back to host byte order. Inverse operation of consensus_metrics_to_wire().

Parameters
wire_metricsInput metrics in network byte order
out_metricsOutput metrics in host byte order
Returns
ASCIICHAT_OK on success, error code on failure
Note
out_metrics must point to valid participant_metrics_t allocated by caller

Definition at line 60 of file metrics.c.

61 {
62 if (!wire_metrics || !out_metrics) {
63 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters");
64 }
65
66 // Copy entire structure first
67 memcpy(out_metrics, wire_metrics, sizeof(*out_metrics));
68
69 // Convert multi-byte fields from network byte order
70 out_metrics->upload_kbps = endian_unpack_u32(wire_metrics->upload_kbps);
71 out_metrics->rtt_ns = endian_unpack_u32(wire_metrics->rtt_ns);
72 out_metrics->public_port = endian_unpack_u16(wire_metrics->public_port);
73 out_metrics->measurement_time_ns = endian_unpack_u64(wire_metrics->measurement_time_ns);
74 out_metrics->measurement_window_ns = endian_unpack_u64(wire_metrics->measurement_window_ns);
75
76 return ASCIICHAT_OK;
77}

References ASCIICHAT_OK, ERROR_INVALID_PARAM, and SET_ERRNO.

◆ consensus_metrics_measure()

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

Measure participant network quality metrics.

Collects all metrics needed for host selection:

  • NAT tier from detected NAT type (0-4)
  • Session-supplied measured bandwidth
  • Matched-probe RTT when available
  • STUN probe success rate by sending 10 probes

Without a session provider this returns ERROR_INVALID_STATE with an empty observation. Missing data must not be scored as a favorable default.

Parameters
my_idParticipant UUID (16 bytes)
out_metricsOutput metrics structure (caller-allocated)
Returns
ASCIICHAT_OK on success, error code on failure
Note
out_metrics must point to valid participant_metrics_t allocated by caller
Measurement window and timestamp are set automatically

Definition at line 33 of file metrics.c.

33 {
34 if (!my_id || !out_metrics)
35 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid measurement parameters");
36 memset(out_metrics, 0, sizeof(*out_metrics));
37 memcpy(out_metrics->participant_id, my_id, SESSION_ID_SIZE);
38 out_metrics->nat_tier = 4;
39 return SET_ERRNO(ERROR_INVALID_STATE, "Network measurements require a session measurement provider");
40}
@ ERROR_INVALID_STATE
#define SESSION_ID_SIZE

References ERROR_INVALID_PARAM, ERROR_INVALID_STATE, SESSION_ID_SIZE, and SET_ERRNO.

◆ consensus_metrics_to_wire()

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

Serialize metrics to wire format with network byte order.

Converts host-order values to network byte order (big-endian) for transmission over the network. Multi-byte fields are converted:

Parameters
metricsInput metrics in host byte order
out_wireOutput metrics in network byte order
Returns
ASCIICHAT_OK on success, error code on failure
Note
out_wire must point to valid participant_metrics_t allocated by caller

Definition at line 42 of file metrics.c.

42 {
43 if (!metrics || !out_wire) {
44 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters");
45 }
46
47 // Copy entire structure first
48 memcpy(out_wire, metrics, sizeof(*out_wire));
49
50 // Convert multi-byte fields to network byte order
51 out_wire->upload_kbps = endian_pack_u32(metrics->upload_kbps);
52 out_wire->rtt_ns = endian_pack_u32(metrics->rtt_ns);
53 out_wire->public_port = endian_pack_u16(metrics->public_port);
54 out_wire->measurement_time_ns = endian_pack_u64(metrics->measurement_time_ns);
55 out_wire->measurement_window_ns = endian_pack_u64(metrics->measurement_window_ns);
56
57 return ASCIICHAT_OK;
58}

References ASCIICHAT_OK, ERROR_INVALID_PARAM, and SET_ERRNO.