submodule openconfig-ospfv2-area-interface {

  belongs-to openconfig-ospfv2 {
    prefix "oc-ospfv2";
  }

  import ietf-yang-types { prefix "yang"; }
  import openconfig-extensions { prefix "oc-ext"; }
  import openconfig-types { prefix "oc-types"; }
  import openconfig-interfaces { prefix "oc-if"; }
  import openconfig-ospf-types { prefix "oc-ospf-types"; }

  // include common submodule
  include openconfig-ospfv2-common;

  // meta
  organization "OpenConfig working group";

  contact
    "OpenConfig working group
    www.openconfig.net";

  description
    "This submodule provides OSPFv2 configuration and operational
    state parameters that are specific to the area context";

  oc-ext:openconfig-version "0.1.0";

  revision "2017-02-28"{
    description
      "Initial public release of OSPFv2";
    reference "0.1.0";
  }

  revision "2016-06-24" {
    description
      "Initial revision";
    reference "0.0.1";
  }

  grouping ospfv2-area-interface-config {
    description
      "Configuration parameters for an OSPF interface";

    leaf id {
      type string;
      description
        "An operator-specified string utilised to uniquely
        reference this interface";
    }

    leaf network-type {
      type identityref {
        base "oc-ospf-types:OSPF_NETWORK_TYPE";
      }
      description
        "The type of network that OSPFv2 should use for the specified
        interface.";
    }

    leaf priority {
      type uint8;
      description
        "The local system's priority to become the designated
        router";
    }

    leaf multi-area-adjacency-primary {
      type boolean;
      default true;
      description
        "When the specified interface is included in more than one
        area's configuration, this leaf marks whether the area should
        be considered the primary (when the value is true). In the
        case that this value is false, the area is considered a
        secondary area.";
    }

    leaf authentication-type {
      type string;
      // rjs TODO: discuss with bogdanov@ what the approach for auth
      // links should be.
      description
        "The type of authentication that should be used on this
        interface";
    }

    leaf metric {
      type oc-ospf-types:ospf-metric;
      description
        "The metric for the interface";
    }

    leaf passive {
      type boolean;
      description
        "When this leaf is set to true, the interface should be
        advertised within the OSPF area but OSPF adjacencies should
        not be established over the interface";
    }

    leaf hide-network {
      type boolean;
      description
        "When this leaf is set to true, the network connected to
        the interface should be hidden from OSPFv2 advertisements
        per the procedure described in RFC6860.";
      reference
        "RFC6860 - Hiding Transit-Only Networks in OSFF";
    }
  }

  grouping ospfv2-area-interface-timers-config {
    description
      "Configuration parameters relating to per-interface OSPFv2
      timers";

    leaf dead-interval {
      type uint32;
      units seconds;
      description
        "The number of seconds that the local system should let
        elapse before declaring a silent router down";
      reference "RFC2328";
    }

    leaf hello-interval {
      type uint32;
      units seconds;
      description
        "The number of seconds the local system waits between the
        transmission of subsequent Hello packets";
    }

    leaf retransmission-interval {
      type uint32;
      units seconds;
      description
        "The number of seconds that the local system waits before
        retransmitting an unacknowledged LSA.";
    }
  }

  grouping ospfv2-area-interface-mpls-config {
    description
      "Configuration parameters relating to MPLS extensions for OSPF";

    leaf traffic-engineering-metric {
      type uint32;
      description
        "A link metric that should only be considered for traffic
        engineering purposes.";
      reference "RFC3630, §2.5.5";
    }
  }

  grouping ospfv2-area-interface-neighbor-config {
    description
      "Configuration parameters relating to an individual neighbor
      system on an interface within an OSPF area";

    leaf router-id {
      type yang:dotted-quad;
      description
        "The router ID of the remote system.";
    }

    leaf metric {
      type oc-ospf-types:ospf-metric;
      description
        "The metric that should be considered to the remote neighbor
        over this interface. This configuration is only applicable
        for multiple-access networks";
    }
  }

  grouping ospfv2-area-interface-neighbor-state {
    description
      "Operational state parameters relating an individual neighbor
      system on an interface within an OSPF area";

    leaf priority {
      type uint8;
      description
        "The remote system's priority to become the designated
        router";
    }

    leaf dead-time {
      // rjs TODO: discussion with aashaikh@ + hines@ around how this
      // value should be represented, usually is a timer that
      // continually counts down but this sounds challenging for
      // telemetry.
      type oc-types:timeticks64;
      description
        "The time at which this neighbor's adjacency will be
        considered dead. This value is expressed as a number of
        seconds since the Unix Epoch";
    }

    leaf designated-router {
      type yang:dotted-quad;
      description
        "The designated router for the adjacency. This device
        advertises the Network LSA for broadcast and NBMA networks.";
    }

    leaf backup-designated-router {
      type yang:dotted-quad;
      description
        "The backup designated router for the adjacency.";
    }

    leaf optional-capabilities {
      // rjs TODO: should this be anything more than the hex-string
      // this is currently what is shown in IOS/JUNOS
      type yang:hex-string;
      description
        "The optional capabilities field received in the Hello
        message from the neighbor";
    }

    leaf last-established-time {
      type oc-types:timeticks64;
      units seconds;
      // rjs TODO: check implementations - is FULL considered 'up'
      // since the adjacency is probably up since ExStart
      description
        "The time at which the adjacency was last established with
        the neighbor. That is to say the time at which the
        adjacency last transitioned into the FULL state.

        This value is expressed as the number of seconds, relative to
        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
    }

    leaf adjacency-state {
      type identityref {
        base "oc-ospf-types:OSPF_NEIGHBOR_STATE";
      }
      description
        "The state of the adjacency with the neighbor.";
    }

    leaf state-changes {
      type uint32;
      description
        "The number of transitions out of the FULL state that this
        neighbor has been through";
    }

    leaf retranmission-queue-length {
      type uint32;
      description
        "The number of LSAs that are currently in the queue to be
        retransmitted to the neighbor";
    }
  }

  grouping ospfv2-area-interface-lsa-filter-config {
    description
      "Configuration options relating to filtering LSAs
      on an interface.";

    leaf all {
      type boolean;
      description
        "When this leaf is set to true, all LSAs should be
        filtered to the neighbours with whom adjacencies are
        formed on the interface.";
    }

    // NB: this container can be augmented to add additional
    // filtering options which exist in some implementations.
  }

  grouping ospfv2-area-interface-mpls-igp-ldp-sync-state {
    description
      "Operational state parameters relating to MPLS LDP/IGP
      synchronization on a per-neighbor basis";

    leaf synchronized {
      type boolean;
      description
        "When the value of this leaf is set to true, the
        LDP neighbors reachable via this interface are considered
        to be synchronized, and hence the link is considered
        usable by the IGP.";
    }
  }

  grouping ospfv2-area-interfaces-structure {
    description
      "Structural grouping for configuration and operational state
      parameters that relate to an interface";

    container interfaces {
      description
        "Enclosing container for a list of interfaces enabled within
        this area";

      list interface {
        key "id";

        description
          "List of interfaces which are enabled within this area";

        leaf id {
          type leafref {
            path "../config/id";
          }
          description
            "A pointer to the identifier for the interface.";
        }

        container config {
          description
            "Configuration parameters for the interface on which
            OSPFv2 is enabled";

          uses ospfv2-area-interface-config;
        }

        container state {
          config false;
          description
            "Operational state parameters for the interface on which
            OSPFv2 is enabled";
          uses ospfv2-area-interface-config;
        }

        uses oc-if:interface-ref;

        container timers {
          description
            "Timers relating to OSPFv2 on the interface";

          container config {
            description
              "Configuration parameters for OSPFv2 timers on the
              interface";
            uses ospfv2-area-interface-timers-config;
          }

          container state {
            config false;
            description
              "Operational state parameters for OSPFv2 timers on
              the interface";

            uses ospfv2-area-interface-timers-config;
          }
        }

        container mpls {
          description
            "Configuration and operational state parameters for
            OSPFv2 extensions related to MPLS on the interface.";

          container config {
            description
              "Configuration parameters for OSPFv2 extensions relating
              to MPLS for the interface";
            uses ospfv2-area-interface-mpls-config;
          }

          container state {
            config false;
            description
              "Operational state for OSPFv2 extensions relating to
              MPLS for the interface";
            uses ospfv2-area-interface-mpls-config;
          }

          container igp-ldp-sync {
            description
              "OSPFv2 parameters relating to LDP/IGP synchronization";

            container config {
              description
                "Configuration parameters relating to LDP/IG
                synchronization.";
              uses ospfv2-common-mpls-igp-ldp-sync-config;
            }

            container state {
              config false;
              description
                "Operational state variables relating to LDP/IGP
                synchronization";
              uses ospfv2-common-mpls-igp-ldp-sync-config;
              uses ospfv2-area-interface-mpls-igp-ldp-sync-state;
            }
          }
        }

        container lsa-filter {
          description
            "OSPFv2 parameters relating to filtering of LSAs to
            neighbors the specified interface.";

          container config {
            description
              "Configuration parameters relating to filtering LSAs
              on the specified interface.";
            uses ospfv2-area-interface-lsa-filter-config;
          }

          container state {
            config false;
            description
              "Operational state parameters relating to filtering
              LSAs on the specified interface";
            uses ospfv2-area-interface-lsa-filter-config;
          }
        }

        container neighbors {
          description
            "Enclosing container for the list of neighbors that
            an adjacency has been established with on the interface";

          list neighbor {
            key "router-id";

            description
              "A neighbor with which an OSPFv2 adjacency has been
              established within this area";

            leaf router-id {
              type leafref {
                path "../config/router-id";
              }
              description
                "Reference to the router ID of the adjacent system";
            }

            container config {
              description
                "Configuration parameters relating to the adjacent
                system";
              uses ospfv2-area-interface-neighbor-config;
            }

            container state {
              config false;
              description
                "Operational state parameters relating to the adjacent
                system";
              uses ospfv2-area-interface-neighbor-config;
              uses ospfv2-area-interface-neighbor-state;
            }
          }
        }

      }
    }
  }

}