RFC 9129 YANG Data Model for the OSPF Protocol

Internet Engineering Task Force (IETF)                          D. Yeung
Request for Comments: 9129                                  Arrcus, Inc.
Category: Standards Track                                          Y. Qu
ISSN: 2070-1721                                                Futurewei
                                                                J. Zhang
                                                        Juniper Networks
                                                                 I. Chen
                                                   The MITRE Corporation
                                                               A. Lindem
                                                           Cisco Systems
                                                            October 2022

YANG Data Model for the OSPF Protocol

Модель данных YANG для протокола OSPF

PDF

Аннотация

Этот документ задаёт модель данных YANG, которая может служить для настройки и управления OSPF. Модель основана на версии YANG 1.1, определённой в RFC 7950, и соответствует архитектуре хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA), описанной в RFC 8342.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информация о текущем статусе документа, найденных ошибках и способах обратной связи доступна по ссылке https://www.rfc-editor.org/info/rfc9129.

Авторские права

Copyright (c) 2022. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

Оглавление

Исключено в версии HTML.

1. Введение

YANG [RFC7950] — язык определения данных, служащий для задания содержимого концептуального хранилища данных, позволяющего управлять сетевыми устройствами по протоколу настройки сети (Network Configuration Protocol или NETCONF) [RFC6241], RESTCONF [RFC8040] или иному протоколу управления сетью. Кроме того, модели данных YANG могут служить основой для реализации других интерфейсов, таких как консольный (Command-Line Interface или CLI) и программный API.

Этот документ определяет модель данных YANG, которая может служить для настройки и управления OSPF. Он дополняет модель данных ядра маршрутизации, заданную в [RFC8349], и предоставляет основу для разработки моделей данных протоколов маршрутизации. Модель полностью соответствует архитектуре NMDA [RFC8342]. Модель данных интерфейса определена в [RFC8343] и применяется для ссылки на интерфейсы из протоколов маршрутизации. Модель данных для цепочек ключей [RFC8177] применяется для аутентификации OSPF и обеспечивает ссылки на настроенные цепочки ключей и криптографические алгоритмы.

Поддерживаются оба протокола OSPFv2 [RFC2328] и OSPFv3 [RFC5340]. В дополнение к протоколу ядра OSPF поддерживаются функции из других RFC, связанных с OSPF. Это включает устройства запроса [RFC1793], организацию трафика (Traffic Engineering или TE) [RFC3630], разные семейства адресов [RFC5838], аккуратный перезапуск [RFC3623] [RFC5187], опцию NSSA (Not-So-Stubby Area) [RFC3101] и OSPFv2 или OSPFv3 в качестве протокола между провайдером и клиентом (Provider Edge to Customer Edge или PE-CE) [RFC4577] [RFC6565]. Не входящие в ядро функции в модели OSPF являются необязательными.

1.1. Уровни требований

Ключевые слова должно (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

1.2. Диаграммы деревьев

В этом документе применяется графическое представление данных, определённое в [RFC8340].

2. Устройство модели данных

Хотя базовые элементы конфигурации OSPF (маршрутизаторы, области, интерфейсы) не меняются, детали модели конфигурации зависят от производителя. Различия наблюдаются в разных аспектах, включая привязку экземпляра протокола к домену маршрутизации и создание экземпляров протокола. Цель этого документа состоит в определении модели данных, обеспечивающей пользовательский интерфейс для OSPFv2 и OSPFv3. Обязательных элементов (mandatory) очень немного, что даёт производителям возможность приспособить эту модель данных к своим реализациям.

2.1. Рабочее состояние OSPF

Рабочее состояние OSPF включено в одно дерево с конфигурацией OSPF в соответствии с архитектурой NMDA [RFC8342] и дополняется лишь контейнер routing из ietf-routing [RFC8349], а контейнер routing-state не меняется.

2.2. Обзор

Модуль YANG OSPF, заданный в этом документе, включает все базовые блоки, нужные для протокола OSPF. Модуль дополняет путь /routing/control-plane-protocols/control-plane-protocol, заданный в модуле ietf-routing. Модель ietf-ospf задаёт один экземпляр OSPF, который может быть создан как OSPFv2 или OSPFv3. Несколько экземпляров создаются как экземпляры протоколов плоскости управления.

   module: ietf-ospf
     augment /rt:routing/rt:control-plane-protocols/
              rt:control-plane-protocol:
       +--rw ospf
             .
             .
          +--rw address-family?       iana-rt-types:address-family
             .
             .
          +--rw areas
          |  +--rw area* [area-id]
          |     +--rw area-id                   area-id-type
          |        .
          |        .
          |     +--rw virtual-links
          |     |  +--rw virtual-link* [transit-area-id router-id]
          |     |     .
          |     |     .
          |     +--rw sham-links {pe-ce-protocol}?
          |     |  +--rw sham-link* [local-id remote-id]
          |     |     .
          |     |     .
          |     +--rw interfaces
          |        +--rw interface* [name]
          |           .
          |           .
          +--rw topologies {multi-topology}?
             +--rw topology* [name]
                .
                .

Контейнер ospf включает один экземпляр протокола OSPF, содержащий данные конфигурации и состояния на уровне маршрутизатора OSPF. Каждый экземпляр OSPF сопоставляется с экземпляром протокола плоскости управления в соответствии с [RFC8349].

Контейнеры areas и area/interfaces определяют конфигурацию и рабочее состояние областей и интерфейсов OSPF.

Контейнер topologies определяет конфигурацию и рабочее состояние OSPF для топологий OSPF при поддержке функции (feature) multi-topology.

2.3. OSPFv2 и OSPFv3

Определённая здесь модель данных поддерживает протоколы OSPFv2 и OSPFv3. Обязательное поле version указывает применяемую версию OSPF и в соответствии с этим модель данных использует OSPFv2 или OSPFv3.

2.4. Необязательные функции

Указанные ниже необязательные функции (feature) выходят за рамки базовой конфигурации OSPF и производители сами решают, какие из этих функций поддерживать на конкретном устройстве.

multi-topology

Поддержка маршрутизации MT Multi-Topology) [RFC4915].

multi-area-adj

Поддержка смежности нескольких областей OSPF [RFC5185].

explicit-router-id

Поддержка явного задания Router ID на уровне экземпляра.

demand-circuit

Поддержа устройств, запрашивающих OSPF [RFC1793].

mtu-ignore

Поддержка запрета проверки MTU пакета OSPF Database Description в соответствии с параграфом 10.6 в [RFC2328].

lls

Поддержка сигнализации LLS (OSPF Link-Local Signaling) [RFC5613].

prefix-suppression

Поддержка подавления анонсов префиксов OSPF [RFC6860].

ttl-security

Поддержка проверки безопасности для OSPF TTL (Time to Live) [RFC5082].

nsr

Поддержка OSPF NSR (Non-Stop Routing), позволяющей маршрутизатору с избыточностью плоскости управления (например, платы с двумя процессорами маршрутов — Route Processor или RP)) поддерживать своё состояние и отношения смежности при плановом или неплановом перезапуске плоскости управления. Это отличается от безостановочной пересылки (Non-Stop Forwarding или NSF) тем, что не требует содействия соседей OSPF для восстановления состояния плоскости управления.

graceful-restart

Поддержка аккуратного (graceful) перезапуска OSPF [RFC3623] [RFC5187].

auto-cost

Поддержка расчёта стоимости для интерфейса OSPF по эталонной пропускной способности [RFC2328].

max-ecmp

Поддержка настройки максимального числа равноценных путей (Equal-Cost Multi-Path или ECMP).

max-lsa

Поддержка настройки максимального числа анонсов состояния канала (Link State Advertisement или LSA), воспринимаемых экземпляром OSPF [RFC1765].

te-rid

Поддержка настройки TE Router ID, т е. Router Address TLV, как указано в параграфе 2.4.1 [RFC3630], или Router IPv6 Address TLV, как указано в разделе 3 [RFC5329].

ldp-igp-sync

Поддержка синхронизации LDP IGP [RFC5443].

ospfv2-authentication-trailer

Поддержка трейлера аутентификации OSPFv2 [RFC5709] [RFC7474].

ospfv3-authentication-ipsec

Поддержка IPsec для аутентификации OSPFv3 [RFC4552].

ospfv3-authentication-trailer

Поддержка трейлера аутентификации OSPFv3 [RFC7166].

fast-reroute

Поддержка IP Fast Reroute (IP-FRR) [RFC5714].

node-flag

Поддержка флагов узла для префиксов for OSPF [RFC7684].

node-tag

Поддержка административных флагов узла для экземпляров OSPF [RFC7777].

lfa

Поддержка беспетлевых вариантов (Loop-Free Alternate или LFA) [RFC5286].

remote-lfa

Поддержка удалённых LFA (Remote LFA или R-LFA) [RFC7490].

stub-router

Поддержка анонсов тупиковых маршрутизаторов OSPF [RFC6987].

pe-ce-protocol

Поддержка OSPF в качестве протокола PE-CE [RFC4577] [RFC6565].

ietf-spf-delay

Поддержка алгоритма задержки IETF Shortest Path First (SPF) [RFC8405].

bfd

Поддержка обнаружения двухсторонней пересылки (Bidirectional Forwarding Detection или BFD) для нахождения соседей OSPF [RFC5880] [RFC5881].

hybrid-interface

Поддержка гибридных интерфейсов OSPF (broadcast и point-to-multipoint) [RFC6845].

Предполагается, что производители будут применять дополнения (augment) для поддержки дополнительных функций.

2.5. Конфигурация и рабочее состояние маршрутизатора OSPF

Контейнер ospf размещается на верхнем уровне модели и представляет экземпляр протокола OSPF с конфигурацией и рабочим состоянием на уровне маршрутизатора. Рабочее состояние включает статистику экземпляра, статистику задержки IETF SPF, базу данных LSDB (AS-Scope Link State Database), локальную таблицу RIB, журналы SPF и LSA.

   module: ietf-ospf
     augment /rt:routing/rt:control-plane-protocols/
              rt:control-plane-protocol:
       +--rw ospf
          .
          .
          +--rw address-family?       iana-rt-types:address-family
          +--rw enabled?              boolean
          +--rw explicit-router-id?   rt-types:router-id
          |                           {explicit-router-id}?
          +--rw preference
          |  +--rw (scope)?
          |     +--:(single-value)
          |     |  +--rw all?          uint8
          |     +--:(multi-values)
          |        +--rw (granularity)?
          |        |  +--:(detail)
          |        |  |  +--rw intra-area?   uint8
          |        |  |  +--rw inter-area?   uint8
          |        |  +--:(coarse)
          |        |     +--rw internal?     uint8
          |        +--rw external?     uint8
          +--rw nsr {nsr}?
          |  +--rw enabled?  boolean
          +--rw graceful-restart {graceful-restart}?
          |  +--rw enabled?                      boolean
          |  +--rw helper-enabled?               boolean
          |  +--rw restart-interval?             uint16
          |  +--rw helper-strict-lsa-checking?   boolean
          +--rw auto-cost {auto-cost}?
          |  +--rw enabled?               boolean
          |  +--rw reference-bandwidth?   uint32
          +--rw spf-control
          |  +--rw paths?            uint16 {max-ecmp}?
          |  +--rw ietf-spf-delay {ietf-spf-delay}?
          |     +--rw initial-delay?   uint32
          |     +--rw short-delay?     uint32
          |     +--rw long-delay?      uint32
          |     +--rw hold-down?       uint32
          |     +--rw time-to-learn?   uint32
          |     +--ro current-state?             enumeration
          |     +--ro remaining-time-to-learn?
          |                   rt-types:timer-value-milliseconds
          |     +--ro remaining-hold-down?
          |                   rt-types:timer-value-milliseconds
          |     +--ro last-event-received?       yang:timestamp
          |     +--ro next-spf-time?             yang:timestamp
          |     +--ro last-spf-time?             yang:timestamp
          +--rw database-control
          |  +--rw max-lsa?   uint32 {max-lsa}?
          +--rw stub-router {stub-router}?
          |  +--rw (trigger)?
          |     +--:(always)
          |        +--rw always!
          +--rw mpls
          |  +--rw te-rid {te-rid}?
          |  |  +--rw ipv4-router-id?   inet:ipv4-address
          |  |  +--rw ipv6-router-id?   inet:ipv6-address
          |  +--rw ldp
          |     +--rw igp-sync?   boolean {ldp-igp-sync}?
          +--rw fast-reroute {fast-reroute}?
          |  +--rw lfa {lfa}?
          +--rw node-tags {node-tag}?
          |  +--rw node-tag* [tag]
          |     +--rw tag      uint32
          +--ro router-id?          rt-types:router-id
          +--ro local-rib
          |  +--ro route* [prefix]
          |     +--ro prefix        inet:ip-prefix
          |     +--ro next-hops
          |     |  +--ro next-hop* []
          |     |     +--ro outgoing-interface?   if:interface-ref
          |     |     +--ro next-hop              inet:ip-address
          |     +--ro metric?       uint32
          |     +--ro route-type?   route-type
          |     +--ro route-tag?    uint32
          +--ro statistics
          |  +--ro discontinuity-time         yang:date-and-time
          |  +--ro originate-new-lsa-count?   yang:counter32
          |  +--ro rx-new-lsas-count?         yang:counter32
          |  +--ro as-scope-lsa-count?        yang:gauge32
          |  +--ro as-scope-lsa-chksum-sum?   uint32
          |  +--ro database
          |  |  +--ro as-scope-lsa-type*
          |  |     +--ro lsa-type?        uint16
          |  |     +--ro lsa-count?       yang:gauge32
          |  |     +--ro lsa-cksum-sum?   uint32
          |  +--ro protected-routes {fast-reroute}?
          |  |  +--ro address-family-stats*
          |  |         [address-family prefix alternate]
          |  |     +--ro address-family
          |  |         iana-rt-types:address-family
          |  |     +--ro prefix                  inet:ip-prefix
          |  |     +--ro alternate               inet:ip-address
          |  |     +--ro alternate-type?         enumeration
          |  |     +--ro best?                   boolean
          |  |     +--ro non-best-reason?        string
          |  |     +--ro protection-available?   bits
          |  |     +--ro alternate-metric-1?     uint32
          |  |     +--ro alternate-metric-2?     uint32
          |  |     +--ro alternate-metric-3?     uint32
          |  +--ro unprotected-routes {fast-reroute}?
          |  |  +--ro address-family-stats* [address-family prefix]
          |  |     +--ro address-family    iana-rt-types:address-family
          |  |     +--ro prefix            inet:ip-prefix
          |  +--ro protection-statistics* [frr-protection-method]
          |     +--ro frr-protection-method    string
          |     +--ro address-family-stats* [address-family]
          |        +--ro address-family
          |             iana-rt-types:address-family
          |        +--ro total-routes?           uint32
          |        +--ro unprotected-routes?     uint32
          |        +--ro protected-routes?       uint32
          |        +--ro linkprotected-routes?   uint32
          |        +--ro nodeprotected-routes?   uint32
          +--ro database
          |  +--ro as-scope-lsa-type* [lsa-type]
          |     +--ro as-scope-lsas
          |        +--ro as-scope-lsa* [lsa-id adv-router]
          |           +--ro lsa-id               union
          |           +--ro adv-router           inet:ipv4-address
          |           +--ro decoded-completed?   boolean
          |           +--ro raw-data?            yang:hex-string
          |           +--ro (version)?
          |              +--:(ospfv2)
          |              |  +--ro ospfv2
          .              .
          .              .
          |              +--:(ospfv3)
          |                 +--ro ospfv3
          .
          .
          +--ro spf-log
          |  +--ro event* [id]
          |     +--ro id                    uint32
          |     +--ro spf-type?             enumeration
          |     +--ro schedule-timestamp?   yang:timestamp
          |     +--ro start-timestamp?      yang:timestamp
          |     +--ro end-timestamp?        yang:timestamp
          |     +--ro trigger-lsa*
          |        +--ro area-id?      area-id-type
          |        +--ro type?         uint16
          |        +--ro lsa-id?       union
          |        +--ro adv-router?   rt-types:router-id
          |        +--ro seq-num?      uint32
          +--ro lsa-log
          |  +--ro event* [id]
          |     +--ro id                    uint32
          |     +--ro lsa
          |     |  +--ro area-id?      area-id-type
          |     |  +--ro type?         uint16
          |     |  +--ro lsa-id?       union
          |     |  +--ro adv-router?   rt-types:router-id
          |     |  +--ro seq-num?      uint32
          |     +--ro received-timestamp?   yang:timestamp
          |     +--ro reason?               identityref
          .
          .

2.6. Конфигурация и рабочее состояние области OSPF

