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.
190 lines
5.3 KiB
190 lines
5.3 KiB
#ifndef CONN_MGR_H |
|
#define CONN_MGR_H |
|
|
|
#include <stdint.h> |
|
#include <stddef.h> |
|
#include "../lib/ll_queue.h" |
|
#include "etcp_api.h" |
|
#include "etcp_router.h" |
|
#include "route_node.h" |
|
|
|
struct UTUN_INSTANCE; |
|
struct ETCP_CONN; |
|
struct NODEINFO_Q; |
|
struct ROUTE_BGP; |
|
|
|
#define CONN_MGR_MAX_CANDIDATES 3 |
|
#define CONN_MGR_CANDIDATE_CACHE_MS 20000 |
|
#define CONN_MGR_CANDIDATE_STALE_TB 300000 |
|
#define CONN_MGR_CANDIDATE_PING_TB 20000 |
|
#define CONN_MGR_BG_PING_INTERVAL_TB 1000 |
|
#define CONN_MGR_BG_PING_CYCLE_MIN_TB 100000 |
|
#define CONN_MGR_IDLE_CHECK_INTERVAL_TB 10000 |
|
#define CONN_MGR_LOCAL_SCAN_ATTEMPTS 3 |
|
#define CONN_MGR_LOCAL_SCAN_TIMEOUT_MS 100 |
|
#define CONN_MGR_CONNECT_DIRECT_TIMEOUT_MS 5000 |
|
#define CONN_MGR_CONNECT_REVERSE_TIMEOUT_MS 15000 |
|
#define CONN_MGR_INTERM_EXCHANGE_TIMEOUT_MS 15000 |
|
|
|
#define CONN_MGR_OK 0 |
|
#define CONN_MGR_ERR_NOT_FOUND -1 |
|
#define CONN_MGR_ERR_NO_ADDRESSES -2 |
|
#define CONN_MGR_ERR_TIMEOUT -3 |
|
#define CONN_MGR_ERR_UNREACHABLE -4 |
|
#define CONN_MGR_ERR_REFUSED -5 |
|
#define CONN_MGR_ERR_ALREADY_CONNECTED -6 |
|
#define CONN_MGR_ERR_INTERNAL -7 |
|
|
|
enum CONN_MGR_STATE { |
|
CONN_MGR_STATE_DISCONNECTED = 0, |
|
CONN_MGR_STATE_CONNECTING = 1, |
|
CONN_MGR_STATE_CONNECTED = 2, |
|
}; |
|
|
|
enum CM_TRY_STATE { |
|
CM_TRY_NONE = 0, |
|
CM_TRY_PENDING = 1, |
|
CM_TRY_OK = 2, |
|
CM_TRY_FAILED = 3, |
|
}; |
|
|
|
#define CONN_MGR_SUBCMD_DIRECT_REQ 0x01 |
|
#define CONN_MGR_SUBCMD_DIRECT_RESP 0x02 |
|
#define CONN_MGR_SUBCMD_INTERM_EXCHANGE_REQ 0x03 |
|
#define CONN_MGR_SUBCMD_INTERM_EXCHANGE_RESP 0x04 |
|
#define CONN_MGR_SUBCMD_INTERM_SELECTED 0x05 |
|
#define CONN_MGR_SUBCMD_DISCONNECT 0x06 |
|
|
|
struct CONN_MGR_CANDIDATE { |
|
uint64_t node_id; |
|
uint16_t rtt; |
|
} __attribute__((packed)); |
|
|
|
#pragma pack(push, 1) |
|
struct CONN_MGR_DIRECT_REQ { |
|
uint8_t cmd; |
|
uint8_t subcmd; |
|
uint32_t request_id; |
|
uint8_t addr_count; |
|
}; |
|
|
|
struct CONN_MGR_DIRECT_RESP { |
|
uint8_t cmd; |
|
uint8_t subcmd; |
|
uint32_t request_id; |
|
uint8_t accepted; |
|
}; |
|
|
|
struct CONN_MGR_INTERM_EXCHANGE_REQ { |
|
uint8_t cmd; |
|
uint8_t subcmd; |
|
uint32_t request_id; |
|
uint8_t candidate_count; |
|
struct CONN_MGR_CANDIDATE candidates[4]; |
|
}; |
|
|
|
struct CONN_MGR_INTERM_EXCHANGE_RESP { |
|
uint8_t cmd; |
|
uint8_t subcmd; |
|
uint32_t request_id; |
|
uint8_t my_count; |
|
uint8_t your_count; |
|
struct CONN_MGR_CANDIDATE my_candidates[4]; |
|
struct CONN_MGR_CANDIDATE your_candidates[4]; |
|
}; |
|
|
|
struct CONN_MGR_INTERM_SELECTED { |
|
uint8_t cmd; |
|
uint8_t subcmd; |
|
uint32_t request_id; |
|
uint8_t count; |
|
struct CONN_MGR_CANDIDATE selected[3]; |
|
}; |
|
|
|
struct CONN_MGR_DISCONNECT { |
|
uint8_t cmd; |
|
uint8_t subcmd; |
|
uint64_t node_id; |
|
}; |
|
#pragma pack(pop) |
|
|
|
#define CONN_MGR_DIRECT_REQ_HDR_SIZE sizeof(struct CONN_MGR_DIRECT_REQ) |
|
#define CONN_MGR_DIRECT_RESP_HDR_SIZE sizeof(struct CONN_MGR_DIRECT_RESP) |
|
#define CONN_MGR_INTERM_EXCHANGE_REQ_SIZE sizeof(struct CONN_MGR_INTERM_EXCHANGE_REQ) |
|
#define CONN_MGR_INTERM_EXCHANGE_RESP_SIZE sizeof(struct CONN_MGR_INTERM_EXCHANGE_RESP) |
|
#define CONN_MGR_INTERM_SELECTED_SIZE sizeof(struct CONN_MGR_INTERM_SELECTED) |
|
#define CONN_MGR_DISCONNECT_SIZE sizeof(struct CONN_MGR_DISCONNECT) |
|
|
|
typedef void (*conn_mgr_connect_callback_t)(int result, uint64_t node_id, void* arg); |
|
|
|
struct cm_cb_node { |
|
conn_mgr_connect_callback_t cb; |
|
void* arg; |
|
struct cm_cb_node* next; |
|
}; |
|
|
|
struct CONN_MGR_ENTRY { |
|
uint64_t node_id; |
|
uint8_t state; |
|
uint8_t conn_type; |
|
uint8_t alien; |
|
uint32_t idle_timeout_ms; |
|
uint64_t last_traffic_tb; |
|
void* idle_timer; |
|
|
|
struct cm_cb_node* cb_list; |
|
|
|
uint64_t intermediaries[CONN_MGR_MAX_INTERMEDIARIES]; |
|
uint8_t intermediariy_count; |
|
uint8_t rr_idx; |
|
|
|
uint8_t local_scan_state; |
|
uint8_t main_connect_state; |
|
struct { |
|
uint8_t phase; |
|
void* timer; |
|
uint32_t request_id; |
|
void* conn_ctx; |
|
} main; |
|
|
|
struct CONN_MGR* mgr; |
|
}; |
|
|
|
struct CONN_MGR { |
|
struct UTUN_INSTANCE* instance; |
|
struct CONN_MGR_ENTRY* entries; |
|
size_t entry_count; |
|
size_t entry_capacity; |
|
|
|
void* bg_ping_timer; |
|
size_t bg_ping_cursor; |
|
uint64_t bg_ping_cycle_start_tb; |
|
|
|
void* candidate_ping_timer; |
|
|
|
struct CONN_MGR_CANDIDATE best_candidates[CONN_MGR_MAX_CANDIDATES]; |
|
uint8_t best_candidate_count; |
|
|
|
uint32_t next_request_id; |
|
uint8_t initialized; |
|
|
|
struct cm_reverse_pending* reverse_pending; |
|
struct cm_exchange_pending* exchange_pending; |
|
}; |
|
|
|
struct CONN_MGR* conn_mgr_init(struct UTUN_INSTANCE* instance); |
|
void conn_mgr_destroy(struct CONN_MGR* mgr); |
|
|
|
int conn_mgr_connect_node(struct CONN_MGR* mgr, uint64_t node_id, |
|
uint32_t idle_timeout_ms, |
|
conn_mgr_connect_callback_t cb, void* cb_arg); |
|
int conn_mgr_disconnect_node(struct CONN_MGR* mgr, uint64_t node_id); |
|
int conn_mgr_set_idle_timeout(struct CONN_MGR* mgr, uint64_t node_id, uint32_t timeout_ms); |
|
int conn_mgr_get_status(struct CONN_MGR* mgr, uint64_t node_id, |
|
uint8_t* out_state, uint8_t* out_conn_type); |
|
int conn_mgr_add_alien_node(struct CONN_MGR* mgr, const uint8_t* nodeinfo_data, size_t len); |
|
int conn_mgr_send(struct CONN_MGR* mgr, uint64_t node_id, struct ll_entry* entry); |
|
|
|
void conn_mgr_update_best_candidates(struct CONN_MGR* mgr, uint64_t node_id, uint16_t rtt); |
|
|
|
#endif
|
|
|