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.
76 lines
4.7 KiB
76 lines
4.7 KiB
/* Владелец измеряет собственный endpoint. Пиры передают наблюдения и выполняют |
|
* прямые пробы; управление идёт через маршруты одной из доступных групп. |
|
* Все операции и callbacks выполняются в uasync-потоке ядра. */ |
|
#ifndef NAT_DETECTION_H |
|
#define NAT_DETECTION_H |
|
|
|
#include <stddef.h> |
|
#include <stdint.h> |
|
#include "../lib/socket_compat.h" |
|
#include "address_profile.h" |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
struct UTUN_INSTANCE; |
|
struct ETCP_CONN; |
|
struct ETCP_LINK; |
|
struct ETCP_SOCKET; |
|
struct NAT_DETECTION; |
|
|
|
enum nat_check_reason { |
|
NAT_REASON_NONE, NAT_REASON_NO_OBSERVER, NAT_REASON_NO_HELPER, NAT_REASON_CONTROL_LOST, |
|
NAT_REASON_SEND_ERROR, NAT_REASON_TIMEOUT, NAT_REASON_ADDRESS_CHANGED, NAT_REASON_CONTACT_HISTORY, |
|
NAT_REASON_PROXY, NAT_REASON_NO_LISTENER, NAT_REASON_CANCELLED, NAT_REASON_INVALID_OBSERVATION, NAT_REASON_DEPENDENT_MAPPING |
|
}; |
|
|
|
struct nat_check_status { |
|
struct address_profile measured_profile, effective_profile; |
|
uint64_t generation, round; |
|
uint64_t group_id, observer, helper; |
|
uint32_t rounds, helper_reselections; |
|
uint8_t phase, reason, history_complete, cycling; |
|
uint8_t fallback_allowed; |
|
}; |
|
|
|
struct NAT_DETECTION *nat_detection_create(struct UTUN_INSTANCE *instance); |
|
void nat_detection_destroy(struct NAT_DETECTION *detector); |
|
/* Объединить изменения NODEINFO/READY и пересмотреть доступные группы в следующем uasync-вызове. */ |
|
void nat_detection_topology_changed(struct NAT_DETECTION *detector); |
|
/* Отменить раунды, задачи помощников и наблюдения до закрытия router-каналов группы. */ |
|
void nat_detection_cancel_group(struct NAT_DETECTION *detector, uint64_t group_id); |
|
/* Короткий приоритет начального измерения перед фоновыми UDP-пробами достижимости; задержка в timebase. */ |
|
uint64_t nat_detection_probe_delay(struct NAT_DETECTION *detector); |
|
/* Холодные измерения сериализуются по node_id; делегированные пробы более раннего owner пропускаются. */ |
|
int nat_detection_ping_allowed(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket, |
|
const uint8_t peer_key[32], const struct sockaddr_storage *source, |
|
uint8_t flags, const uint8_t *tag, size_t length); |
|
void nat_detection_link_ready(struct NAT_DETECTION *detector, struct ETCP_LINK *link); |
|
void nat_detection_cancel_for_conn(struct NAT_DETECTION *detector, struct ETCP_CONN *connection); |
|
/* Перепроверить после реально отправленных INIT к OPEN; CONTACT — только после исчерпания reverse. */ |
|
void nat_detection_connection_failed(struct NAT_DETECTION *detector, struct ETCP_CONN *connection, int reverse_done); |
|
void nat_detection_socket_removed(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket); |
|
void nat_detection_note_send(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket, |
|
const struct sockaddr_storage *destination); |
|
void nat_detection_observed_by_peer(struct NAT_DETECTION *detector, struct ETCP_LINK *link, |
|
const struct sockaddr_storage *observed); |
|
void nat_detection_record_observation(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket, |
|
const uint8_t peer_key[32], const struct sockaddr_storage *source, |
|
const uint8_t *tag, size_t length); |
|
void nat_detection_receive_ingress(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket, |
|
const uint8_t peer_key[32], const struct sockaddr_storage *source, |
|
const uint8_t *tag, size_t length); |
|
void nat_detection_request_check_all(struct NAT_DETECTION *detector); |
|
int nat_detection_request_check_socket(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket, uint64_t observer); |
|
void nat_detection_set_allow_local(struct NAT_DETECTION *detector, int allow); |
|
/* При ручном режиме помощники продолжают работать, раунды запускает request_check_all. */ |
|
void nat_detection_set_automatic(struct NAT_DETECTION *detector, int automatic); |
|
int nat_detection_get_status(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket, struct nat_check_status *status); |
|
const char *nat_check_reason_name(uint8_t reason); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif
|
|
|