Контейнер area содержит конфигурацию области OSPF и список контейнеров для всех интерфейсов OSPF в эту область. Рабочее состояние области включает статистику и LSDB.

   module: ietf-ospf
     augment /rt:routing/rt:control-plane-protocols/
              rt:control-plane-protocol:
       +--rw ospf
          .
          .
          +--rw areas
          |  +--rw area* [area-id]
          |     +--rw area-id                   area-id-type
          |     +--rw area-type?                identityref
          |     +--rw summary?                  boolean
          |     +--rw default-cost?             ospf-metric
          |     +--rw ranges
          |     |  +--rw range* [prefix]
          |     |     +--rw prefix       inet:ip-prefix
          |     |     +--rw advertise?   boolean
          |     |     +--rw cost?        ospf-metric
          |     +--rw topologies {ospf:multi-topology}?
          |     |  +--rw topology* [name]
          |     |     +--rw name  -> ../../../../../../../../
          |     |                    ../../../rt:ribs/rib/name
          |     |     +--rw summary?        boolean
          |     |     +--rw default-cost?   ospf-metric
          |     |     +--rw ranges
          |     |         +--rw range* [prefix]
          |     |            +--rw prefix       inet:ip-prefix
          |     |            +--rw advertise?   boolean
          |     |            +--rw cost?        ospf-metric
          |     +--ro statistics
          |     |  +--ro discontinuity-time           yang:date-and-time
          |     |  +--ro spf-runs-count?              yang:counter32
          |     |  +--ro abr-count?                   yang:gauge32
          |     |  +--ro asbr-count?                  yang:gauge32
          |     |  +--ro ar-nssa-translator-event-count?
          |     |                                     yang:counter32
          |     |  +--ro area-scope-lsa-count?        yang:gauge32
          |     |  +--ro area-scope-lsa-cksum-sum?    uint32
          |     |  +--ro database
          |     |     +--ro area-scope-lsa-type*
          |     |        +--ro lsa-type?        uint16
          |     |        +--ro lsa-count?       yang:gauge32
          |     |        +--ro lsa-cksum-sum?   uint32
          |     +--ro database
          |     |  +--ro area-scope-lsa-type* [lsa-type]
          |     |     +--ro lsa-type           uint16
          |     |     +--ro area-scope-lsas
          |     |        +--ro area-scope-lsa* [lsa-id adv-router]
          |     |           +--ro lsa-id               union
          .     .           .
          .     .           .
          |     |           +--ro (version)?
          |     |              +--:(ospfv2)
          |     |              |  +--ro ospfv2
          |     |              |     +--ro header
          .     .              .     .
          .     .              .     .
          |     |              |     +--ro body
          |     |              |        +--ro router
          .     .              .        .
          .     .              .        .
          |     |              |        +--ro network
          .     .              .        .
          .     .              .        .
          |     |              |        +--ro summary
          .     .              .        .
          .     .              .        .
          |     |              |        +--ro external
          .     .              .        .
          .     .              .        .
          |     |              |        +--ro opaque
          .     .              .        .
          .     .              .        .
          |     |              +--:(ospfv3)
          |     |                 +--ro ospfv3
          |     |                    +--ro header
          .     .                    .
          .     .                    .
          |     |                    +--ro body
          |     |                       +--ro router
          .     .                       .
          .     .                       .
          |     |                       +--ro network
          .     .                       .
          .     .                       .
          |     |                       +--ro inter-area-prefix
          .     .                       .
          .     .                       .
          |     |                       +--ro inter-area-router
          .     .                       .
          .     .                       .
          |     |                       +--ro as-external
          .     .                       .
          .     .                       .
          |     |                       +--ro nssa
          .     .                       .
          .     .                       .
          |     |                       +--ro link
          .     .                       .
          .     .                       .
          |     |                       +--ro intra-area-prefix
          .     .                       .
          .     .                       .
          |     |                       +--ro router-information
          .     .                       .
          .     .                       .
          |     +--rw virtual-links
          |     |  +--rw virtual-link* [transit-area-id router-id]
          |     |     +--rw transit-area-id       -> ../../../../
          |     |                                    area/area-id
          |     |     +--rw router-id             rt-types:router-id
          |     |     +--rw hello-interval?       uint16
          |     |     +--rw dead-interval?        uint32
          |     |     +--rw retransmit-interval?  uint16
          |     |     +--rw transmit-delay?       uint16
          |     |     +--rw lls?                  boolean {lls}?
          |     |     +--rw ttl-security {ttl-security}?
          |     |     |  +--rw enabled?  boolean
          |     |     |  +--rw hops?     uint8
          |     |     +--rw enabled?              boolean
          |     |     +--rw authentication
          |     |     |  +--rw (auth-type-selection)?
          |     |     |     +--:(ospfv2-auth)
          |     |     |     |  +--rw ospfv2-auth-trailer-rfc?
          |     |     |     |  |       ospfv2-auth-trailer-rfc-version
          |     |     |     |  |        {ospfv2-authentication-trailer}?
          |     |     |     |  +--rw (ospfv2-auth-specification)?
          |     |     |     |     +--:(auth-key-chain) {key-chain}?
          |     |     |     |     |  +--rw ospfv2-key-chain?
          |     |     |     |     |         key-chain:key-chain-ref
          |     |     |     |     +--:(auth-key-explicit)
          |     |     |     |        +--rw ospfv2-key-id?     uint32
          |     |     |     |        +--rw ospfv2-key?        string
          |     |     |     |        +--rw ospfv2-crypto-algorithm?
          |     |     |     |                identityref
          |     |     |     +--:(ospfv3-auth-ipsec)
          |     |     |     |      {ospfv3-authentication-ipsec}?
          |     |     |     |  +--rw sa?                       string
          |     |     |     +--:(ospfv3-auth-trailer)
          |     |     |        |  {ospfv3-authentication-trailer}?
          |     |     |        +--rw (ospfv3-auth-specification)?
          |     |     |           +--:(auth-key-chain) {key-chain}?
          |     |     |           |  +--rw ospfv3-key-chain?
          |     |     |           |          key-chain:key-chain-ref
          |     |     |           +--:(auth-key-explicit)
          |     |     |              +--rw ospfv3-sa-id?        uint16
          |     |     |              +--rw ospfv3-key?          string
          |     |     |              +--rw ospfv3-crypto-algorithm?
          |     |     |                      identityref
          |     |     +--ro cost?              ospf-link-metric
          |     |     +--ro state?             if-state-type
          |     |     +--ro hello-timer?       rt-types:
          |     |     |                         rtimer-value-seconds16
          |     |     +--ro wait-timer?        rt-types:
          |     |     |                         rtimer-value-seconds16
          |     |     +--ro dr-router-id?      rt-types:router-id
          |     |     +--ro dr-ip-addr?        inet:ip-address
          |     |     +--ro bdr-router-id?     rt-types:router-id
          |     |     +--ro bdr-ip-addr?       inet:ip-address
          |     |     +--ro statistics
          |     |     |  +--ro discontinuity-time     yang:date-and-time
          |     |     |  +--ro if-event-count?        yang:counter32
          |     |     |  +--ro link-scope-lsa-count?  yang:gauge32
          |     |     |  +--ro link-scope-lsa-cksum-sum?
          |     |     |                               uint32
          |     |     |  +--ro database
          |     |     |     +--ro link-scope-lsa-type*
          |     |     |        +--ro lsa-type?        uint16
          |     |     |        +--ro lsa-count?       yang:gauge32
          |     |     |        +--ro lsa-cksum-sum?   int32
          |     |     +--ro neighbors
          |     |     |  +--ro neighbor* [neighbor-router-id]
          |     |     |     +--ro neighbor-router-id
          |     |     |                           rt-types:router-id
          |     |     |     +--ro address?        inet:ip-address
          |     |     |     +--ro dr-router-id?   rt-types:router-id
          |     |     |     +--ro dr-ip-addr?     inet:ip-address
          |     |     |     +--ro bdr-router-id?  rt-types:router-id
          |     |     |     +--ro bdr-ip-addr?    inet:ip-address
          |     |     |     +--ro state?          nbr-state-type
          |     |     |     +--ro dead-timer? rt-types:
          |     |     |     |                  rtimer-value-seconds16
          |     |     |     +--ro statistics
          |     |     |        +--ro discontinuity-time
          |     |     |                           yang:date-and-time
          |     |     |        +--ro nbr-event-count?
          |     |     |                           yang:counter32
          |     |     |        +--ro nbr-retrans-qlen?
          |     |     |                           yang:gauge32
          |     |     +--ro database
          |     |        +--ro link-scope-lsa-type* [lsa-type]
          |     |           +--ro lsa-type           uint16
          |     |           +--ro link-scope-lsas
          .     .
          .     .
          |     +--rw sham-links {pe-ce-protocol}?
          |     |  +--rw sham-link* [local-id remote-id]
          |     |     +--rw local-id               inet:ip-address
          |     |     +--rw remote-id              inet:ip-address
          |     |     +--rw hello-interval?        uint16
          |     |     +--rw dead-interval?         uint32
          |     |     +--rw retransmit-interval?   uint16
          |     |     +--rw transmit-delay?        uint16
          |     |     +--rw lls?                   boolean {lls}?
          |     |     +--rw ttl-security {ttl-security}?
          |     |     |  +--rw enabled?  boolean
          |     |     |  +--rw hops?     uint8
          |     |     +--rw enabled?            boolean
          |     |     +--rw authentication
          |     |     |  +--rw (auth-type-selection)?
          |     |     |     +--:(ospfv2-auth)
          |     |     |     |  +--rw ospfv2-auth-trailer-rfc?
          |     |     |     |  |       ospfv2-auth-trailer-rfc-version
          |     |     |     |  |        {ospfv2-authentication-trailer}?
          |     |     |     |  +--rw (ospfv2-auth-specification)?
          |     |     |     |     +--:(auth-key-chain) {key-chain}?
          |     |     |     |     |  +--rw ospfv2-key-chain?
          |     |     |     |     |         key-chain:key-chain-ref
          |     |     |     |     +--:(auth-key-explicit)
          |     |     |     |        +--rw ospfv2-key-id?     uint32
          |     |     |     |        +--rw ospfv2-key?        string
          |     |     |     |        +--rw ospfv2-crypto-algorithm?
          |     |     |     |                identityref
          |     |     |     +--:(ospfv3-auth-ipsec)
          |     |     |     |      {ospfv3-authentication-ipsec}?
          |     |     |     |  +--rw sa?                       string
          |     |     |     +--:(ospfv3-auth-trailer)
          |     |     |        |  {ospfv3-authentication-trailer}?
          |     |     |        +--rw (ospfv3-auth-specification)?
          |     |     |           +--:(auth-key-chain) {key-chain}?
          |     |     |           |  +--rw ospfv3-key-chain?
          |     |     |           |          key-chain:key-chain-ref
          |     |     |           +--:(auth-key-explicit)
          |     |     |              +--rw ospfv3-sa-id?        uint16
          |     |     |              +--rw ospfv3-key?          string
          |     |     |              +--rw ospfv3-crypto-algorithm?
          |     |     |                      identityref
          |     |     +--rw cost?               ospf-link-metric
          |     |     +--rw mtu-ignore?         boolean
          |     |                               {mtu-ignore}?
          |     |     +--rw prefix-suppression? boolean
          |     |                               {prefix-suppression}?
          |     |     +--ro state?              if-state-type
          |     |     +--ro hello-timer?       rt-types:
          |     |     |                         rtimer-value-seconds16
          |     |     +--ro wait-timer?        rt-types:
          |     |     |                         rtimer-value-seconds16
          |     |     +--ro dr-router-id?       rt-types:router-id
          |     |     +--ro dr-ip-addr?         inet:ip-address
          |     |     +--ro bdr-router-id?      rt-types:router-id
          |     |     +--ro bdr-ip-addr?        inet:ip-address
          |     |     +--ro statistics
          |     |     |  +--ro discontinuity-time     yang:date-and-time
          |     |     |  +--ro if-event-count?        yang:counter32
          |     |     |  +--ro link-scope-lsa-count?  yang:gauge32
          |     |     |  +--ro link-scope-lsa-cksum-sum?
          |     |     |                               uint32
          |     |     |  +--ro database
          |     |     |     +--ro link-scope-lsa-type*
          |     |     |        +--ro lsa-type?        uint16
          |     |     |        +--ro lsa-count?       yang:gauge32
          |     |     |        +--ro lsa-cksum-sum?   uint32
          |     |     +--ro neighbors
          |     |     |  +--ro neighbor* [neighbor-router-id]
          |     |     |     +--ro neighbor-router-id
          |     |     |                           rt-types:router-id
          |     |     |     +--ro address?        inet:ip-address
          |     |     |     +--ro dr-router-id?   rt-types:router-id
          |     |     |     +--ro dr-ip-addr?     inet:ip-address
          |     |     |     +--ro bdr-router-id?  rt-types:router-id
          |     |     |     +--ro bdr-ip-addr?    inet:ip-address
          |     |     |     +--ro state?          nbr-state-type
          |     |     |     +--ro cost?           ospf-link-metric
          |     |     |     +--ro dead-timer? rt-types:
          |     |     |     |                  rtimer-value-seconds16
          |     |     |     +--ro statistics
          |     |     |        +--ro discontinuity-time?
          |     |     |                           yang:date-and-time
          |     |     |        +--ro nbr-event-count?
          |     |     |                           yang:counter32
          |     |     |        +--ro nbr-retrans-qlen?
          |     |     |                           yang:gauge32
          |     |     +--ro database
          |     |        +--ro link-scope-lsa-type* [lsa-type]
          |     |           +--ro lsa-type           uint16
          |     |           +--ro link-scope-lsas
          .     .
          .     .

2.7. Конфигурация и рабочее состояние интерфейса OSPF

Контейнер interface содержит конфигурацию и рабочее состояние интерфейса OSPF. Рабочее состояние интерфейса включает статистику интерфейса, список соседей и link-local LSDB.

   module: ietf-ospf
     augment /rt:routing/rt:control-plane-protocols/
              rt:control-plane-protocol:
       +--rw ospf
          .
          .
          +--rw areas
          |  +--rw area* [area-id]
          |     .
          |     .
          |     +--rw interfaces
          |        +--rw interface* [name]
          |           +--rw name                   if:interface-ref
          |           +--rw interface-type?        enumeration
          |           +--rw passive?               boolean
          |           +--rw demand-circuit?        boolean
          |                                        {demand-circuit}?
          |           +--rw priority?              uint8
          |           +--rw multi-areas {multi-area-adj}?
          |           |  +--rw multi-area* [multi-area-id]
          |           |     +--rw multi-area-id      area-id-type
          |           |     +--rw cost?              ospf-link-metric
          |           +--rw static-neighbors
          |           |  +--rw neighbor* [identifier]
          |           |     +--rw identifier       inet:ip-address
          |           |     +--rw cost?            ospf-link-metric
          |           |     +--rw poll-interval?   uint16
          |           |     +--rw priority?        uint8
          |           +--rw node-flag?             boolean
          |                                        {node-flag}?
          |           +--rw bfd {bfd}?
          |           |  +--rw enabled?            boolean
          |           |  +--rw local-multiplier?   multiplier
          |           |  |      {client-base-cfg-parms}?
          |           |  +--rw (interval-config-type)?
          |           |  |      {client-base-cfg-parms}?
          |           |     +--:(tx-rx-intervals)
          |           |     |  +--rw desired-min-tx-interval?  uint32
          |           |     |  +--rw required-min-rx-interval? uint32
          |           |     +--:(single-interval)
          |           |     |   {single-minimum-interval}?
          |           |        +--rw min-interval?             uint32
          |           +--rw fast-reroute {fast-reroute}?
          |           |  +--rw lfa {lfa}?
          |           |     +--rw candidate-enabled?  boolean
          |           |     +--rw enabled?            boolean
          |           |     +--rw remote-lfa {remote-lfa}?
          |           |        +--rw enabled?  boolean
          |           +--rw hello-interval?        uint16
          |           +--rw dead-interval?         uint32
          |           +--rw retransmit-interval?   uint16
          |           +--rw transmit-delay?        uint16
          |           +--rw lls?                   boolean {lls}?
          |           +--rw ttl-security {ttl-security}?
          |           |  +--rw enabled?  boolean
          |           |  +--rw hops?     uint8
          |           +--rw enabled?               boolean
          |           +--rw authentication
          |           |  +--rw (auth-type-selection)?
          |           |     +--:(ospfv2-auth)
          |           |     |  +--rw ospfv2-auth-trailer-rfc?
          |           |     |  |       ospfv2-auth-trailer-rfc-version
          |           |     |  |        {ospfv2-authentication-trailer}?
          |           |     |  +--rw (ospfv2-auth-specification)?
          |           |     |     +--:(auth-key-chain) {key-chain}?
          |           |     |     |  +--rw ospfv2-key-chain?
          |           |     |     |         key-chain:key-chain-ref
          |           |     |     +--:(auth-key-explicit)
          |           |     |        +--rw ospfv2-key-id?     uint32
          |           |     |        +--rw ospfv2-key?        string
          |           |     |        +--rw ospfv2-crypto-algorithm?
          |           |     |                identityref
          |           |     +--:(ospfv3-auth-ipsec)
          |           |     |      {ospfv3-authentication-ipsec}?
          |           |     |  +--rw sa?                       string
          |           |     +--:(ospfv3-auth-trailer)
          |           |        |  {ospfv3-authentication-trailer}?
          |           |        +--rw (ospfv3-auth-specification)?
          |           |           +--:(auth-key-chain) {key-chain}?
          |           |           |  +--rw ospfv3-key-chain?
          |           |           |          key-chain:key-chain-ref
          |           |           +--:(auth-key-explicit)
          |           |              +--rw ospfv3-sa-id?        uint16
          |           |              +--rw ospfv3-key?          string
          |           |              +--rw ospfv3-crypto-algorithm?
          |           |                      identityref
          |           +--rw cost?               ospf-link-metric
          |           +--rw mtu-ignore?         boolean
          |           |                         {mtu-ignore}?
          |           +--rw prefix-suppression? boolean
          |           |                         {prefix-suppression}?
          |           +--ro state?                 if-state-type
          |           +--ro hello-timer?       rt-types:
          |           |                         rtimer-value-seconds16
          |           +--ro wait-timer?        rt-types:
          |           |                         rtimer-value-seconds16
          |           +--ro dr-router-id?       rt-types:router-id
          |           +--ro dr-ip-addr?         inet:ip-address
          |           +--ro bdr-router-id?      rt-types:router-id
          |           +--ro bdr-ip-addr?        inet:ip-address
          |           +--ro statistics
          |           |  +--ro discontinuity-time?    yang:date-and-time
          |           |  +--ro if-event-count?        yang:counter32
          |           |  +--ro link-scope-lsa-count?  yang:gauge32
          |           |  +--ro link-scope-lsa-cksum-sum?
          |           |                               uint32
          |           |  +--ro database
          |           |     +--ro link-scope-lsa-type*
          |           |        +--ro lsa-type?        uint16
          |           |        +--ro lsa-count?       yang:gauge32
          |           |        +--ro lsa-cksum-sum?   int32
          |           +--ro neighbors
          |           |  +--ro neighbor* [neighbor-router-id]
          |           |     +--ro neighbor-router-id
          |           |                           rt-types:router-id
          |           |     +--ro address?        inet:ip-address
          |           |     +--ro dr-router-id?   rt-types:router-id
          |           |     +--ro dr-ip-addr?     inet:ip-address
          |           |     +--ro bdr-router-id?  rt-types:router-id
          |           |     +--ro bdr-ip-addr?    inet:ip-address
          |           |     +--ro state?          nbr-state-type
          |           |     +--ro dead-timer? rt-types:
          |           |     |                  rtimer-value-seconds16
          |           |     +--ro statistics
          |           |        +--ro discontinuity-time?
          |           |                           yang:date-and-time
          |           |        +--ro nbr-event-count?
          |           |                           yang:counter32
          |           |        +--ro nbr-retrans-qlen?
          |           |                           yang:gauge32
          |           +--ro database
          |           .  +--ro link-scope-lsa-type* [lsa-type]
          |           .     +--ro lsa-type           uint16
          |           .     +--ro link-scope-lsas
          .           .
          .           .
          |           +--rw topologies {ospf:multi-topology}?
          |           |  +--rw topology* [name]
          |           |     +--rw name  -> ../../../../../../../../
          |           |                    ../../../rt:ribs/rib/name
          |           |     +--rw cost? ospf-link-metric
          |           +--rw instance-id?           uint8
          .
          .

2.8. Уведомления OSPF

Эта модель YANG содержит все уведомления, информирующие клиентов YANG о важных событиях при работе протокола. Уведомления включают базовый набор ловушек (trap) из OSPFv2 MIB [RFC4750] и OSPFv3 MIB [RFC5643].

     notifications:
       +---n if-state-change
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro (if-link-type-selection)?
       |  |  +--:(interface)
       |  |  |  +--ro interface
       |  |  |     +--ro interface?   if:interface-ref
       |  |  +--:(virtual-link)
       |  |  |  +--ro virtual-link
       |  |  |     +--ro transit-area-id?      area-id-type
       |  |  |     +--ro neighbor-router-id?   rt-types:router-id
       |  |  +--:(sham-link)
       |  |     +--ro sham-link
       |  |        +--ro area-id?          area-id-type
       |  |        +--ro local-ip-addr?    inet:ip-address
       |  |        +--ro remote-ip-addr?   inet:ip-address
       |  +--ro state?                   if-state-type
       +---n if-config-error
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro (if-link-type-selection)?
       |  |  +--:(interface)
       |  |  |  +--ro interface
       |  |  |     +--ro interface?   if:interface-ref
       |  |  +--:(virtual-link)
       |  |  |  +--ro virtual-link
       |  |  |     +--ro transit-area-id?      area-id-type
       |  |  |     +--ro neighbor-router-id?   rt-types:router-id
       |  |  +--:(sham-link)
       |  |     +--ro sham-link
       |  |        +--ro area-id?          area-id-type
       |  |        +--ro local-ip-addr?    inet:ip-address
       |  |        +--ro remote-ip-addr?   inet:ip-address
       |  +--ro packet-source?           yang:dotted-quad
       |  +--ro packet-type?             packet-type
       |  +--ro error?                   enumeration
       +---n nbr-state-change
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro (if-link-type-selection)?
       |  |  +--:(interface)
       |  |  |  +--ro interface
       |  |  |     +--ro interface?   if:interface-ref
       |  |  +--:(virtual-link)
       |  |  |  +--ro virtual-link
       |  |  |     +--ro transit-area-id?      area-id-type
       |  |  |     +--ro neighbor-router-id?   rt-types:router-id
       |  |  +--:(sham-link)
       |  |     +--ro sham-link
       |  |        +--ro area-id?          area-id-type
       |  |        +--ro local-ip-addr?    inet:ip-address
       |  |        +--ro remote-ip-addr?   inet:ip-address
       |  +--ro neighbor-router-id?      rt-types:router-id
       |  +--ro neighbor-ip-addr?        yang:dotted-quad
       |  +--ro state?                   nbr-state-type
       +---n nbr-restart-helper-status-change
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro (if-link-type-selection)?
       |  |  +--:(interface)
       |  |  |  +--ro interface
       |  |  |     +--ro interface?   if:interface-ref
       |  |  +--:(virtual-link)
       |  |  |  +--ro virtual-link
       |  |  |     +--ro transit-area-id?      area-id-type
       |  |  |     +--ro neighbor-router-id?   rt-types:router-id
       |  |  +--:(sham-link)
       |  |     +--ro sham-link
       |  |        +--ro area-id?          area-id-type
       |  |        +--ro local-ip-addr?    inet:ip-address
       |  |        +--ro remote-ip-addr?   inet:ip-address
       |  +--ro neighbor-router-id?      rt-types:router-id
       |  +--ro neighbor-ip-addr?        yang:dotted-quad
       |  +--ro status?                  restart-helper-status-type
       |  +--ro age?                     rt-types:timer-value-seconds16
       |  +--ro exit-reason?             restart-exit-reason-type
       +---n if-rx-bad-packet
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro (if-link-type-selection)?
       |  |  +--:(interface)
       |  |  |  +--ro interface
       |  |  |     +--ro interface?   if:interface-ref
       |  |  +--:(virtual-link)
       |  |  |  +--ro virtual-link
       |  |  |     +--ro transit-area-id?      area-id-type
       |  |  |     +--ro neighbor-router-id?   rt-types:router-id
       |  |  +--:(sham-link)
       |  |     +--ro sham-link
       |  |        +--ro area-id?          area-id-type
       |  |        +--ro local-ip-addr?    inet:ip-address
       |  |        +--ro remote-ip-addr?   inet:ip-address
       |  +--ro packet-source?           yang:dotted-quad
       |  +--ro packet-type?             packet-type
       +---n lsdb-approaching-overflow
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro ext-lsdb-limit?          uint32
       +---n lsdb-overflow
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro ext-lsdb-limit?          uint32
       +---n nssa-translator-status-change
       |  +--ro routing-protocol-name?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol/name
       |  +--ro address-family?
       |  +     -> /rt:routing/control-plane-protocols/
       |  +         control-plane-protocol[rt:name=current()/../
       |  +         routing-protocol-name]/ospf/address-family
       |  +--ro area-id?                 area-id-type
       |  +--ro status?                  nssa-translator-state-type
       +---n restart-status-change
          +--ro routing-protocol-name?
          +     -> /rt:routing/control-plane-protocols/
          +         control-plane-protocol/name
          +--ro address-family?
          +     -> /rt:routing/control-plane-protocols/
          +         control-plane-protocol[rt:name=current()/../
          +         routing-protocol-name]/ospf/address-family
          +--ro status?                  restart-status-type
          +--ro restart-interval?        uint16
          +--ro exit-reason?             restart-exit-reason-type

2.9. Операции OSPF RPC

Модуль ietf-ospf задаёт две операции RPC.

clear-database

Сброс содержимого конкретной базы OSPF LSDB с переводом отношений смежности в состояние DOWN и повторным созданием собственных анонсов LSA.

clear-neighbor

Сброс конкретного соседа или группы соседей OSPF, связанных с интерфейсом OSPF.
     rpcs:
       +---x clear-neighbor
       |  +---w input
       |     +---w routing-protocol-name
       |     +     -> /rt:routing/control-plane-protocols/
       |     +         control-plane-protocol/name
       |     +---w interface?               if:interface-ref
       +---x clear-database
          +---w input
             +---w routing-protocol-name
                   -> /rt:routing/control-plane-protocols/
                       control-plane-protocol/name

3. Модуль YANG OSPF

