submodule openconfig-pf-interfaces {
  belongs-to openconfig-policy-forwarding {
    prefix "oc-pf";
  }

  import openconfig-extensions { prefix "oc-ext"; }
  import openconfig-interfaces { prefix "oc-if"; }

  include openconfig-pf-forwarding-policies;

  organization
    "OpenConfig working group";

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

  description
    "This submodule contains groupings related to the association
    between interfaces and policy forwarding rules.";

  oc-ext:openconfig-version "0.5.0";

  revision "2022-01-25" {
    description
      "Add GUE and MPLS-in-UDP decapsulation actions.";
    reference "0.5.0";
  }

  revision "2021-08-06" {
    description
      "Update path to the network instance action to allow references
      to other NIs.";
    reference "0.4.0";
  }

  revision "2021-05-19" {
    description
      "Add a VRF selection policy type, and means to apply the
      policy.";
    reference "0.3.0";
  }

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

  revision "2017-06-21" {
    description
      "Amend policy forwarding model based on ACL changes.";
    reference "0.2.0";
  }

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

  revision "2016-11-08" {
    description
      "Initial revision";
    reference "0.0.1";
  }


  grouping pf-interfaces-structural {
    description
      "Structural grouping for interface to forwarding policy bindings
      within the policy-forwarding model.";

    container interfaces {
      description
        "Configuration and operational state relating policy
        forwarding on interfaces.";

      list interface {
        key "interface-id";

        description
          "Configuration and operationals state relating to the
          relationship between interfaces and policy-based forwarding
          rules.";

        leaf interface-id {
          type leafref {
            path "../config/interface-id";
          }
          description
            "A reference to the unique identifier for the interface
            being referenced by the policy.";
        }

        container config {
          description
            "Configuration parameters relating to an interface to
            policy forwarding rule binding.";

          uses pf-interface-config;
        }

        container state {
          config false;
          description
            "Operational state parameters relating to an interface to
            policy forwarding rule binding.";

          uses pf-interface-config;
        }

        uses oc-if:interface-ref;
      }
    }
  }

  grouping pf-interface-config {
    description
      "Configuration parameters relating to an interface to policy
      forwarding rule binding.";

    leaf interface-id {
      type oc-if:interface-id;
      description
        "A unique identifier for the interface.";
    }

    leaf apply-forwarding-policy {
      type leafref {
        // We are at /network-instances/network-instance/
        // policy-forwarding/interfaces/interface/config/
        // apply-forwarding-policy
        path "../../../../policies/policy/config/policy-id";
      }
      description
        "The policy to be applied on the interface. Packets ingress on
        the referenced interface should be compared to the match
        criteria within the specified policy, and in the case that
        these criteria are met, the forwarding actions specified
        applied. These policies should be applied following quality of
        service classification, and ACL actions if such entities are
        referenced by the corresponding interface.";
    }

    leaf apply-vrf-selection-policy {
      type leafref {
        // We are at /network-instances/network-instance/
        // policy-forwarding/interfaces/interface/config/
        // apply-vrf-selection-policy
        path "../../../../policies/policy/config/policy-id";
      }
      description
        "Apply the specific VRF selection policy on the interface. The referenced policy
        MUST be of type VRF_SELECTION_POLICY. The VRF selection policy may coexist with
        a policy-forwarding policy.

        The policy specified in this leaf is used to specifically choose the L3VRF network
        instance that is used for specific input criteria of packets.";
    }
  }
}