You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

152 lines
4.4 KiB

/*
* etcpmon_client.h - ETCP Monitor Client Network Layer
*
* Handles TCP connection to utun control server
*/
#ifndef ETCPMON_CLIENT_H
#define ETCPMON_CLIENT_H
#include "etcpmon_protocol.h"
#include <winsock2.h>
#include <stdint.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Graph history size (samples) */
#define GRAPH_HISTORY_SIZE 860
/* Graph metrics types */
typedef enum {
GRAPH_METRIC_RTT_LAST = 0,
GRAPH_METRIC_RTT_AVG10,
GRAPH_METRIC_RTT_AVG100,
GRAPH_METRIC_JITTER,
GRAPH_METRIC_RETRANS,
GRAPH_METRIC_ACKS,
GRAPH_METRIC_INFLIGHT,
GRAPH_METRIC_BYTES_SENT,
GRAPH_METRIC_COUNT
} graph_metric_type_t;
/* Metrics history buffer */
struct metrics_history {
float values[GRAPH_METRIC_COUNT][GRAPH_HISTORY_SIZE];
int head;
int count;
uint32_t last_retrans;
uint32_t last_acks;
uint64_t last_bytes_sent;
};
/* Client state */
struct etcpmon_client {
SOCKET sock;
int connected;
int fully_connected;
/* Receive buffer */
uint8_t recv_buffer[ETCPMON_MAX_MSG_SIZE];
uint16_t recv_len;
/* Server address */
char server_addr[64];
uint16_t server_port;
/* Selected connection */
uint64_t selected_peer_id;
/* Connection info cache */
struct etcpmon_conn_info* conn_list;
uint8_t conn_count;
/* Latest metrics */
struct etcpmon_rsp_metrics* last_metrics;
struct etcpmon_link_metrics* last_links;
uint8_t last_links_count;
/* Log file */
FILE* log_file;
/* Metrics history for graph */
struct metrics_history history;
/* Callbacks */
void (*on_connected)(void* user_data);
void (*on_disconnected)(void* user_data);
void (*on_conn_list)(struct etcpmon_conn_info* list, uint8_t count, void* user_data);
void (*on_metrics)(struct etcpmon_rsp_metrics* metrics,
struct etcpmon_link_metrics* links,
uint8_t links_count, void* user_data);
void (*on_error)(const char* msg, void* user_data);
void* user_data;
};
/* Initialize client structure */
void etcpmon_client_init(struct etcpmon_client* client);
/* Cleanup client resources */
void etcpmon_client_cleanup(struct etcpmon_client* client);
/* Connect to server
* Returns 0 on success, -1 on error
*/
int etcpmon_client_connect(struct etcpmon_client* client, const char* addr, uint16_t port);
/* Disconnect from server */
void etcpmon_client_disconnect(struct etcpmon_client* client);
/* Check if connected */
int etcpmon_client_is_connected(const struct etcpmon_client* client);
/* Request connection list
* Returns 0 on success, -1 on error
*/
int etcpmon_client_request_list(struct etcpmon_client* client);
/* Select connection to monitor
* Returns 0 on success, -1 on error
*/
int etcpmon_client_select_connection(struct etcpmon_client* client, uint64_t peer_node_id);
/* Request metrics for selected connection
* Returns 0 on success, -1 on error
*/
int etcpmon_client_request_metrics(struct etcpmon_client* client);
/* Process incoming data (non-blocking)
* Should be called periodically (e.g., from window message loop)
* Returns 1 if data was processed, 0 if no data, -1 on error
*/
int etcpmon_client_process(struct etcpmon_client* client);
/* Set callbacks */
void etcpmon_client_set_callbacks(struct etcpmon_client* client,
void (*on_connected)(void*),
void (*on_disconnected)(void*),
void (*on_conn_list)(struct etcpmon_conn_info*, uint8_t, void*),
void (*on_metrics)(struct etcpmon_rsp_metrics*,
struct etcpmon_link_metrics*,
uint8_t, void*),
void (*on_error)(const char*, void*),
void* user_data);
/* Get connection name by peer_id */
const char* etcpmon_client_get_conn_name(struct etcpmon_client* client, uint64_t peer_id);
/* Get metrics history */
struct metrics_history* etcpmon_client_get_history(struct etcpmon_client* client);
/* Add metrics to history */
void etcpmon_client_add_to_history(struct etcpmon_client* client, struct etcpmon_rsp_metrics* metrics);
uint64_t get_timestamp_ms(void); // Add this declaration
#ifdef __cplusplus
}
#endif
#endif /* ETCPMON_CLIENT_H */