Модуль YANG ietf-ospf ссылается на [RFC0905], [RFC1765], [RFC1793], [RFC2328], [RFC3101], [RFC3623], [RFC3630], [RFC4552], [RFC4576], [RFC4577], [RFC4915], [RFC4973], [RFC5082], [RFC5185], [RFC5187], [RFC5250], [RFC5286], [RFC5309], [RFC5329], [RFC5340], [RFC5443], [RFC5613], [RFC5642], [RFC5709], [RFC5714], [RFC5838], [RFC5880], [RFC5881], [RFC6565], [RFC6845], [RFC6860], [RFC6987], [RFC6991], [RFC7166], [RFC7474], [RFC7490], [RFC7684], [RFC7770], [RFC7777], [RFC7884], [RFC8177], [RFC8294], [RFC8343], [RFC8349], [RFC8405], [RFC8476], [RFC9314].

   <CODE BEGINS> file "ietf-ospf@2022-10-19.yang"
   module ietf-ospf {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-ospf";

     prefix ospf;

     import ietf-inet-types {
       prefix inet;
       reference
         "RFC 6991: Common YANG Data Types";
     }

     import ietf-yang-types {
       prefix yang;
       reference
         "RFC 6991: Common YANG Data Types";
     }

     import ietf-interfaces {
       prefix if;
       reference
         "RFC 8343: A YANG Data Model for Interface Management";
     }

     import ietf-routing-types {
       prefix rt-types;
       reference
         "RFC 8294: Common YANG Data Types for the Routing Area";
     }

     import iana-routing-types {
       prefix iana-rt-types;
       reference
         "RFC 8294: Common YANG Data Types for the Routing Area";
     }

     import ietf-routing {
       prefix rt;
       reference
         "RFC 8349: A YANG Data Model for Routing Management
          (NMDA Version)";
     }

     import ietf-key-chain {
       prefix key-chain;
       reference
         "RFC 8177: YANG Data Model for Key Chains";
     }

     import ietf-bfd-types {
       prefix bfd-types;
       reference
         "RFC 9314: YANG Data Model for Bidirectional Forwarding
          Detection (BFD)";
     }

     organization
       "IETF Link State Routing (lsr) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/lsr/> 
        WG List:  <mailto:lsr@ietf.org> 

        Editor:   Derek Yeung
                  <mailto:derek@arrcus.com> 
        Author:   Acee Lindem
                  <mailto:acee@cisco.com> 
        Author:   Yingzhen Qu
                  <mailto:yingzhen.qu@futurewei.com> 
        Author:   Jeffrey Zhang
                  <mailto:zzhang@juniper.net> 
        Author:   Ing-Wher Chen
                  <mailto:ingwherchen@mitre.org>"; 

     description
       "Этот модуль определяет базовую конфигурацию и рабочее состояние
        для протокола OSPF, общие для реализаций всех производителей.
        Предполагается, что производители будут расширять модуль, 
        задавая зависимые от реализации параметры и правила, например,
        карты и политику для маршрутов.

        Эта модель YANG соответствует архитектуре NMDA (RFC 8342).

        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
        указаны заглавными буквами, как показано здесь.

        Авторские права (Copyright (c) 2022) принадлежат IETF Trust и
        лицам, указанным как авторы. Все права защищены.

        Распространение и применение модуля в исходной или двоичной 
        форме с изменениями или без таковых разрешено в соответствии с
        лицензией Simplified BSD License, изложенной в параграфе 4.c
        IETF Trust's Legal Provisions Relating to IETF Documents
        (https://trustee.ietf.org/license-info). 

        Эта версия модуля YANG является частью RFC 9129, где правовые
        аспекты приведены более полно.";

     revision 2022-10-19 {
       description
         "Исходный выпуск.";
       reference
         "RFC 9129: YANG Data Model for the OSPF Protocol";
     }

     feature multi-topology {
       description
         "Поддержка маршрутизации Multi-Topology (MT).";
       reference
         "RFC 4915: Multi-Topology (MT) Routing in OSPF";
     }

     feature multi-area-adj {
       description
         "Поддержка смежности с несколькими областями (RFC 5185).";
       reference
         "RFC 5185: OSPF Multi-Area Adjacency";
     }

     feature explicit-router-id {
       description
         "Явно задаёт Router ID на уровне экземпляра.";
     }

     feature demand-circuit {
       description
         "Поддержка устройств OSPF demand (RFC 1793).";
       reference
         "RFC 1793: Extending OSPF to Support Demand Circuits";
     }

     feature mtu-ignore {
       description
         "Запрет проверки несоответствия MTU для пакетов OSPF 
          Database Description, описанной в спецификации OSPFv2
          (RFC 2328). Проверка применима и к OSPFv3 (RFC 5340).";
       reference
         "RFC 2328: OSPF Version 2, Section 10.6
          RFC 5340: OSPF for IPv6";
     }

     feature lls {
       description
         "Сигнализация OSPF LLS, определённая в RFC 5613.";
       reference
         "RFC 5613: OSPF Link-Local Signaling";
     }

     feature prefix-suppression {
       description
         "Поддержка подавления префиксов OSPF, описанная в RFC 6860.";
       reference
         "RFC 6860: Hiding Transit-Only Networks in OSPF";
     }

     feature ttl-security {
       description
         "Поддержка проверки безопасности OSPF Time TTL.";
       reference
         "RFC 5082: The Generalized TTL Security Mechanism (GTSM)";
     }

     feature nsr {
       description
         "Поддержка безостановочной маршрутизации (NSR). Функция 
          позволяет маршрутизатору с избыточностью плоскости управления
          (например, с двойными платами RP) поддерживать своё состояние
          и смежности при плановом или неплановом перезапуске экземпляра
          OSPF. Это отличается от аккуратного перезапуска и 
          безостановочной пересылки (NSF) тем, что для восстановления
          состоянии плоскости управления не требуется протокол
          сигнализации или содействие соседей OSPF .";
     }

     feature graceful-restart {
       description
         "Аккуратный перезапуск OSPF в соответствии с RFC 3623 и 5187.";
       reference
         "RFC 3623: Graceful OSPF Restart
          RFC 5187: OSPFv3 Graceful Restart";
     }

     feature auto-cost {
       description
         "Расчёт стоимости для интерфейса OSPF по эталонной пропускной
          способности.";
       reference
         "RFC 2328: OSPF Version 2";
     }

     feature max-ecmp {
       description
         "Задаёт максимальное число путей ECMP.";
     }

     feature max-lsa {
       description
         "Максимальной число анонсов LSA, воспринимаемых экземпляром.";
       reference
         "RFC 1765: OSPF Database Overflow";
     }

     feature te-rid {
       description
         "Поддержка настройки TE Router ID, т. е. Router Address TLV 
          (параграф 2.4.1 в RFC 3630) или Router IPv6 Address TLV
          (раздел 3 в RFC 5329).";
       reference
         "RFC 3630: Traffic Engineering (TE) Extensions to
          OSPF Version 2, Section 2.4.1
          RFC 5329: Traffic Engineering Extensions to OSPF Version 3,
          Section 3";
     }

     feature ldp-igp-sync {
       description
         "Синхронизация LDP IGP.";
       reference
         "RFC 5443: LDP IGP Synchronization";
     }

     feature ospfv2-authentication-trailer {
       description
         "Поддержка трейлера аутентификации OSPFv2.";
       reference
         "RFC 5709: OSPFv2 HMAC-SHA Cryptographic Authentication
          RFC 7474: Security Extension for OSPFv2 When
          Using Manual Key Management";
     }

     feature ospfv3-authentication-ipsec {
       description
         "Поддержка IPsec для аутентификации OSPFv3.";
       reference
         "RFC 4552: Authentication/Confidentiality for OSPFv3";
     }

     feature ospfv3-authentication-trailer {
       description
         "Поддержка трейлера аутентификации OSPFv3.";
       reference
         "RFC 7166: Supporting Authentication Trailer for OSPFv3";
     }

     feature fast-reroute {
       description
         "Поддержка IP Fast Reroute (IP-FRR).";
       reference
         "RFC 5714: IP Fast Reroute Framework";
     }

     feature key-chain {
       description
         "Поддержка цепочки ключей для аутентификации.";
       reference
         "RFC 8177: YANG Data Model for Key Chains";
     }

     feature node-flag {
       description
         "Поддержка флагов узла для префиксов OSPF.";
       reference
         "RFC 7684: OSPFv2 Prefix/Link Attribute Advertisement";
     }

     feature node-tag {
       description
         "Поддержка административных флагов узла для экземпляров 
          маршрутизации OSPF.";
       reference
         "RFC 7777: Advertising Node Administrative Tags in OSPF";
     }

     feature lfa {
       description
         "Поддержка Loop-Free Alternate (LFA).";
       reference
         "RFC 5286: Basic Specification for IP Fast Reroute:
          Loop-Free Alternates";
     }

     feature remote-lfa {
       description
         "Поддержка Remote LFA (R-LFA).";
       reference
         "RFC 7490: Remote Loop-Free Alternate (LFA) Fast Reroute
          (FRR)";
     }

     feature stub-router {
       description
         "Поддержка анонсов тупиковых маршрутизаторов OSPF (RFC 6987).";
       reference
         "RFC 6987: OSPF Stub Router Advertisement";
     }

     feature pe-ce-protocol {
       description
         "Поддержка OSPF в качестве протокола PE-CE.";
       reference
         "RFC 4577: OSPF as the Provider/Customer Edge Protocol
          for BGP/MPLS IP Virtual Private Networks (VPNs)
          RFC 6565: OSPFv3 as a Provider Edge to Customer Edge (PE-CE)
          Routing Protocol";
     }

     feature ietf-spf-delay {
       description
         "Поддержка алгоритма задержки IETF SPF.";
       reference
         "RFC 8405: Shortest Path First (SPF) Back-Off Delay Algorithm
          for Link-State IGPs";
     }

     feature bfd {
       description
         "Поддержка BFD для обнаружения доступности соседей OSPF.";
       reference
         "RFC 5880: Bidirectional Forwarding Detection (BFD)
          RFC 5881: Bidirectional Forwarding Detection
          (BFD) for IPv4 and IPv6 (Single Hop)";
     }

     feature hybrid-interface {
       description
         "Поддержка гибридных интерфейсов OSPF.";
       reference
         "RFC 6845: OSPF Hybrid Broadcast and
          Point-to-Multipoint Interface Type";
     }

     identity ospf {
       base rt:routing-protocol;
       description
         "Любая версия протокола OSPF.";
     }

     identity ospfv2 {
       base ospf;
       description
         "Протокол OSPFv2.";
     }

     identity ospfv3 {
       base ospf;
       description
         "Протокол OSPFv3.";
     }

     identity area-type {
       description
         "Базовый идентификатор для типа области OSPF.";
     }

     identity normal-area {
       base area-type;
       description
         "Обычная область OSPF.";
     }

     identity stub-nssa-area {
       base area-type;
       description
         "Тупиковая или NSSA область OSPF.";
     }

     identity stub-area {
       base stub-nssa-area;
       description
         "Тупиковая область OSPF.";
     }

     identity nssa-area {
       base stub-nssa-area;
       description
         "OSPF NSSA.";
       reference
         "RFC 3101: The OSPF Not-So-Stubby Area (NSSA) Option";
     }

     identity ospf-lsa-type {
       description
         "Базовый идентификатор типов LSA для OSPFv2 и OSPFv3.";
     }

     identity ospfv2-lsa-type {
       base ospf-lsa-type;
       description
         "Типы OSPFv2 LSA.";
     }

     identity ospfv2-router-lsa {
       base ospfv2-lsa-type;
       description
         "OSPFv2 Router-LSA - тип 1.";
     }

     identity ospfv2-network-lsa {
       base ospfv2-lsa-type;
       description
         "OSPFv2 Network-LSA - тип 2.";
     }

     identity ospfv2-summary-lsa-type {
       base ospfv2-lsa-type;
       description
         "Типы OSPFv2 summary LSA.";
     }

     identity ospfv2-network-summary-lsa {
       base ospfv2-summary-lsa-type;
       description
         "OSPFv2 Network summary LSA - тип 3.";
     }

     identity ospfv2-asbr-summary-lsa {
       base ospfv2-summary-lsa-type;
       description
         "OSPFv2 ASBR summary LSA - тип 4.";
     }

     identity ospfv2-external-lsa-type {
       base ospfv2-lsa-type;
       description
         "OSPFv2 External-LSA.";
     }

     identity ospfv2-as-external-lsa {
       base ospfv2-external-lsa-type;
       description
         "OSPFv2 AS-External-LSA - тип 5.";
     }

     identity ospfv2-nssa-lsa {
       base ospfv2-external-lsa-type;
       description
         "OSPFv2 NSSA-LSA - тип 7.";
     }

     identity ospfv2-opaque-lsa-type {
       base ospfv2-lsa-type;
       description
         "Типы OSPFv2 Opaque-LSA.";
       reference
         "RFC 5250: The OSPF Opaque LSA Option";
     }

     identity ospfv2-link-scope-opaque-lsa {
       base ospfv2-opaque-lsa-type;
       description
         "OSPFv2 Link-Scope Opaque-LSA - тип 9.";
     }

     identity ospfv2-area-scope-opaque-lsa {
       base ospfv2-opaque-lsa-type;
       description
         "OSPFv2 Area-Scope Opaque-LSA - тип 10.";
     }

     identity ospfv2-as-scope-opaque-lsa {
       base ospfv2-opaque-lsa-type;
       description
         "OSPFv2 AS-Scope Opaque-LSA - тип 11.";
     }

     identity ospfv2-unknown-lsa-type {
       base ospfv2-lsa-type;
       description
         "Неизвестный тип OSPFv2 LSA.";
     }

     identity ospfv3-lsa-type {
       base ospf-lsa-type;
       description
         "Типы OSPFv3 LSA.";
       reference
         "RFC 5340: OSPF for IPv6";
     }

     identity ospfv3-router-lsa {
       base ospfv3-lsa-type;
       description
         "OSPFv3 Router-LSA - тип 0x2001.";
     }

     identity ospfv3-network-lsa {
       base ospfv3-lsa-type;
       description
         "OSPFv3 Network-LSA - тип 0x2002.";
     }

     identity ospfv3-summary-lsa-type {
       base ospfv3-lsa-type;
       description
         "Типы OSPFv3 summary LSA.";
     }

     identity ospfv3-inter-area-prefix-lsa {
       base ospfv3-summary-lsa-type;
       description
         "OSPFv3 Inter-Area-Prefix-LSA - тип 0x2003.";
     }

     identity ospfv3-inter-area-router-lsa {
       base ospfv3-summary-lsa-type;
       description
         "OSPFv3 Inter-Area-Router-LSA - тип 0x2004.";
     }

     identity ospfv3-external-lsa-type {
       base ospfv3-lsa-type;
       description
         "Типы OSPFv3 External-LSA.";
     }

     identity ospfv3-as-external-lsa {
       base ospfv3-external-lsa-type;
       description
         "OSPFv3 AS-External-LSA - тип 0x4005.";
     }

     identity ospfv3-nssa-lsa {
       base ospfv3-external-lsa-type;
       description
         "OSPFv3 NSSA-LSA - тип 0x2007.";
     }

     identity ospfv3-link-lsa {
       base ospfv3-lsa-type;
       description
         "OSPFv3 Link-LSA - тип 0x0008.";
     }

     identity ospfv3-intra-area-prefix-lsa {
       base ospfv3-lsa-type;
       description
         "OSPFv3 Intra-Area-Prefix-LSA - тип 0x2009.";
     }

     identity ospfv3-router-information-lsa {
       base ospfv3-lsa-type;
       description
         "OSPFv3 Router-Information-LSA - тип 0x800C, 0xA00C, 0xC00C.";
     }

     identity ospfv3-unknown-lsa-type {
       base ospfv3-lsa-type;
       description
         "Неизвестный тип OSPFv3 LSA.";
     }

     identity lsa-log-reason {
       description
         "Базовый идентификатор для причины записи LSA.";
     }

     identity lsa-refresh {
       base lsa-log-reason;
       description
         "Идентификатор записи LSA в результате приёма обновления LSA.";
     }

     identity lsa-content-change {
       base lsa-log-reason;
       description
         "Идентификатор записи LSA в результате изменения содержимого.";
     }

     identity lsa-purge {
       base lsa-log-reason;
       description
         "Идентификатор записи LSA в результате очистки.";
     }

     identity informational-capability {
       description
         "Базовый идентификатор возможностей маршрутизатора.";
     }

     identity graceful-restart {
       base informational-capability;
       description
         "Маршрутизатор поддерживает аккуратный перезапуск.";
       reference
         "RFC 3623: Graceful OSPF Restart
          RFC 5187: OSPFv3 Graceful Restart";
     }

     identity graceful-restart-helper {
       base informational-capability;
       description
         "Маршрутизатор способен помогать аккуратному перезапуску.";
       reference
         "RFC 3623: Graceful OSPF Restart
          RFC 5187: OSPFv3 Graceful Restart";
     }

     identity stub-router {
       base informational-capability;
       description
         "Маршрутизатор способен быть тупиковым OSPF stub.";
       reference
         "RFC 6987: OSPF Stub Router Advertisement";
     }

     identity traffic-engineering {
       base informational-capability;
       description
         "Маршрутизатор может поддерживать OSPF TE.";
       reference
         "RFC 3630: Traffic Engineering (TE) Extensions to
          OSPF Version 2
          RFC 5329: Traffic Engineering Extensions to OSPF Version 3";
     }

     identity p2p-over-lan {
       base informational-capability;
       description
         "Маршрутизатор может поддерживать соединения OSPF «точка-точка»
          через ЛВС.";
       reference
         "RFC 5309: Point-to-Point Operation over LAN in Link State
          Routing Protocols";
     }

     identity experimental-te {
       base informational-capability;
       description
         "Маршрутизатор может поддерживать экспериментальный OSPF TE.";
       reference
         "RFC 4973: OSPF-xTE: Experimental Extension to OSPF for
          Traffic Engineering";
     }

     identity router-lsa-bit {
       description
         "Базовый идентификатор для битов Router-LSA.";
     }

     identity vlink-end-bit {
       base router-lsa-bit;
       description
         "Бит V, указывающий, что маршрутизатор является конечной
          точкой одного или нескольких виртуальных каналов.";
     }

     identity asbr-bit {
       base router-lsa-bit;
       description
         "Бит E, указывающий, что маршрутизатор является ASBR.";
     }

     identity abr-bit {
       base router-lsa-bit;
       description
         "Бит B, указывающий, что маршрутизатор является ABR.";
     }

     identity nssa-bit {
       base router-lsa-bit;
       description
         "Бит Nt, указывающий, что маршрутизатор является граничным для
          NSSA и безусловно транслирует NSSA-LSA в AS-External-LSA.";
     }

     identity ospfv3-lsa-option {
       description
         "базовый идентификатор для опций OSPF LSA.";
     }

     identity af-bit {
       base ospfv3-lsa-option;
       description
         "Бит AF, указывающий поддержку маршрутизатором семейств адресов
          OSPFv3, как описано в RFC 5838.";
       reference
         "RFC 5838: Support of Address Families in OSPFv3";
     }

     identity dc-bit {
       base ospfv3-lsa-option;
       description
         "Бит DC, указывающий поддержку demand-устройств.";
     }

     identity r-bit {
       base ospfv3-lsa-option;
       description
         "Бит R, указывающий активность инициатора.";
     }

     identity n-bit {
       base ospfv3-lsa-option;
       description
         "Бит N, указывающий подключение маршрутизатора к NSSA.";
     }

     identity e-bit {
       base ospfv3-lsa-option;
       description
         "Бит E, описывающий способ лавинной рассылки AS-External-LSA.";
     }

     identity v6-bit {
       base ospfv3-lsa-option;
       description
         "Бит V6, сброс которого исключает маршрутизатор/канал из
          расчётов маршрутизации IPv6.";
     }

     identity ospfv3-prefix-option {
       description
         "Базовый идентификатор для опций префиксов OSPFv3.";
     }

     identity nu-bit {
       base ospfv3-prefix-option;
       description
         "Бит NU, указывающий исключение префикса из расчётов 
          IPv6 unicast.";
     }

     identity la-bit {
       base ospfv3-prefix-option;
       description
         "Бит LA, указывающий, что префикс является адресом IPv6
          интерфейса анонсирующего маршрутизатора.";
     }

     identity p-bit {
       base ospfv3-prefix-option;
       description
         "Бит P, указывающий, что префикс NSSA следует транслировать в
          AS-External-LSA и анонсировать транслирующему граничному
          маршрутизатору NSSA.";
     }

     identity dn-bit {
       base ospfv3-prefix-option;
       description
         "Бит DN, указывающий, что Inter-Area-Prefix-LSA или префикс
          AS-External-LSA анонсируется как префикс L3VPN.";
     }

     identity ospfv2-lsa-option {
       description
         "базовый идентификатор для опций OSPFv2 LSA.";
     }

     identity mt-bit {
       base ospfv2-lsa-option;
       description
         "Бит MT, указывающий что маршрутизатор поддерживает несколько
          топологий, как описано в RFC 4915.";
       reference
         "RFC 4915: Multi-Topology (MT) Routing in OSPF";
     }

     identity v2-dc-bit {
       base ospfv2-lsa-option;
       description
         "Бит DC, указывающий поддержку demand-устройств.";
     }

     identity v2-p-bit {
       base ospfv2-lsa-option;
       description
         "Бит P, используемый только для LSA типа 7 и указывающий, что
          граничному маршрутизатору NSSA следует транслировать LSA типа
          7 в LSA типа 5.";
     }

     identity mc-bit {
       base ospfv2-lsa-option;
       description
         "Бит MC, указывающий поддержку маршрутизатором MOSPF.";
     }

     identity v2-e-bit {
       base ospfv2-lsa-option;
       description
         "Бит E, описывающий способ лавинной рассылки AS-External-LSA.";
     }

     identity o-bit {
       base ospfv2-lsa-option;
       description
         "Бит O, указывающий поддержку опции Opaque LSA (RFC 5250).";
       reference
         "RFC 5250: The OSPF Opaque LSA Option";
     }

     identity v2-dn-bit {
       base ospfv2-lsa-option;
       description
         "Бит DN, который должен устанавливаться при передаче LSA типов
          3, 5, 7 от PE к CE (RFC 4576).";
       reference
         "RFC 4576: Using a Link State Advertisement (LSA) Options Bit
          to Prevent Looping in BGP/MPLS IP Virtual Private Networks
          (VPNs)";
     }

     identity ospfv2-extended-prefix-flag {
       description
         "Базовый идентификатор для флага Extended Prefix TLV.";
     }

     identity a-flag {
       base ospfv2-extended-prefix-flag;
       description
         "Флаг присоединения, указывающий что префикс соответствует
          маршруту, напрямую соединённому с анонсирующим 
          маршрутизатором.";
     }

     identity node-flag {
       base ospfv2-extended-prefix-flag;
       description
         "Флаг узла, указывающий, что префикс служит для представления
          анонсирующего узла (т. е. адреса loopback.";
     }

     typedef ospf-metric {
       type uint32 {
         range "0 .. 16777215";
       }
       description
         "Метрика OSPF. 24-битовое целое число без знака.";
     }

     typedef ospf-link-metric {
       type uint16 {
         range "0 .. 65535";
       }
       description
         "метрика канала OSPF.  16-битовое целое число без знака .";
     }

     typedef opaque-id {
       type uint32 {
         range "0 .. 16777215";
       }
       description
         "Opaque-LSA ID. 24-битовое целое число без знака .";
     }

     typedef area-id-type {
       type yang:dotted-quad;
       description
         "Тип Area ID.";
     }

     typedef route-type {
       type enumeration {
         enum intra-area {
           description
             "Внутриобластной маршрут OSPF.";
         }
         enum inter-area {
           description
             "Межобластной маршрут OSPF.";
         }
         enum external-1 {
           description
             "Внешний маршрут OSPF типа 1.";
         }
         enum external-2 {
           description
             "Внешний маршрут OSPF типа 2.";
         }
         enum nssa-1 {
           description
             "Маршрут OSPF NSSA типа 1.";
         }
         enum nssa-2 {
           description
             "Маршрут OSPF NSSA типа 2.";
         }
       }
       description
         "Тип маршрута OSPF.";
     }

     typedef if-state-type {
       type enumeration {
         enum down {
           value 1;
           description
             "Интерфейс в состоянии Down.";
         }
         enum loopback {
           value 2;
           description
             "Интерфейс в состоянии Loopback.";
         }
         enum waiting {
           value 3;
           description
             "Интерфейс в состоянии Waiting.";
         }
         enum point-to-point {
           value 4;
           description
             "Интерфейс в состоянии Point-to-point.";
         }
         enum dr {
           value 5;
           description
             "Интерфейс в состоянии DR.";
         }
         enum bdr {
           value 6;
           description
             "Интерфейс в состоянии Backup.";
         }
         enum dr-other {
           value 7;
           description
             "Интерфейс в состоянии DR Other.";
         }
       }
       description
         "Тип состояния интерфейса OSPF.";
       reference
         "RFC 2328: OSPF Version 2";
     }

     typedef router-link-type {
       type enumeration {
         enum point-to-point-link {
           value 1;
           description
             "Канал «точка-точка» к другому маршрутизатору.";
         }
         enum transit-network-link {
           value 2;
           description
             "Канал в транзитную сеть, указанную DR.";
         }
         enum stub-network-link {
           value 3;
           description
             "Канал в тупиковую сеть (stub), указанную подсетью.";
         }
         enum virtual-link {
           value 4;
           description
             "Виртуальный канал через транзитную область.";
         }
       }
       description
         "Тип канала маршрутизатора OSPF.";
     }

     typedef nbr-state-type {
       type enumeration {
         enum down {
           value 1;
           description
             "Сосед в состоянии Down.";
         }
         enum attempt {
           value 2;
           description
             "Сосед в состоянии Attempt.";
         }
         enum init {
           value 3;
           description
             "Сосед в состоянии Init.";
         }
         enum 2-way {
           value 4;
           description
             "Сосед в состоянии 2-Way.";
         }
         enum exstart {
           value 5;
           description
             "Сосед в состоянии ExStart (начало обмена).";
         }
         enum exchange {
           value 6;
           description
             "Сосед в состоянии Exchange.";
         }
         enum loading {
           value 7;
           description
             "Сосед в состоянии Loading.";
         }
         enum full {
           value 8;
           description
             "Сосед в состоянии Full.";
         }
       }
       description
         "Тип состояния соседа OSPF.";
       reference
         "RFC 2328: OSPF Version 2";
     }

     typedef restart-helper-status-type {
       type enumeration {
         enum not-helping {
           value 1;
           description
             "Состояние помощника в перезапуске not-helping.";
         }
         enum helping {
           value 2;
           description
             "Состояние помощника в перезапуске helping.";
         }
       }
       description
         "Состояние помощника в перезапуске.";
     }

     typedef restart-exit-reason-type {
       type enumeration {
         enum none {
           value 1;
           description
             "Перезапуск не предпринимался.";
         }
         enum in-progress {
           value 2;
           description
             "Перезапуск выполняется.";
         }
         enum completed {
           value 3;
           description
             "Перезапуск завершен.";
         }
         enum timed-out {
           value 4;
           description
             "Тайм-аут при перезапуске.";
         }
         enum topology-changed {
           value 5;
           description
             "Перезапуск прерван из-за изменения топологии.";
         }
       }
       description
         "Описывает результат последней попытки аккуратного перезапуска.
          Локальный маршрутизатор перезапускается или помогает.";
     }

     typedef packet-type {
       type enumeration {
         enum hello {
           value 1;
           description
             "Пакет OSPF Hello.";
         }
         enum database-description {
           value 2;
           description
             "Пакет OSPF Database Description.";
         }
         enum link-state-request {
           value 3;
           description
             "Пакет OSPF Link State Request.";
         }
         enum link-state-update {
           value 4;
           description
             "Пакет OSPF Link State Update.";
         }
         enum link-state-ack {
           value 5;
           description
             "Пакет OSPF Link State Acknowledgment.";
         }
       }
       description
         "Типы пакетов OSPF.";
     }

     typedef nssa-translator-state-type {
       type enumeration {
         enum enabled {
           value 1;
           description
             "NSSATranslatorState enabled.";
         }
         enum elected {
           value 2;
           description
             "NSSATranslatorState elected.";
         }
         enum disabled {
           value 3;
           description
             "NSSATranslatorState disabled.";
         }
       }
       description
         "Тип состояния транслятора OSPF NSSA.";
       reference
         "RFC 3101: The OSPF Not-So-Stubby Area (NSSA) Option";
     }

     typedef restart-status-type {
       type enumeration {
         enum not-restarting {
           value 1;
           description
             "Маршрутизатор не перезапускается.";
         }
         enum planned-restart {
           value 2;
           description
             "Маршрутизатор выполняет плановый перезапуск.";
         }
         enum unplanned-restart {
           value 3;
           description
             "Маршрутизатор выполняет неплановый перезапуск.";
         }
       }
       description
         "Тип состояния аккуратного перезапуска OSPF.";
     }

     typedef fletcher-checksum16-type {
       type string {
         pattern '(0x)?[0-9a-fA-F]{4}';
       }
       description
         "16-битовая контрольная сумма Fletcher в форме строки 0xXXXX.";
       reference
         "RFC 905: ISO Transport Protocol Specification ISO DP 8073";
     }

     typedef ospfv2-auth-trailer-rfc-version {
       type enumeration {
         enum rfc5709 {
           description
             "Поддержка трейлера аутентификации OSPF RFC 5709.";
           reference
             "RFC 5709: OSPFv2 HMAC-SHA Cryptographic Authentication";
         }
         enum rfc7474 {
           description
             "Поддержка трейлера аутентификации OSPF RFC 7474.";
           reference
             "RFC 7474: Security Extension for OSPFv2
              When Using Manual Key Management";
         }
       }
       description
         "Поддержка трейлера аутентификации OSPFv2.";
     }

     grouping tlv {
       description
         "Тип-Размер-Значение (Type-Length-Value или TLV).";
       leaf type {
         type uint16;
         description
           "Тип TLV.";
       }
       leaf length {
         type uint16;
         description
           "Размер TLV в октетах.";
       }
       leaf value {
         type yang:hex-string;
         description
           "Значение TLV.";
       }
     }

     grouping unknown-tlvs {
       description
         "Группировка служит для неизвестных TLV и суб-TLV.";
       container unknown-tlvs {
         description
           "Все неизвестные TLV.";
         list unknown-tlv {
           description
             "Неизвестный TLV.";
           uses tlv;
         }
       }
     }

     grouping node-tag-tlv {
       description
         "Группировка OSPF Node Admin Tag TLV.";
       list node-tag {
         leaf tag {
           type uint32;
           description
             "Значение административного тега узла.";
         }
         description
           "Список тегов.";
       }
     }

     grouping router-capabilities-tlv {
       description
         "Группировка для TLV возможностей маршрутизатора OSPF.";
       reference
         "RFC 7770: Extensions to OSPF for Advertising Optional
          Router Capabilities";
       container router-informational-capabilities {
         leaf-list informational-capabilities {
           type identityref {
             base informational-capability;
           }
           description
             "Список идентификаторов поддерживаемых маршрутизатором 
              информационных возможностей.";
         }
         description
           "Определения OSPF Router Informational Flag.";
       }
       list informational-capabilities-flags {
         leaf informational-flag {
           type uint32;
           description
             "Флаг отдельной информационной возможности.";
         }
         description
           "Список флагов информационных возможностей. Возвращаются все
            32-битовые информационные флаги, независимо от их
            известности устройству.";
       }
       list functional-capabilities {
         leaf functional-flag {
           type uint32;
           description
             "Флаг отдельной функциональной возможности.";
         }
         description
           "Список флагов функциональных возможностей. Возвращаются все
            32-битовые функциональные флаги, независимо от их
            известности устройству.";
       }
     }

     grouping dynamic-hostname-tlv {
       description
         "TLV динамического имени хоста.";
       reference
         "RFC 5642: Dynamic Hostname Exchange Mechanism for OSPF";
       leaf hostname {
         type string {
           length "1..255";
         }
         description
           "Динамическое имя хоста.";
       }
     }

     grouping sbfd-discriminator-tlv {
       description
         "S-BFD Discriminator TLV.";
       reference
         "RFC 7884: OSPF Extensions to Advertise Seamless Bidirectional
          Forwarding Detection (S-BFD) Target Discriminators";
       list sbfd-discriminators {
         leaf sbfd-discriminator {
           type uint32;
           description
             "Индивидуальный S-BFD Discriminator.";
         }
         description
           "Список дискриминаторов S-BFD.";
       }
     }

     grouping maximum-sid-depth-tlv {
       description
         "TLV узла для Maximum SID Depth (MSD).";
       reference
         "RFC 8476: Signaling Maximum SID Depth (MSD) Using OSPF";
       list msd-type {
         leaf msd-type {
           type uint8;
           description
             "Тип MSD.";
         }
         leaf msd-value {
           type uint8;
           description
             "Значение MSD для типа.";
         }
         description
           "Список кортежей MSD.";
       }
     }

     grouping ospf-router-lsa-bits {
       container router-bits {
         leaf-list rtr-lsa-bits {
           type identityref {
             base router-lsa-bit;
           }
           description
             "Список битов Router-LSA, содержащий идентификаторы для 
              всех битов, установленных в Router-LSA.";
         }
         description
           "Биты Router-LSA.";
       }
       description
         "Биты Router-LSA. В настоящее время одинаковы для OSPFv2 и
          OSPFv3, но могут быть разделены будущими дополнениями.";
     }

     grouping ospfv2-router-link {
       description
         "Канал маршрутизатора OSPFv2.";
       leaf link-id {
         type union {
           type inet:ipv4-address;
           type yang:dotted-quad;
         }
         description
           "Router-LSA Link ID.";
       }
       leaf link-data {
         type union {
           type inet:ipv4-address;
           type uint32;
         }
         description
           "Данные канала Router-LSA.";
       }
       leaf type {
         type router-link-type;
         description
           "Тип канала Router-LSA.";
       }
     }

     grouping ospfv2-lsa-body {
       description
         "Тело OSPFv2 LSA.";
       container router {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv2-router-lsa')" {
           description
             "Применимо только к Router-LSA.";
         }
         description
           "Router-LSA.";
         uses ospf-router-lsa-bits;
         leaf num-of-links {
           type uint16;
           description
             "Число каналов в Router-LSA.";
         }
         container links {
           description
             "Все каналы маршрутизатора.";
           list link {
             description
               "Канал Router-LSA.";
             uses ospfv2-router-link;
             container topologies {
               description
                 "Все топологии для канала.";
               list topology {
                 description
                   "Зависящая от топологии информация.";
                 leaf mt-id {
                   type uint8;
                   description
                     "MT-ID для топологии разрешён на канале.";
                 }
                 leaf metric {
                   type uint16;
                   description
                     "Метрика для топологии.";
                 }
               }
             }
           }
         }
       }
       container network {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv2-network-lsa')" {
           description
             "Применимо только к Network-LSA.";
         }
         description
           "Network-LSA.";
         leaf network-mask {
           type yang:dotted-quad;
           description
             "Маска IP-адреса для сети.";
         }
         container attached-routers {
           description
             "Все присоединённые маршрутизаторы.";
           leaf-list attached-router {
             type inet:ipv4-address;
             description
               "Список маршрутизаторов, присоединённых к сети.";
           }
         }
       }
       container summary {
         when "derived-from(../../header/type, "
            + "'ospfv2-summary-lsa-type')" {
           description
             "Применимо только к summary LSA.";
         }
         description
           "Summary LSA.";
         leaf network-mask {
           type inet:ipv4-address;
           description
             "Маска IP-адреса для сети.";
         }
         container topologies {
           description
             "Все топологии для summary LSA.";
           list topology {
             description
               "Зависящая от топологии информация.";
             leaf mt-id {
               type uint8;
               description
                 "MT-ID для топологии разрешён в summary.";
             }
             leaf metric {
               type ospf-metric;
               description
                 "Метрика для топологии.";
             }
           }
         }
       }
       container external {
         when "derived-from(../../header/type, "
            + "'ospfv2-external-lsa-type')" {
           description
             "Применимо только к AS-External-LSA и NSSA-LSA.";
         }
         description
           "External-LSA.";
         leaf network-mask {
           type inet:ipv4-address;
           description
             "Маска IP-адреса для сети.";
         }
         container topologies {
           description
             "Все топологии для External-LSA.";
           list topology {
             description
               "Зависящая от топологии информация.";
             leaf mt-id {
               type uint8;
               description
                 "MT-ID для топологии разрешён для внешних и
                  NSSA-префиксов.";
             }
             leaf flags {
               type bits {
                 bit E {
                   description
                     "Указывает внешнюю метрику типа 2.";
                 }
               }
               description
                 "Флаги топологии.";
             }
             leaf metric {
               type ospf-metric;
               description
                 "Метрика для топологии.";
             }
             leaf forwarding-address {
               type inet:ipv4-address;
               description
                 "Адрес IPv4 Forwarding.";
             }
             leaf external-route-tag {
               type uint32;
               description
                 "Флаг маршрута для топологии.";
             }
           }
         }
       }
       container opaque {
         when "derived-from(../../header/type, "
            + "'ospfv2-opaque-lsa-type')" {
           description
             "Применимо только для Opaque-LSA.";
         }
         description
           "Opaque-LSA.";

         container ri-opaque {
           description
             "OSPF Router-Information-Opaque-LSA.";
           reference
             "RFC 7770: Extensions to OSPF for Advertising Optional
              Router Capabilities";

           container router-capabilities-tlv {
             description
               "Информационные и функциональные возможности 
                маршрутизатора.";
             uses router-capabilities-tlv;
           }

           container node-tag-tlvs {
             description
               "Все Node Admin Tag TLV.";
             list node-tag-tlv {
               description
                 "Node Admin Tag TLV.";
               uses node-tag-tlv;
             }
           }

           container dynamic-hostname-tlv {
             description
               "OSPF Dynamic Hostname TLV.";
             uses dynamic-hostname-tlv;
           }

           container sbfd-discriminator-tlv {
             description
               "OSPF S-BFD Discriminator TLV.";
             uses sbfd-discriminator-tlv;
           }

           container maximum-sid-depth-tlv {
             description
               "OSPF Node MSD TLV.";
             uses maximum-sid-depth-tlv;
           }
           uses unknown-tlvs;
         }

         container te-opaque {
           description
             "OSPFv2 TE Opaque-LSA.";
           reference
             "RFC 3630: Traffic Engineering (TE) Extensions to
              OSPF Version 2";

           container router-address-tlv {
             description
               "TLV с адресом маршрутизатора.";
             leaf router-address {
               type inet:ipv4-address;
               description
                 "Адрес маршрутизатора.";
             }
           }

           container link-tlv {
             description
               "Описывает один канал и состоит из набора суб-TLV.";
             leaf link-type {
               type router-link-type;
               mandatory true;
               description
                 "Тип канала.";
             }
             leaf link-id {
               type union {
                 type inet:ipv4-address;
                 type yang:dotted-quad;
               }
               mandatory true;
               description
                 "Link ID.";
             }
             container local-if-ipv4-addrs {
               description
                 "Все адреса IPv4 локального интерфейса.";
               leaf-list local-if-ipv4-addr {
                 type inet:ipv4-address;
                 description
                   "Список адресов IPv4 локального интерфейса.";
               }
             }
             container remote-if-ipv4-addrs {
               description
                 "Все адреса IPv4 удалённого интерфейса.";
               leaf-list remote-if-ipv4-addr {
                 type inet:ipv4-address;
                 description
                   "Список адресов IPv4 удалённого интерфейса.";
               }
             }
             leaf te-metric {
               type uint32;
               description
                 "TE metric.";
             }
             leaf max-bandwidth {
               type rt-types:bandwidth-ieee-float32;
               description
                 "Максимальная пропускная способность.";
             }
             leaf max-reservable-bandwidth {
               type rt-types:bandwidth-ieee-float32;
               description
                 "Максимальная резервируемая пропускная способность.";
             }
             container unreserved-bandwidths {
               description
                 "Вся незарезервированная пропускная способность.";
               list unreserved-bandwidth {
                 leaf priority {
                   type uint8 {
                     range "0 .. 7";
                   }
                   description
                     "Приоритет от 0 до 7.";
                 }
                 leaf unreserved-bandwidth {
                   type rt-types:bandwidth-ieee-float32;
                   description
                     "Незарезервированная пропускная способность.";
                 }
                 description
                   "Список значение незарезервированной пропускной
                    способности для разных приоритетов.";
               }
             }
             leaf admin-group {
               type uint32;
               description
                 "Административная группа-Класс ресурсов-Цвет.";
             }
             uses unknown-tlvs;
           }
         }

         container extended-prefix-opaque {
           description
             "Все Extended Prefix TLV в LSA.";
           list extended-prefix-tlv {
             description
               "Extended Prefix TLV.";
             leaf route-type {
               type enumeration {
                 enum unspecified {
                   value 0;
                   description
                     "Не задано.";
                 }
                 enum intra-area {
                   value 1;
                   description
                     "Маршрут внутри области OSPF.";
                 }
                 enum inter-area {
                   value 3;
                   description
                     "Маршрут между областями OSPF.";
                 }
                 enum external {
                   value 5;
                   description
                     "Внешний маршрут OSPF.";
                 }
                 enum nssa {
                   value 7;
                   description
                     "Внешний маршрут OSPF NSSA.";
                 }
               }
               description
                 "Тип маршрута.";
             }
             container flags {
               leaf-list extended-prefix-flags {
                 type identityref {
                   base ospfv2-extended-prefix-flag;
                 }
                 description
                   "Список флагов Extended Prefix TLV, содержащий
                    идентификаторы для флагов префикса, устанавливаемые
                    во флагах расширенного префикса.";
               }
               description
                 "Флаги префикса.";
             }
             leaf prefix {
               type inet:ip-prefix;
               description
                 "Адресный префикс.";
             }
             uses unknown-tlvs;
           }
         }

         container extended-link-opaque {
           description
             "Все Extended Link TLV в LSA.";
           reference
             "RFC 7684: OSPFv2 Prefix/Link Attribute Advertisement";
           container extended-link-tlv {
             description
               "Extended Link TLV.";
             uses ospfv2-router-link;
             container maximum-sid-depth-tlv {
               description
                 "OSPF Node MSD TLV.";
               uses maximum-sid-depth-tlv;
             }
             uses unknown-tlvs;
           }
         }
       }
     }

     grouping ospfv3-lsa-options {
       description
         "Опции OSPFv3 LSA.";
       container lsa-options {
         leaf-list lsa-options {
           type identityref {
             base ospfv3-lsa-option;
           }
           description
             "Список опций OSPFv3 LSA, содержащий идентификаторы
              OSPFv3 LSA Option, устанавливаемых для LSA.";
         }
         description
           "Опции OSPFv3 LSA.";
       }
     }

     grouping ospfv3-lsa-prefix {
       description
         "Префикс OSPFv3 LSA.";

       leaf prefix {
         type inet:ip-prefix;
         description
           "Префикс LSA.";
       }
       container prefix-options {
         leaf-list prefix-options {
           type identityref {
             base ospfv3-prefix-option;
           }
           description
             "Список опций префиксов OSPFv3, содержащий идентификаторы
              опций OSPFv3, устанавливаемых для префикса OSPFv3.";
         }
         description
           "Опции префикса.";
       }
     }

     grouping ospfv3-lsa-external {
       description
         "AS-External-LSA or NSSA-LSA.";
       leaf metric {
         type ospf-metric;
         description
           "Метрика AS-External-LSA или NSSA-LSA.";
       }
       leaf flags {
         type bits {
           bit E {
             description
               "Указывает внешнюю метрику типа 2.";
           }
           bit F {
             description
               "Указывает включение пересылающего адреса в LSA.";
           }
           bit T {
             description
               "Указывает включение тега внешнего маршрута в LSA.";
           }
         }
         description
           "Флаги AS-External-LSA или NSSA-LSA.";
       }

       leaf referenced-ls-type {
         type identityref {
           base ospfv3-lsa-type;
         }
         description
           "Referenced Link State (LS) Type.";
         reference
           "RFC 5340: OSPF for IPv6";
       }
       leaf unknown-referenced-ls-type {
         type uint16;
         description
           "Значение для неизвестного Referenced LS Type.";
       }

       uses ospfv3-lsa-prefix;

       leaf forwarding-address {
         type inet:ipv6-address;
         description
           "Адрес IPv6 Forwarding.";
       }

       leaf external-route-tag {
         type uint32;
         description
           "Тег маршрута.";
       }
       leaf referenced-link-state-id {
         type uint32;
         description
           "Referenced Link State ID.";
         reference
           "RFC 5340: OSPF for IPv6";
       }
     }

     grouping ospfv3-lsa-body {
       description
         "Тело OSPFv3 LSA.";
       container router {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-router-lsa')" {
           description
             "Применимо лишь к Router-LSA.";
         }
         description
           "Router-LSA.";
         uses ospf-router-lsa-bits;
         uses ospfv3-lsa-options;

         container links {
           description
             "Все каналы маршрутизатора.";
           list link {
             description
               "Канал Router-LSA.";
             leaf interface-id {
               type uint32;
               description
                 "Interface ID для канала.";
             }
             leaf neighbor-interface-id {
               type uint32;
               description
                 "Interface ID соседа по каналу.";
             }
             leaf neighbor-router-id {
               type rt-types:router-id;
               description
                 "Router ID соседа по каналу.";
             }
             leaf type {
               type router-link-type;
               description
                 "Ти канала: 1 - «точка-точка»
                             2 — транзитная сеть
                             3 — резерв для каналов OSPFv3
                             4 — виртуальный канал.";
             }
             leaf metric {
               type uint16;
               description
                 "Метрика канала.";
             }
           }
         }
       }
       container network {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-network-lsa')" {
           description
             "Применимо только к Network-LSA.";
         }
         description
           "Network-LSA.";

         uses ospfv3-lsa-options;

         container attached-routers {
           description
             "Все присоединённые маршрутизаторы.";
           leaf-list attached-router {
             type rt-types:router-id;
             description
               "Список присоединённых к сети маршрутизаторов.";
           }
         }
       }
       container inter-area-prefix {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-inter-area-prefix-lsa')" {
           description
             "Применимо только к Inter-Area-Prefix-LSA.";
         }
         leaf metric {
           type ospf-metric;
           description
             "Метрика префикса Inter-Area Prefix.";
         }
         uses ospfv3-lsa-prefix;
         description
           "Prefix-LSA.";
       }
       container inter-area-router {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-inter-area-router-lsa')" {
           description
             "Применимо только к Inter-Area-Router-LSA.";
         }
         uses ospfv3-lsa-options;
         leaf metric {
           type ospf-metric;
           description
             "Метрика граничного маршрутизатора AS (ASBR).";
         }
         leaf destination-router-id {
           type rt-types:router-id;
           description
             "Router ID маршрутизатора ASBR из LSA.";
         }
         description
           "Inter-Area-Router-LSA.";
       }
       container as-external {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-as-external-lsa')" {
           description
             "Применимо только к AS-External-LSA.";
         }

         uses ospfv3-lsa-external;

         description
           "AS-External-LSA.";
       }
       container nssa {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-nssa-lsa')" {
           description
             "Применимо только к NSSA-LSA.";
         }
         uses ospfv3-lsa-external;

         description
           "NSSA-LSA.";
       }
       container link {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-link-lsa')" {
           description
             "Применимо только к Link-LSA.";
         }
         leaf rtr-priority {
           type uint8;
           description
             "Приоритет маршрутизатора для выбора DR. Предпочитается
              маршрутизатор с наибольшим значением, 0 указывает, что
              маршрутизатор нежелателен в качестве DR или BDR.";
         }
         uses ospfv3-lsa-options;

         leaf link-local-interface-address {
           type inet:ipv6-address;
           description
             "Адрес link-local интерфейса создавшего анонс 
              маршрутизатора для этого канала.";
         }

         leaf num-of-prefixes {
           type uint32;
           description
             "Число префиксов.";
         }

         container prefixes {
           description
             "Все префиксы для канала.";
           list prefix {
             description
               "Список связанных с каналом префиксов.";
             uses ospfv3-lsa-prefix;
           }
         }
         description
           "Link-LSA.";
       }
       container intra-area-prefix {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-intra-area-prefix-lsa')" {
           description
             "Применимо только к Intra-Area-Prefix-LSA.";
         }
         description
           "Intra-Area-Prefix-LSA.";

         leaf referenced-ls-type {
           type identityref {
             base ospfv3-lsa-type;
           }
           description
             "Referenced LS Type.";
         }
         leaf unknown-referenced-ls-type {
           type uint16;
           description
             "Значение для неизвестного Referenced LS Type.";
         }
         leaf referenced-link-state-id {
           type uint32;
           description
             "Referenced Link State ID.";
         }
         leaf referenced-adv-router {
           type rt-types:router-id;
           description
             "Referenced Advertising Router.";
           reference
             "RFC 5340: OSPF for IPv6";
         }

         leaf num-of-prefixes {
           type uint16;
           description
             "Число префиксов.";
         }
         container prefixes {
           description
             "Все префиксы в этом анонсе LSA.";
           list prefix {
             description
               "Список префиксов в LSA.";
             uses ospfv3-lsa-prefix;
             leaf metric {
               type uint16;
               description
                 "Метрика перфикса.";
             }
           }
         }
       }
       container router-information {
         when "derived-from-or-self(../../header/type, "
            + "'ospfv3-router-information-lsa')" {
           description
             "Применимо только к Router-Information-LSA (RFC 7770).";
           reference
             "RFC 7770: Extensions to OSPF for Advertising Optional
              Router Capabilities";
         }
         container router-capabilities-tlv {
           description
             "Информационные и функциональные возможности 
              маршрутизатора.";
           uses router-capabilities-tlv;
         }
         container node-tag-tlvs {
           description
             "Все Node Admin Tag TLV.";
           list node-tag-tlv {
             description
               "Node Admin Tag TLV.";
             uses node-tag-tlv;
           }
         }
         container dynamic-hostname-tlv {
           description
             "OSPF Dynamic Hostname TLV.";
           uses dynamic-hostname-tlv;
         }

         container sbfd-discriminator-tlv {
           description
             "OSPF S-BFD Discriminator TLV.";
           uses sbfd-discriminator-tlv;
         }

         description
           "Router-Information-LSA.";
         reference
           "RFC 7770: Extensions to OSPF for Advertising Optional
            Router Capabilities";
       }
     }

     grouping lsa-header {
       description
         "LSA для OSPFv2 и OSPFv3.";
       leaf age {
         type uint16;
         mandatory true;
         description
           "Возраст LSA.";
       }
       leaf type {
         type identityref {
           base ospf-lsa-type;
         }
         mandatory true;
         description
           "Тип LSA.";
       }
       leaf adv-router {
         type rt-types:router-id;
         mandatory true;
         description
           "Анонсирующий LSA маршрутизатор.";
       }
       leaf seq-num {
         type uint32;
         mandatory true;
         description
           "Порядковый номер LSA.";
       }
       leaf checksum {
         type fletcher-checksum16-type;
         mandatory true;
         description
           "Контрольная сумма LSA.";
       }
       leaf length {
         type uint16;
         mandatory true;
         description
           "Размер LSA с учётом заголовка.";
       }
     }

     grouping ospfv2-lsa {
       description
         "OSPFv2 LSA. Анонсы LSA однозначно указываются триплетом
          <LSA Type, Link State ID, Advertising Router> с разделением
          экземпляров по порядковым номерам LSA.";
       container header {
         must "(derived-from(type, "
            + "'ospfv2-opaque-lsa-type') and "
            + "opaque-id and opaque-type) or "
            + "(not(derived-from(type, "
            + "'ospfv2-opaque-lsa-type')) "
            + "and not(opaque-id) and not(opaque-type))" {
           description
             "Значение opaque-type и opaque-id применимы лишь 
              к Opaque-LSA.";
         }
         description
           "Декодированные данные заголовка OSPFv2 LSA.";

         container lsa-options {
           leaf-list lsa-options {
             type identityref {
               base ospfv2-lsa-option;
             }
             description
               "Список опций LSA, содержащий идентификаторы 
                установленных опций OSPFv2 LSA.";
           }
           description
             "Опции LSA.";
         }

         leaf lsa-id {
           type yang:dotted-quad;
           mandatory true;
           description
             "Link State ID.";
         }

         leaf opaque-type {
           type uint8;
           description
             "Тип Opaque-LSA.";
         }

         leaf opaque-id {
           type opaque-id;
           description
             "Opaque-LSA ID.";
         }

         uses lsa-header;
       }
       container body {
         description
           "Декодированные данные тела OSPFv2 LSA.";
         uses ospfv2-lsa-body;
       }
     }

     grouping ospfv3-lsa {
       description
         "Декодированный анонс OSPFv3 LSA.";
       container header {
         description
           "Декодированные данные заголовка OSPFv3 LSA.";
         leaf lsa-id {
           type uint32;
           mandatory true;
           description
             "OSPFv3 LSA ID.";
         }
         uses lsa-header;
       }
       container body {
         description
           "Декодированные данные тела OSPF LSA.";
         uses ospfv3-lsa-body;
       }
     }
     grouping lsa-common {
       description
         "Общие поля для представления OSPF LSA.";
       leaf decode-completed {
         type boolean;
         description
           "Тело OSPF LSA было декодировано за исключением
            неизвестных TLV. Типы неизвестных LSA и OSPFv2 Opaque-LSA
            не декодированы. Некорректно сформированные LSA обычно не
            воспринимаются м не включаются в LSDB.";
       }
       leaf raw-data {
         type yang:hex-string;
         description
           "Шестнадцатеричное представление полного анонса LSA, как
            он получен или передан, с сетевым порядком байтов.";
       }
     }

     grouping lsa {
       description
         "OSPF LSA.";
       uses lsa-common;
       choice version {
         description
           "Тело OSPFv2 или OSPFv3 LSA.";
         container ospfv2 {
           description
             "OSPFv2 LSA.";
           uses ospfv2-lsa;
         }
         container ospfv3 {
           description
             "OSPFv3 LSA.";
           uses ospfv3-lsa;
         }
       }
     }

     grouping lsa-key {
       description
         "Ключ OSPF LSA. Ключ базы данных для каждого анонса LSA данного
          типа в базе LSDB.";
       leaf lsa-id {
         type union {
           type yang:dotted-quad;
           type uint32;
         }
         description
           "Link State ID.";
       }
       leaf adv-router {
         type rt-types:router-id;
         description
           "Анонсирующий маршрутизатор.";
       }
     }

     grouping instance-stat {
       description
         "Статистика для экземпляра.";
       leaf discontinuity-time {
         type yang:date-and-time;
         description
           "Время последнего события, когда один или несколько счётчиков
            этого экземпляра OSPF столкнулись с разрывом. Если разрывов
            не было с момента последней реинициализации экземпляра OSPF,
            узел содержит время инициализации, которое обычно происходит
            при создании экземпляра OSPF.";
       }
       leaf originate-new-lsa-count {
         type yang:counter32;
         description
           "Число созданных LSA. Разрыв этого счётчика может происходить
            при реинициализации экземпляра OSPF.";
       }
       leaf rx-new-lsas-count {
         type yang:counter32;
         description
           "Число принятых новых LSA.  Разрыв этого счётчика может
            происходить при реинициализации экземпляра OSPF.";
       }
       leaf as-scope-lsa-count {
         type yang:gauge32;
         description
           "Число AS-Scope LSA.";
       }
       leaf as-scope-lsa-chksum-sum {
         type uint32;
         description
           "Сумма по модулю 2^32 контрольных сумм LSA для AS-Scope LSA.
            Значение при сравнении следует считать беззнаковым. Хотя
            разные контрольные суммы относятся к разным комбинациям LSA,
            эквивалентные контрольные суммы не гарантируют совпадения
            LSA, поскольку разные комбинации могут давать одну
            контрольную сумму.";
       }
       container database {
         description
           "Контейнер для статистики на уровне AS-Scope LSA.";
         list as-scope-lsa-type {
           description
             "Список статистики AS-Scope LSA.";
           leaf lsa-type {
             type uint16;
             description
               "Тип AS-Scope LSA.";
           }
           leaf lsa-count {
             type yang:gauge32;
             description
               "Число LSA этого типа.";
           }
           leaf lsa-cksum-sum {
             type uint32;
             description
               "Сумма по модулю 2^32 контрольных сумм LSA для LSA этого
                типа. Значение при сравнении следует считать 
                беззнаковым. Хотя разные контрольные суммы относятся к 
                разным комбинациям LSA, эквивалентные контрольные суммы
                не гарантируют совпадения LSA, поскольку разные 
                комбинации могут давать одну контрольную сумму.";
           }
         }
       }
       uses instance-fast-reroute-state;
     }

     grouping area-stat {
       description
         "Per-area statistics.";
       leaf discontinuity-time {
         type yang:date-and-time;
         description
           "Время последнего события, когда один или несколько счётчиков
            этой области OSPF столкнулись с разрывом. Если разрывов
            не было с момента последней реинициализации области OSPF,
            узел содержит время инициализации, которое обычно происходит
            при создании области OSPF.";
       }
       leaf spf-runs-count {
         type yang:counter32;
         description
           "Число запусков внутриобластного алгоритма SPF. Разрыв этого
            счётчика может возникать при реинициализации области OSPF.";
       }
       leaf abr-count {
         type yang:gauge32;
         description
           "Число доступных в области граничных маршрутизаторов (ABR).";
       }
       leaf asbr-count {
         type yang:gauge32;
         description
           "Общее число граничных маршрутизаторов AS (ASBR), доступных
            внутри этой области.";
       }
       leaf ar-nssa-translator-event-count {
         type yang:counter32;
         description
           "Общее число изменения состояния транслятора NSSA. Разрыв 
            счётчика может возникать при реинициализации области OSPF.";
       }
       leaf area-scope-lsa-count {
         type yang:gauge32;
         description
           "Число Area-scope LSA в области.";
       }
       leaf area-scope-lsa-cksum-sum {
         type uint32;
         description
           "Сумма по модулю 2^32 контрольных сумм LSA для Area-scope LSA
            Значение при сравнении следует считать беззнаковым. Хотя
            разные контрольные суммы относятся к разным комбинациям LSA, 
            эквивалентные контрольные суммы не гарантируют совпадения 
            LSA, поскольку разные комбинации могут давать одну 
            контрольную сумму.";
       }
       container database {
         description
           "Контейнер для статистики Area-scope LSA.";
         list area-scope-lsa-type {
           description
             "Список статистики Area-scope LSA.";
           leaf lsa-type {
             type uint16;
             description
               "Тип Area-scope LSA.";
           }
           leaf lsa-count {
             type yang:gauge32;
             description
               "Число LSA этого типа.";
           }
           leaf lsa-cksum-sum {
             type uint32;
             description
               "Сумма по модулю 2^32 контрольных сумм LSA для LSA этого
                типа. Значение при сравнении следует считать 
                беззнаковым. Хотя разные контрольные суммы относятся к 
                разным комбинациям LSA, эквивалентные контрольные суммы
                не гарантируют совпадения LSA, поскольку разные 
                комбинации могут давать одну контрольную сумму.";
           }
         }
       }
     }

     grouping interface-stat {
       description
         "Per-interface statistics.";
       leaf discontinuity-time {
         type yang:date-and-time;
         description
           "Время последнего события, когда один или несколько счётчиков
            этого интерфейса OSPF столкнулись с разрывом. Если разрывов
            не было с момента последней реинициализации интерфейса OSPF,
            узел содержит время инициализации, которое обычно происходит
            при создании интерфейса OSPF.";
       }
       leaf if-event-count {
         type yang:counter32;
         description
           "Число изменений состояния интерфейса или ошибок на нем.
            Разрыв счётчика может возникать при реинициализации
            интерфейса OSPF.";
       }
       leaf link-scope-lsa-count {
         type yang:gauge32;
         description
           "Число Link-scope LSA.";
       }
       leaf link-scope-lsa-cksum-sum {
         type uint32;
         description
           "Сумма по модулю 2^32 контрольных сумм LSA для Link-scope LSA
            Значение при сравнении следует считать беззнаковым. Хотя
            разные контрольные суммы относятся к разным комбинациям LSA, 
            эквивалентные контрольные суммы не гарантируют совпадения 
            LSA, поскольку разные комбинации могут давать одну 
            контрольную сумму.";
       }
       container database {
         description
           "Контейнер для статистики Link-scope LSA.";
         list link-scope-lsa-type {
           description
             "Список статистики Link-scope LSA.";
           leaf lsa-type {
             type uint16;
             description
               "Тип Link-scope LSA.";
           }
           leaf lsa-count {
             type yang:gauge32;
             description
               "Число LSA этого типа.";
           }
           leaf lsa-cksum-sum {
             type uint32;
             description
               "Сумма по модулю 2^32 контрольных сумм LSA для LSA этого
                типа. Значение при сравнении следует считать 
                беззнаковым. Хотя разные контрольные суммы относятся к 
                разным комбинациям LSA, эквивалентные контрольные суммы
                не гарантируют совпадения LSA, поскольку разные 
                комбинации могут давать одну контрольную сумму.";
           }
         }
       }
     }

     grouping neighbor-stat {
       description
         "Статистика на уровне соседа.";
       leaf discontinuity-time {
         type yang:date-and-time;
         description
           "Время последнего события, когда один или несколько счётчиков
            для этого соседа OSPF столкнулись с разрывом. Если разрывов
            не было с момента последней реинициализации соседа OSPF,
            узел содержит время инициализации, которое обычно происходит
            при динамическом обнаружении соседа OSPF.";
       }
       leaf nbr-event-count {
         type yang:counter32;
         description
           "Число изменений состояния соседа или ошибок для него.
            Разрыв счётчика может возникать при реинициализации
            соседа OSPF.";
       }
       leaf nbr-retrans-qlen {
         type yang:gauge32;
         description
           "Текущий размер очереди на повтор передачи.";
       }
     }

     grouping instance-fast-reroute-config {
       description
         "Эта группа задаёт глобальную конфигурацию 
          IP Fast Reroute (IP-FRR).";
       container fast-reroute {
         if-feature "fast-reroute";
         description
           "Этот контейнер может дополняться глобальными параметрами
            для IP-FRR.";
         container lfa {
           if-feature "lfa";
           description
             "Этот контейнер может дополняться глобальными параметрами
              для Loop-Free Alternate (LFA). Создание контейнера не
              влияет на активацию LFA.";
         }
       }
     }

     grouping instance-fast-reroute-state {
       description
         "Группировка данных состояния IP-FRR.";

       container protected-routes {
         if-feature "fast-reroute";
         config false;
         description
           "Статистика защиты экземпляра.";

         list address-family-stats {
           key "address-family prefix alternate";
           description
             "Сведения о защищённом префиксе на семейство адресов.";

           leaf address-family {
             type iana-rt-types:address-family;
             description
               "Семейство адресов.";
           }
           leaf prefix {
             type inet:ip-prefix;
             description
               "Защищённый префикс.";
           }
           leaf alternate {
             type inet:ip-address;
             description
               "Другой next-hop для префикса.";
           }
           leaf alternate-type {
             type enumeration {
               enum equal-cost {
                 description
                   "Вариант на основе ECMP.";
               }
               enum lfa {
                 description
                   "Вариант на основе LFA.";
               }
               enum remote-lfa {
                 description
                   "Вариант на основе Remote-LFA.";
               }
               enum tunnel {
                 description
                   "Вариант на основе туннеля (RSVP-TE или GRE).";
               }
               enum ti-lfa {
                 description
                   "Вариант на основе TI-LFA.";
               }
               enum mrt {
                 description
                   "Вариант на основе MRT.";
               }
               enum other {
                 description
                   "Вариант неизвестного типа.";
               }
             }
             description
               "Тип варианта.";
           }
           leaf best {
             type boolean;
             description
               "Указывает предпочтительность этого варианта.";
           }
           leaf non-best-reason {
             type string {
               length "1..255";
             }
             description
               "Описывает причину того, что вариант не является
                лучшим выбором.";
           }
           leaf protection-available {
             type bits {
               bit node-protect {
                 position 0;
                 description
                   "Доступна защита узла.";
               }
               bit link-protect {
                 position 1;
                 description
                   "Доступна защита канала.";
               }
               bit srlg-protect {
                 position 2;
                 description
                   "Доступна защита SRLG.";
               }
               bit downstream-protect {
                 position 3;
                 description
                   "Доступна защита нисходящего направления.";
               }
               bit other {
                 position 4;
                 description
                   "Доступна иная защита.";
               }
             }
             description
               "Защита обеспечивается вариантом (альтернативой).";
           }
           leaf alternate-metric-1 {
             type uint32;
             description
               "Метрика от точки локального ремонта (PLR) до адресата
                по альтернативному пути.";
           }
           leaf alternate-metric-2 {
             type uint32;
             description
               "Метрика от PLR до альтернативного узла.";
           }
           leaf alternate-metric-3 {
             type uint32;
             description
               "Метрика от альтернативного узла до адресата.";
           }
         }
       }

       container unprotected-routes {
         if-feature "fast-reroute";
         config false;
         description
           "Список незащищённых префиксов.";

         list address-family-stats {
           key "address-family prefix";
           description
             "Статистика незащищённых префиксов на AF.";

           leaf address-family {
             type iana-rt-types:address-family;
             description
               "Семейство адресов.";
           }
           leaf prefix {
             type inet:ip-prefix;
             description
               "Незащищённый префикс.";
           }
         }
       }

       list protection-statistics {
         key "frr-protection-method";
         config false;
         description
           "Список статистики методов защиты.";

         leaf frr-protection-method {
           type string;
           description
             "Используемый метод защиты.";
         }
         list address-family-stats {
           key "address-family";
           description
             "Статистика защиты на AF.";

           leaf address-family {
             type iana-rt-types:address-family;
             description
               "Семейство адресов.";
           }
           leaf total-routes {
             type uint32;
             description
               "Общее число префиксов.";
           }
           leaf unprotected-routes {
             type uint32;
             description
               "Общее число незащищённых префиксов.";
           }
           leaf protected-routes {
             type uint32;
             description
               "Общее число защищённых префиксов.";
           }
           leaf linkprotected-routes {
             type uint32;
             description
               "Общее число префиксов с защитой канала.";
           }
           leaf nodeprotected-routes {
             type uint32;
             description
               "Общее число защищённых префиксов.";
           }
         }
       }
     }

     grouping interface-fast-reroute-config {
       description
         "Эта группа определяет конфигурацию интерфейса IP-FRR.";
       container fast-reroute {
         if-feature "fast-reroute";
         container lfa {
           if-feature "lfa";
           leaf candidate-enabled {
             type boolean;
             default "true";
             description
               "Разрешает применять интерфейс как резервный.";
           }
           leaf enabled {
             type boolean;
             default "false";
             description
               "Активирует LFA. Предполагается расчёт LFA на префикс.";
           }
           container remote-lfa {
             if-feature "remote-lfa";
             leaf enabled {
               type boolean;
               default "false";
               description
                 "Активирует Remote LFA (R-LFA).";
             }
             description
               "Конфигурация R-LFA.";
           }
           description
             "Конфигурация LFA.";
         }
         description
           "Конфигурация интерфейса IP-FRR.";
       }
     }

     grouping interface-physical-link-config {
       description
         "Конфигурация стоимости интерфейса, применяемая только к
          физическим (не виртуальным) интерфейсам и и sham-каналам.";
       leaf cost {
         type ospf-link-metric;
         description
           "Стоимость интерфейса.";
       }
       leaf mtu-ignore {
         if-feature "mtu-ignore";
         type boolean;
         description
           "Управляет обходом проверки несоответствия MTU для пакетов
            Database Description (параграф 10.6 в RFC 2328).";
         reference
           "RFC 2328: OSPF Version 2, Section 10.6";
       }
       leaf prefix-suppression {
         if-feature "prefix-suppression";
         type boolean;
         description
           "Подавляет анонсы префиксов, связанных с интерфейсом.";
       }
     }

     grouping interface-common-config {
       description
         "Общая конфигурация для всех типов интерфейсов, включая
          виртуальные и sham-каналы (фиктивные).";

       leaf hello-interval {
         type uint16;
         units "seconds";
         description
           "Интервал между пакетами Hello (в секундах), который должен
            совпадать для всех маршрутизаторов в одной сети. Разные
            реализации и развёртывания применяют разные интервалы Hello.
            Примером значения для ЛВС служит интервал в 10 секунд.";
         reference
           "RFC 2328: OSPF Version 2, Appendix C.3";
       }

       leaf dead-interval {
         type uint16;
         units "seconds";
         must '../dead-interval > ../hello-interval' {
           error-message "Интервал «умирания» (dead) должен быть "
                       + "больше интервала Hello";
           description
             "Значение должно быть больше hello-interval.";
         }
         description
           "Интервал, после которого сосед считается отключённым 
            (в секундах), если от него нет пакетов Hello. Обычно это
            в 3 - 4 раза больше hello-interval. Типовое значение для
            ЛВС составляет 40 секунд.";
         reference
           "RFC 2328: OSPF Version 2, Appendix C.3";
       }

       leaf retransmit-interval {
         type uint16 {
           range "1..3600";
         }
         units "seconds";
         description
           "Интервал повтора неподтвержденных анонсов LSA (в секундах).
            Значение должно быть больше RTT между любыми двумя 
            маршрутизаторами в сети. Примером служит значение 5 сек.";
         reference
           "RFC 2328: OSPF Version 2, Appendix C.3";
       }

       leaf transmit-delay {
         type uint16;
         units "seconds";
         description
           "Оценка времени передачи пакетов обновления состояния канала
            (LSU) на интерфейсе (в секундах). Возраст LSA увеличивается
            на это значение при анонсировании через интерфейс. Примером
            значения является 1 секунда.";
         reference
           "RFC 2328: OSPF Version 2, Appendix C.3";
       }

       leaf lls {
         if-feature "lls";
         type boolean;
         description
           "Управляет поддержкой сигнализации LLS.";
       }

       container ttl-security {
         if-feature "ttl-security";
         description
           "Проверка безопасности TTL.";
         leaf enabled {
           type boolean;
           description
             "Управляет проверкой безопасности TTL.";
         }
         leaf hops {
           type uint8 {
             range "1..254";
           }
           default "1";
           description
             "Максимальное число пересылок (hop), которые пакет OSPF
              может пройти до получения.";
         }
       }
       leaf enabled {
         type boolean;
         default "true";
         description
           "Управляет протоколом OSPF на интерфейсе.";
       }

       container authentication {
         description
           "Конфигурация проверки подлинности.";
         choice auth-type-selection {
           description
             "Опции для настройки аутентификации OSPFv2/OSPFv3.";
           case ospfv2-auth {
             when "derived-from-or-self(../../../../../../rt:type, "
                + "'ospfv2')" {
               description
                 "Применимо только к OSPFv2.";
             }
             leaf ospfv2-auth-trailer-rfc {
               if-feature "ospfv2-authentication-trailer";
               type ospfv2-auth-trailer-rfc-version;
               description
                 "Поддержка трейлера аутентификации OSPFv2 (RFC 5709
                  и RFC 7474).";
               reference
                 "RFC 5709: OSPFv2 HMAC-SHA Cryptographic Authentication
                  RFC 7474: Security Extension for OSPFv2 When Using
                  Manual Key Management";
             }
             choice ospfv2-auth-specification {
               description
                 "Указание цепочки ключей или явных параметров ключа.";
               case auth-key-chain {
                 if-feature "key-chain";
                 leaf ospfv2-key-chain {
                   type key-chain:key-chain-ref;
                   description
                     "Имя цепочки ключей.";
                 }
               }
               case auth-key-explicit {
                 leaf ospfv2-key-id {
                   type uint32;
                   description
                     "Идентификатор ключа.";
                 }
                 leaf ospfv2-key {
                   type string;
                   description
                     "Ключ аутентификации OSPFv2. Размер ключа может
                      зависеть от применяемого алгоритма.";
                 }
                 leaf ospfv2-crypto-algorithm {
                   type identityref {
                     base key-chain:crypto-algorithm;
                   }
                   description
                     "Криптоалгоритм, связанный с ключом.";
                 }
               }
             }
           }
           case ospfv3-auth-ipsec {
             when "derived-from-or-self(../../../../../../rt:type, "
                + "'ospfv3')" {
               description
                 "Применимо только к OSPFv3.";
             }
             if-feature "ospfv3-authentication-ipsec";
             leaf sa {
               type string;
               description
                 "Имя защищённой связи (SA).";
             }
           }
           case ospfv3-auth-trailer {
             when "derived-from-or-self(../../../../../../rt:type, "
                + "'ospfv3')" {
               description
                 "Применимо только к OSPFv3.";
             }
             if-feature "ospfv3-authentication-trailer";
             choice ospfv3-auth-specification {
               description
                 "Указание цепочки ключей или явных параметров ключа.";
               case auth-key-chain {
                 if-feature "key-chain";
                 leaf ospfv3-key-chain {
                   type key-chain:key-chain-ref;
                   description
                     "Имя цепочки ключей.";
                 }
               }
               case auth-key-explicit {
                 leaf ospfv3-sa-id {
                   type uint16;
                   description
                 "Имя защищённой связи (SA).";
                 }
                 leaf ospfv3-key {
                   type string;
                   description
                     "Ключ аутентификации OSPFv3. Размер ключа может
                      зависеть от применяемого алгоритма.";
                 }
                 leaf ospfv3-crypto-algorithm {
                   type identityref {
                     base key-chain:crypto-algorithm;
                   }
                   description
                     "Криптоалгоритм, связанный с ключом.";
                 }
               }
             }
           }
         }
       }
     }

     grouping interface-config {
       description
         "Конфигурация для обычных интерфейсов OSPF (не виртуальных
          или фиктивных - sham).";

       leaf interface-type {
         type enumeration {
           enum broadcast {
             description
               "Широковещательная сеть с множественным доступом.";
           }
           enum non-broadcast {
             description
               "Сеть с множественным доступом без широковещания (NBMA).";
           }
           enum point-to-multipoint {
             description
               "Сеть «один со многими» (point-to-multipoint).";
           }
           enum point-to-point {
             description
                "Сеть «точка-точка».";
              "Specifies an OSPF point-to-point network.";
           }
           enum hybrid {
             if-feature "hybrid-interface";
             description
               "Гибридная сеть (широковещание/point-to-multipoint).";
           }
         }
         description
           "Тип интерфейса.";
       }

       leaf passive {
         type boolean;
         description
           "Управляет пассивным интерфейсом. Префикс пассивного
            интерфейса анонсируется, но смежность не создается.";
       }

       leaf demand-circuit {
         if-feature "demand-circuit";
         type boolean;
         description
           "Управляет demand-устройством.";
       }

       leaf priority {
         type uint8;
         description
           "Задаёт приоритет маршрутизатора OSPF. В сети с множественным
            доступом это служит для выбора DR. На интерфейсах других
            типов приоритет игнорируется. Маршрутизатор с высоким 
            приоритетом предпочитается при выборе. Значение 0 указывает,
            что маршрутизатору нежелательно быть DR или BDR.";
       }

       container multi-areas {
         if-feature "multi-area-adj";
         description
           "Контейнер для конфигурации с множеством областей.";
         list multi-area {
           key "multi-area-id";
           description
             "Настраивает смежность между областями OSPF.";
           leaf multi-area-id {
             type area-id-type;
             description
               "Идентификатор области для смежности областей.";
           }
           leaf cost {
             type ospf-link-metric;
             description
               "Стоимость интерфейса для смежности областей.";
           }
         }
       }

       container static-neighbors {
         description
           "Статически заданные соседи.";

         list neighbor {
           key "identifier";
           description
             "Статически заданный сосед OSPF.";

           leaf identifier {
             type inet:ip-address;
             description
               "Router ID, адрес IPv4 или IPv6 у соседа.";
           }

           leaf cost {
             type ospf-link-metric;
             description
               "Стоимость интерфейса. Разные реализации по умолчанию 
                задают разную стоимость, при этом у некоторых стоимость
                обратно пропорциональная значения. Некоторые задают по
                умолчанию 1, считая стоимостью число пересылок (hop).";
           }
           leaf poll-interval {
             type uint16;
             units "seconds";
             description
               "Интервал опроса (в секундах) для отправки пакетов
                OSPF Hello с целью обнаружения соседей в сети NBMA.
                Этот интервал задаёт детализацию поиска новых соседей.
                Примером может служить интервал 120 секунд (2 минуты)
                для унаследованных пакетных сетей (PDN) X.25.";
             reference
               "RFC 2328: OSPF Version 2, Appendix C.5";
           }
           leaf priority {
             type uint8;
             description
               "Приоритет соседа при выборе DR. Маршрутизатор с высоким 
                приоритетом предпочитается при выборе, 0, указывает,
                что маршрутизатору нежелательно быть DR или BDR.";
           }
         }
       }

       leaf node-flag {
         if-feature "node-flag";
         type boolean;
         default "false";
         description
           "Набор префиксов, указывающих анонсирующий маршрутизатор.";
         reference
           "RFC 7684: OSPFv2 Prefix/Link Attribute Advertisement";
       }

       container bfd {
         if-feature "bfd";
         description
           "Конфигурация интерфейса BFD.";
         uses bfd-types:client-cfg-parms;
         reference
           "RFC 5880: Bidirectional Forwarding Detection (BFD)
            RFC 5881: Bidirectional Forwarding Detection
            (BFD) for IPv4 and IPv6 (Single Hop)
            RFC 9314: YANG Data Model for Bidirectional Forwarding
            Detection (BFD)";
       }

       uses interface-fast-reroute-config;
       uses interface-common-config;
       uses interface-physical-link-config;
     }

     grouping neighbor-state {
       description
         "Рабочее состояние соседа OSPF.";

       leaf address {
         type inet:ip-address;
         config false;
         description
           "Адрес соседа.";
       }
       leaf dr-router-id {
         type rt-types:router-id;
         config false;
         description
           "Router ID у DR соседа.";
       }

       leaf dr-ip-addr {
         type inet:ip-address;
         config false;
         description
           "Адрес IP у DR соседа.";
       }

       leaf bdr-router-id {
         type rt-types:router-id;
         config false;
         description
          "Router ID у BDR соседа.";
       }

       leaf bdr-ip-addr {
         type inet:ip-address;
         config false;
         description
           "Адрес IP у BDR соседа.";
       }
       leaf state {
         type nbr-state-type;
         config false;
         description
           "Состояние соседа OSPF.";
       }
       leaf cost {
         type ospf-link-metric;
         config false;
         description
           "Стоимость доступа к соседу для сетей point-to-multipoint
            и Hybrid.";
       }
       leaf dead-timer {
         type rt-types:timer-value-seconds16;
         config false;
         description
           "Таймер, отслеживающий оставшееся время до момента, когда
            сосед будет сочтён «мертвым».";
       }
       container statistics {
         config false;
         description
           "Статистика для соседа.";
         uses neighbor-stat;
       }
     }

     grouping interface-common-state {
       description
         "Базовое рабочее состояние интерфейса OSPF.";
       reference
         "RFC 2328: OSPF Version 2, Section 9";

       leaf state {
         type if-state-type;
         config false;
         description
           "Состояние интерфейса.";
       }

       leaf hello-timer {
         type rt-types:timer-value-seconds16;
         config false;
         description
           "Таймер, отслеживающий оставшееся время до момента отправки
            через интерфейс следующего сообщения Hello.";
       }

       leaf wait-timer {
         type rt-types:timer-value-seconds16;
         config false;
         description
           "Таймер, отслеживающий оставшееся время до момента выхода
            интерфейса из состояния Waiting.";
       }

       leaf dr-router-id {
         type rt-types:router-id;
         config false;
         description
           "DR Router ID.";
       }

       leaf dr-ip-addr {
         type inet:ip-address;
         config false;
         description
           "IP-адрес DR.";
       }

       leaf bdr-router-id {
         type rt-types:router-id;
         config false;
         description
           "BDR Router ID.";
       }

       leaf bdr-ip-addr {
         type inet:ip-address;
         config false;
         description
           "IP-адрес BDR.";
       }

       container statistics {
         config false;
         description
           "Статистика для интерфейса.";
         uses interface-stat;
       }

       container neighbors {
         config false;
         description
           "Все соседи на интерфейсе.";
         list neighbor {
           key "neighbor-router-id";
           description
             "Список соседей OSPF на интерфейсе.";
           leaf neighbor-router-id {
             type rt-types:router-id;
             description
               "Router ID соседа.";
           }
           uses neighbor-state;
         }
       }
       container database {
         config false;
         description
           "Link-scope LSDB.";
         list link-scope-lsa-type {
           key "lsa-type";
           description
             "Список OSPF Link-scope LSA.";
           leaf lsa-type {
             type uint16;
             description
               "Тип OSPF Link-scope LSA.";
           }
           container link-scope-lsas {
             description
               "Все Link-scope LSA этого типа.";
             list link-scope-lsa {
               key "lsa-id adv-router";
               description
                 "Список OSPF Link-scope LSA.";
               uses lsa-key;
               uses lsa {
                 refine "version/ospfv2/ospfv2" {
                   must "derived-from-or-self( "
                      + "../../../../../../../../../../"
                      + "rt:type, 'ospfv2')" {
                     description
                       "OSPFv2 LSA.";
                   }
                 }
                 refine "version/ospfv3/ospfv3" {
                   must "derived-from-or-self( "
                      + "../../../../../../../../../../"
                      + "rt:type, 'ospfv3')" {
                     description
                       "OSPFv3 LSA.";
                   }
                 }
               }
             }
           }
         }
       }
     }

     grouping interface-state {
       description
         "Рабочее состояние интерфейса OSPF.";
       reference
         "RFC 2328: OSPF Version 2, Section 9";

       uses interface-common-state;
     }

     grouping virtual-link-config {
       description
         "Состояние конфигурации виртуального канала OSPF.";

       uses interface-common-config;
     }

     grouping virtual-link-state {
       description
         "Рабочее состояние виртуального канала OSPF.";

       leaf cost {
         type ospf-link-metric;
         config false;
         description
           "Стоимость интерфейса виртуального канала.";
       }
       uses interface-common-state;
     }

     grouping sham-link-config {
       description
         "Состояние конфигурации фиктивного канала OSPF.";

       uses interface-common-config;
       uses interface-physical-link-config;
     }

     grouping sham-link-state {
       description
         "Рабочее состояние фиктивного канала OSPF.";
       uses interface-common-state;
     }

     grouping address-family-area-config {
       description
         "Состояние конфигурации области OSPF для семейства адресов.";

       container ranges {
         description
           "Контейнер для сводных (summary) диапазонов.";

         list range {
           key "prefix";
           description
             "Сводка маршрутов, соответствующих адресу и маске.
              Применима лишь для маршрутизаторов ABR.";
           leaf prefix {
             type inet:ip-prefix;
             description
               "Префикс IPv4 или IPv6.";
           }
           leaf advertise {
             type boolean;
             description
               "Аносируется или скрыт.";
           }
           leaf cost {
             type ospf-metric;
             description
               "Анонсируемая стоимость сводного маршрута.";
           }
         }
       }
     }

     grouping area-common-config {
       description
         "Базовое состояние конфигурации области OSPF.";

       leaf summary {
         when "derived-from(../area-type,'stub-nssa-area')" {
           description
             "Сводный анонс в тупиковую область или NSSA.";
         }
         type boolean;
         description
           "Управляет анонсами в тупиковые области или NSSA.";
       }
       leaf default-cost {
         when "derived-from(../area-type,'stub-nssa-area')" {
           description
             "Стоимость LSA принятого по умолчанию маршрута,
              анонсируемого у тупиковую область или NSSA.";
         }
         type ospf-metric;
         description
           "Задаёт сводную стоимость маршрута по умолчанию для
            тупиковой области или NSSA.";
       }
     }

     grouping area-config {
       description
         "Состояние конфигурации области OSPF.";

       leaf area-type {
         type identityref {
           base area-type;
         }
         default "normal-area";
         description
           "Тип области.";
       }

       uses area-common-config;
       uses address-family-area-config;
     }

     grouping area-state {
       description
         "Рабочее состояние области OSPF.";

       container statistics {
         config false;
         description
           "Статистика для области.";
         uses area-stat;
       }

       container database {
         config false;
         description
           "Area-scope LSDB.";
         list area-scope-lsa-type {
           key "lsa-type";
           description
             "Список OSPF Area-scope LSA.";
           leaf lsa-type {
             type uint16;
             description
               "Тип OSPF Area-scope LSA.";
           }
           container area-scope-lsas {
             description
               "Все Area-scope LSA.";
             list area-scope-lsa {
               key "lsa-id adv-router";
               description
                 "Список OSPF Area-scope LSA.";
               uses lsa-key;
               uses lsa {
                 refine "version/ospfv2/ospfv2" {
                   must "derived-from-or-self( "
                      + "../../../../../../../../"
                      + "rt:type, 'ospfv2')" {
                     description
                       "OSPFv2 LSA.";
                   }
                 }
                 refine "version/ospfv3/ospfv3" {
                   must "derived-from-or-self( "
                      + "../../../../../../../../"
                      + "rt:type, 'ospfv3')" {
                     description
                       "OSPFv3 LSA.";
                   }
                 }
               }
             }
           }
         }
       }
     }

     grouping local-rib {
       description
         "Локальная таблица RIB для маршрутов, рассчитанных
          локальным экземпляром маршрутизации OSPF.";
       container local-rib {
         config false;
         description
           "Local RIB.";
         list route {
           key "prefix";
           description
             "Локальные маршруты экземпляра OSPF.";
           leaf prefix {
             type inet:ip-prefix;
             description
               "Префикс адресата.";
           }
           container next-hops {
             description
               "Следующие узлы (next-hop) для маршрута.";
             list next-hop {
               description
                 "Список next-hop для маршрута.";
               leaf outgoing-interface {
                 type if:interface-ref;
                 description
                   "Имя выходного интерфейса.";
               }
               leaf next-hop {
                 type inet:ip-address;
                 description
                   "Адрес next-hop.";
               }
             }
           }
           leaf metric {
             type uint32;
             description
               "Метрика маршрута.";
           }
           leaf route-type {
             type route-type;
             description
               "Тип маршрута.";
           }
           leaf route-tag {
             type uint32;
             description
               "Тег для маршрута.";
           }
         }
       }
     }

     grouping ietf-spf-delay {
       leaf initial-delay {
         type uint32;
         units "milliseconds";
         default "50";
         description
           "Задержка, применяемая в состоянии QUIET (мсек).";
       }
       leaf short-delay {
         type uint32;
         units "milliseconds";
         default "200";
         description
           "Задержка, применяемая в состоянии SHORT_WAIT (мсек).";
       }
       leaf long-delay {
         type uint32;
         units "milliseconds";
         default "5000";
         description
           "Задержка, применяемая в состоянии LONG_WAIT (мсек).";
       }
       leaf hold-down {
         type uint32;
         units "milliseconds";
         default "10000";
         description
           "Таймер для интервала без изменений, когда IGP
            считается стабильным (мсек).";
       }
       leaf time-to-learn {
         type uint32;
         units "milliseconds";
         default "500";
         description
           "Продолжительность изучения всех событий IGP, относящихся
            к одному сетевому событию (мсек).";
       }
       leaf current-state {
         type enumeration {
           enum quiet {
             description
               "Состояние QUIET.";
           }
           enum short-wait {
             description
               "Состояние SHORT_WAIT.";
           }
           enum long-wait {
             description
               "Состояние LONG_WAIT.";
           }
         }
         config false;
         description
           "Текущее состояние алгоритма отсрочки SPF (back-off).";
       }
       leaf remaining-time-to-learn {
         type rt-types:timer-value-milliseconds;
         config false;
         description
           "Время, оставшееся до завершения time-to-learn.";
       }
       leaf remaining-hold-down {
         type rt-types:timer-value-milliseconds;
         config false;
         description
           "Время, оставшееся до завершения hold-down.";
       }
       leaf last-event-received {
         type yang:timestamp;
         config false;
         description
           "Время последнего события-триггера SPF.";
       }
       leaf next-spf-time {
         type yang:timestamp;
         config false;
         description
           "Время следующего запланированного SPF.";
       }
       leaf last-spf-time {
         type yang:timestamp;
         config false;
         description
           "Время последнего расчёта SPF.";
       }
       description
         "Группировка для конфигурации и состояния задержки IETF SPF.";
       reference
         "RFC 8405: Shortest Path First (SPF) Back-Off Delay Algorithm
          for Link-State IGPs";
     }

     grouping node-tag-config {
       description
         "Состояние конфигурации тега узла OSPF.";
       container node-tags {
         if-feature "node-tag";
         list node-tag {
           key "tag";
           leaf tag {
             type uint32;
             description
               "Значение тега узла.";
           }
           description
             "Список тегов узлов.";
         }
         description
           "Контейнер для административных тегов узла.";
       }
     }

     grouping instance-config {
       description
         "Состояние конфигурации экземпляра OSPF.";

       leaf enabled {
         type boolean;
         default "true";
         description
           "Включает и выключает протокол.";
       }

       leaf explicit-router-id {
         if-feature "explicit-router-id";
         type rt-types:router-id;
         description
           "Уникальный 32-битовый идентификатор маршрутизатора
            (RFC 2328).";
         reference
           "RFC 2328: OSPF Version 2";
       }

       container preference {
         description
           "Конфигурация предпочтений для маршрутизатора. Во многих
            реализациях называется административной дистанцией.";
         reference
           "RFC 8349: A YANG Data Model for Routing Management
            (NMDA Version)";
         choice scope {
           description
             "Опции выражения предпочтений одним или несколькими
              значениями.";
           case single-value {
             leaf all {
               type uint8;
               description
                 "Предпочтение для внутриобластных, межобластных
                  и внешних маршрутов.";
             }
           }
           case multi-values {
             choice granularity {
               description
                 "Опции для указания предпочтений внутриобластных
                  и межобластных маршрутов.";
               case detail {
                 leaf intra-area {
                   type uint8;
                   description
                     "Предпочтение для маршрутов внутри области.";
                 }
                 leaf inter-area {
                   type uint8;
                   description
                     "Предпочтение для маршрутов между областями.";
                 }
               }
               case coarse {
                 leaf internal {
                   type uint8;
                   description
                     "Предпочтение для маршрутов внутри и между 
                      областями.";
                 }
               }
             }
             leaf external {
               type uint8;
               description
                 "Предпочтение для маршрутов внешних AS и NSSA.";
             }
           }
         }
       }

       container nsr {
         if-feature "nsr";
         description
           "Состояние настройки безостановочной маршрутизации (NSR).";
         leaf enabled {
           type boolean;
           description
             "Включает и выключает NSR.";
         }
       }

       container graceful-restart {
         if-feature "graceful-restart";
         description
           "Состояние конфигурации аккуратного перезапуска.";
         reference
           "RFC 3623: Graceful OSPF Restart
            RFC 5187: OSPFv3 Graceful Restart";
         leaf enabled {
           type boolean;
           description
             "Управляет аккуратным перезапуском (RFC 3623 для
              OSPFv2 и RFC 5187 для OSPFv3).";
         }
         leaf helper-enabled {
           type boolean;
           description
             "Включает поддержку помощника при аккуратном перезапуске
              маршрутизаторов (раздел 3 в RFC 3623).";
           reference
             "RFC 3623: Graceful OSPF Restart, Section 3";
         }
         leaf restart-interval {
           type uint16 {
             range "1..1800";
           }
           units "seconds";
           default "120";
           description
             "Интервал попыток аккуратного перезапуска (в секундах)
              до отказа (Приложение B.1 в RFC 3623).";
           reference
             "RFC 3623: Graceful OSPF Restart, Appendix B.1";
         }
         leaf helper-strict-lsa-checking {
           type boolean;
           description
             "Прерывает аккуратный перезапуск при смене топологии LSA
              (Приложение B.2 в RFC 3623).";
           reference
             "RFC 3623: Graceful OSPF Restart, Appendix B.2";
         }
       }

       container auto-cost {
         if-feature "auto-cost";
         description
           "Состояние автоматического расчёта стоимости интерфейса.";
         leaf enabled {
           type boolean;
           description
             "Управляет автоматическим расчётом стоимости интерфейса.";
         }
         leaf reference-bandwidth {
           when "../enabled = 'true'" {
             description
               "Применимо лишь при автоматическом расчёте стоимости.";
           }
           type uint32 {
             range "1..4294967";
           }
           units "Mbits";
           description
             "Эталонная пропускная способность для автоматического
              расчёта стоимости интерфейса (Мбит/с). Это значение
              делится на скорость интерфейса и 1 указывает
              минимальную стоимость.";
         }
       }

       container spf-control {
         leaf paths {
           if-feature "max-ecmp";
           type uint16 {
             range "1..65535";
           }
           description
             "Максимальное число равноценных путей (ECMP).";
         }
         container ietf-spf-delay {
           if-feature "ietf-spf-delay";
           uses ietf-spf-delay;
           description
             "Конфигурация алгоритма задержки IETF SPF.";
         }
         description
           "Управление расчётом SPF.";
       }

       container database-control {
         leaf max-lsa {
           if-feature "max-lsa";
           type uint32 {
             range "1..4294967294";
           }
           description
             "Максимальное число OSPF LSA, принимаемых маршрутизатором";
         }
         description
           "Управление поддержкой базы данных.";
       }

       container stub-router {
         if-feature "stub-router";
         description
           "Задаёт конфигурацию максимальной метрики.";

         choice trigger {
           description
             "Триггеры, разрешающие состояние маршрутизатора-заглушки.";
           container always {
             presence "Разрешает безусловную поддержку stub router.";
             description
               "Безусловное состояние stub router (анонсы транзитных
                каналов с MaxLinkMetric).";
             reference
               "RFC 6987: OSPF Stub Router Advertisement";
           }
         }
       }

       container mpls {
         description
           "Состояние конфигурации OSPF MPLS.";
         container te-rid {
           if-feature "te-rid";
           description
             "Стабильный IP-адрес маршрутизатора OSPF для TE.";
           leaf ipv4-router-id {
             type inet:ipv4-address;
             description
               "Явно заданный TE IPv4 Router ID.";
           }
           leaf ipv6-router-id {
             type inet:ipv6-address;
             description
               "Явно заданный TE IPv6 Router ID.";
           }
         }
         container ldp {
           description
             "Состояние конфигурации OSPF MPLS LDP.";
           leaf igp-sync {
             if-feature "ldp-igp-sync";
             type boolean;
             description
               "Включает синхронизацию LDP IGP.";
           }
         }
       }
       uses instance-fast-reroute-config;
       uses node-tag-config;
     }

     grouping instance-state {
       description
         "Рабочее состояние экземпляра OSPF.";

       leaf router-id {
         type rt-types:router-id;
         config false;
         description
           "32-битовый уникальный идентификатор маршрутизатора
            (RFC 2328).";
         reference
           "RFC 2328: OSPF Version 2";
       }

       uses local-rib;

       container statistics {
         config false;
         description
           "Статистика для экземпляра.";
         uses instance-stat;
       }

       container database {
         config false;
         description
           "AS-Scope LSDB.";
         list as-scope-lsa-type {
           key "lsa-type";
           description
             "Список OSPF AS-Scope LSA.";
           leaf lsa-type {
             type uint16;
             description
               "Тип OSPF AS-Scope LSA.";
           }
           container as-scope-lsas {
             description
               "Все AS-Scope LSA этого типа.";
             list as-scope-lsa {
               key "lsa-id adv-router";
               description
                 "Список OSPF AS-Scope LSA.";
               uses lsa-key;
               uses lsa {
                 refine "version/ospfv2/ospfv2" {
                   must "derived-from-or-self( "
                      + "../../../../../../"
                      + "rt:type, 'ospfv2')" {
                     description
                       "OSPFv2 LSA.";
                   }
                 }
                 refine "version/ospfv3/ospfv3" {
                   must "derived-from-or-self( "
                      + "../../../../../../"
                      + "rt:type, 'ospfv3')" {
                     description
                       "OSPFv3 LSA.";
                   }
                 }
               }
             }
           }
         }
       }
       uses spf-log;
       uses lsa-log;
     }

     grouping multi-topology-area-common-config {
       description
         "Базовое состояние конфигурации области OSPF с несколькими 
          топологиями.";
       leaf summary {
         when "derived-from(../../../area-type, 'stub-nssa-area')" {
           description
             "Сводный анонс в тупиковую область или NSSA.";
         }
         type boolean;
         description
           "Управляет сводными анонсами в топологию тупиковой области
            или NSSA.";
       }
       leaf default-cost {
         when "derived-from(../../../area-type, 'stub-nssa-area')" {
           description
             "Стоимость для LSA маршрута по умолчанию, анонсируемого 
              в тупиковую область или NSSA.";
         }
         type ospf-metric;
         description
           "Задаёт сводный маршрут по умолчанию для тупиковой области
            или NSSA.";
       }
     }

     grouping multi-topology-area-config {
       description
         "Состояние конфигурации области OSPF с разными топологиями.";

       uses multi-topology-area-common-config;
       uses address-family-area-config;
     }

     grouping multi-topology-state {
       description
         "Рабочее состояние OSPF с несколькими топологиями.";

       uses local-rib;
     }

     grouping multi-topology-interface-config {
       description
         "Состояние конфигурации OSPF с несколькими топологиями.";

       leaf cost {
         type ospf-link-metric;
         description
           "Стоимость интерфейса для этой топологии.";
       }
     }

     grouping ospfv3-interface-config {
       description
         "Связанное с интерфейсом состояние конфигурации OSPFv3.";

       leaf instance-id {
         type uint8;
         default "0";
         description
           "Идентификатор экземпляра OSPFv3.";
       }
     }

     grouping ospfv3-interface-state {
       description
         "Связанное с интерфейсом рабочее состояние OSPFv3.";

       leaf interface-id {
         type uint32;
         config false;
         description
           "Идентификатор экземпляра OSPFv3.";
       }
     }

     grouping lsa-identifiers {
       description
         "Параметры, однозначно указывающие LSA.";
       leaf area-id {
         type area-id-type;
         description
           "Area ID.";
       }
       leaf type {
         type uint16;
         description
           "Тип LSA.";
       }
       leaf lsa-id {
         type union {
           type inet:ipv4-address;
           type yang:dotted-quad;
         }
         description
           "Link State ID.";
       }
       leaf adv-router {
         type rt-types:router-id;
         description
           "Анонсирующий LSA маршрутизатор.";
       }
       leaf seq-num {
         type uint32;
         description
           "Порядковый номер LSA.";
       }
     }

     grouping spf-log {
       description
         "Группировка для журнальных записей SPF (log).";
       container spf-log {
         config false;
         description
           "Контейнер с записями SPF.";
         list event {
           key "id";
           description
             "Список записей SPF в форме буфера переноса в обратном
              хронологическом порядке (начиная со старых).";
           leaf id {
             type uint32;
             description
               "Идентификатор события (сугубо внутреннее значение).";
           }
           leaf spf-type {
             type enumeration {
               enum full {
                 description
                   "Расчёт SPF был выполнен для всего SPF.";
               }
               enum intra {
                 description
                   "Расчёт SPF лишь для маршрутов внутри области.";
               }
               enum inter {
                 description
                   "Расчёт SPF для сводных маршрутов между областями.";
               }
               enum external {
                 description
                   "Расчёт SPF лишь для маршрутов внешних AS и NSSA.";
               }
             }
             description
               "Расчёт SPF лишь для для записи журнала SPF.";
           }
           leaf schedule-timestamp {
             type yang:timestamp;
             description
               "Временная метка для запланированного расчёта.";
           }
           leaf start-timestamp {
             type yang:timestamp;
             description
               "Временная метка начала расчёта.";
           }
           leaf end-timestamp {
             type yang:timestamp;
             description
               "Временная метка завершения расчёта.";
           }
           list trigger-lsa {
             description
               "Список LSA, вызвавших расчёт.";
             uses lsa-identifiers;
           }
         }
       }
     }

     grouping lsa-log {
       description
         "Группировка для системного журнала LSA (log).";
       container lsa-log {
         config false;
         description
           "Контейнер со списком записей журнала LSA, включая локальные
            изменения LSA.";
         list event {
           key "id";
           description
             "Список записей LSA в форме буфера переноса в обратном
              хронологическом порядке (начиная со старых).";
           leaf id {
             type uint32;
             description
               "Идентификатор события (сугубо локальное значение).";
           }
           container lsa {
             description
               "Контейнер, описывающий LSA, записанные в журнал.";
             uses lsa-identifiers;
           }
           leaf received-timestamp {
             type yang:timestamp;
             description
               "Временная метка получения LSA. При локальном обновлении
                LSA это будет время создания LSA.";
           }
           leaf reason {
             type identityref {
               base lsa-log-reason;
             }
             description
               "Причина внесения записи в журнал LSA.";
           }
         }
       }
     }

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol" {
       when "derived-from(rt:type, 'ospf')" {
         description
           "Это дополнение пригодно лишь для экземпляра протокола
            маршрутизации OSPF (типа ospfv2 или ospfv3).";
       }
       description
         "Дополнение OSPF control-plane-protocol для модуля 
          ietf-routing.";

       container ospf {
         description
           "Экземпляр протокола OSPF.";

         leaf address-family {
           when "derived-from-or-self(../../rt:type, 'ospfv3')" {
             description
               "Применимо только для OSPFv3.";
           }
           type iana-rt-types:address-family;
           description
             "Семейство адресов для экземпляра.";
         }

         uses instance-config;
         uses instance-state;

         container areas {
           description
             "Все области OSPF.";
           list area {
             key "area-id";
             description
               "Список областей OSPF.";
             leaf area-id {
               type area-id-type;
               description
                 "Area ID.";
             }

             uses area-config;
             uses area-state;

             container virtual-links {
               when "derived-from-or-self(../area-type, 'normal-area') "
                  + "and ../area-id = '0.0.0.0'" {
                 description
                   "Виртуальные каналы должны быть в магистральной 
                    (backbone) области.";
               }
               description
                 "Все виртуальные каналы.";
               list virtual-link {
                 key "transit-area-id router-id";
                 description
                   "Виртуальный канал OSPF.";
                 leaf transit-area-id {
                   type leafref {
                     path "../../../../area/area-id";
                   }
                   must "derived-from-or-self("
                      + "../../../../area[area-id=current()]"
                      + "/area-type, 'normal-area') and "
                      + "../../../../area[area-id=current()]"
                      + "/area-id != '0.0.0.0'" {
                     error-message "Транзитной области виртуального "
                             + "канала недопустимо быть магистральной.";
                     description
                       "Транзитной области виртуального канала 
                        недопустимо быть магистральной (0.0.0.0).";
                   }
                   description
                     "Идентификатор транзитной области виртуального 
                      канала.";
                 }
                 leaf router-id {
                   type rt-types:router-id;
                   description
                     "Router ID удалённой конечной точки виртуального
                      канала.";
                 }

                 uses virtual-link-config;
                 uses virtual-link-state;
               }
             }
             container sham-links {
               if-feature "pe-ce-protocol";
               description
                 "Все фиктивные (sham) каналы.";
               list sham-link {
                 key "local-id remote-id";
                 description
                   "Фиктивный канал OSPF.";
                 leaf local-id {
                   type inet:ip-address;
                   description
                     "Адрес локальной конечной точки фиктивного канала";
                 }
                 leaf remote-id {
                   type inet:ip-address;
                   description
                     "Адрес удалённой конечной точки фиктивного канала";
                 }
                 uses sham-link-config;
                 uses sham-link-state;
               }
             }
             container interfaces {
               description
                 "Все интерфейсы OSPF.";
               list interface {
                 key "name";
                 description
                   "Список интерфейсов OSPF.";
                 leaf name {
                   type if:interface-ref;
                   description
                     "Ссылка на имя интерфейса.";
                 }
                 uses interface-config;
                 uses interface-state;
               }
             }
           }
         }
       }
     }

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol/ospf" {
       when "derived-from(../rt:type, 'ospf')" {
         description
           "Это дополнение действительно лишь для OSPF
            (тип ospfv2 или ospfv3).";
       }
       if-feature "multi-topology";
       description
         "Дополнение состояния конфигурации экземпляра OSPF
          с несколькими топологиями.";
       container topologies {
         description
           "Все топологии.";
         list topology {
           key "name";
           description
             "Топология OSPF. Семейство адресов топологии OSPF 
              должно совпадать с семейством экземпляра маршрутизации.";
           leaf name {
             type leafref {
               path "../../../../../../rt:ribs/rt:rib/rt:name";
             }
             description
               "Имя таблицы RIB, соответствующей топологии OSPF.";
           }

           uses multi-topology-state;
         }
       }
     }

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol/ospf/"
           + "areas/area" {
       when "derived-from-or-self(../../../rt:type, "
          + "'ospfv2')" {
         description
           "Это дополнение действительно лишь для OSPFv2.";
       }
       if-feature "multi-topology";
       description
         "Дополнение состояния конфигурации области OSPF 
          с несколькими топологиями.";
       container topologies {
         description
           "Все топологии для области.";
         list topology {
           key "name";
           description
             "Топология области OSPF.";
           leaf name {
             type leafref {
               path "../../../../../../../../"
                  + "rt:ribs/rt:rib/rt:name";
             }
             description
               "Одна топология разрешена для этой области.";
           }

           uses multi-topology-area-config;
         }
       }
     }

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol/ospf/"
           + "areas/area/interfaces/interface" {
       when "derived-from-or-self(../../../../../rt:type, "
          + "'ospfv2')" {
         description
           "Это дополнение действительно лишь для OSPFv2.";
       }
       if-feature "multi-topology";
       description
         "Дополнение состояния конфигурации интерфейса OSPF 
          с несколькими топологиями.";
       container topologies {
         description
           "Все топологии для интерфейса.";
         list topology {
           key "name";
           description
             "Топология для интерфейса OSPF.";
           leaf name {
             type leafref {
               path "../../../../../../../../../../"
                  + "rt:ribs/rt:rib/rt:name";
             }
             description
               "Одна топология разрешена для этого интерфейса.";
           }

           uses multi-topology-interface-config;
         }
       }
     }

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol/ospf/"
           + "areas/area/interfaces/interface" {
       when "derived-from-or-self(../../../../../rt:type, "
          + "'ospfv3')" {
         description
           "Это дополнение действительно лишь для OSPFv3.";
       }
       description
         "Дополнение состояния конфигурации OSPFv3, связанной 
          с интерфейсом.";
       uses ospfv3-interface-config;
       uses ospfv3-interface-state;
     }

     grouping route-content {
       description
         "Эта группировка определяет атрибуты маршрута,
          связанные с OSPF.";
       leaf metric {
         type uint32;
         description
           "Метрика маршрута OSPF.";
       }
       leaf tag {
         type uint32;
         default "0";
         description
           "Тег маршрута OSPF.";
       }
       leaf route-type {
         type route-type;
         description
           "Тип маршрута OSPF.";
       }
     }

     augment "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route" {
       when "derived-from(rt:source-protocol, 'ospf')" {
         description
           "Это дополнение действительно лишь для маршрутов,
            полученных от протокола OSPF.";
       }
       description
         "Связанные с OSPF атрибуты маршрута.";
       uses route-content;
     }

     /*
      * RPC
      */

     rpc clear-neighbor {
       description
         "Этот вызов RPC очищает указанный набор соседей OSPF.
          При отказе по внутренним причинам OSPF следует возвращать
          error-tag и error-app-tag, соответствующие ошибке.";
       input {
         leaf routing-protocol-name {
           type leafref {
             path "/rt:routing/rt:control-plane-protocols/"
                + "rt:control-plane-protocol/rt:name";
           }
           mandatory true;
           description
             "Экземпляр протокола OSPF для которого удаляются соседи.

              Если указанного экземпляра OSPF нет, эту операцию НУЖНО
              завершать отказом с error-tag data-missing и
              error-app-tag routing-protocol-instance-not-found.";
         }

         leaf interface {
           type if:interface-ref;
           description
             "Имя экземпляра OSPF, для которого удаляются соседи.

              Если указанного экземпляра OSPF нет, эту операцию НУЖНО
              завершать отказом с error-tag data-missing и
              error-app-tag ospf-interface-not-found.";
         }
       }
     }

     rpc clear-database {
       description
         "Этот вызов RPC очищает указанную базу OSPF Link State. Кроме 
          того, все отношения соседства переводятся в состояние DOWN,
          а самосозданные LSA реорганизуются. При отказе операции по
          внутренним причинам OSPF следует указывать причину в error-tag
          и error-app-tag.";
       input {
         leaf routing-protocol-name {
           type leafref {
             path "/rt:routing/rt:control-plane-protocols/"
                + "rt:control-plane-protocol/rt:name";
           }
           mandatory true;
           description
             "Экземпляр протокола OSPF, для которого очищается LSDB.

              Если указанного экземпляра OSPF нет, эту операцию НУЖНО
              завершать отказом с error-tag data-missing и
              error-app-tag routing-protocol-instance-not-found.";
         }
       }
     }

     /*
      * Уведомления
      */

     grouping notification-instance-hdr {
       description
         "Группировка с описаниями связанных с экземпляром общих
          уведомления OSPF.";

       leaf routing-protocol-name {
         type leafref {
           path "/rt:routing/rt:control-plane-protocols/"
              + "rt:control-plane-protocol/rt:name";
         }
         must "derived-from( "
            + "/rt:routing/rt:control-plane-protocols/"
            + "rt:control-plane-protocol[rt:name=current()]/"
            + "rt:type, 'ospf')";
         description
           "Имя экземпляра протокола маршрутизации OSPF.";
       }

       leaf address-family {
         type leafref {
           path "/rt:routing/"
              + "rt:control-plane-protocols/rt:control-plane-protocol"
              + "[rt:name=current()/../routing-protocol-name]/"
              + "ospf/address-family";
         }
         description
           "Семейство адресов экземпляра OSPF.";
       }
     }

     grouping notification-interface {
       description
         "Группировка для сведений об интерфейсе в связанных с
          интерфейсами уведомлениях OSPF.";

       choice if-link-type-selection {
         description
           "Варианты типов канала.";
         container interface {
           description
             "Обычный интерфейс.";
           leaf interface {
             type if:interface-ref;
             description
               "Интерфейс.";
           }
         }
         container virtual-link {
           description
             "Виртуальный канал.";
           leaf transit-area-id {
             type area-id-type;
             description
               "Area ID.";
           }
           leaf neighbor-router-id {
             type rt-types:router-id;
             description
               "Router ID соседа.";
           }
         }
         container sham-link {
           description
             "Фиктивный канал.";
           leaf area-id {
             type area-id-type;
             description
               "Area ID.";
           }
           leaf local-ip-addr {
             type inet:ip-address;
             description
               "Локальный адрес фиктивного канала.";
           }
           leaf remote-ip-addr {
             type inet:ip-address;
             description
               "Удаленный адрес фиктивного канала.";
           }
         }
       }
     }

     grouping notification-neighbor {
       description
         "Группировка для сведений о соседе в связанных
          с соседями уведомлениях.";

       leaf neighbor-router-id {
         type rt-types:router-id;
         description
           "Router ID соседа.";
       }

       leaf neighbor-ip-addr {
         type inet:ip-address;
         description
           "Адрес соседа.";
       }
     }

     notification if-state-change {
       uses notification-instance-hdr;
       uses notification-interface;

       leaf state {
         type if-state-type;
         description
           "Состояние интерфейса.";
       }
       description
         "Это уведомление передаётся при обнаружении
          смены состояния интерфейса.";
     }

     notification if-config-error {
       uses notification-instance-hdr;
       uses notification-interface;

       leaf packet-source {
         type inet:ip-address;
         description
           "Адрес источника.";
       }

       leaf packet-type {
         type packet-type;
         description
           "Тип пакета OSPF.";
       }

       leaf error {
         type enumeration {
           enum bad-version {
             description
               "Непригодня версия.";
           }
           enum area-mismatch {
             description
               "Несоответствие областей.";
           }
           enum unknown-nbma-nbr {
             description
               "Неизвестный сосед NBMA.";
           }
           enum unknown-virtual-nbr {
             description
               "Неизвестный сосед по виртуальному каналу.";
           }
           enum auth-type-mismatch {
             description
               "Несоответствие типа аутентификации.";
           }
           enum auth-failure {
             description
               "Отказ при аутентификации.";
           }
           enum net-mask-mismatch {
             description
               "Несоответствие маски сети.";
           }
           enum hello-interval-mismatch {
             description
               "Несоответствие интервала Hello.";
           }
           enum dead-interval-mismatch {
             description
               "Несоответствие интервала Dead.";
           }
           enum option-mismatch {
             description
               "Несоответствие опций.";
           }
           enum mtu-mismatch {
             description
               "Несоответствие MTU.";
           }
           enum duplicate-router-id {
             description
               "Дубликат Router ID.";
           }
           enum no-error {
             description
               "Нет ошибок.";
           }
         }
         description
           "Коды ошибок.";
       }
       description
         "Это уведомление передаётся при получении пакета, указывающего
          ошибку настройки интерфейса передающего маршрутизатора OSPF.";
     }

     notification nbr-state-change {
       uses notification-instance-hdr;
       uses notification-interface;
       uses notification-neighbor;

       leaf state {
         type nbr-state-type;
         description
           "Состояние соседа.";
       }

       description
         "Это уведомление передаётся при обнаружении смены состояния
          соседа.";
     }

     notification nbr-restart-helper-status-change {
       uses notification-instance-hdr;
       uses notification-interface;
       uses notification-neighbor;

       leaf status {
         type restart-helper-status-type;
         description
           "Состояние помошника в перезапуске.";
       }

       leaf age {
         type rt-types:timer-value-seconds16;
         description
           "Оставшееся время текущего интервала аккуратного перезапуска
            OSPF, когда маршрутизатор служит помощником для соседа.";
       }

       leaf exit-reason {
         type restart-exit-reason-type;
         description
           "Причина завершения помощника при перезапуске.";
       }
       description
         "Это уведомление передаётся при обнаружении смены состояния
          помощника при перезапуске соседа.";
     }

     notification if-rx-bad-packet {
       uses notification-instance-hdr;
       uses notification-interface;

       leaf packet-source {
         type inet:ip-address;
         description
           "Адрес источника.";
       }

       leaf packet-type {
         type packet-type;
         description
           "Тип пакета OSPF.";
       }

       description
         "Это уведомление передаётся при невозможности анализа пакета
          OSPF, принятого на интерфейсе OSPF.";
     }

     notification lsdb-approaching-overflow {
       uses notification-instance-hdr;

       leaf ext-lsdb-limit {
         type uint32;
         description
           "Максимальное число не заданных по умолчанию AS-External-LSA,
            которые можно сохранить в базе LSDB.";
       }

       description
         "Это уведомление передаётся, когда число LSA в LSDB 
          маршрутизатора превысит 90% от предела ext-lsdb-limit.";
     }

     notification lsdb-overflow {
       uses notification-instance-hdr;

       leaf ext-lsdb-limit {
         type uint32;
         description
           "Максимальное число не заданных по умолчанию AS-External-LSA,
            которые можно сохранить в базе LSDB.";
       }

       description
         "Это уведомление передаётся, когда число LSA в LSDB 
          маршрутизатора превысит предел ext-lsdb-limit.";
     }

     notification nssa-translator-status-change {
       uses notification-instance-hdr;

       leaf area-id {
         type area-id-type;
         description
           "Area ID.";
       }

       leaf status {
         type nssa-translator-state-type;
         description
           "Состояние транслятора NSSA.";
       }

       description
         "Это уведомление передаётся при смене роли маршрутизатора в
          трансляции OSPF NSSA-LSA в OSPF AS-External-LSA.";
     }

     notification restart-status-change {
       uses notification-instance-hdr;

       leaf status {
         type restart-status-type;
         description
           "Состояние перезапуска.";
       }

       leaf restart-interval {
         type uint16 {
           range "1..1800";
         }
         units "seconds";
         default "120";
         description
           "Интервал перезапуска.";
       }

       leaf exit-reason {
         type restart-exit-reason-type;
         description
           "Причина выхода для перезапуска.";
       }

       description
         "Это уведомление передаётся при смене состояния аккуратного
          перезапуска для маршрутизатора.";
     }
   }
   <CODE ENDS>

