78 lines
4.9 KiB
C
78 lines
4.9 KiB
C
/* Владелец измеряет рабочий UDP endpoint по разным IP, без сравнения портов одного IP.
|
|
* Наблюдения возвращаются через router. Прямые входящие пробы не получают UDP-ответа;
|
|
* незнакомость фактического source IP проверяет получатель до исходящего контакта.
|
|
* Mapping и inbound завершаются независимо; CONTACT — оценка по сериям до/после контакта.
|
|
* Все операции и 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;
|
|
};
|
|
|
|
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);
|
|
/* Фоновый UDP-ответ к незнакомому IP может откладываться; односторонние NAT-пробы принимаются независимо. */
|
|
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
|