#ifndef ROUTE6_LIB_H #define ROUTE6_LIB_H #ifdef __cplusplus extern "C" { #endif #include #include #include #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