4. Вопросы безопасности

Заданный этим документом модуль YANG определяет схему для данных, предназначенную для доступа через сеть с использованием протоколов управления, таких как NETCONF [RFC6241] или RESTCONF [RFC8040]. Нижним уровнем NETCONF служит защищённый транспорт с обязательной поддержкой SSH (Secure Shell) [RFC6242]. Нижним уровнем RESTCONF служит протокол HTTPS с обязательной поддержкой защиты на транспортном уровне (TLS) [RFC8446].

Модель доступа к конфигурации сети (NACM – Network Configuration Access Control Model) [RFC8341] обеспечивает возможность разрешить доступ лишь определённых пользователей NETCONF или RESTCONF к заранее заданному подмножеству операций NETCONF или RESTCONF и содержимого.

В этом модуле данных YANG определено множество узлов данных, которые разрешают запись, создание и удаление (т. е. config true, как принято по умолчанию). Эти узлы могут быть конфиденциальными или уязвимыми в некоторых сетевых средах. Запись в такие узлы (например, edit-config) без должной защиты может негативно влиять на работу сети. Ниже перечислены ветви и узлы, которые могут быть конфиденциальны или уязвимы.

/ospf

/ospf/areas/

/ospf/areas/area[area-id]

/ospf/virtual-links/

