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
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 */
|
|
|