submodule openconfig-bgp-global {

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

  import openconfig-extensions { prefix oc-ext; }
  import openconfig-yang-types { prefix oc-yang; }
  import openconfig-inet-types { prefix oc-inet; }

  // Include common submodules
  include openconfig-bgp-common;
  include openconfig-bgp-common-multiprotocol;
  include openconfig-bgp-peer-group;
  include openconfig-bgp-common-structure;

  // meta
  organization
    "OpenConfig working group";

  contact
    "OpenConfig working group
    netopenconfig@googlegroups.com";

  description
    "This sub-module contains groupings that are specific to the
    global context of the OpenConfig BGP module";

  oc-ext:openconfig-version "9.1.0";

  revision "2022-05-21" {
    description
      "Added extended-next-hop-encoding leaf.";
    reference "9.1.0";
  }

  revision "2022-04-26" {
    description
      "Transition decimal64 types to uint16 for various BGP timers";
    reference "9.0.0";
  }

  revision "2022-03-21" {
    description
      "Add BGP port";
    reference "8.1.0";
  }

  revision "2021-12-01" {
    description
      "Add prefix-limit-received, add prefix-limit
      state nodes, change/relocate restart-timer";
    reference "8.0.0";
  }

  revision "2021-10-21" {
    description
      "Removal of top-level /bgp container";
    reference "7.0.0";
  }

  revision "2021-06-16" {
    description
      "Remove trailing whitespace";
    reference "6.1.1";
  }

  revision "2021-03-17" {
    description
      "Add bfd support without augmentation.";
    reference "6.1.0";
  }

  revision "2019-07-10" {
    description
      "Normalise timestamp units to nanoseconds.";
    reference "6.0.0";
  }

  revision "2019-05-28" {
    description
      "Clarify prefix counter descriptions, add received-pre-policy
      counter.";
    reference "5.2.0";
  }

  revision "2019-04-16" {
    description
      "Add BGP RIB to the top-level BGP container";
    reference "5.1.0";
  }

  revision "2018-11-21" {
    description
      "Add OpenConfig module metadata extensions.";
    reference "5.0.2";
  }

  revision "2018-08-20" {
    description
      "Correct description of AFI-SAFI enabled leaf.";
    reference "5.0.1";
  }

  revision "2018-04-11" {
    description
      "Correct naming of BGP maximum prefix warning percentage leaf.";
    reference "5.0.0";
  }

  revision "2018-03-20" {
    description
      "Added SR-TE policy SAFI";
    reference "4.1.0";
  }

  revision "2017-07-10" {
    description
      "Add error notifications; moved add-paths config; add AS
      prepend policy features; removed unneeded config leaves";
    reference "4.0.0";
  }

  revision "2017-02-02" {
    description
      "Bugfix to remove remaining global-level policy data";
    reference "3.0.1";
  }

  revision "2017-01-26" {
    description
      "Add dynamic neighbor support, migrate to OpenConfig types";
    reference "3.0.0";
  }

  revision "2016-06-21" {
    description
      "OpenConfig BGP refactor";
    reference "2.1.1";
  }

  grouping bgp-global-config {
    description
      "Global configuration options for the BGP router.";

    leaf as {
      type oc-inet:as-number;
      mandatory true;
      description
        "Local autonomous system number of the router.  Uses
        the 32-bit as-number type from the model in RFC 6991.";
    }

    leaf router-id {
      type oc-yang:dotted-quad;
      description
        "Router id of the router - an unsigned 32-bit integer
        expressed in dotted quad notation.";
      reference
        "RFC4271 - A Border Gateway Protocol 4 (BGP-4),
        Section 4.2";
    }
  }

  grouping bgp-global-state {
    description
      "Operational state parameters for the BGP neighbor";

    uses bgp-common-state;
  }

  grouping bgp-global-default-route-distance-config {
    description
      "Configuration options relating to the administrative distance
      (or preference) assigned to routes received from different
      sources (external, internal, and local).";

    leaf external-route-distance {
      type uint8 {
        range "1..255";
      }
      description
        "Administrative distance for routes learned from external
        BGP (eBGP).";
    }
    leaf internal-route-distance {
      type uint8 {
        range "1..255";
      }
      description
        "Administrative distance for routes learned from internal
        BGP (iBGP).";
    }
  }

  grouping bgp-global-confederation-config {
    description
      "Configuration options specifying parameters when the local
      router is within an autonomous system which is part of a BGP
      confederation.";

    leaf identifier {
      type oc-inet:as-number;
      description
        "Confederation identifier for the autonomous system.
        Setting the identifier indicates that the local-AS is part
        of a BGP confederation.";
    }

    leaf-list member-as {
      type oc-inet:as-number;
      description
        "Remote autonomous systems that are to be treated
        as part of the local confederation.";
    }
  }

  grouping bgp-global-dynamic-neighbors {
    description
      "Grouping containing configuration relating to dynamic peers.";

    container dynamic-neighbor-prefixes {
      description
        "A list of IP prefixes from which the system should:
          - Accept connections to the BGP daemon
          - Dynamically configure a BGP neighbor corresponding to the
            source address of the remote system, using the parameters
            of the specified peer-group.
         For such neighbors, an entry within the neighbor list should
         be created, indicating that the peer was dynamically
         configured, and referencing the peer-group from which the
         configuration was derived.";

      list dynamic-neighbor-prefix {
        key "prefix";
        description
          "An individual prefix from which dynamic neighbor
          connections are allowed.";

        leaf prefix {
          type leafref {
            path "../config/prefix";
          }
          description
            "Reference to the IP prefix from which source connections
            are allowed for the dynamic neighbor group.";
        }

        container config {
          description
            "Configuration parameters relating to the source prefix
            for the dynamic BGP neighbor connections.";

          uses bgp-global-dynamic-neighbor-config;
        }

        container state {
          config false;
          description
            "Operational state parameters relating to the source
            prefix for the dynamic BGP neighbor connections.";

          uses bgp-global-dynamic-neighbor-config;
        }
      }
    }
  }

  grouping bgp-global-dynamic-neighbor-config {
    description
      "Configuration parameters relating to an individual prefix from
      which dynamic neighbors are accepted.";

    leaf prefix {
      type oc-inet:ip-prefix;
      description
        "The IP prefix within which the source address of the remote
        BGP speaker must fall to be considered eligible to the
        dynamically configured."; }

    leaf peer-group {
      type leafref {
        // At bgp/global/dynamic-neighbor-prefixes/dynamic-neighbor
        // prefix/config/peer-group
        path "../../../../../peer-groups/peer-group/config/" +
             "peer-group-name";
      }
      description
        "The peer-group within which the dynamic neighbor will be
        configured.  The configuration parameters used for the dynamic
        neighbor are those specified within the referenced peer
        group.";
    }
  }

  grouping bgp-global-mp-all-afi-safi-list-contents {
    description
      "A grouping used for contents of the list of AFI-SAFI
      entries at the global BGP level.";

    // import and export policy included for the afi/safi

    uses bgp-common-mp-ipv4-unicast-group;
    uses bgp-common-mp-ipv6-unicast-group;
    uses bgp-common-mp-ipv4-labeled-unicast-group;
    uses bgp-common-mp-ipv6-labeled-unicast-group;
    uses bgp-common-mp-l3vpn-ipv4-unicast-group;
    uses bgp-common-mp-l3vpn-ipv6-unicast-group;
    uses bgp-common-mp-l3vpn-ipv4-multicast-group;
    uses bgp-common-mp-l3vpn-ipv6-multicast-group;
    uses bgp-common-mp-l2vpn-vpls-group;
    uses bgp-common-mp-l2vpn-evpn-group;
    uses bgp-common-mp-srte-policy-ipv4-group;
    uses bgp-common-mp-srte-policy-ipv6-group;
  }

  grouping bgp-global-afi-safi-list {
    description
      "List of address-families associated with the BGP instance";

    list afi-safi {
      key "afi-safi-name";

      description
        "AFI,SAFI configuration available for the
        neighbour or group";

      leaf afi-safi-name {
        type leafref {
          path "../config/afi-safi-name";
        }
        description
          "Reference to the AFI-SAFI name used as a key
          for the AFI-SAFI list";
      }

      container config {
        description
          "Configuration parameters for the AFI-SAFI";
        uses bgp-common-mp-afi-safi-config;
      }
      container state {
        config false;
        description
          "State information relating to the AFI-SAFI";
        uses bgp-common-mp-afi-safi-config;
        uses bgp-common-state;
      }

      container graceful-restart {
        description
          "Parameters relating to BGP graceful-restart";
        container config {
          description
            "Configuration options for BGP graceful-restart";
          uses bgp-common-mp-afi-safi-graceful-restart-config;
        }
        container state {
          config false;
          description
            "State information for BGP graceful-restart";
          uses bgp-common-mp-afi-safi-graceful-restart-config;
        }
      }

      uses bgp-common-route-selection-options;
      uses bgp-common-global-group-use-multiple-paths;
      uses bgp-common-structure-neighbor-group-add-paths;
      uses bgp-global-mp-all-afi-safi-list-contents;
    }
  }

  // Structural groupings
  grouping bgp-global-base {
    description
      "Global configuration parameters for the BGP router";

    container config {
      description
        "Configuration parameters relating to the global BGP router";
      uses bgp-global-config;
    }
    container state {
      config false;
      description
        "State information relating to the global BGP router";
      uses bgp-global-config;
      uses bgp-global-state;
    }

    container default-route-distance {
      description
        "Administrative distance (or preference) assigned to
        routes received from different sources
        (external, internal, and local).";

      container config {
        description
          "Configuration parameters relating to the default route
          distance";
        uses bgp-global-default-route-distance-config;
      }
      container state {
        config false;
        description
          "State information relating to the default route distance";
        uses bgp-global-default-route-distance-config;
      }
    }

    container confederation {
      description
        "Parameters indicating whether the local system acts as part
        of a BGP confederation";

      container config {
        description
          "Configuration parameters relating to BGP confederations";
        uses bgp-global-confederation-config;
      }
      container state {
        config false;
        description
          "State information relating to the BGP confederations";
        uses bgp-global-confederation-config;
      }
    }

    container graceful-restart {
      description
        "Parameters relating the graceful restart mechanism for BGP";
      container config {
        description
          "Configuration parameters relating to graceful-restart";
        uses bgp-common-graceful-restart-config;
      }
      container state {
        config false;
        description
          "State information associated with graceful-restart";
        uses bgp-common-graceful-restart-config;
      }
    }

    uses bgp-common-global-group-use-multiple-paths;
    uses bgp-common-route-selection-options;

    container afi-safis {
      description
        "Address family specific configuration";
      uses bgp-global-afi-safi-list;
    }

    uses bgp-global-dynamic-neighbors;
  }

}