/ospf/virtual-links/virtual-link[transit-area-id router-id]

/ospf/areas/area[area-id]/interfaces

/ospf/areas/area[area-id]/interfaces/interface[name]

/ospf/area/area[area-id]/sham-links

/ospf/area/area[area-id]/sham-links/sham-link[local-id remote-id]

Доступные для записи узлы данных представляют конфигурацию экземпляров, областей, виртуальных каналов, фиктивных (sham) каналов и интерфейсов и соответствуют указанным выше узлам схемы.
Для OSPF возможность изменения конфигурации позволяет скомпрометировать целиком домен OSPF, включая партнерство с несанкционированными маршрутизаторами для нарушения маршрутизации трафика и организацию массированных атак на службы (Denial-of-Service или DoS). Например, активизация OSPF на любом незащищённом интерфейсе позволить организовать смежность OSPF с несанкционированным и враждебным соседом. После организации смежности возможен перехват трафика. Например, может быть организована DoS-атака путём изменения стоимости интерфейса OSPF с введением асимметрии и возникновением жёсткой петли. Как правило, несанкционированное изменение большинства функций OSPF создаёт свой риск безопасности. Следует обратиться к разделу Security Considerations в соответствующих RFC.

Некоторые из доступных для чтения узлов в этом модуле YANG могут быть конфиденциальны или уязвимы в той или иной сетевой среде. Важно контролировать доступ к таким объектам (например, get, get-config, notification). Ниже перечислены ветви и узлы, которые могут быть конфиденциальны или уязвимы.

