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.
93 lines
4.9 KiB
93 lines
4.9 KiB
#ifndef ROUTE_NODE_H |
|
#define ROUTE_NODE_H |
|
|
|
#include <stdint.h> |
|
#include <stddef.h> |
|
#include "../lib/ll_queue.h" |
|
#include "secure_channel.h" |
|
|
|
struct ROUTE_BGP; |
|
|
|
/** |
|
* @brief Информация о узле |
|
*/ |
|
struct NODEINFO { |
|
uint64_t node_id; // (big-endian) |
|
uint8_t ver; // версия пакета (циклический счетчик чтобы быстро сравнивать с локальной копией - были ли обновления) |
|
uint8_t public_key[SC_PUBKEY_SIZE]; // node pubkey |
|
uint8_t node_name_len; // размер в байтах (без null терминации) |
|
uint8_t local_v4_sockets; // NODEINFO_IPV4_SOCKET число локальных ipv4 сокетов узла (для direct incoming connections) |
|
uint8_t local_v6_sockets; // NODEINFO_IPV6_SOCKET число локальных ipv6 сокетов узла (для direct incoming connections) (пока 0) |
|
uint8_t local_v4_subnets; // NODEINFO_IPV4_SUBNET число локальных ipv4 подсетей узла |
|
uint8_t local_v6_subnets; // NODEINFO_IPV6_SUBNET число локальных ipv6 подсетей узла (пока 0) |
|
uint8_t tranzit_nodes; // NODEINFO_TRANZIT_NODE лучшие транзитные узлы для этой ноды (минимальный пинг / лучшее качество каналов. выбирается/обновляется узлом) |
|
uint8_t hop_count; // hop list: маршрут по которому распространялся этот NODEINFO_PACKET. для избежания зацикливаний при распространении по узлам. каждый узел при передаче инкрементирует и добавляет в конец свой node_id. |
|
// далее идут динамическип поля по порядку следования полей в этой структуре: char node_name[node_name_len], сокеты, роуты, tranzit nodes, hop list (блоки описаны структурами ниже). hop list - это массив node_id[hop_count]. |
|
} __attribute__((packed)); |
|
|
|
struct NODEINFO_IPV4_SOCKET { |
|
uint8_t addr[4];// network byte order |
|
uint16_t port; |
|
} __attribute__((packed)); |
|
|
|
struct NODEINFO_IPV6_SOCKET { |
|
uint8_t addr[16]; |
|
uint16_t port; |
|
} __attribute__((packed)); |
|
|
|
struct NODEINFO_IPV4_SUBNET { |
|
uint8_t addr[4];// network byte order |
|
uint8_t prefix_length; |
|
} __attribute__((packed)); |
|
|
|
struct NODEINFO_IPV6_SUBNET { |
|
uint8_t addr[16]; |
|
uint8_t prefix_length; |
|
} __attribute__((packed)); |
|
|
|
struct NODEINFO_TRANZIT_NODE { |
|
uint64_t node_id; // (big-endian) |
|
uint16_t rtt; // x0.1 ms (измеренный удаленным узлом RTT до транзитного узла) |
|
uint16_t link_q; // меньше - лучше (потери + 1/BW) |
|
} __attribute__((packed)); |
|
|
|
struct NODEINFO_PATH { |
|
struct ll_entry ll; |
|
struct ETCP_CONN* conn; |
|
uint8_t hop_count; // hop list: маршрут этого path |
|
};// __attribute__((packed)); |
|
|
|
struct NODEINFO_Q { |
|
struct ll_entry ll; |
|
struct ll_queue* paths; // сюда помещаем struct NODEINFO_PATH |
|
uint8_t dirty; |
|
uint8_t last_ver; |
|
struct NODEINFO node; // Всегда в конце структуры - динамически расширяемый блок |
|
};// __attribute__((packed)); |
|
|
|
|
|
/** |
|
* @brief Создаёт/обновляет nodeinfo для собственного узла |
|
* |
|
* Собирает данные из локальных структур и упаковывает к структуру (оптимизированную для передачи по сети) |
|
* |
|
* @param instance Указатель на UTUN_INSTANCE (с него сбоираем все данные) |
|
* @param bgp Указатель на ROUTE_BGP (для доступа к my_nodeinfo и instance) |
|
* @return количество подсетей (>= 0) или -1 при ошибке |
|
*/ |
|
int route_bgp_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct ROUTE_BGP* bgp); |
|
|
|
/** |
|
* @brief Получает указатель на массив IPv4-подсетей узла (без malloc/копирования). |
|
* |
|
* Функция вычисляет смещение внутри динамической части NODEINFO_Q |
|
* и возвращает прямой указатель на массив struct NODEINFO_IPV4_SUBNET. |
|
* |
|
* @param node Указатель на NODEINFO_Q |
|
* @param out_subnets [out] сюда будет записан указатель на первый элемент массива |
|
* (NULL если подсетей нет) |
|
* @return количество подсетей (>= 0) или -1 при ошибке |
|
*/ |
|
int get_node_routes(struct NODEINFO_Q *node, const struct NODEINFO_IPV4_SUBNET **out_subnets); |
|
|
|
#endif // ROUTE_NODE_H
|
|
|