Файлы: route_node.* route_node_lmdb.* route_bgp.* -> topo_node.* topo_node_lmdb.* topo_bgp.* Структуры: - ROUTE_BGP -> TOPO_BGP, ROUTE_BGP_CONN_ITEM -> TOPO_BGP_CONN_ITEM - NODEINFO -> TOPO_NODE, NODEINFO_Q -> TOPO_NODEQ, NODEINFO_PATH -> TOPO_NODEPATH - NODEINFO_ROUTES -> TOPO_NODESUBNETS, NODE_CONNECTIVITY -> TOPO_CONNECTIVITY - wire: NODEINFO_MSG -> TOPOMSG_NODE, NODEINFO_IPV4_* -> TOPOMSG_*4 и т.д. - memory: NI_IPV4_* -> TOPO_*4, NI_IPV6_* -> TOPO_*6 - ROUTE_SUBCMD_* -> TOPO_SUBCMD_*, ETCP_ID_ROUTE_ENTRY -> ETCP_ID_TOPO_ENTRY Функции: - route_bgp_* -> topo_bgp_* - nodeinfo_* -> topo_node_* - route_node_* -> topo_node_* - route_node_lmdb_* -> topo_node_lmdb_* Смысл: отделение механизма формирования топологии узлов от IP-роутинга.
78 lines
3.9 KiB
C
78 lines
3.9 KiB
C
#ifndef ROUTE6_LIB_H
|
||
#define ROUTE6_LIB_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <stdint.h>
|
||
#include <stddef.h>
|
||
#include <stdbool.h>
|
||
#include "../lib/radix.h"
|
||
#include "../lib/ll_queue.h"
|
||
#include "../lib/u_async.h"
|
||
|
||
|
||
/*
|
||
Диапазон Назначение
|
||
::/128 Неопределенный адрес (unspecified). Используется до назначения адреса интерфейсу.
|
||
::1/128 Адрес обратной петли (loopback), аналог 127.0.0.1 в IPv4.
|
||
2000::/3 Глобально маршрутизируемые (Global Unicast) адреса. Основное адресное пространство Интернета.
|
||
fc00::/7 Уникальные локальные адреса (ULA), аналог частных IPv4 (10.0.0.0/8, 192.168.0.0/16). На практике обычно используется fd00::/8.
|
||
fe80::/10 Локальные канальные адреса (Link-Local). Автоматически назначаются интерфейсам и работают только в пределах одного сегмента сети. Не маршрутизируются.
|
||
ff00::/8 Multicast-адреса. Используются вместо широковещания (broadcast), которого в IPv6 нет.
|
||
100::/64 Адреса для протокола Discard-Only. Предназначены для тестирования и отладки.
|
||
64:ff9b::/96 Префикс для трансляции IPv4↔IPv6 (NAT64).
|
||
64:ff9b:1::/48 Расширенный префикс NAT64.
|
||
2001:db8::/32 Зарезервирован для документации и примеров. Не используется в Интернете.
|
||
2002::/16 6to4-адреса (устаревший механизм перехода с IPv4 на IPv6).
|
||
2001::/32 Teredo (устаревшая технология туннелирования IPv6 через IPv4).
|
||
::ffff:0:0/96 IPv4-mapped IPv6 addresses. Используются ОС для представления IPv4-адресов в IPv6 API.
|
||
|
||
Адреса узлов сети формируются по следующему принципу:
|
||
FCxx:xxxx:xxxx:xxxx : yyyy:yyyy:yyyy:yyyy - local network: x = network id, y - node id.
|
||
-- network id --- ---- node id ------
|
||
|
||
FDxx/8 - опциональные ipv6 подсети узлов /64 (если нужно)
|
||
|
||
В разных node_groups общие:
|
||
- nodelists с их настройками (глобальная таблица)
|
||
- одинаковые линки между nodes (т.к. только один линк между парой узлов)
|
||
|
||
- При маршрутизации используем только узлы
|
||
|
||
|
||
*/
|
||
|
||
// таблица маршрутизации IPv6 на radix tree + ll_queue (поиск по node_id для удаления)
|
||
|
||
struct ROUTE6_DATA {
|
||
struct radix_node rn_nodes[2]; // scratch-буфер для rn_addroute
|
||
struct TOPO_NODEQ *v_node_info; // узел-владелец
|
||
uint64_t node_id; // ключ для hash-поиска в ll_queue
|
||
uint8_t prefix_length; // 0..128
|
||
uint8_t key[17]; // sockaddr-like: {len=17, addr[16]}
|
||
uint8_t mask[17]; // sockaddr-like: {len=17, mask[16]}
|
||
};
|
||
|
||
#define ROUTE6_DATA_SIZE sizeof(struct ROUTE6_DATA)
|
||
#define ROUTE6_NODE_ID_OFF offsetof(struct ROUTE6_DATA, node_id)
|
||
#define ROUTE6_KEY_SIZE 17
|
||
|
||
struct ROUTE6_TABLE {
|
||
struct radix_node_head *rnh; // radix tree
|
||
struct ll_queue *queue; // indexed by node_id for delete
|
||
};
|
||
|
||
struct ROUTE6_TABLE *route6_table_create(struct UASYNC *ua);
|
||
void route6_table_destroy(struct ROUTE6_TABLE *table);
|
||
bool route6_insert(struct ROUTE6_TABLE *table, struct TOPO_NODEQ *node);
|
||
void route6_delete(struct ROUTE6_TABLE *table, struct TOPO_NODEQ *node);
|
||
const struct ROUTE6_DATA *route6_lookup(struct ROUTE6_TABLE *table, const uint8_t addr[16]);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif
|