/ospf/database

/ospf/areas/area[area-id]/database

/ospf/virtual-links/virtual-link[transit-area-id router-id]/database

/ospf/areas/area[area-id]/interfaces/interface[name]/database

/ospf/area/area[area-id]/sham-links/sham-link[local-id remote-id]/database

Раскрытие базы состояний каналов (LSDB) будет подробно показывать топологию сети. Имеются отдельные базы LSDB для каждого интерфейса, области, виртуального и фиктивного канала, интерфейса. Соответствующие узлы данных показаны выше.
Раскрытие LSDB включает сведения, выходящие за рамки маршрутизатора OSPF. Это может быть нежелательно, поскольку может приводить к атакам. Кроме того, в случае раскрытия LSDB области можно восстановить целиком топологию IP-сети, а при развёртывании TE — и этой топологии. Операторы могут считать свою топологию конфиденциальной.

Для аутентификации OSPF конфигурация поддерживается через указание цепочек ключей [RFC8177] или прямое указание ключа и алгоритма проверки подлинности. Поэтому настройка аутентификации с использованием варианта (case) auth-key-chain в контейнере ospfv2-auth-specification или ospfv3-auth-specification наследует вопросы безопасности [RFC8177]. Это включает соображения о локальном хранении и обработке ключей аутентификации.

Кроме того, поддерживается локальное задание ключей аутентификации OSPF и связанных с ними алгоритмов для унаследованных реализаций, не поддерживающих цепочки ключей [RFC8177]. реализациям рекомендуется переходить на цепочки ключей, поскольку они обеспечивают (1) бесшовную смену ключей и алгоритмов, (2) задании ключей в шестнадцатеричном формате, повышающем энтропию ключа и (3) шифрование ключей с использованием алгоритма AES Key Wrap с заполнением (Padding) [RFC5649].

Некоторые из операций RPC в этом модуле YANG могут быть чувствительны или уязвимы в той или иной сетевой среде. Важно контролировать доступ к таким операциям. Ниже указаны такие операции.

  • Модуль YANG OSPF поддерживает RPC clear-neighbor и clear-database, компрометация доступа к которым позволяет использовать временные отказы сети для организации DoS-атаки.

Фактические данные ключа аутентификации (заданного локально или полученного из цепочки) являются конфиденциальными и их нужно хранить в секрете от посторонних. Компрометация этих данных позволит злоумышленнику подделать трафик OSPF, что позволяет скомпрометировать домен OSPF целиком.

5. Взаимодействие с IANA

Этот документ регистрирует URI в реестре IETF XML Registry [RFC3688] в соответствии с форматом [RFC3688].

   URI:  urn:ietf:params:xml:ns:yang:ietf-ospf
   Registrant Contact:  The IESG.
   XML:  N/A; запрошенный URI является пространством имён XML.

Документ регистрирует модуль YANG в реестре YANG Module Names [RFC6020].

   Name:  ietf-ospf
   Namespace:  urn:ietf:params:xml:ns:yang:ietf-ospf
   Prefix:  ospf
   Reference:  RFC 9129

6. Литература

6.1. Нормативные документы

[RFC1765] Moy, J., «OSPF Database Overflow», RFC 1765, DOI 10.17487/RFC1765, March 1995, <https://www.rfc-editor.org/info/rfc1765>.

[RFC1793] Moy, J., «Extending OSPF to Support Demand Circuits», RFC 1793, DOI 10.17487/RFC1793, April 1995, <https://www.rfc-editor.org/info/rfc1793>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC2328] Moy, J., «OSPF Version 2», STD 54, RFC 2328, DOI 10.17487/RFC2328, April 1998, <https://www.rfc-editor.org/info/rfc2328>.

[RFC3101] Murphy, P., «The OSPF Not-So-Stubby Area (NSSA) Option», RFC 3101, DOI 10.17487/RFC3101, January 2003, <https://www.rfc-editor.org/info/rfc3101>.

[RFC3623] Moy, J., Pillay-Esnault, P., and A. Lindem, «Graceful OSPF Restart», RFC 3623, DOI 10.17487/RFC3623, November 2003, <https://www.rfc-editor.org/info/rfc3623>.

[RFC3630] Katz, D., Kompella, K., and D. Yeung, «Traffic Engineering (TE) Extensions to OSPF Version 2», RFC 3630, DOI 10.17487/RFC3630, September 2003, <https://www.rfc-editor.org/info/rfc3630>.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC4552] Gupta, M. and N. Melam, «Authentication/Confidentiality for OSPFv3», RFC 4552, DOI 10.17487/RFC4552, June 2006, <https://www.rfc-editor.org/info/rfc4552>.

[RFC4576] Rosen, E., Psenak, P., and P. Pillay-Esnault, «Using a Link State Advertisement (LSA) Options Bit to Prevent Looping in BGP/MPLS IP Virtual Private Networks (VPNs)», RFC 4576, DOI 10.17487/RFC4576, June 2006, <https://www.rfc-editor.org/info/rfc4576>.

[RFC4577] Rosen, E., Psenak, P., and P. Pillay-Esnault, «OSPF as the Provider/Customer Edge Protocol for BGP/MPLS IP Virtual Private Networks (VPNs)», RFC 4577, DOI 10.17487/RFC4577, June 2006, <https://www.rfc-editor.org/info/rfc4577>.

[RFC4915] Psenak, P., Mirtorabi, S., Roy, A., Nguyen, L., and P. Pillay-Esnault, «Multi-Topology (MT) Routing in OSPF», RFC 4915, DOI 10.17487/RFC4915, June 2007, <https://www.rfc-editor.org/info/rfc4915>.

[RFC4973] Srisuresh, P. and P. Joseph, «OSPF-xTE: Experimental Extension to OSPF for Traffic Engineering», RFC 4973, DOI 10.17487/RFC4973, July 2007, <https://www.rfc-editor.org/info/rfc4973>.

[RFC5082] Gill, V., Heasley, J., Meyer, D., Savola, P., Ed., and C. Pignataro, «The Generalized TTL Security Mechanism (GTSM)», RFC 5082, DOI 10.17487/RFC5082, October 2007, <https://www.rfc-editor.org/info/rfc5082>.

[RFC5185] Mirtorabi, S., Psenak, P., Lindem, A., Ed., and A. Oswal, «OSPF Multi-Area Adjacency», RFC 5185, DOI 10.17487/RFC5185, May 2008, <https://www.rfc-editor.org/info/rfc5185>.

[RFC5187] Pillay-Esnault, P. and A. Lindem, «OSPFv3 Graceful Restart», RFC 5187, DOI 10.17487/RFC5187, June 2008, <https://www.rfc-editor.org/info/rfc5187>.

[RFC5250] Berger, L., Bryskin, I., Zinin, A., and R. Coltun, «The OSPF Opaque LSA Option», RFC 5250, DOI 10.17487/RFC5250, July 2008, <https://www.rfc-editor.org/info/rfc5250>.

[RFC5286] Atlas, A., Ed. and A. Zinin, Ed., «Basic Specification for IP Fast Reroute: Loop-Free Alternates», RFC 5286, DOI 10.17487/RFC5286, September 2008, <https://www.rfc-editor.org/info/rfc5286>.

[RFC5309] Shen, N., Ed. and A. Zinin, Ed., «Point-to-Point Operation over LAN in Link State Routing Protocols», RFC 5309, DOI 10.17487/RFC5309, October 2008, <https://www.rfc-editor.org/info/rfc5309>.

[RFC5329] Ishiguro, K., Manral, V., Davey, A., and A. Lindem, Ed., «Traffic Engineering Extensions to OSPF Version 3», RFC 5329, DOI 10.17487/RFC5329, September 2008, <https://www.rfc-editor.org/info/rfc5329>.

[RFC5340] Coltun, R., Ferguson, D., Moy, J., and A. Lindem, «OSPF for IPv6», RFC 5340, DOI 10.17487/RFC5340, July 2008, <https://www.rfc-editor.org/info/rfc5340>.

[RFC5613] Zinin, A., Roy, A., Nguyen, L., Friedman, B., and D. Yeung, «OSPF Link-Local Signaling», RFC 5613, DOI 10.17487/RFC5613, August 2009, <https://www.rfc-editor.org/info/rfc5613>.

[RFC5642] Venkata, S., Harwani, S., Pignataro, C., and D. McPherson, «Dynamic Hostname Exchange Mechanism for OSPF», RFC 5642, DOI 10.17487/RFC5642, August 2009, <https://www.rfc-editor.org/info/rfc5642>.

[RFC5709] Bhatia, M., Manral, V., Fanto, M., White, R., Barnes, M., Li, T., and R. Atkinson, «OSPFv2 HMAC-SHA Cryptographic Authentication», RFC 5709, DOI 10.17487/RFC5709, October 2009, <https://www.rfc-editor.org/info/rfc5709>.

[RFC5714] Shand, M. and S. Bryant, «IP Fast Reroute Framework», RFC 5714, DOI 10.17487/RFC5714, January 2010, <https://www.rfc-editor.org/info/rfc5714>.

[RFC5838] Lindem, A., Ed., Mirtorabi, S., Roy, A., Barnes, M., and R. Aggarwal, «Support of Address Families in OSPFv3», RFC 5838, DOI 10.17487/RFC5838, April 2010, <https://www.rfc-editor.org/info/rfc5838>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC6565] Pillay-Esnault, P., Moyer, P., Doyle, J., Ertekin, E., and M. Lundberg, «OSPFv3 as a Provider Edge to Customer Edge (PE-CE) Routing Protocol», RFC 6565, DOI 10.17487/RFC6565, June 2012, <https://www.rfc-editor.org/info/rfc6565>.

[RFC6845] Sheth, N., Wang, L., and J. Zhang, «OSPF Hybrid Broadcast and Point-to-Multipoint Interface Type», RFC 6845, DOI 10.17487/RFC6845, January 2013, <https://www.rfc-editor.org/info/rfc6845>.

[RFC6860] Yang, Y., Retana, A., and A. Roy, «Hiding Transit-Only Networks in OSPF», RFC 6860, DOI 10.17487/RFC6860, January 2013, <https://www.rfc-editor.org/info/rfc6860>.

[RFC6987] Retana, A., Nguyen, L., Zinin, A., White, R., and D. McPherson, «OSPF Stub Router Advertisement», RFC 6987, DOI 10.17487/RFC6987, September 2013, <https://www.rfc-editor.org/info/rfc6987>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7166] Bhatia, M., Manral, V., and A. Lindem, «Supporting Authentication Trailer for OSPFv3», RFC 7166, DOI 10.17487/RFC7166, March 2014, <https://www.rfc-editor.org/info/rfc7166>.

[RFC7474] Bhatia, M., Hartman, S., Zhang, D., and A. Lindem, Ed., «Security Extension for OSPFv2 When Using Manual Key Management», RFC 7474, DOI 10.17487/RFC7474, April 2015, <https://www.rfc-editor.org/info/rfc7474>.

[RFC7490] Bryant, S., Filsfils, C., Previdi, S., Shand, M., and N. So, «Remote Loop-Free Alternate (LFA) Fast Reroute (FRR)», RFC 7490, DOI 10.17487/RFC7490, April 2015, <https://www.rfc-editor.org/info/rfc7490>.

[RFC7684] Psenak, P., Gredler, H., Shakir, R., Henderickx, W., Tantsura, J., and A. Lindem, «OSPFv2 Prefix/Link Attribute Advertisement», RFC 7684, DOI 10.17487/RFC7684, November 2015, <https://www.rfc-editor.org/info/rfc7684>.

[RFC7770] Lindem, A., Ed., Shen, N., Vasseur, JP., Aggarwal, R., and S. Shaffer, «Extensions to OSPF for Advertising Optional Router Capabilities», RFC 7770, DOI 10.17487/RFC7770, February 2016, <https://www.rfc-editor.org/info/rfc7770>.

[RFC7777] Hegde, S., Shakir, R., Smirnov, A., Li, Z., and B. Decraene, «Advertising Node Administrative Tags in OSPF», RFC 7777, DOI 10.17487/RFC7777, March 2016, <https://www.rfc-editor.org/info/rfc7777>.

[RFC7884] Pignataro, C., Bhatia, M., Aldrin, S., and T. Ranganath, «OSPF Extensions to Advertise Seamless Bidirectional Forwarding Detection (S-BFD) Target Discriminators», RFC 7884, DOI 10.17487/RFC7884, July 2016, <https://www.rfc-editor.org/info/rfc7884>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8177] Lindem, A., Ed., Qu, Y., Yeung, D., Chen, I., and J. Zhang, «YANG Data Model for Key Chains», RFC 8177, DOI 10.17487/RFC8177, June 2017, <https://www.rfc-editor.org/info/rfc8177>.

[RFC8294] Liu, X., Qu, Y., Lindem, A., Hopps, C., and L. Berger, «Common YANG Data Types for the Routing Area», RFC 8294, DOI 10.17487/RFC8294, December 2017, <https://www.rfc-editor.org/info/rfc8294>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

[RFC8349] Lhotka, L., Lindem, A., and Y. Qu, «A YANG Data Model for Routing Management (NMDA Version)», RFC 8349, DOI 10.17487/RFC8349, March 2018, <https://www.rfc-editor.org/info/rfc8349>.

[RFC8405] Decraene, B., Litkowski, S., Gredler, H., Lindem, A., Francois, P., and C. Bowers, «Shortest Path First (SPF) Back-Off Delay Algorithm for Link-State IGPs», RFC 8405, DOI 10.17487/RFC8405, June 2018, <https://www.rfc-editor.org/info/rfc8405>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[RFC8476] Tantsura, J., Chunduri, U., Aldrin, S., and P. Psenak, «Signaling Maximum SID Depth (MSD) Using OSPF», RFC 8476, DOI 10.17487/RFC8476, December 2018, <https://www.rfc-editor.org/info/rfc8476>.

[RFC9314] Jethanandani, M., Ed., Rahman, R., Ed., Zheng, L., Ed., Pallagatti, S., and G. Mirsky, «YANG Data Model for Bidirectional Forwarding Detection (BFD)», RFC 9314, DOI 10.17487/RFC9314, September 2022, <https://www.rfc-editor.org/info/rfc9314>.

6.2. Дополнительная литература

[RFC0905] International Organization for Standardization, «ISO Transport Protocol specification ISO DP 8073», RFC 905, DOI 10.17487/RFC0905, April 1984, <https://www.rfc-editor.org/info/rfc905>.

[RFC4750] Joyal, D., Ed., Galecki, P., Ed., Giacalone, S., Ed., Coltun, R., and F. Baker, «OSPF Version 2 Management Information Base», RFC 4750, DOI 10.17487/RFC4750, December 2006, <https://www.rfc-editor.org/info/rfc4750>.

[RFC5443] Jork, M., Atlas, A., and L. Fang, «LDP IGP Synchronization», RFC 5443, DOI 10.17487/RFC5443, March 2009, <https://www.rfc-editor.org/info/rfc5443>.

[RFC5643] Joyal, D., Ed. and V. Manral, Ed., «Management Information Base for OSPFv3», RFC 5643, DOI 10.17487/RFC5643, August 2009, <https://www.rfc-editor.org/info/rfc5643>.

[RFC5649] Housley, R. and M. Dworkin, «Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm», RFC 5649, DOI 10.17487/RFC5649, September 2009, <https://www.rfc-editor.org/info/rfc5649>.

[RFC5880] Katz, D. and D. Ward, «Bidirectional Forwarding Detection (BFD)», RFC 5880, DOI 10.17487/RFC5880, June 2010, <https://www.rfc-editor.org/info/rfc5880>.

[RFC5881] Katz, D. and D. Ward, «Bidirectional Forwarding Detection (BFD) for IPv4 and IPv6 (Single Hop)», RFC 5881, DOI 10.17487/RFC5881, June 2010, <https://www.rfc-editor.org/info/rfc5881>.

Благодарности

Авторы благодарны Yi Yang, Alexander Clemm, Gaurav Gupta, Ladislav Lhotka, Stephane Litkowski, Greg Hankins, Manish Gupta, Michael Darwish, Alan Davey, Renato Westphal за подробные рецензии и полезные замечания.

Спасибо Tom Petch за рецензию Last Call и улучшение организации документа.

Спасибо Alvaro Retana за комментарии AD.

Спасибо Benjamin Kaduk, Suresh Krishnan, Roman Danyliw за комментарии IESG review.

Принадлежность автора к MITRE Corporation указана лишь для идентификации и не означает явного согласия или поддержки корпорацией MITRE высказанных суждений, мнений ил точек зрения. Корпорация MITRE одобрила публикацию этого документа для Public Release, Distribution Unlimited с Public Release Case Number 18-3194.

Участники работы

Dean Bogdanovic
Volta Networks, Inc.
Email: dean@voltanet.io
 
Kiran Koushik Agrahara Sreenivasa
Verizon
500 W Dove Rd
Southlake, TX 76092
United States of America
Email: kk@employees.org

Адреса авторов

Derek Yeung
Arrcus, Inc.
2077 Gateway Place, Suite 400
San Jose, CA 95110
United States of America
Email: derek@arrcus.com
 
Yingzhen Qu
Futurewei
2330 Central Expressway
Santa Clara, CA 95050
United States of America
Email: yingzhen.qu@futurewei.com
 
Jeffrey Zhang
Juniper Networks
10 Technology Park Drive
Westford, MA 01886
United States of America
Email: zzhang@juniper.net
 
Ing-Wher Chen
The MITRE Corporation
Email: ingwherchen@mitre.org
 
Acee Lindem
Cisco Systems
301 Midenhall Way
Cary, NC 27513
United States of America
Email: acee@cisco.com

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Запись опубликована в рубрике RFC. Добавьте в закладки постоянную ссылку.

Добавить комментарий