DMM Working Group                                          S. Matsushima
Internet-Draft                                                  SoftBank
Intended status: Standards Track                                L. Bertz
Expires: March 17, May 3, 2018                                              Sprint
                                                              M. Liebsch
                                                                     NEC
                                                           S. Gundavelli
                                                                   Cisco
                                                                D. Moses
                                                       Intel Corporation
                                                              C. Perkins
                                                               Futurewei
                                                      September 13,
                                                        October 30, 2017

       Protocol for Forwarding Policy Configuration (FPC) in DMM
                       draft-ietf-dmm-fpc-cpdp-08
                       draft-ietf-dmm-fpc-cpdp-09

Abstract

   This document describes a way, called Forwarding Policy Configuration
   (FPC) to manage the separation of data-plane and control-plane.  FPC
   defines a flexible mobility management system using FPC agent and FPC
   client functions.  An FPC agent provides an abstract interface to the
   data-plane.  The FPC client configures data-plane nodes by using the
   functions and abstractions provided by the FPC agent for that data-
   plane nodes.  The data-plane abstractions presented in this document
   is extensible, in order to support many different types of mobility
   management systems and data-plane functions.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at http://datatracker.ietf.org/drafts/current/. https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on March 17, May 3, 2018.

Copyright Notice

   Copyright (c) 2017 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info)
   (https://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
   2.  Terminology . . . . . . . . . . . . . . . . . . . . . . . . .   4
   3.  FPC Architecture  . . . . . . . . . . Design Objectives and Deployment  . . . . . . . . . . . .   5
   4.  FPC Mobility Information Model for FPC . . .  . . . . . . . . . . . . . . .   8
     4.1.  FPC-Topology  . . .  Model Notation and Conventions  . . . . . . . . . . . . .   8
     4.2.  Core Structure - Information Model Components . . . . . .   9
       4.1.1.  DPNs  . . . . . . . . . . . . . . . . . . . . .
     4.3.  Topology  . . .   9
       4.1.2.  DPN-groups . . . . . . . . . . . . . . . . . . . . .  10
       4.1.3.  Domains . . . . . . . . . . . . . . . . . . . . .
       4.3.1.  DPN . .  12
     4.2.  FPC-Policy . . . . . . . . . . . . . . . . . . . . . . .  12
       4.2.1.  Descriptors  11
       4.3.2.  DPN-Type  . . . . . . . . . . . . . . . . . . . . .  13
       4.2.2.  Actions .  12
       4.3.3.  DPN-Group . . . . . . . . . . . . . . . . . . . . . .  13
       4.2.3.  Policies  . . . . . . . . . . . . . . .
       4.3.4.  Domain  . . . . . . .  14
       4.2.4.  Policy-groups . . . . . . . . . . . . . . . .  15
     4.4.  Policy  . . . .  16
     4.3.  FPC for Mobility Management . . . . . . . . . . . . . . .  16
       4.3.1.  Vport . . . . . .  15
     4.5.  Configurable Policy . . . . . . . . . . . . . . . . . .  16
       4.3.2.  Context .  18
     4.6.  Mobility-Context  . . . . . . . . . . . . . . . . . . . .  19
     4.7.  Monitors  . .  17
       4.3.3.  Monitors . . . . . . . . . . . . . . . . . . . . . .  22
     4.4.
     4.8.  Namespace and Format  . . . . . . . . . . . . . . . . . .  23
     4.5.
     4.9.  Attribute Application . . . . . . . . . . . . . . . . . .  24
   5.  Protocol  . . . . . . . . . . . . . . . . . . . . . . . . . .  25  24
     5.1.  Protocol Messages and Semantics . . . . . . . . . . . . .  25  24
       5.1.1.  CONFIG and CONF_BUNDLE Messages . . . . . . . . . . .  28  27
       5.1.2.  Monitors  . . . . . . . . . . . . . . . . . . . . . .  31  29
     5.2.  Protocol Operation  . . . . . . . . . . . . . . . . . . .  32  30
       5.2.1.  Simple RPC Operation  . . . . . . . . . . . . . . . .  32  30
       5.2.2.  Policy And Mobility on the Agent  . . . . . . . . . .  37  36
       5.2.3.  Optimization for Current and Subsequent Messages  . .  39
       5.2.4.  Pre-provisioning  . . . . . . . . . . . . . . . . . .  44  38
   6.  Protocol Message Details  . . . . . . . . . . . . . . . . . .  45  41
     6.1.  Data Structures And Type Assignment . . . . . . . . . . .  45  41
       6.1.1.  Policy Structures . . . . . . . . . . . . . . . . . .  45  41
       6.1.2.  Mobility Structures . . . . . . . . . . . . . . . . .  47  43
       6.1.3.  Topology Structures . .  Message Attributes  . . . . . . . . . . . . . . .  49
       6.1.4.  Monitors . .  47
   7.  Derived and Subtyped Attributes . . . . . . . . . . . . . . .  51
     7.1.  3GPP Specific Extenstions . . . . .  50
     6.2.  Message Attributes . . . . . . . . . . .  56
   8.  Implementation Status . . . . . . . .  52
       6.2.1.  Header . . . . . . . . . . . .  58
   9.  Security Considerations . . . . . . . . . . .  52
       6.2.2.  CONFIG and CONF_BUNDLE Attributes and Notifications .  52
       6.2.3.  Monitors . . . . . . .  62
   10. IANA Considerations . . . . . . . . . . . . . . .  55
   7.  Derived and Subtyped Attributes . . . . . .  63
   11. Work Team Participants  . . . . . . . . .  55
     7.1.  3GPP Specific Extenstions . . . . . . . . . .  64
   12. References  . . . . . .  58
   8.  Implementation Status . . . . . . . . . . . . . . . . . . .  64
     12.1.  Normative References .  60
   9.  Security Considerations . . . . . . . . . . . . . . . . .  65
     12.2.  Informative References . .  64
   10. IANA Considerations . . . . . . . . . . . . . . .  65
   Appendix A.  YANG Data Model for the FPC protocol . . . . . .  65
   11. Work Team Participants . .  66
     A.1.  FPC YANG Model  . . . . . . . . . . . . . . . . .  67
   12. References  . . . . . . . . . . . . . . . . . . . . . . . . .  67
     12.1.  Normative References . . . . . . . . . . . . . . . . . .  67
     12.2.  Informative References . . . . . . . . . . . . . . . . .  68
   Appendix A.  YANG Data Model for the FPC protocol . . . . . . . .  69
     A.1.  FPC Agent YANG Model  . . . . . . . . . . . . . . . . . .  69
     A.2.  YANG Models . . . . . . . . . . . . . . . . . . . . . . .  86  89
       A.2.1.  FPC YANG Settings and Extensions Model  . . . . . . . . . . . . . . . . . . .  86  89
       A.2.2.  PMIP QoS Model  . . . . . . . . . . . . . . . . . . . 102 105
       A.2.3.  Traffic Selectors YANG Model  . . . . . . . . . . . . 115
       A.2.4.  FPC 3GPP Mobility YANG Model  . . . . . . . . . . . . 127
       A.2.5.  FPC / PMIP Integration YANG Model . . . . . . . . . . 144
       A.2.6.  FPC Policy Extension YANG Model . . . . . . . . . . . 151 117
     A.3.  FPC YANG Data Model Structure . . . . . . . . . . . . . . 155 125
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . . 159 128

1.  Introduction

   This document describes Forwarding Policy Configuration (FPC), a
   system for managing the separation of data-plane and control-plane.
   FPC enables flexible mobility management using FPC agent and FPC
   client functions.  An FPC agent exports an abstract interface to the
   data-plane.  To configure data-plane nodes and functions, the FPC
   client uses the interface to the data-plane offered by the FPC agent.

   Control planes of mobility management systems, or other applications
   which require data-plane control, can utilize the FPC client at
   various granularities of operation.  The operations are capable of
   configuring a single Data-Plane Node (DPN) directly, as well as
   multiple DPNs as determined by abstracted data-plane models on the
   FPC agent.

   A FPC agent provides data-plane abstraction in the following three
   areas:

   Topology:  DPNs are grouped and abstracted according to well-known
      concepts of mobility management such as access networks, anchors
      and domains.  A FPC agent provides an interface to the abstract
      DPN-groups that enables definition of a topology for the
      forwarding plane.  For example, access nodes may be assigned to a
      DPN-group which peers to a DPN-group of anchor nodes.

   Policy:  A Policy embodies the mechanisms for processing specific
      traffic flows or packets.  This is needed for QoS, for packet
      processing to rewrite headers, etc.  A Policy consists of one or
      more rules.  Each rule is composed of Descriptors and Actions.
      Descriptors in a rule identify traffic flows, and Actions apply
      treatments to packets that match the Descriptors in the rule.  An
      arbitrary set of policies can be abstracted as a Policy-group to
      be applied to a particular collection
      of flows, which is called flows throgh the Virtual Port (Vport). use of a Configurable-Policy.

   Mobility:  A mobility session which is active on a mobile node is
      abstracted as a Context Mobility-Context with associated runtime concrete
      attributes, such as tunnel endpoints, tunnel identifiers,
      delegated prefix(es), routing information, etc.  Contexts  Mobility-Contexts
      are attached to DPN-groups along with consequence DPNs via DPN-References.  The References assign
      pre-defined Policies that were requested to be enforced as part of
      the control
      plane.  One or multiple Contexts which have same sets of mobility signaling request.  Policy may also be realized by
      Embedded-Rules in the DPN-Reference.  Such policies are assigned Vports which abstract those policy sets.  A Context
      can belong to multiple Vports which serve various kinds typically
      highly specialized (e.g. negotiated as a part of purpose
      and policy. signaling), were
      not pre-provisioned or designed as a template.  Hence, they are
      not reusable across Mobility-Contexts.

      Monitors provide a mechanism to produce reports when events
      regarding Vports, Sessions, Configurable Policies, Mobility Contexts, DPNs or the
      Agent occur.

   The Agent assembles applicable sets of forwarding policies for the
   mobility sessions from the data model, and then renders those
   policies into specific configurations for each DPN to which the
   sessions attached.  The specific protocols and configurations to
   configure DPN from a FPC Agent are outside the scope of this
   document.

   The data-plane abstractions may be extended to support many different
   mobility management systems and data-plane functions.  The
   architecture and protocol design of FPC is not tied to specific types
   of access technologies and mobility protocols.

2.  Terminology

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in [RFC2119].

   DPN:                    A data-plane node (DPN) is capable of
                           deploying data-plane features.  DPNs may be
                           switches or routers regardless of their
                           realiziation, i.e. whether they are hardware
                           or software based.

   FPC Agent:              A functional entity in FPC that manages DPNs
                           and provides abstracted data-plane networks
                           to mobility management systems and/or
                           applications through FPC Clients.

   FPC Client:             A functional entity in FPC that is integrated
                           with mobility management systems and/or
                           applications to control forwarding policy,
                           mobility sessions and DPNs.

   Tenant:                 An operational entity that manages mobility
                           management systems or applications which
                           require data-plane functions.

   Domain:                 One or more DPNs that form a data-plane
                           network.  A mobility management system or an
                           application in a tenant may utilize a single
                           or multiple domains.

   Virtual Port (Vport):

   Configurable Policy:    A set of forwarding policies. Rules (forwarding policies)
                           installed upon a DPN.

   Mobility Context:       An abstracted endpoint of a mobility session
                           associated with runtime attributes.  Vports
                           may apply to Context which instantiates those
                           forwarding policies on a DPN.

3.  FPC Architecture Design Objectives and Deployment

   To fulfill the requirements described in [RFC7333], FPC enables
   mobility control-planes and applications to configure DPNs with
   various roles of the mobility management as described in
   [I-D.ietf-dmm-deployment-models].

   FPC defines building blocks of FPC Agent and FPC Client, as well as
   data models for the necessary data-plane abstractions.  The
   attributes defining those data models serve as protocol elements for
   the interface between the FPC Agent and the FPC Client.

   Mobility control-planes and applications integrate the FPC Client
   function.  The FPC Client connects to FPC Agent functions.  The
   Client and the Agent communicate based on information models for the
   data-plane abstractions described in Section 4.  The data models
   allow the control-plane and the applications to support forwarding
   policies on the Agent for their mobility sessions.

   The FPC Agent carries out the required configuration and management
   of the DPN(s).  The Agent determines DPN configurations according to
   the forwarding policies requested by the FPC Client.  The DPN
   configurations could be specific to each DPN implementation such that
   how FPC Agent determines implementation specific configuration for a
   DPN is outside of the scope of this document.  Along with the models,
   the control-plane and the applications put Policies to the Agent
   prior to creating their mobility sessions.

   Once the Topology of DPN(s) and domains are defined for a data plane
   on an Agent, the data-plane nodes (DPNs) are available for further
   configuration.  The FPC Agent connects those DPNs to manage their
   configurations.

   This architecture is illustrated in Figure 1.  An FPC Agent may be
   implemented in a network controller that handles multiple DPNs, or
   there is a simple case where another FPC Agent may itself be
   integrated into a DPN.

   This document does not adopt a specific protocol for the FPC
   interface protocol and it is out of scope.  However it must be
   capable of supporting FPC protocol messages and transactions
   described in Section 5.

                           +-------------------------+
                           | Mobility Control-Plane  |
                           |          and            |
                           |      Applications       |
                           |+-----------------------+|
                           ||      FPC Client       ||
                           |+----------^------------+|
                           +-----------|-------------+
               FPC interface protocol  |
                       +---------------+-----------------+
                       |                                 |
         Network       |                                 |
         Controller    |                      DPN        |
           +-----------|-------------+        +----------|---------+
           |+----------v------------+|        |+---------v--------+|
           ||   [Data-plane model]  ||        ||[Data-plane model]||
           ||       FPC Agent       ||        ||    FPC Agent     ||
           |+-----------------------+|        |+------------------+|
           |+------------+----------+|        |                    |
           ||SB Protocols|FPC Client||        |  DPN Configuration |
           ||   Modules  |  Module  ||        +--------------------+
           |+------^-----+----^-----+|
           +-------|----------|------+
                   |          |
         Other     |          | FPC interface
         Southband |          | Protocol
         Protocols |          |
                   |          +-----------------+
                   |                            |
       DPN         |                 DPN        |
        +----------|---------+       +----------|---------+
        |+---------v--------+|       |+---------v--------+|
        ||  Configuration   ||       ||[Data-plane model]||
        || Protocol module  ||       ||     FPC Agent    ||
        |+------------------+|       |+------------------+|
        |                    |       |                    |
        | DPN Configuration  |       |  DPN Configuration |
        +--------------------+       +--------------------+

         Figure 1: Reference Forwarding Policy Configuration (FPC)
                               Architecture

   The FPC architecture supports multi-tenancy; an FPC enabled data-
   plane supports tenants of multiple mobile operator networks and/or
   applications.  It means that the FPC Client of each tenant connects
   to the FPC Agent and it MUST partition namespace and data for their
   data-planes.  DPNs on the data-plane may fulfill multiple data-plane
   roles which are defined per session, domain and tenant.

   Note that all FPC models SHOULD be configurable.  The FPC interface
   protocol in Figure 1 is only required to handle runtime data in the
   Mobility model.  The rest of the FPC models, namely Topology and
   Policy, may be pre-configured, and in that case real-time protocol
   exchanges would not be required for them.  Operators that are tenants
   in the FPC data-plane could configure Topology and Policy on the
   Agent through other means, such as Restconf
   [I-D.ietf-netconf-restconf] or Netconf [RFC6241].

4.  FPC Mobility Information Model for FPC

   This section presents an

4.1.  Model Notation and Conventions

   In order to clarify the description of the information model, this
   draft uses the convention describe in the below.

   Information model representing entities, e.g.  DPNs, Rules, etc., are listed in a
   hierarchical notation where all entities with the abstract
   concepts of FPC, which same hierarchical
   level are language and protocol neutral.  Figure 2
   shows an overview located on the same left-justified position one after the
   other.  When entities are composed of sub-entities, they will appear
   shifted to the FPC data-plane information model.

        (Mobile operator tenant that abstracted data-plane is used)
                |
                +---FPC-Topology
                |     |
                |     +---DPNs
                |     |
                |     +---DPN-groups
                |     |
                |     +---Domains
                |
                +---FPC-Policy
                |    |
                |    +---Descriptors
                | right.

                              |
                              +-[entity2]
                              |    +---Actions         +-[entity2.1]
                              |    |
                |    +---Policies
                |    |
                |    +---Policy-groups
                |
                +---FPC-Mobility
                      |
                      +---Vports
                      |
                      +---Contexts         +-[entity2.2]

                   Figure 2: FPC Data-plane Information Model

4.1.  FPC-Topology

   Topology abstraction enables a physical data-plane network to support
   multiple overlay topologies. Notation - An FPC-Topology consists Example

   Some entities MAY have one or more sub-types placed on the right hand
   side of DPNs, DPN-
   groups and Domains which abstract data-plane topologies for the
   Client's mobility control-planes and applications.

   Utilizing a FPC Agent, a mobile operator can create virtual DPNs element definition in
   an overlay network.  Those such virtual DPNs are treated pointing brackets.  Common types
   include:

   List:  A collection of entities (some could be of the same as
   physical forwarding DPNs in this document.

4.1.1.  DPNs

   The DPNs define all available nodes to kind)

   Set:  A collection of entities without duplications

   Name:  a tenant human-readable string

   Key:  a unique value.  There are 3 types of keys:

      U-Key:  a universally unique key across all tenants.  U-Key spaces
         are typically involve the FPC data-plane
   network.  FPC Agent defines DPN binding to actual nodes.  The role use of registries or language
         specific mechanisms that guarantee universal uniqueness of
         values.

      G-Key:  a DPN in the data-plane is determined at the time the DPN is assigned
   to globally unique key - unique within a DPN-group.

                       (FPC-Topology)
                           |
                           +---DPNs
                                  |
                                  +---DPN-id
                                  |
                                  +---DPN-name
                                  |
                                  +---DPN-groups
                                  |
                                  +---Node-reference

                      Figure 3: DPNs Model Structure

   DPN-id:  The identifier for tenant
      L-Key:  a unique key within the DPN.  The ID format MUST conform to
       Section 4.4.

   DPN-name:  The name set of values in local namespace.
         For example, there exist interfaces with teh same name, e.g.
         "interface0", in two different DPNs within the DPN.

   DPN-groups: same tenant but
         there can only be one "interface0" within each DPN, i.e. its
         local Interface-Id L-Key space.

   The list of DPN-groups to which Settings pattern, i.e. attributes whose names contain the DPN belongs.

   Node-reference:  Indicates a physical node, or word
   'Settings', is a platform genera set that holds unique properties.  If
   multiple values of
       virtualization, to which a property are present they are held in a List for
   the DPN is bound by property within the Agent. settings container.  The
       Agent SHOULD maintain container acts as an
   extensible placeholder for properties (attribute/value pairs).

   Each entity or its subtype may be optional (O) or mandatory (M).
   Entities that node's information, including IP
       address of management and control protocol to connect them.  In
       the case of a node are not marked as optional are mandatory.

             Example: The following example shows 3 entities:
                      - Entity1 is a virtualization platform, FPC Agent
       directs the platform to instantiate a DPN to which globally unique key and has an
                              optional, associated Name
                      - Entity2 is a DPN-group
       attributes.

4.1.2.  DPN-groups

   A DPN-group list
                      - Entity3 is a set of DPNs which share certain specified data-plane
   attributes.  DPN-groups define the data-plane topology consisting of
   a DPN-group of access nodes connecting to an anchor node's DPN-group.

   A DPN-group has attributes such as its data-plane role, supported
   access technologies, mobility profiles, connected peer groups and
   domain.  A DPN may be assigned to multiple DPN-groups in different
   data-plane roles or different domains.

                      (FPC-Topology)
                          |
                          +---DPN-groups
                                 |
                                 +---DPN-group-id
                                 |
                                 +---Data-plane-role
                                 |
                                 +---Domains
                                 |
                                 +---Access-type is optional
                 +
                 |
                                 +---Mobility-profile
                 +-[entity1] <G-Key> (M), <Name> (O)
                 +-[entity2] <List>
                 +-[entity3] <Set> (O)
                 |
                                 +---DPN-group-peers
                 +

                                 Figure 4: DPN-groups Model Structure

   DPN-group-id:  The identifier of the DPN-group.  The ID format MUST
       conform to Section 4.4.

   Data-plane-role:  The data-plane role of the DPN-group, 3

   When expanding entity1 into an information model such as
       access-dpn, anchor-dpn.

   Domains: YANG it
   would result in two values: entity1-GKey and entity1-Name.

4.2.  Core Structure - Information Model Components

   The domains to which substructures that comprise the DPN-group belongs.

   Access-type:  The access type supported by information model are:

   Topology:   defines the DPN-group such as
       ethernet(802.3/11), 3gpp cellular(S1, RAB), if any.

   Mobility-profile:  Identifies a supported mobility profile, such as
       ietf-pmip, or 3gpp.  New profiles may be defined as extensions of
       this specification.  Mobility profiles different DPNs and links between them.

   Policy-Definitions:   describes how to handle flows: how to identify
      traffic and what actions are defined so performed on data packets

   Configurable-Policy:   policies that some
       or all data-plane parameters of are relatively static.  These
      policies are usually pre-provisioned and are modified only when
      the mobility contexts network configuration is updated or when new policy rules are
      configured

   Mobility-Context:   policies that are
       part of the profile can be automatically determined by the FPC
       Agent.

   DPN-group-peers:  The remote peers of created or modified during the DPN-group with parameters
       described in Section 4.1.2.1.

4.1.2.1.  DPN-group Peers

   DPN-group-peers lists relevant parameters
      network's operation.  In most cases, on a per-flow or per session
      basis

   Monitor:   a list of remote peer DPNs as
   illustrated in Figure 5.

                   (DPN-groups) events that trigger notification messages from
      FPC Agents to FPC Clients

                    :
                    |
                       +---DPN-group-peers
                    +-[Mobility]
                    |          +
                    |
                             +---Remote-DPN-group-id          |
                             +---Remote-mobility-profile
                    :          +-[Topology]
                               |
                             +---Remote-data-plane-role
                               +-[Policy]
                               |
                             +---Remote-endpoint-address
                               +-[Configurable-Policy] <Set>
                               |
                             +---Local-endpoint-address
                               +-[Mobility-Context] <Set>
                               |
                             +---MTU-size
                               +-[Monitor] <Set>

           Figure 5: DPN-groups Peer 4: Mobility Information Model - Core Structure

   Remote-DPN-group-id:

4.3.  Topology

   The ID of Topology sub-structure specifies virtual DPNs and the peering DPN-Group.  The ID format
       MUST conform relations
   between them.  It is used by the network management entity to Section 4.4.

   Remote-mobility-profile:  The mobility-profile for select
   the peering DPN-
       group.  Currently defined profiles are ietf-pmip, or 3gpp.  New
       profiles most appropriate DPN resources for handling specific session
   flows.

   A virtual DPN is a logical entity that performs DPN functionality
   (packet movement and management).  It may be defined as extensions represent a physical DPN
   unit, a sub-function of this specification.

   Remote-data-plane-role:  The data-plane role of the peering DPN-
       group.

   Remote-endpoint-address:  Defines Endpoint address a physical DPN or a collection of physical
   DPNs.  The motivation to refer to virtual DPNs in the peering
       DPN-group.

   Local-endpoint-address:  Defines Endpoint address of its own DPN-
       group information
   model rather than physical DPNs is to provide flexibility for network
   architects to define which DPN-selection capabilities are performed
   by the FPC Agent (distributed) and which by the FPC client
   (centralized).

   When a virtual DPN is mapped to peer a physical DPN, the remote DPN-group.

   MTU-size:  Defines MTU size FPC client has
   maximum knowledge of traffic between the DPN-Group DPN architecture and this
       DPN-group-peer.

4.1.3.  Domains

   A domain is defined by an operator uses it to refer perform DPN
   selection for specific sessions.  When a virtual DPN is mapped to a particular network,
   considered as
   collection of physical DPNs, the FPC client cannot select a system specific
   physical DPN because it is hidden by the abstraction and only the FPC
   Agent can address the specific associated physical DPNs.

   The Topology sub-structure is comprised of the following sub-
   structures:

   DPN-Set:   the set of virtual DPNs in a network configuration

   DPN-Type-Set:   a set of DPN-Type entities

   DPN-Group-Set:   a set of virtual DPNs that supports a specific
      administrative purpose (in/out bound, roaming, subnetwork with
      common specific configuration etc.)

   Domain:   a set of cooperating DPN-groups. Domains may tha represent services or applications that are resident within an
   operator's network.

                      (FPC-Topology) a logical partition of
      network resources

                          |
                          +---Domains
                          +-[Topology]
                          |
                                 +---Domain-id          +-[DPN] <Set>
                          |
                                 +---Domain-name          +-[DPN-Type] <Set>
                          |
                                 +---Domain-type          +-[DPN-Group] <Set>
                          |
                                 +---Domain-reference          +-[Domain] <Set>

                      Figure 6: Domain Model Structure

   Domain-id:  Identifier of Domain.  The ID format MUST conform to
       Section 4.4.

   Domain-name: 5: Topology Substructure

4.3.1.  DPN

   The name of the Domain.

   Domain-type:  Specifies which address families are supported within
       the domain.

   Domain-reference:  Indicates a DPN set of resources for the domain which
       consists sub-structure specifies a topology subset of physical nodes, platforms of
       virtualization and physical/virtual links with certain bandwidth,
       etc,.

4.2.  FPC-Policy

   The FPC-Policy consists virtual DPNs in the
   network . Some of Descriptors, Actions, Policies and Policy-
   groups.  These can the DPNs may be viewed as configuration data, identical in contrast to
   Contexts and Vports, which are structures that are instantiated on
   the Agent.  The Descriptors functionality and Actions in a Policy referenced only
   differ by a
   Vport are active when their key.

            |
            +-[DPN] <Set>
            |     +-[DPN-Id] <G-Key>, <Name> (O)
            |     +-[DPN-Resource-Mapping-Reference] (O)
            |     +-[Interface] <Set>
            |                 +-[Interface-Reference]
            |                 |           +-[Access-Technology] <U-Key>
            |                 |           +-[Role] <U-Key>
            |                 |           +-[Interface-Id] <L-Key>
            |                 +-[Interface-Settings] <Set> (O)

                        Figure 6: DPN Substructure

   Each DPN entry contains the Vport is in an active Context, i.e. they
   can following information:

   DPN-Id (Key):  A unique Identifier of the virtual DPN

   DPN-Id (Name):  the human-readable display string
   DPN-Resource-Mapping-Reference (O):  A reference to the underlying
      implementation, e.g. physical node, virtual element, etc. that
      supports this DPN.  This value MUST be applied non-empty prior to traffic on a Dynamic-
      Policies being installed upon the DPN.

4.2.1.  Descriptors

   Descriptors defines classifiers

   Interface-Set:  the set of specific traffic flows, such as
   those based on source interfaces (through which data packets are
      received and destination addresses, protocols, port
   numbers transmitted) of TCP/UDP/SCTP/DCCP, that Virtual DPN.  The virtual DPN
      abstracts one or any way multiple physical DPNs each having one or more
      interfaces.  The Interface-set sub-structure is a collection of classifying packets.
   Descriptors are defined by specific profiles that may be produced
      all interface types available by
   3gpp, ietf or other SDOs.  Many specifications also use this virtual DPN.  The purpose of
      this information is not to describe each interface of each DPN,
      but rather, to indicate the terms
   Filter, Traffic Descriptor or Traffic Selector [RFC6088].  A packet
   that meets entire set of interface types for the criteria
      sake of the DPN selection process, when a Descriptor DPN with specific
      interface capabilities is said required.  Each interface entry has a
      reference to satisfy, pass or
   be consumed by a defined DPN-Type entry in the Descriptor.  Descriptors are assigned an
   identifier DPN-Type-Set sub-
      structure defined below and contain additional information that is
      specific to that interface:

         Interface-Reference - a type 3-tuple key that uniquely references an
         entry in the DPN-Type-Set sub-structure: Access-Technology,
         Role and value.

                      (FPC-Policy)
                          |
                          +---Descriptors
                                 |
                                 +---Descriptor-id
                                 |
                                 +---Descriptor-type
                                 |
                                 +---Descriptor-value

                   Figure 7: Descriptor Model Structure

   Descriptor-id:  Identifier Interface-Id.

         Interface-Settings - An optional set of Descriptor.  The ID format MUST conform
       to Section 4.4.

   Descriptor-type:  The descriptor type, which determines settings of this
         interface (that do not affect the
       classification DPN selection of a specific traffic flows, such as source and
       destination addresses, protocols, port numbers of TCP/UDP/SCTP/
       DCCP, active or any other way
         enabled interfaces).  Examples: MTU size, display name, etc.

4.3.2.  DPN-Type

   DPN-Type is the collection of selecting packets.

   Descriptor-value:  The value all possible types of Descriptor such as IP prefix/address,
       protocol number, port number, interfaces
   defined for DPNs in the network.  The interfaces are grouped
   according to their access technology, e.g. 3GPP, WiMAX, 802.x and
   Role, e.g.  LMA, MAG, PGW, AMF etc.

4.2.2.  Actions

   A Policy defines  Within a list of Actions group, interfaces may
   have additional properties that are more specific, a list of features
   and optionally settings relevant to be applied DPN selection.  This information
   is used when searching for resources in a network to traffic
   meeting the criteria defined by the Descriptors.  Actions include
   traffic management such as shaping, policing based carry out
   required operations on given
   bandwidth, and connectivity actions such as pass, drop, forward to
   given nexthop.  Actions may be defined as part of specific profiles
   which are produced by 3gpp, ietf or other SDOs.

                        (FPC-Policy)
                            |
                            +---Actions
                                   |
                                   +---Action-id data traffic.

               |
                                   +---Action-type
               +-[DPN-Type] <Set>
               |
                                   +---Action-value     +-[Access-Technology] <U-Key>,<Name> (O)
               |     +-[Role] <U-Key>, <Name> (O)
               |     +-[Interface] <Set>
               |             +-[Interface-Id] <L-Key>, <Name> (O)
               |             +-[Interface-Protocol] <Set>
               |             +-[Features] <Set> (O)
               |             +-[Interface-Settings] <Set> (O)

                            Figure 8: Action Model Structure

   Action-id:  Identifier for 7: DPN Type

   Each DPN-Type entry contains the Action.  The ID format MUST conform to
       Section 4.4.

   Action-type:  The type following information:

   Access-technology:   the technology used in the access network that
      originated the signaling (WiMAX, 3GPP, 802.x etc.)

   Role:   the role (MAG, LMA, PGW, AMF etc.) of the action -- i.e. how to treat device sharing the
      interfaces specified traffic flows.  Examples include pass, drop, forward to
       a given nexthop value, shape or police based on given bandwidth
       value, etc.

   Action-value:  Specifies a value below.

   Interface:   A set of interfaces possible for the Action-type, such as
       bandwidth, nexthop address or drop, etc.

4.2.3.  Policies

   Policies are collections of Rules. group above.  Each Policy has
      interface carries the following information:

         Interface-Id: a Policy
   Identifier key that is used together with the 2-tuple
         Access-Technology and Role, to create a list of Rule/Order pairs.  The Order and Rule values
   MUST 3-tuple key that is
         referred to be unique in the Policy.  Unlike interface definition of virtual DPNs

         Interface-Protocols: rotocols supported by this interface -
         PMIP, S5-GTP, S5-PMIP etc.

         Features: an optional set of supported features which further
         determine the AND filter matching suitability of each
   Rule the Policy uses an OR matching interface to find the first Rule whose
   Descriptors are satisfied by the packet.  The search for a Rule to
   apply to packet is executed according to the unique Order values desired
         operation

         Interface-Settings: an optional set of settings that MUST be
         known when determining the Rules.  This is suitability of an ascending order search, i.e. the Rule with interface for the
   lowest Order value is tested first
         specific request.  The difference between 'Features' and if its Descriptors
         'Settings' is that 'Features' are not
   satisfied by the packet static while 'Settings' may
         be configured.  Examples: SequenceNumber=ON/OFF

   The entries Access-Technology and Role represent a tuple key that
   uniquely identifies the Rule with set of interfaces that may be available for
   DPNs of the next lowest Order value specific type.

4.3.3.  DPN-Group

   A DPN-Group is
   tested.  If a Rule is not found then the Policy does not apply.
   Policies contain Rules (not references to Rules).

                 (FPC-Policy)
                     |
                     +---Policies
                            |
                            +---Policy-id
                            |
                            +---Rules
                                  |
                                  +---Order
                                  |
                                  +---Descriptors
                                  |      |
                                  |      +---Descriptor-id
                                  |      |
                                  |      +---Direction
                                  |
                                  +---Actions
                                         |
                                         +---Action-id
                                         |
                                         +---Action-Order

                  Figure 9: Model Structure for Policies

   Policy-id:  Identifier list of Policy.  The ID format MUST conform to
       Section 4.4.

   Rules:  List a group of Rules which are DPNs serving some administrative
   purpose.  Each group contains a collection list of Descriptors DPNs (referenced by DPN-Id)
   and
       Actions.  All Descriptors MUST be satisfied before selected interfaces (referenced by the Actions interface's 3-tuple key).
   The interfaces are taken.  This is known as an AND Descriptor list, i.e.
       Descriptor 1 AND Descriptor 2 AND ... Descriptor X all MUST listed rather than referred implicitly by each
   specific DPN to enable to define a subset of a DPN interfaces to be
       satisfied for
   part of the Rule to apply.

   Order:  Specifies ordering if group.

       |
       +-[DPN-Group] <Set>
       |           +-[DPN-Group-Id] <G-Key>, <Name> (O)
                   +-[Referenced-Interface] <Set>
                   |           +-[Interface-Id] <L-Key>
                   |           +-[Role] <U-Key>
                   |           +-[Access-Technology] <U-Key>
                   |           +-[Supporting-DPN-Id] <Set>
                   |           +-[DPN-Group-Peer-Reference] <Set> (O)
                   +-[DPN-Peer-Group] <Set>
                   |           +-[Remote-DPN-Group-Id] <L-key>
                   |           +-[Interface-Settings] <Set> (O)
                   +-[Domain-Id-Reference]

                            Figure 8: DPN Group

   Each DPN-Group entry contains the Rule has multiple Descriptors and
       Action sets.  Order values MUST be following information:

   DPN-Group (Key):  A unique within the Rules list.

   Descriptors:  The list Identifer of Descriptors.

   Descriptor-id:  Identifies each Descriptor in the Rule.

   Direction:  Specifies which direction applies, such as uplink,
       downlink or both.

   Actions:  List DPN-Group

   DPN-Group (Name):  the human-readable display string

   Referenced-Interfaces:  A set of Actions.

   Action-id:  Indicates each Action in interfaces and the rule.

   Action-Order:  Specifies Action ordering if DPNs / associated
      DPN-Peer-Groups that support them.  Each entry contains

      Interface-Id:   a key that is used together with the Rule has multiple
       actions.  Action-Order values MUST 2-tuple
         Access-Technology and Role, to create a 3-tuple key that is
         referred to be unique within the Actions
       list.

4.2.4.  Policy-groups

   List interface definition of Policy-groups which are an aggregation virtual DPNs

      Role:   the role (MAG, LMA, PGW, AMF etc.) of Policies.  Common
   applications include aggregating Policies the device sharing
         the interfaces specified below.

      Access-technology:   the technology used in the access network
         that are defined by
   different functions, e.g.  Network Address Translation, Security,
   etc.  The structure has an Identifier and references originated the Policies via
   their Identifiers.

                       (FPC-Policy)
                           |
                           +---Policy-groups
                                  |
                                  +---Policy-group-id
                                  |
                                  +---Policies

                  Figure 10: Policy-group Model Structure

   Policy-group-id:  The identifier signaling (WiMAX, 3GPP, 802.x etc.)

      Role:   the role (MAG, LMA, PGW, AMF etc.) of the Policy-group.  The ID format
       MUST conform to Section 4.4.

   Policies:  List device sharing
         the interfaces specified below.

      Supporting-DPN-Id (Set):   A set of Policies in DPN-Id-References that support
         the Policy-group.

4.3.  FPC specific interface for Mobility Management

   The FPC-Mobility consists this DPN-Group.

      Interface-Settings:   an optional set of Vports and Contexts. settings that MUST be
         known when determining the suitability of an interface for the
         specific request.F

   DPN-Peer-Group:  A mobility session
   is abstracted as a Context with its associated runtime concrete
   attributes, such as tunnel endpoints, tunnel identifiers, delegated
   prefix(es) set of Remote (from the DPN-Group's point of view)
      DPN-Groups.  When communication occurs between the DPN-Group and routing information, etc.
      DPN-Peer-Group the Interface-Settings MUST be used.  Each entry
      contains the following information: entry contains

      Remote-DPN-Group-Id:   A Vport abstracts a unique Identifier of the DPN-Peer-Group

      Interface-Settings:   an optional set of
   policies applied to settings that MUST be
         known when determining the Context.

4.3.1.  Vport suitability of an interface for the
         specific request.

4.3.4.  Domain

   A Vport Domain represents a collection logica abstraction of policy groups, that is, a group of
   rules that can exist independently heterogeneous
   Topology resources.  Other models, outside of the mobility/session lifecycle.
   Mobility control-plane applications create, modify and delete Vports
   on FPC Agent through scope of this
   specificaiton, provide the FPC Client.

   When a Vport is indicated in a Context, details for the set of Descriptors and
   Actions in Domain.

               |
               +-[Domain] <Set>
               |           +-[Domain-Id] <G-Key>, <Name> (O)
                           +-[Domain-Reference]

                             Figure 9: Domainn

   Each Domain entry contains the Policies following information:

   Domain (Key):  A unique Identifier of the Vport are collected and applied Domain

   Domain (Name):  the human-readable display string

   Domain-Reference:  A link to the
   Context.  They must be instantiated underlying resource / informaiton
      that provides further details regarding the domain.

4.4.  Policy

   The Policy substructure defines and identifies grouped Rules for
   enforcement on the DPN as forwarding related data plane.  Rules comprise traffic descriptors
   and actions such as QoS differentiations, packet processing of encap/
   decap, header rewrite, route selection, etc.

                     (FPC-Mobility)
                             |
                             +---Vports
                                    |
                                    +---Vport-id
                                    |
                                    +---Policy-groups

                     Figure 11: Vport Model Structure

   Vport-id:  The identifier of Vport.  The ID format MUST conform on how to
       Section 4.4.

   Policy-groups:  List treat traffic in case the traffic descriptor
   matches a data packet.  The Policy substructure is independent of references to Policy-groups a
   policy context, whether it's an administratively configurable policy
   which apply applies to
       the Vport.

4.3.2.  Context

   An endpoint all or a defined aggregate of data flows, or a
   mobility session context-related policy, which is abstracted as a Context with its associated runtime concrete attributes, such as tunnel endpoints,
   tunnel identifiers, delegated prefix(es) and routing information,
   etc.  A with a mobility control-plane, or other applications, can create,
   modify
   session and delete contexts on an FPC Agent by using the FPC Client.

   FPC Agent SHOULD determine runtime attributes may apply only to data traffic of a Context from an associated mobile
   node while being registered.

   In addition to the
   Vport's policies and Policy substructure, the attached DPN's attributes.  A mobility
   control-plane, or other applications, MAY set some of Core Structure per
   Section 4.2 holds accordingly separate entries for the runtime
   attributes directly when they create data-plane related attributes.
   In Configurable-
   Policy as well as for Mobility-Context, which do not only define
   their own policies by embedded rules, but comprise references to
   policy definitions in the case of that Policy substructure, to which additional
   settings can be applies on a mobility control-plane assigns tunnel
   identifiers, for instance.

                 (FPC-Mobility)
                         |
                         +---Contexts
                                |
                                +---Context-id
                                |
                                +---Vports
                                |
                                +---DPN-group
                                |
                                +---Delegated-ip-prefixes
                                |
                                +---Parent-context

                 Figure 12: Common Context Model Structure

   Context-id:  Identifier of the Context.  The ID format MUST conform
       to Section 4.4.

   Vports:  List of Vports.  When a Context is applied to per-Configurable-Policy basis and on a Vport, the
       context
   per-Mobility-Context bases respectively.

   Traffic descriptions and traffic treatment actions are defined
   separately in Descriptor-Definition and Action-Definition
   respectively.  Binding between traffic descriptors and associated
   traffic treatment action is configured by policies at each such Vport.  Vport-id
       references indicate Vports which apply to the Context.  Context
       can be defined in a spread over multiple Vports which have different
       policies.

   DPN-group:  The DPN-group assigned to the Context.

   Delegated-ip-prefixes:  List set of IP prefixes to be delegated rule definition
   entries (Rule-Definition) which comprise references to entries in the
       mobile node
   set of the Context.

   Parent-context:  Indicates traffic descriptors (Descriptor-Reference) and traffic
   treatment actions (Action-Reference).  Accordingly, a parent context from which this context
       inherits.

4.3.2.1.  Single DPN Agent Case

   In the case where single rule or
   a FPC Agent supports only one DPN, the Agent MUST
   maintain Context data just for the DPN.  The Agent does not need group of rules are bound to
   maintain a Topology model.  Contexts policy in single DPN case consists the set of
   following parameters for both direction policy
   definitions (Policy-Definition) by reference to entries in the set of uplink and downlink.

              (Contexts)
   rule definitions (Rule-Id).

      |
      +-[Policy]
      |      +-[Policy-Definition] <Set>
      |      |             +-[Policy-Id] <G-Key> (M)
      |      |             +-[Rule-Reference] Set (M)
      |
                  +---UL-Tunnel-local-address      |
                  +---UL-Tunnel-remote-address             +-[Precedence] <L-Key> (M)
      |
                  +---UL-MTU-size      |
                  +---UL-Mobility-specific-tunnel-parameters             +-[Rule-Id-Reference] (M)
      |
                  +---UL-Nexthop      +-[Rule-Definition] <Set>
      |
                  +---UL-QoS-profile-specific-parameters      |
                  +---UL-DPN-specific-parameters             +-[Rule-Id] <L-Key> (M)
      |      |             +-[Descriptor-Match-Type] (M)
      |      |             +-[Descriptor-Reference] <Set>
      |      |             |                +-[Descriptor-Id-Reference]
      |      |             |                +-[Direction] (O)
      |      |             +-[Action-Reference] <Set>
      |      |                              +-[Action-Id-Reference]
      |      |                              +-[Action-Order]
      |      +-[Descriptor-Definition] <Set>
      |      |             +-[Descriptor -Id] <L-Key> (M)
      |      |             +-[Descriptor-Type]
      |      |             +-[Descriptor-Value]
      |      +-[Action-Definition] <Set>
      |                    +-[Action-Id] <L-Key> (M)
      |                    +-[Action-Type]
      |                    +-[Action-Value]
      |
                  +---UL-Vendor-specific-parameters

                      Figure 13: Uplink Context Model of Single DPN Structure

   UL-Tunnel-local-address:  Specifies uplink endpoint address of 10: Policy Substructure

   The Policy Substructure contains the
       DPN.

   UL-Tunnel-remote-address:  Specifies uplink endpoint address following entries:

   Policy-Definition:   A set of the
       remote DPN.

   UL-MTU-size:  Specifies the uplink MTU size.

   UL-Mobility-specific-tunnel-parameters:  Specifies profile specific
       uplink tunnel parameters to the DPN policy definitions which the agent exists.  This
       may, for example, include GTP/TEID for 3gpp profile, bind a single
      or GRE/Key
       for ietf-pmip profile.

   UL-Nexthop:  Indicates next-hop information multiple rules to a policy.

      Policy-Id:   Identifies a policy definition.

      Rule-Reference:   Assigns a set of uplink rule definitions, which are
         bound to a policy definition, by reference to the associated
         Rule in external
       network such as IP address, MAC address, SPI of service function
       chain [I-D.ietf-sfc-nsh], SID of segment
       routing[I-D.ietf-6man-segment-routing-header]
       [I-D.ietf-spring-segment-routing-mpls], etc.

   UL-QoS-profile-specific-parameters:  Specifies profile specific QoS
       parameters the Rule-Definition Substructure.

      Precedence:   Defines the order with which the rules must be
         applied.

      Rule-Id-Reference:   Identifies a rule.

   Rule-Definition:   A set of uplink, such as QCI/TFT for 3gpp profile,
       [RFC6089]/[RFC7222] for ietf-pmip, rule definitions which bind a single or parameters of new profiles
       defined by extensions
      multiple traffic descriptors (by reference to Descriptor-
      Definition) to a single or multiple traffic treatment actions (by
      reference to Action-Definition).

      Rule-Id:   Identifies a rule definition.

      Descriptor-Match-Type:   Conjuction of this specification.

   UL-DPN-specific-parameters:  Specifies optional node specific
       parameters needed by uplink such Descriptor-Values to apply
         as if-index, tunnel-if-number
       that must match to DPN traffic, which can be unique either OR or AND.  The
         identified conjunction applies to all Descriptor-Definitions in
         the DPN.

   UL-Vendor-specific-parameters:  Specifies given Rule-Definition.

      Descriptor-Reference:   Assigns a vendor specific parameter
       space for the uplink.

              (Contexts)
                  |
                  +---DL-Tunnel-local-address
                  |
                  +---DL-Tunnel-remote-address
                  |
                  +---DL-MTU-size
                  |
                  +---DL-Mobility-specific-tunnel-parameters
                  |
                  +---DL-Nexthop
                  |
                  +---DL-QoS-profile-specific-parameters
                  |
                  +---DL-DPN-specific-parameters
                  |
                  +---DL-Vendor-specific-parameters

         Figure 14: Downlink Context Model of Single DPN Structure

   DL-Tunnel-local-address:  Specifies downlink endpoint address set of descriptors to the
       DPN.

   DL-Tunnel-remote-address:  Specifies downlink endpoint address of rule
         by reference to the
       remote DPN.

   DL-MTU-size:  Specifies associated Descriptor-Definition.

      Descriptor-Id-Reference:   Identifies the referred Descriptor-
         Definition

      Direction:   Indicates if a rule applies to uplink traffic, to
         downlink MTU size of tunnel.

   DL-Mobility-specific-tunnel-parameters:  Specifies profile specific traffic, or to both, uplink- and downlink tunnel parameters traffic.
         Applying a rule to the DPN which the agent exists.
       This may, for example, include GTP/TEID for 3gpp profile, or GRE/
       Key for ietf-pmip profile.

   DL-Nexthop:  Indicates next-hop information of both, uplink- and downlink traffic, in external
       network such as IP address, MAC address, SPI of service function
       chain [I-D.ietf-sfc-nsh], SID of segment
       routing[I-D.ietf-6man-segment-routing-header]
       [I-D.ietf-spring-segment-routing-mpls], etc.

   DL-QoS-profile-specific-parameters:  Specifies profile specific QoS
       parameters case
         of downlink, such as QCI/TFT for 3gpp profile,
       [RFC6089]/[RFC7222] symmetric rules, allows omitting a separate entry for ietf-pmip, or parameters of new profiles
       defined each
         direction.  When not present, the direction is implied by extensions the
         Descriptor's values.

      Action-Reference:   Assigns a set of this specification.

   DL-DPN-specific-parameters:  Specifies optional node specific
       parameters needed actions to the rule by downlink such as if-index, tunnel-if-number
       that must be unique
         reference to the associated Action-Definition.

      Action-Id-Reference:   Identifies the referred Action-Definition.

      Action-Order:   Defines the order how actions are executed in case
         the DPN.

   DL-Vendor-specific-parameters:  Specifies a vendor specific parameter
       space for rule applies per match of the downlink.

4.3.2.2.  Multiple DPN Agent Case

   Alternatively, a FPC Agent may connect to multiple DPNs.  The Agent
   MUST maintain a associated traffic
         descriptor.

   Descriptor-Definition:   A set of Context data for descriptor definitions, each DPN.  The Context
   contains being
      identified by a list of DPNs, where each entry of key (Descriptor-Id)

      Descriptor-Id:   Identifies a descriptor definition.

      Descriptor-Type:   Identifies the list consists type of descriptor, e.g. an IPv6
         traffic selector per [RFC 6088], for unambiguous 2
         interpretation of a Descriptor-Value.

      Descriptor-Value:   Defines all required attribute-value pairs per
         the
   parameters traffic descriptor type identified in Figure 15. Descriptor-Type.

   Action-Definition:   A Context data for one DPN has two entries
   - one for uplink and another set of action definitions.

      Action-Id:   Identifies an action definition.

      Action-Type:   Identifies the type of an action for downlink or, where applicable, a
   direction unambiguous
         interpretation of 'both'.

             (Contexts) an Action-Value entry.

      Action-Value:   Defines all required attribute-value pairs per the
         action type identified in Action-Type.

4.5.  Configurable Policy

           |
                 +---DPNs
           +-[Configurable-Policy] <Set>
           |
                      +---DPN-id               +-[DPN-Id-Reference] <U-Key>
           |
                      +---Direction               +-[Installed-Policy] <List>
           |
                      +---Tunnel-local-address               |
                      +---Tunnel-remote-address           +-[Installed-Policy-Id] <G-Key>
           |
                      +---MTU-size               |
                      +---Mobility-specific-tunnel-parameters           +-[Policy-Id-Reference]
           |
                      +---Nexthop               |
                      +---QoS-profile-specific-parameters           +-[Policy-Settings] <Set> (O)
           |
                      +---DPN-specific-parameters               +-[Settings] <Set> (O)
           |
                      +---Vendor-specific-parameters

                      Figure 15: Multiple-DPN Supported Context Model Structure

   DPN-id:  Indicates 11: Configurable Policy

   The Configurable-Policy Substructure contains the following entries:

   DPN-Id-Reference:   Refers to the DPN of to which the runtime Context data installed.

   Direction:  Specifies which side policy applies.

   Installed-Policy:   A list of connection at policies that apply to an identified
      DPN.

      Installed-Policy-Id:   Holds the DPN indicated -
       uplink, downlink or both.

   Tunnel-local-address:  Specifies endpoint address identifier of the DPN at which
         the
       uplink or downlink.

   Tunnel-remote-address:  Specifies endpoint address of remote DPN at policy has been installed.

      Policy-Id-Reference:   Assigns a policy by reference to the uplink or downlink.

   MTU-size:  Specifies
         associated Policy-Definition.

      Policy-Settings:   Settings that apply to the packet MTU size on uplink previously
         referenced policy to complement rules or downlink.

   Mobility-specific-tunnel-parameters:  Specifies profile specific
       tunnel parameters for uplink make them concrete,
         e.g. in case the descriptor representing a packet match has not
         or downlink unambiguously been defined in the poliicy sub-structure.

   Settings:   Settings that apply to multiple policies at the
      identified DPN.  This may,

4.6.  Mobility-Context

   The Mobility-Context Substructure holds entries associated with a
   mobile node's mobility sessions.  At least one instance is created at
   the mobile node's registration to serve as parent context.
   Additional instances holding child context with reference to parent
   context can be created.  Child context holds, for example, include GTP/TEID for 3gpp profile, or GRE/Key for
       ietf-pmip profile.

   Nexthop:  Indicates next-hop information for uplink or downlink in
       external network such as IP address, MAC address, SPI
   descriptors of service
       function chain [I-D.ietf-sfc-nsh], SID of segment
       routing[I-D.ietf-6man-segment-routing-header]
       [I-D.ietf-spring-segment-routing-mpls], etc.

   QoS-profile-specific-parameters:  Specifies profile specific QoS
       parameters for uplink or downlink mobile node data traffic which needs to be treated
   different from traffic that matches descriptor of the DPN, parent context,
   e.g. in terms of QoS.  Child context can inherit some attributes/
   values from parent context, such as QCI/TFT for
       3gpp profile, [RFC6089]/[RFC7222] for ietf-pmip, or parameters of
       new profiles defined by extensions of this specification.

   DPN-specific-parameters:  Specifies optional node specific parameters
       needed by uplink traffic encapsulation and
   forwarding information, but can hold different or downlink additional
   attributes/values that apply to the DPN such like if-index,
       tunnel-if-number traffic that must be unique in the DPN.

   Vendor-specific-parameters:  Specifies a vendor specific parameter
       space for matches the DPN.

   Multi-DPN Agents will use only descriptor
   of the DPNs list child context.

   Termination a parent context implies termination of all dependent
   child context, e.g. at deregistration of a mobile node.

      |
      +-[Mobility-Context] <Set>
      |            +-[Mobility-Context-Id] <G-Key>
      |            +-[DPN-Group-Id-Reference] (O)
      |            +-[Parent-Mobility-Context-Id-Reference] (O)
      |            +-[DPN-References] <List>
      |            |          +-[DPN-Id-Reference]
      |            |          +-[Direction] (O)
      |            |          +-[DPN-Settings-Complementary]
      |            |          +-[Interface-Id-Reference]
      |            |          +-[Embedded-Rule] <Set> (O)
      |            |          +-[Assigned-Policy-Reference] <Set> (O)
      |            +-[Requested-Policy-Reference] <Set> (O)
      |            +-[Context-Settings-Complementary] <Set> (O)

                        Figure 12: Mobility Context for
   processing as described in this section.  A single-DPN Agent MAY use
   both

   The Mobility-Context Substructure holds the Single Agent following entries:

   Mobility-Context-Id:   Identifies a Mobility-Context

   DPN-Group-Id-Reference:   Assigns a DPN-Group, which groups DPN model Section 4.3.2.1 and that
      are used during the multi-DPN
   Agent DPN selection procedure, by reference.

   Parent-Mobility-Context-Id-Reference:   Assigns a parent Mobility-
      Context described here.

4.3.3.  Monitors

   Monitors provide a mechanism to produce reports when events occur.  A
   Monitor will have aquire settings as required.

   DPN-References:   Holds a target list of DPNs with the associated concrete
      policies that specifies what is apply to be watched.

   When a Monitor is specified, the configuration DPN.  An entry MUST be applicable have at least one
      value present in its Assigned-Policy-Refence or Embedded-Rule sets
      in order to
   the attribute/entity monitored.  For example, a Monitor using a
   Threshold configuration cannot be applied to a Context, because
   Contexts do not have thresholds.  But such valid.

      DPN-Id-Reference:   Assigns a monitor could be applied DPN, to a numeric threshold property of a Context.

                     (FPC-Mobility)
                             |
                             +---Monitors
                                    |
                                    +---Monitor-id
                                    |
                                    +---Target
                                    |
                                    +---Configuration

                 Figure 16: Common Monitor Model Structure

   Monitor-id:  Name of which the Monitor.  The ID format MUST conform policy applies, by
         reference.

      Direction:   Indicates if a rule applies to
       Section 4.4.

   Target:  Target uplink or downlink
         traffic, or to be monitored.  This may be an event, a Context, both, uplink- and downlink traffic.  Applying a
       Vport or attribute(s)
         rule to both, uplink- and downlink traffic, in case of Contexts.
         symmetric rules, allows omitting a separate entry for each
         direction.  When not present the type value is an
       attribute(s) of a Context, assumed to apply to
         both directions.

      DPN-Settings-Complementary:   Complementary seeings that apply to
         the target name is a concatenation of DPN for the Context-Id and given Mobility-Context.

      Interface-Id-Reference:   Assigns the relative path (separated by '/') to selected interface of the
       attribute(s)
         DPN my reference.

      Embedded-Rule:   Rule that applies to be monitored.

   Configuration:  Determined by the Monitor subtype.  Four report types
       are defined:

       *  Periodic reporting specifies an interval by which a
          notification DPN for this Mobility-
         Context.  This rule is sent embedded and not refereced in the Policy
         substructure.

      Assigned-Policy-Reference:   A set of references to the Client.

       *  Event reporting specifies list of
         Requested-Policy-References per this Mobility-Context.

   Requested-Policy-Reference:   Assigns a list of event types that, if they
          occur and are related to the monitored attribute, will result policies in sending a notification Policy-
      Definitions that can apply to any DPN per this Mobility-Context.
      DPN-Reference entries can select from this list of policy
      references to apply to the Client.

       *  Scheduled reporting specifies the time (in seconds since Jan
          1, 1970) when a notification for the monitor should be sent associated DPN.

   Context-Settings-Complementary:   Complementary settings that apply
      to the Client.  Once referenced policies per this Monitor's notification Mobility-Context.

   The Rules Template format is completed aligned with the
          Monitor is automatically de-registered.

       *  Threshold reporting specifies one or both of a low and high
          threshold.  When these values are crossed Rule Substructure.  It
   can represent an Embedded-Rule per the Mobility-Context Substructure.

             |
             +-[Embedded-Rule] <List>
             |         +-[Rule-Id] (M)
             |         +-[Precedence] <L-Key>
             |         +-[Descriptor-Match-Type] (M)
             |         +-[Descriptor-Definition] <Set>
             |         |             +-[Descriptor-Id] <L-Key> (M)
             |         |             +-[Descriptor-Type]
             |         |             +-[Descriptor-Value]
             |         +-[Action-Definition] <Set>
             |                       +-[Action-Order] <L-Key> (M)
             |                       +-[Action-Id] (O)
             |                       +-[Action-Type]
             |                       +-[Action-Value]

                         Figure 13: Rule Template

   The Embedded-Rule template holds the following entries:

   Rule-Id:   Identifies a corresponding
          notification rule definition.  It is sent to provided for
      convenience.

   Precedence:   Defines the Client.

4.4.  Namespace and Format

   The identifiers and names in FPC models order with which reside in the same
   namespace rules must be unique.  That uniqueness must applied
      and is used as the key.

   Descriptor-Match-Type:   Conjuction of Descriptor-Values to apply as
      match to DPN traffic, which can be kept in agent either OR or
   data-plane tenant namespace on an Agent. AND.  The tenant namespace
   uniqueness MUST be applied
      identified conjunction applies to all elements of Descriptor-Definitions in
      the tenant model, i.e.
   Topology, Policy and Mobility models.

   When given Rule-Definition

   Descriptor-Definition:   A set of descriptor definitions, each being
      identified by a Policy needs to be applied to Contexts in all tenants on an
   Agent, key (Descriptor-Id)

      Descriptor-Id:   Identifies a Descriptor-Definition

      Descriptor-Type:   Identifies the Agent SHOULD define that policy to be visible from type of descriptor, e.g. an IPv6
         traffic selector per [RFC 6088], for unambiguous 2
         interpretation of a Descriptor-Value

      Descriptor-Value:   Defines all required attribute-value pairs per
         the
   tenants.  In this case, the Agent assigns an unique identifier traffic descriptor type identified in the
   agent namespace.

   The format Descriptor-Type.

   Action-Definition:   A set of identifiers can utilize any format with agreement
   between data-plane agent and client operators.  The formats include
   but action definitions.

      Action-Order:   Defines the order how actions are not limited to Globally Unique IDentifiers (GUIDs),
   Universally Unique IDentifiers (UUIDs), Fully Qualified Domain Names
   (FQDNs), Fully Qualified Path Names (FQPNs) and Uniform Resource
   Identifiers (URIs).

   The FPC model does not limit executed in case
         the types rule applies per match of format that dictate the
   choice of FPC protocol.  However associated traffic
         descriptor.

      Action-Id:   Identifies an action definition.

      Action-Type:   Identifies the choice type of identifiers which are
   used in Mobility model need to be considered to handle runtime
   parameters an action for unambiguous
         interpretation of an Action-Value entry.

      Action-Value:   Defines all required attribute-value pairs per the
         action type identified in real-time.  The Topology and Policy models are not
   restricted Action-Type.

4.7.  Monitors

   Monitors provide a mechanism to meet produce reports when events occur.  A
   Monitor will have a target that requirement, as described in Section 3.

4.5.  Attribute Application

   Attributes in FPC Topology and Policy SHOULD specifies what is to be pre-configured in watched.

   When a
   FPC Agent prior to Contexts and Vports.  The FPC Agent requires those
   pre-configured attributes to Monitor is specified, the configuration MUST be able applicable to derive
   the attribute/entity monitored.  For example, a Context's detailed
   runtime attributes.

   When Monitor using a FPC Client creates
   Threshold configuration cannot be applied to a Context, the FPC Client is then able because
   Contexts do not have thresholds.  But such a monitor could be applied
   to
   indicate specific DPN-group(s) instead of all endpoint addresses a numeric threshold property of
   the DPN(s) and MTU-size a Context.

                      |
                      +-[Monitor] <List>
                      |         +-[Monitor-Id] <U-Key>
                      |         +-[Target]
                      |         +-[Binding-Information] (O)
                      |         +-[Deterrable] (O)
                      |         +-[Configuration]

                      Figure 14: Monitor Substructure

   Monitor-Id:  Name of the tunnels for example.  This is because
   that the FPC Agent can derive data for those details from the pre-
   configured DPN-group information in the FPC Topology.

   Similarly when a Vport is created for the Context, the FPC Agent can
   derive detailed forwarding policies from the pre-configured Policy
   information in the FPC Policy. Monitor.  The FPC Client thereby has no need Id format MUST conform to
   indicate those specific policies
      Section 4.8.

   Target:  Description of what is to all be monitored.  This can be an
      Event, a Dynamic Policy, an installed DPN Policy, or values of a
      Dynamic-Policy attribute.  When the Contexts which share
   the same set type is an attribute of Policy-groups.

   This
      Mobility-Context, the target name is intentional as it provides FPC Clients a concatenation of the ability to reuse
   pre-configured FPC Topology
      Context-Id and FPC Policy attributes.  It helps to
   minimize over the wire exchanges and reduce system errors relative path (separated by
   exchanging less information.

   The Agent turns those derived data into runtime attributes of UL '/') to the
      attribute(s) to be monitored.  Target must provide unambiguously
      identify the monitored attribute and
   DL objects which are in the DPNs list of location (DPN).

   Binding-Information:  Complements (ambigous) Target information to
      define the Context (multiple-DPNs
   Agent case) or directly under Monitor in an unambigous way.

   Deterrable:   Indicates that a monitoring report can be delayed in a
      defined delay budget for possible bundling with other reports

   Configuration:  Determined by the Context (single-DPN Agent case). Monitor subtype.  The Agent consequently instantiates forwarding policies on DPN(s)
   based on those attributes.

   When recipient of
      a Context inherits another Context notification as its parent, missing
   attributes monitor report is specified in the child Context
      Configuration.  Four reporting types are provided defined:

      *  Periodic reporting specifies an interval by which a
         notification is sent.

      *  Event reporting specifies a list of event types that, if they
         occur and are related to the Parent Context
   (for example, IMSI defined monitored attribute, will result
         in sending a notification.

      *  Scheduled reporting specifies the 3GPP extension) .

   It is noted that the Agent SHOULD update the Context's attributes
   which are instantiated on DPN(s) time (in seconds since Jan 1,
         1970) when a notification for the applied attributes monitor should be sent.  Once
         this Monitor's notification is completed the Monitor is
         automatically de-registered.

      *  Threshold reporting specifies one or both of
   Topology a low and Policy high
         threshold.  When these values are changed.

   In the case of FPC Client modifying an existing runtime attribute of crossed a Context which the FPC Agent derived, the corresponding
         notification is sent.

4.8.  Namespace and Format

   The identifiers and names in FPC Agent MUST overwrite
   that attribute with the value models which reside in the Client brings to the same
   namespace must be unique.  That uniqueness must be kept in agent or
   data-plane tenant namespace on an Agent.
   However risks exist, for example, the attributes could  The tenant namespace
   uniqueness MUST be outside of
   allowable range applied to all elements of DPNs which the FPC Agent managed.

5.  Protocol

5.1.  Protocol Messages tenant model, i.e.
   Topology, Policy and Semantics

   Five message types are supported:

   +---------------+----------------+----------------------------------+
   | Message       | Type           | Description                      |
   +---------------+----------------+----------------------------------+
   | CONF          | HEADER         | Configure processes Mobility models.

   When a single     |
   |               | ADMIN_STATE    | operation.                       |
   |               | SESSION_STATE  |                                  |
   |               | OP_TYPE BODY   |                                  |
   |               |                |                                  |
   | CONF_BUNDLE   | 1*[HEADER      | A Conf-bundle takes multiple     |
   |               | ADMIN_STATE    | operations that are Policy needs to be        |
   |               | SESSION_STATE  | executed as a group with partial |
   |               | TRANS_STRATEGY | failures allowed. They are       |
   |               | OP_TYPE BODY]  | executed according applied to the OP_ID  |
   |               |                | value Contexts in all tenants on an
   Agent, the OP_BODY in          |
   |               |                | ascending order. If a            |
   |               |                | CONF_BUNDLE fails, any entities  |
   |               |                | provisioned Agent SHOULD define that policy to be visible from all the
   tenants.  In this case, the Agent assigns an unique identifier in the CURRENT       |
   |               |                | operation are removed.  However, |
   |               |                |
   agent namespace and effectively creates a U-Key although only a G-Key
   is required.

   The format of identifiers can utilize any successful operations        |
   |               |                | completed prior format with agreement
   between data-plane agent and client operators.  The formats include
   but are not limited to Globally Unique IDentifiers (GUIDs),
   Universally Unique IDentifiers (UUIDs), Fully Qualified Domain Names
   (FQDNs), Fully Qualified Path Names (FQPNs) and Uniform Resource
   Identifiers (URIs).

   The FPC model does not limit the current   |
   |               |                | operation types of format that dictate the
   choice of FPC protocol.  However the choice of identifiers which are preserved
   used in order |
   |               |                | Mobility model need to reduce system load.           |
   |               |                |                                  |
   | REG_MONITOR   | HEADER         | Register a monitor at an Agent.  |
   |               | ADMIN_STATE *[ | The message includes information |
   |               | MONITOR ]      | about the attribute be considered to monitor   |
   |               |                | and handle runtime
   parameters in real-time.

4.9.  Attribute Application

   When search for attributes in Settings to apply for Embeded Rules or
   Assigned-Policy-References the reporting method.  Note  |
   |               |                | that a MONITOR_CONFIG following search order is         |
   |               |                | required applied by
   the Agent / DPN for this operation.     |
   |               |                |                                  |
   | DEREG_MONITOR | HEADER *[      | Deregister monitors from an Mobilty-Contexts:

   1.  DPN-Settings-Complementary of the DPN-Reference entry

   2.  Context-Settings-Complementary of the Mobility-Context

   3.  If Parent-Mobility-Context-Id-Reference is not empty the
       following are also searched:

       1.  DPN-Settings-Complementary of the DPN-Reference entry for the
           same interface, if present.

       2.  Context-Settings-Complementary of this parent Mobility-
           Context

       3.  Optionally, if this Mobility-Context has a non-empty Parent-
           Mobility-Context-Id-Reference this step MAY be repeated but
           it is NOT reccommended as it could slow system performance.

   4.  Interface-Settings of the DPN interface

   Only looking at settings of the first Parent-Mobility-Context-Id-
   Reference is recommended for performance reasons.  If further depth
   of search is supported the Agent MUST make this known to the Client.

   For Configurable Policy the following search order is applied:

   1.  Policy-Settings of the Installed-Policy

   2.  Settings of the Configurable-Policy

5.  Protocol

   NOTE - The terms Context and Mobility-Context are used
   interchangeable throughout the rest of this document.

5.1.  Protocol Messages and Semantics

   Five message types are supported:

   +---------------+----------------+----------------------------------+
   | Message       | Type           | MONITOR_ID ] [ Description                      | Agent. Monitor IDs are provided.
   +---------------+----------------+----------------------------------+
   | CONF          | HEADER OP_TYPE | boolean ] Configure processes a single     | Boolean (optional) indicates if
   |               | BODY           | operation.                       | a successful DEREG triggers a
   |               |                |                                  | NOTIFY with final data.
   | CONF_BUNDLE   | HEADER OP_TYPE | A Conf-bundle takes multiple     |
   |               | PROBE REF_SCOPE      | HEADER operations that are to be        | Probe the status of
   |               | TRANS_STRATEGY | executed as a registered group with partial |
   |               | MONITOR_ID 1*[OP_ID BODY] | monitor. failures allowed. They are       |
   +---------------+----------------+----------------------------------+

                     Table 1: Client
   |               |                | executed according to Agent Messages

   Each message contains a header the OP_ID  |
   |               |                | value coupled with the Client Identifier, an
   execution delay timer and an operation identifier.  The delay, BODY in   |
   |               |                | ascending order. If a            |
   |               |                | CONF_BUNDLE fails, any entities  |
   |               |                | provisioned in ms,
   is processed as the delay for CURRENT       |
   |               |                | operation are removed.  However, |
   |               |                | any successful operations        |
   |               |                | completed prior to the current   |
   |               |                | operation are preserved in order |
   |               |                | to reduce system load.           |
   |               |                |                                  |
   | REG_MONITOR   | HEADER *[      | Register a monitor at an Agent.  |
   |               | MONITOR ]      | The message includes information |
   |               |                | about the attribute to monitor   |
   |               |                | and the reporting method.  Note  |
   |               |                | that a MONITOR_CONFIG is         |
   |               |                | required for this operation.     |
   |               |                |                                  |
   | DEREG_MONITOR | HEADER 1*[     | Deregister monitors from an      |
   |               | MONITOR_ID ] [ | Agent. Monitor IDs are provided. |
   |               | SEND_DATA ]    | SEND_DATA is an optional boolen  |
   |               |                | that indicates if a successful   |
   |               |                | DEREG triggers a NOTIFY with     |
   |               |                | final data.                      |
   |               |                |                                  |
   | PROBE         | HEADER         | Probe the status of a registered |
   |               | MONITOR_ID     | monitor.                         |
   +---------------+----------------+----------------------------------+

                     Table 1: Client to Agent Messages

   Each message contains a header with the Client Identifier, an
   execution delay timer and an operation identifier.  The delay, in ms,
   is processed as the delay for operation execution from the time the
   operation is received by the Agent.

   The Client Identifier is used by the Agent to associate specific
   configuration characteristics, e.g. options used by the Client when
   communicating with the Agent, as well as the association of the
   Client and tenant in the information model.

   Messages that create or update Monitors and Entities, i.e. CONFIG,

   CONF_BUNDLE and REG_MONITOR, specify an Administrative State which also has the Transaction Strategy (TRANS_STRATEGY)
   attribute.  This value specifies the Administrative state behavior of the message subject(s) after
   the successful completion Agent when an
   operation fails while processing a CONF_BUNDLE message.  The value of the operation.  If the status is set to
   virtual, any existing data on the DPN is removed.  If the value is
   set to disabled, and if that entity exists on the DPN, then an
   operation to disable the associated entity will occur on the DPN . If
   set to 'active' the DPN will be provisioned.  Values are 'enabled',
   'disabled', and 'virtual'.

   CONF_BUNDLE also has the Transaction Strategy (TRANS_STRATEGY)
   attribute.  This value specifies the behavior of the Agent when an
   operation fails while processing a CONF_BUNDLE message.  The value of
   'default' uses
   'default' uses the default strategy defined for the message.  The
   value 'all_or_nothing' will roll back all successfully executed
   operations within the bundle as well as the operation that failed.

   An FPC interface protocol used to support this specification may not
   need to support CONF_BUNDLE messages or specific TRANS_STRATEGY types
   beyond 'default' when the protocol provides similar semantics.
   However, this MUST be clearly defined in the specification that
   defines the interface protocol.

   An Agent will respond with an ERROR, OK, or an OK WITH INDICATION
   that remaining data will be sent via a notify from the Agent to the
   Client Section 5.1.1.6.2 5.1.1.4.2 for CONFIG and CONF_BUNDLE requests.  When
   returning an 'ok' of any kind, optional data may MAY be present.

   Two Agent notifications are supported:

   +----------------------+----------+---------------------------------+
   | Message              | Type     | Description                     |
   +----------------------+----------+---------------------------------+
   | CONFIG_RESULT_NOTIFY | See      | An asynchronous notification    |
   |                      | Table 15 13 | from Agent to Client based upon |
   |                      |          | a previous CONFIG or            |
   |                      |          | CONF_BUNDLE request.            |
   |                      |          |                                 |
   | NOTIFY               | See      | An asynchronous notification    |
   |                      | Table 16 14 | from Agent to Client based upon |
   |                      |          | a registered MONITOR.           |
   +----------------------+----------+---------------------------------+

             Table 2: Agent to Client Messages (notifications)

5.1.1.  CONFIG and CONF_BUNDLE Messages

   CONFIG

   The HEADER is a part of all messages and CONF_BUNDLE specify is comprised of the
   following information for each
   operation in addition to the header information:

   SESSION_STATE:  sets

   CLT_ID:  The Client Identifier

   DELAY (OPTIONAL):  The time (in ms) to delay the expected state execution of ther
       operaiton on the entities embedded in
       the operation body after successful completion of DPN once it is received by the operation.
       Values can Agent.

   OP_ID:  Operation Identifier
   Results will be 'complete', 'incomplete' or 'outdated'.  Any supplied per operation that is 'incomplete' MAY NOT input.  Each result in communication
       between contains
   the Agent RESULT_STATUS and DPN. OP_ID that it corresponds to.  RESULT_STATUS
   values are:

      OK - Success

      ERR - An Error has occurred

   If an error occurs, information MUST be returned in the result response.
   Error informaiton is 'outdated' any new
       operations on these entities or new references to these entities
       have unpredictable results.

   OP_TYPE:  specifies comprised of the type following:

      ERROR_TYPE_ID (Unsigned 32, REQUIRED) - The identifier of operation.  Valid a
      specific error type The values are 'create' TRANSPORT (0), 'update' RPC (1), 'query' (2)
      PROTOCOL(2) or 'delete' APPLICATION (3).

   COMMAND_SET:  If the feature is supported, specifies

      ERROR_TAG - (String, REQUIRED) - enumerated error tag.

      ERROR_APP_TAG - (String, OPTIONAL) - Application specific error
      tag.

      ERROR_MESSAGE - (String, OPTIONAL) - A message describing the Command Set
      error.

      ERROR_INFO - (Any Data, OPTIONAL) - Any data required for the
      response.

5.1.1.  CONFIG and CONF_BUNDLE Messages

   CONFIG and CONF_BUNDLE include OP_TYPE as part of the header
   information:

   OP_TYPE:  specifies the type of operation.  Valid values are 'create'
       (0), 'update' (1), 'query' (2) or 'delete' (3).

   The BODY is comprised of the following information:

   COMMAND_SET:  Specifies the Command Set (see Section 5.1.1.2).

   REF_SCOPE:  If supported, specifies the Reference Scope (see
       Section 5.1.1.4).

   BODY: 5.1.1.3)

   BODY INTERNALS:  A list of Clones, if supported, Vports entities under Policy, e.g.  Policy-
       Definitions, Action-Definitions, etc. as well as Installed
       Policies and Contexts when the OP_TYPE is 'create' or 'update'.
       Otherwise it is a list of Targets for 'query' or 'deletion'.  See
       Section 6.2.2 6.1.3.2 for details.

   CONF_BUNDLES includes an OP_ID with each body for tracking of the
   bundle's subtransactions.

5.1.1.1.  Agent Operation Processing

   The Agent will process entities provided in an operation in the
   following order:

   1.  Clone Instructions, if the feature is supported  Action-Definitions

   2.  Vports  Descriptor Defintions

   3.  Rule Definitions

   4.  Policy Definitions

   5.  Installed Policies

   6.  Mobility Contexts according to COMMAND_SET order processing

   The following Order Processing occurs when COMMAND Sets are present

   1.

5.1.1.2.  Command Bitsets

   The Entity-specific COMMAND_SET is processed according to its bit
       order unless otherwise specified by the technology specific
       COMMAND_SET definition.

   2.  Operation specific COMMAND_SET is processed upon all applicable
       entities (even if they had Entity-specific COMMAND_SET values
       present) according to its bit order unless otherwise specified by
       the a technology specific COMMAND_SET definition.

   3.  Operation OP_TYPE is processed bitset that allows for all entities.

   When deleting objects only their name needs a
   single entity to be provided.  However,
   attributes MAY sent in an operation with multiple requested sub-
   transactions to be provided completed.  It can also provide clarity for a
   request.  For example, a Mobility-Context could have the Home Network
   Prefix absent but it is unclear if the Client wishes would like the address
   to avoid requiring be assigned by the Agent cache lookups.

   When deleting an attribute, a leaf reference should be provided.
   This or if this is an error.  Rather than
   creating a path to the attributes.

5.1.1.2.  Policy RPC Support

   This optional feature permits policy elements, (Policy-Group, Policy,
   Action and Descriptor), values to be in CONFIG or CONF_BUNDLE
   requests.  It enables RPC based policy provisioning.

5.1.1.3.  Cloning

   Cloning is an optional feature that allows a Client to copy one
   structure to another in an operation.  Cloning is always done first
   within the operation (see Operation Order of Execution for more
   detail).  If a Client wants to build an object then Clone it, use
   CONF_BUNDLE with the first operation being the entities to be copied
   and a second operation with the Cloning instructions.  A CLONE
   operation takes two arguments, the first is the name of the target to
   clone and the second is the name of the newly created entity.
   Individual attributes are not clonable; only Vports and Contexts can
   be cloned.

5.1.1.4.  Command Bitsets

   The COMMAND_SET is a technology specific bitset that allows for a
   single entity to be sent in an operation with requested sub-
   transactions to be completed.  For example, a Context could have the
   Home Network Prefix absent but it is unclear if the Client would like
   the address to be assigned by the Agent or if this is an error.

   Rather than creating a specific command for assigning specific command for assigning the IP a bit position in a
   COMMAND_SET is reserved for Agent based IP assignment.
   Alternatively, an entity could be sent in an update operation that
   would be considered incomplete, e.g.  missing some required data in
   for the entity, but has sufficient data to complete the instructions
   provided in the COMMAND_SET.

5.1.1.5.

5.1.1.3.  Reference Scope

   The Reference Scope is an optional feature that provides the scope of
   references used in a configuration command, i.e. CONFIG or
   CONF_BUNDLE.  These scopes are defined as

   o  none - all All entities have no references to other entities.  This
      implies only Contexts are present.  Vports MUST have references to
      Policy-Groups.

   o  op - All references are contained in the operation body, i.e. only
      intra-operation references exist.

   o  bundle - All references exist in bundle (inter-operation/intra-
      bundle).  NOTE - If this value is present in a CONFIG message it
      is equivalent to 'op'.

   o  storage - One or more references exist outside of the operation
      and bundle.  A lookup to a cache / storage is required.

   o  unknown - the location of the references are unknown.  This is
      treated as a 'storage' type.

   If supported by the Agent, when cloning instructions are present, the
   scope MUST NOT be 'none'.  When Vports are present the scope MUST be
   'storage' or 'unknown'.

   An agent that only accepts 'op' or 'bundle' reference scope messages
   is referred to as 'stateless' as it has no direct memory of
   references outside messages themselves.  This permits low memory
   footprint Agents.  Even when an Agent supports all message types an
   'op' or 'bundle' scoped message can be processed quickly by the Agent
   as it does not require storage access.

5.1.1.6.

5.1.1.4.  Operation Response

5.1.1.6.1.

5.1.1.4.1.  Immediate Response

   Results will be supplied per operation input.  Each result contains
   the RESULT_STATUS and OP_ID that it corresponds to.  RESULT_STATUS
   values are:

      OK - Success

      ERR - An Error has occurred

      OK_NOTIFY_FOLLOWS

   For CONF and CONF_BUNDLE the Response MAY include the the following:

      NOTIFY_FOLLOWS - The A boolean indicator that the Operation has been
      accepted by the Agent but further processing is required.  A
      CONFIG_RESULT_NOTIFY will be sent once the processing has
      succeeded or failed.

   Any result MAY contain nothing or

      ENTITIES - Optionally, entities created or partially fulfilled as
      part of the operation as specified in Table 14. 12 For Clients that
      need attributes back quickly for call processing, the AGENT MUST
      respond back with an OK_NOTIFY_FOLLOWS and minimally the
      attributes assigned by the Agent in the response.  These
      situations MUST be determined through the use of Command Sets (see
      Section 5.1.1.4).

   If an error occurs the following information is returned.

      ERROR_TYPE_ID (Unsigned 32) - The identifier of a specific error
      type

      ERROR_INFORMATION - An OPTIONAL string of no more than 1024
      characters.

5.1.1.6.2. 5.1.1.2).

5.1.1.4.2.  Asynchronous Notification

   A CONFIG_RESULT_NOTIFY occurs after the Agent has completed
   processing related to a CONFIG or CONF_BUNDLE request.  It is an
   asynchronous communication from the Agent to the Client.

   The values of the CONFIG_RESULT_NOTIFY are detailed in Table 15. 13.

5.1.2.  Monitors

   When a monitor has

   An Agent may reject a reporting configuration of SCHEDULED registration if it is
   automatically de-registered after or the NOTIFY occurs. DPN has insufficient
   resources.

   An Agent or DPN may temporarily suspend monitoring if insufficient
   resources exist.  In such a case the Agent MUST notify the Client.

   All monitored data can be requested by the Client at any time using
   the PROBE message.  Thus,

   When a monitor has a reporting configuration of SCHEDULED it is optional and
   when not present only PROBE messages may be used for monitoring.
   automatically de-registered after the last NOTIFY occurs.

   If a SCHEDULED or PERIODIC configuration is provided during
   registration with the time related value (time or period
   respectively) of 0 a NOTIFY is immediately sent and the monitor is immediately de-
   registered.
   de-registered.  This method should, when a MONITOR has not been
   installed, result in an immediate NOTIFY sufficient for the Client's
   needs and lets the Agent realize the Client has no further need for
   the monitor to be registered.  An Agent may reject a registration if
   it or the DPN has insufficient resources.

   PROBE messages are also used by a Client to retrieve information
   about a previously installed monitor.  The PROBE message SHOULD
   identify one or more monitors by means of including the associated
   monitor identifier.  An Agent receiving a PROBE message sends the
   requested information in a single or multiple NOTIFY messages.

5.1.2.1.  Operation Response

5.1.2.1.1.  Immediate Response

   Results will be supplied per operation input.  Each result contains
   the RESULT_STATUS and OP_ID that it corresponds to.  RESULT_STATUS
   values are:

      OK - Success

      ERR - An Error has occurred

   Any OK result will contain no more information.

   If an error occurs the following information Monitor configuration associated with a NOTIFY is returned.

      ERROR_TYPE_ID (Unsigned 32) - The identifier of deterrable
   then the NOTIFY MAY be bundled with other messages back to the Agent
   even if this results in a specific error
      type

      ERROR_INFORMATION - An OPTIONAL string delay of no more than 1024
      characters.

5.1.2.1.2. the NOTIFY.

5.1.2.1.  Asynchronous Notification

   A NOTIFY can be sent as part of de-registraiton, a trigger based upon
   a Monitor Configuration or a PROBE.  A NOTIFY is comprised of unique
   Notification Identifier from the Agent, the Monitor ID the
   notification applies to, the Trigger for the notification, a
   timestamp of when the notification's associated event occurs and data
   that is specific to the monitored value's type.

5.2.  Protocol Operation

5.2.1.  Simple RPC Operation

   An FPC Client and Agent MUST identify themselves using the CLI_ID and
   AGT_ID respectively to ensure that for all transactions a recipient
   of an FPC message can unambiguously identify the sender of the FPC
   message.  A Client MAY direct the Agent to enforce a rule in a
   particular DPN by including a DPN_ID value in a Context.  Otherwise
   the Agent selects a suitable DPN to enforce a Context and notifies
   the Client about the selected DPN using the DPN_ID.

   All messages sent from a Client to an Agent MUST be acknowledged by
   the Agent.  The response must include all entities as well as status
   information, which indicates the result of processing the message,
   using the RESPONSE_BODY property.  In case the processing of the
   message results in a failure, the Agent sets the ERROR_TYPE_ID ERROR_TYPE and
   ERROR_INFORMATION
   ERROR_TAG accordingly and MAY clear the entity, e.g.  Context or Vport,
   Configurable-Policy, which caused the failure, in the response.

   If based upon Agent configuration or the processing of the request
   possibly taking a significant amount of time the Agent MAY respond
   with an OK_NOTIFY_FOLLOWS a NOTIFY_FOLLOWS indicaiton with an optional RESPONSE_BODY
   containing the partially completed entities.  When an OK_NOTIFY_FOLLOWS a NOTIFY_FOLLOWS
   indication is sent, indicated, the Agent will, upon completion or failure
   of the operation, respond with an asynchronous CONFIG_RESULT_NOTIFY
   to the Client.

   A Client MAY add a property to a Context without providing all
   required details of the attribute's value.  In such case the Agent
   SHOULD determine the missing details and provide the completed
   property description back to the Client.  If the processing will take
   too long or based upon Agent configuration, the Agent MAY respond
   with an OK_NOTIFY_FOLLOWS with OK that indicates a RESPONSE_BODY containing the NOTIFY_FOLLOWS and also includes a
   RESPONSE_BODY containing the partially completed entities.

   In case the Agent cannot determine the missing value of an
   attribute's value per the Client's request, it leaves the attribute's
   value cleared in the RESPONSE_BODY and sets the RESULT to Error,
   ERROR_TYPE_ID
   ERROR_TYPE and ERROR_INFORMATION. ERROR_TAG.  As example, the Control-Plane needs to
   setup a tunnel configuration in the Data-Plane but has to rely on the
   Agent to determine the tunnel endpoint which is associated with the
   DPN that supports the Context.  The Client adds the tunnel property
   attribute to the FPC message and clears the value of the attribute
   (e.g.  IP address of the local tunnel endpoint).  The Agent
   determines the tunnel endpoint and includes the completed tunnel
   property in its response to the Client.

   Figure 17 15 illustrates an exemplary session life-cycle based on Proxy
   Mobile IPv6 registration via MAG Control-Plane function 1 (MAG-C1)
   and handover to MAG Control-Plane function 2 (MAG-C2).  Edge DPN1
   represents the Proxy CoA after attachment, whereas Edge DPN2 serves
   as Proxy CoA after handover.  As exemplary architecture, the FPC
   Agent and the network control function are assumed to be co-located
   with the Anchor-DPN, e.g. a Router.

                                                 +-------Router--------+
                           +-----------+         |+-------+ +---------+|
   +------+ +------+     +-----+ FPC   |          | FPC   | |  Anchor |
   |MAG-C1| |MAG-C2|     |LMA-C| Client|          | Agent | |   DPN   |
   +------+ +------+     +-----+-------+          +-------+ +---------+
   [MN attach]  |            |                          |           |
      |-------------PBU----->|                          |           |
      |         |            |---(1)--CONFIG(CREATE)--->|           |
      |         |            |   [ CONTEXT_ID, MOBILTY_CONTEXT_ID,  |--tun1 up->|
      |         |            | DPNREFLIST:[[DPN1, BOTH  |           |
      |         |            |  DPN_SETTINGS_COMPL:[    |           |
      |         |            |   DOWNLINK(QOS/TUN),     |           |
      |         |            |   UPLINK(QOS/TUN),   UPLINK(QOS/TUN)] ]]    |--tc qos-->|
      |         |            |   CTXT_SETTINGS_COMPL:[  |           |
      |         |            |     IP_PREFIX(HNP) ] ]   |           |
      |         |            |<---(2)- OK --------------|-route add>|
      |         |            |                          |           |
      |<------------PBA------|                          |           |
      |         |            |                          |           |
      | +----+  |            |                          |           |
      | |Edge|  |            |                          |           |
      | |DPN1|  |            |                          |           |
      | +----+  |            |                          |           |
      |   |                                                         |
      |   |-=======================================================-|
      |                      |                          |           |
      |   [MN handover]      |                          |           |
      |         |---PBU ---->|                          |           |
      |         |            |--(3)- CONFIG(MODIFY)---->|           |
      |         |<--PBA------|    [ CONTEXT_ID MOBILTY_CONTEXT_ID  |-tun1 mod->|
      |         |            | DPNREFLIST:[[DPN1, BOTH  |           |
      |         |            |    DPN_SETTINGS_COMPL:[  |           |
      |         |            |   DOWNLINK(TUN),         |           |
      |         |  +----+    |      UPLINK(TUN)   UPLINK(TUN)] ]] ]      |           |
      |         |  |Edge|    |<---(4)- OK --------------|           |
      |         |  |DPN2|    |                          |           |
      |         |  +----+    |                          |           |
      |         |    |       |                          |           |
      |         |    |-============================================-|
      |         |            |                          |           |

   Figure 17: 15: Exemplary Message Sequence (focus on FPC reference point)

   After reception of the Proxy Binding Update (PBU) at the LMA Control-
   Plane function (LMA-C), the LMA-C selects a suitable DPN, which
   serves as Data-Plane anchor to the mobile node's (MN) traffic.  The
   LMA-C adds a new logical Context to the DPN to treat the MN's traffic
   (1) and includes a Context Identifier (CONTEXT_ID) to the CONFIG
   command.  The LMA-C identifies the selected Anchor DPN by including
   the associated DPN identifier. identifier and the Direction the entry applies to,
   BOTH.

   The LMA-C adds properties during the creation of the new Context.
   One property is added to the DPN Settings Complimentary, to specify
   the forwarding tunnel type and endpoints (Anchor DPN, Edge DPN1) in
   each direction (as required).  Another property is added to specify
   the QoS differentiation, which the MN's traffic should experience.
   At reception of the Context, the FPC Agent utilizes local
   configuration commands to create the tunnel (tun1) as well as the
   traffic control (tc) to enable QoS differentiation.  After
   configuration has been completed, the Agent applies a new route to
   forward all traffic destined to the MN's HNP specified as a property
   in the Context to Context's Complementary Settings and applied the configured
   tunnel interface (tun1).

   During handover, the LMA-C receives an updating PBU from the handover
   target MAG-C2.  The PBU refers to a new Data-Plane node (Edge DPN2)
   to represent the new tunnel endpoints in the downlink and uplink, as
   required.  The LMA-C sends a CONFIG message (3) to the Agent to
   modify the existing tunnel property of the existing Context and to
   update the tunnel endpoint from Edge DPN1 to Edge DPN2.  Upon
   reception of the CONFIG message, the Agent applies updated tunnel
   property to the local configuration and responds to the Client (4).

                                                 +-------Router--------+
                           +-----------+         |+-------+ +---------+|
   +------+ +------+     +-----+ FPC   |          | FPC   | |  Anchor |
   |MAG-C1| |MAG-C2|     |LMA-C| Client|          | Agent | |   DPN   |
   +------+ +------+     +-----+-------+          +-------+ +---------+
   [MN attach]  |            |                          |           |
      |-------------PBU----->|                          |           |
      |         |            |---(1)--CONFIG(MODIFY)--->|           |
      |<------------PBA------|   [ CONTEXT_ID,          |--tun1   ->|
      |         |            | DPNREFLIST:[[DPN1, BOTH |           |
      |         |            |    DPN_SETTINGS_COMPL:[  |           |
      |         |            |   DOWNLINK(TUN delete),  |    down   |
      |         |            | UPLINK(TUN delete) delete)] ]] ] |           |
      |         |            |                          |           |
      |         |            |<-(2)- OK ----------------|           |
      |         |            |                          |           |
      |         |  [ MinDelayBeforeBCEDelete expires ]  |           |
      |         |            |                          |           |
      |         |            |---(3)--CONFIG(DELETE)--->|-- tun1 -->|
      |         |            |                          |  delete   |
      |         |            |<-(4)- OK ----------------|           |
      |         |            |                          |-- route ->|
      |         |            |                          |   remove  |
      |         |            |                          |           |

   Figure 18: 16: Exemplary Message Sequence (focus on FPC reference point)

   When a teardown of the session occurs, MAG-C1 will send a PBU with a
   lifetime value of zero.  The LMA-C sends a CONFIG message (1) to the
   Agent to modify the existing tunnel property of the existing Context
   to delete the tunnel information.)  Upon reception of the CONFIG
   message, the Agent removes the tunnel configuration and responds to
   the Client (2).  Per [RFC5213], the PBA is sent back immediately
   after the PBA is received.

   If no valid PBA is received after the expiration of the
   MinDelayBeforeBCEDelete timer (see [RFC5213]), the LMA-C will send a
   CONFIG (3) message with a deletion request for the Context.  Upon
   reception of the message, the Agent deletes the tunnel and route on
   the DPN and responds to the Client (4).

   When a multi-DPN Agent is used the DPN list permits several DPNs to
   be provisioned in a single message. message for the single Conext.

                           +-----------+           +-------+ +---------+
   +------+ +------+     +-----+ FPC   |           | FPC   | |  Anchor |
   |MAG-C1| |MAG-C2|     |LMA-C| Client|           | Agent | |   DPN1  |
   +------+ +------+     +-----+-------+           +-------+ +---------+
   [MN attach]  |            |                          |           |
      |-------------PBU----->|                          |           |
      |         |            |---(1)--CONFIG(CREATE)--->|           |
      |         |            |   [ CONTEXT_ID, DPNS [ MOBILTY_CONTEXT_ID,  |--tun1 up->|
      |         |            |[DPN1,DOWNLINK(QOS/TUN)],            | DPNREFLIST:[[DPN1, BOTH  |           |
      |         |            |    DPN_SETTINGS_COMPL:[  |           |
      | [DPN1,UPLINK(QOS/TUN)],         |            |   DOWNLINK(QOS/TUN),     |           |
      |         |            |   UPLINK(QOS/TUN) ] ],   |--tc qos-->|
      |         |            |[DPN2,DOWNLINK(QOS/TUN)],            |    [DPN2, BOTH           |           |
      |         |            |    DPN_SETTINGS_COMPL:[  |           |
      |         |            | [DPN2,UPLINK(QOS/TUN)],   DOWNLINK(QOS/TUN),     |           |
      |         |            |   UPLINK(QOS/TUN) ] ] ], |           |
      |         |            |   CTXT_SETTINGS_COMPL [  |           |
      |         |            |     IP_PREFIX(HNP) ] ]   |           |
      |         |            |<-(2)- OK_NOTIFY_FOLLOWS -|-route add>|
      |         |            |                          |           |
      |<------------PBA------|                          |           |
      |         |            |                          |           |
      | +----+               |                          |           |
      | |Edge|               |                          |           |
      | |DPN2|               |                          |           |
      | +----+               |                          |           |
      |   |<---------------------- tun1 up -------------|           |
      |   |<---------------------- tc qos --------------|           |
      |   |<---------------------- route add -----------|           |
      |   |                  |                          |           |
      |   |                  |<(3) CONFIG_RESULT_NOTIFY |           |
      |   |                  |   [ Response Data ]      |           |
      |   |                  |                          |           |

         Figure 19: 17: Exemplary Message Sequence for Multi-DPN Agent

   Figure 19 17 shows how the first 2 messages in Figure 17 15 are supported
   when a multi-DPN Agent communicates with both Anchor DPN1 and Edge
   DPN2.  In such a case, the FPC Client sends the downlink and uplink
   for both DPNs in the "DPNS" list DPN Reference List of the same Context.  Message
   1 shows the DPNS list DPN Reference List with all entries.  Each entry
   identifies the DPN and direction (one of 'uplink', 'downlink' or
   'both').  Generally,
   the 'both' direction is not used for normal mobility session
   processing.  It is commonly used for the instantiation of Policies on
   a specific DPN (see Section 5.2.4).

   The Agent responds with an OK_NOTIFY_FOLLOWS OK and NOTIFY_FOLLOWS indication while it
   simultaneoulsy provisions both DPNs.  Upon successful completion, the
   Agent responds to the Client with a CONFIG_RESULT_NOTIFY indicating
   the operation status.

5.2.2.  Policy And Mobility on the Agent

   A Client may build Policy and Topology using any mechanism on the
   Agent.  Such entities are not always required to be constructed in
   realtime and, therefore, there are no specific messages defined for
   them in this specification.

   The Client may add, modify or delete many Vports Installed Policies and
   Contexts in a single FPC message.  This includes linking Contexts to
   Actions and Descriptors, i.e. a Rule.  As example, a Rule which
   performs re-
   writing re-writing of an arriving packet's destination IP address
   from IP_A to IP_B matching an associated Descriptor, can be enforced
   in the Data-
   Plane Data-Plane via an Agent to implicitly consider matching
   arriving packet's source IP address against IP_B and re- write the
   source IP address to IP_A.

   Figure 20 18 illustrates the generic policy configuration model as used
   between a FPC Client and a FPC Agent.

          Descriptor_1 -+          +- Action_1
                        |          |
          Descriptor_2 -+--<Rule>--+- Action_2
                          +------+
                          /Order#/-------------+
                          +------+             |
                                               |
          Descriptor_3 -+          +- Action_3 +-<PolicyID> +-<Policy>
                        |          |           |  ^
          Descriptor_4 -+--<Rule>--+- Action_4 |  |
                          +------+             | <PolicyGroupID>  |
                          /Order#/-------------+  ^  |
                          +------+                |
                                                  <VportID>

           +-------------------+
                                                 <Intsalled-Policy>

          +---------------------+     +----------------------+
          | Bind 1..M traffic   |     |  Bind 1..N traffic   |
          |  Descriptors to     | --> |  treatment actions   |
          |     a Policy,     |     |  to a Policy,   |
           | Policy-Group Policy and    |     |   Policy-Group   to a Policy and    |
          |       Vport Configurable-Policy |     |       Vport  Configurable-Policy |
           +-------------------+
          +---------------------+     +----------------------+

         |                                                 |
         +-------------- Data-Plane Rule ------------------+

               Figure 20: 18: Structure of Configurable Policies and Vports

   As depicted in Figure 20, 18, the Vport Configurable-Policy represents the
   anchor of Rules through the Policy-group, Policy, Policy / Rule hierarchy configured by any
   mechanism including RPC or N. hierarchy.  A Client and
   Agent use the identifier of the associated Policy to directly access
   the Rule and perform modifications of traffic Descriptors or Action
   references.  A Client and Agent use the identifiers to access the
   Descriptors or Actions to perform modifications.  From the viewpoint
   of packet processing, arriving packets are matched against traffic
   Descriptors and processed according to the treatment Actions
   specified in the list of properties associated with the Vport. Configurable-
   Policy.

   A Client complements a rule's Descriptors with a Rule's Order
   (priority) value to allow unambiguous traffic matching on the Data-
   Plane.

   Figure 21 19 illustrates the generic context configuration model as used
   between a FPC Client and a FPC Agent.

             TrafficSelector_1
                      |
             profile-parameters
                      |
             mobility-profile-- dl ------+
                                ^        |
                                |      qos-profile
                           <ContextID1>       |
                                ^        per-mn-agg-max-dl_2
                                |
                           <ContextID2>

             +-------------------+     +---------------------+
             | Bind 1..M traffic |     |  Bind 1..N traffic  |
             |    selectors to   | --> |  treatment / qos    |
             |     a Context     |     |  actions to a       |
             |                   |     |       Context       |
             +-------------------+     +---------------------+

            |                                                 |
            +-------------- Data-Plane Rule ------------------+

                     Figure 21: 19: Structure of Contexts

   As depicted in Figure 21, 19, the Context represents a mobility session
   hierarchy.  A Client and Agent directly assigns values such as
   downlink traffic descriptors, QoS information, etc.  A Client and
   Agent use the context identifiers to access the descriptors, qos
   information, etc. to perform modifications.  From the viewpoint of
   packet processing, arriving packets are matched against traffic
   Descriptors and processed according to the qos or other mobility
   profile related Actions specified in the Context's properties.  If
   present, the final action is to use a Context's tunnel information to
   encapsulate and forward the packet.

   A second Context also references context1 in the figure.  Based upon
   the technology a property in a parent context (parent mobility-
   context-id reference) MAY be inherited by its descendants.  This
   permits concise over the wire representation.  When a Client deletes
   a parent Context all children are also deleted.

5.2.3.  Optimization for Current and Subsequent Messages

5.2.3.1.  Bulk Data  Configuration Bundles

   Bundles provide transaction boundaries around work in a Single Operation

   A single operation MAY contain multiple entities.  This permits
   bundling of requests into
   message.  Operations in a single operation.  In bundle MUST be successfully executed in the example below
   two PMIP sessions are
   order specified.  This allows references created via two PBU messages and sent in one operation to the
   Agent in a single CONFIG message (1).  Upon recieveing the message,
   the Agent responds back with an OK_NOTIFY_FOLLOWS (2), completes work
   on the DPN to activate the associated sessions then responds to the
   Client with a CONFIG_RESULT_NOTIFY (3).

                                                 +-------Router--------+
                           +-----------+         |+-------+ +---------+|
   +------+ +------+     +-----+ FPC   |          | FPC   | |  Anchor |
   |MAG-C1| |MAG-C2|     |LMA-C| Client|          | Agent | |   DPN   |
   +------+ +------+     +-----+-------+          +-------+ +---------+
   [MN1 attach] |            |                          |           |
      |-------------PBU----->|                          |           |
      |  [MN2 attach]        |                          |           |
      |         |---PBU----->|                          |           |
      |         |            |                          |           |
      |         |            |---(1)--CONFIG(CREATE)--->|           |
      |<------------PBA------|   [ CONTEXT_ID 1,        |--tun1 up->|
      |         |            |   DOWNLINK(QOS/TUN),     |           |
      |         |<--PBA------|   UPLINK(QOS/TUN),       |--tc1 qos->|
      |         |            |     IP_PREFIX(HNP) ]     |           |
      |         |            |   [ CONTEXT_ID 2,        |-route1    |
      |         |            |   DOWNLINK(QOS/TUN),     |   add>    |
      |         |            |   UPLINK(QOS/TUN),       |           |
      |         |            |     IP_PREFIX(HNP) ]     |--tun2 up->|
      |         |            |<-(2)- OK_NOTIFY_FOLLOWS--|           |
      |         |            |                          |--tc2 qos->|
      |<------------PBA------|                          |           |
      |         |            |                          |-route2    |
      |         |            |<(3) CONFIG_RESULT_NOTIFY |   add>    |
      |         |            |   [ Response Data ]      |           |
      |         |            |                          |           |
      |         |            |                          |           |

      Figure 22: Exemplary Bulk Entity with Asynchronous Notification
                  Sequence (focus on FPC reference point)

5.2.3.2.  Configuration Bundles

   Bundles provide transaction boundaries around work in a single
   message.  Operations in a bundle MUST be successfully executed in the
   order specified.  This allows references created in one operation to
   be used
   be used in a subsequent operation in the bundle.

   The example bundle shows in Operation 1 (OP 1) the creation of a
   Context 1 which is then referenced in Operation 2 (OP 2) by
   CONTEXT_ID 2.  If OP 1 fails then OP 2 will not be executed.  The
   advantage of the CONF_BUNDLE is preservation of dependency orders in
   a single message as opposed to sending multiple CONFIG messages and
   awaiting results from the Agent.

   When a CONF_BUNDLE fails, any entities provisioned in the CURRENT
   operation are removed, however, any successful operations completed
   prior to the current operation are preserved in order to reduce
   system load.

                                      +-------Router--------+
              +-----------+           |+-------+ +---------+|
              |   FPC     |            | FPC   | |  Anchor |
              |  Client   |            | Agent | |   DPN   |
              +-----------+            +-------+ +---------+
                   |                          |           |
                   |--CONF_BUNDLE(CREATE)---->|           |
                   | [ OP 1, [VPORT X ]                  |           |
                   |   [ CONTEXT_ID MOBILTY_CONTEXT_ID 1,  |--tun1 up->|
                   | DPNREFLIST:[[DPN1, BOTH  |           |
                   |  DPN_SETTINGS_COMPL:[    |           |
                   |   DOWNLINK(QOS/TUN),     |           |
                   |   UPLINK(QOS/TUN),   UPLINK(QOS/TUN)] ]]    |--tc qos-->|
                   |   CTXT_SETTINGS_COMPL:[  |           |
                   |     IP_PREFIX(HNP) ]     | ] ],|           |
                   | [ OP 2,                  |           |
                   |   [ CONTEXT_ID 2, MOBILTY_CONTEXT_ID,  |--tun1 up->|
                   | DPNREFLIST:[[DPN1, BOTH  |           |   PARENT_CONTEXT_ID 1,
                   |  DPN_SETTINGS_COMPL:[    |           |
                   |   DOWNLINK(QOS/TUN),     |           |
                   |   UPLINK(QOS/TUN)] ]]    |--tc qos-->|
                   |   UPLINK(QOS/TUN), PARENT_CONTEXT_ID_REF=1  |           |
                   |   DOWNLINK(QOS/TUN)  ] ]                     |           |
                   |                          |           |

    Figure 23: 20: Exemplary Bundle Message (focus on FPC reference point)

5.2.3.3.  Cloning Feature (Optional)

   Cloning provides a high speed copy/paste mechanism.  The example
   below shows a single Context that will be copied two times.  A
   subsequent update will then override copied values.  To avoid the
   accidental activation of the Contexts on the DPN, the CONFIG (1)
   message with the cloning instruction has a SESSION_STATE with a value
   of 'incomplete' and OP_TYPE of 'CREATE'.  A second CONFIG (2) is sent
   with the SESSION_STATE of 'complete' and OP_TYPE of 'UPDATE'.  The
   second message includes any differences between the original (copied)
   Context and its Clones.

                                      +-------Router--------+
              +-----------+           |+-------+ +---------+|
              |   FPC     |            | FPC   | |  Anchor |
              |  Client   |            | Agent | |   DPN   |
              +-----------+            +-------+ +---------+
                   |                          |           |
                   |--CONF_BUNDLE(CREATE)---->|           |
                   |   [ OP 1,                |           |
                   |    [ SESSION_STATE       |           |
                   |       (incomplete) ],    |           |
                   | [CLONE SRC=2, TARGET=3], |           |
                   | [CLONE SRC=2, TARGET=4], |           |
                   |    [ CONTEXT_ID 2,       |           |
                   |   PARENT_CONTEXT_ID 1,   |           |
                   |   UPLINK(QOS/TUN),       |           |
                   |   DOWNLINK(QOS/TUN),     |           |
                   |   IP_PREFIX(HNP)    ] ]  |           |
                   |<----- OK ----------------|           |
                   |                          |           |
                   |--CONF_BUNDLE(UPDATE)--->|           |
                   |    [ CONTEXT_ID 3,       |           |
                   | PARENT_CONTEXT_ID(empty),|           |
                   |   UPLINK(QOS/TUN),       |           |
                   |   DOWNLINK(QOS/TUN) ],   |           |
                   |    [ CONTEXT_ID 4,       |           |
                   | PARENT_CONTEXT_ID(empty),|           |
                   |   UPLINK(QOS/TUN),       |           |
                   |   DOWNLINK(QOS/TUN) ] ]  |           |
                   |<----- OK ----------------|           |
                   |                          |           |

    Figure 24: Exemplary Bundle Message (focus on FPC reference point)

   Cloning has the added advantage of reducing the over the wire data
   size required to create multiple entities.  This can improve
   performance if serialization / deserialization of multiple entities
   incurs some form of performance penalty.

5.2.3.4.  Command Bitsets

5.2.3.2.  Command Bitsets (Optional)

   Command Sets permit the ability to provide a single, unified data
   structure, e.g.  CONTEXT,  Mobility-Context, and specify which activities are
   expected to be performed on the DPN.  This has some advantages

   o  Rather than sending N messages with a single operation performed
      on the DPN a single message can be used with a Command Set that
      specifies the N DPN operations to be executed.

   o  Errors become more obvious.  For example, if the HNP is NOT
      provided but the Client did not specify that the HNP should be
      assigned by the Agent this error is easily detected.  Without the
      Command Set the default behavior of the Agent would be to assign
      the HNP and then respond back to the Client where the error would
      be detected and subsequent messaging would be required to remedy
      the error.  Such situations can increase the time to error
      detection and overall system load without the Command Set present.

   o  Unambiguous provisioning specification.  The Agent is exactly in
      sync with the expectations of the Client as opposed to guessing
      what DPN work could be done based upon data present at the Agent.
      This greatly increases the speed by which the Agent can complete
      work.

   o  Permits different technologies with different instructions to be
      sent
      supported in the same message. FPC.

   As Command Bitsets are technology specific, e.g.  PMIP or 3GPP
   Mobility, the type of work varies on the DPN and the amount of data
   present in a Context or Port will vary.  Using the technology
   specific instructions allows the Client to serve multiple
   technologies and MAY result in a more stateless Client as the
   instructions are transferred the Agent which will match the desired,
   technology specific instructions with the capabilities and over the
   wire protocol of the DPN more efficiently.

5.2.3.5.

5.2.3.3.  Reference Scope(Optional)

   Although entities MAY refer to any other entity of an appropriate
   type, e.g.  Contexts can refer to Vports Policies or other Contexts, the
   Reference Scope gives the Agent an idea of where those references
   reside.  They may be in the same operation, an operation in the same
   CONF_BUNDLE message or in storage.  There may also be no references.
   This permits the Agent to understand when it can stop searching for
   reference it cannot find.  For example, if a CONF_BUNDLE message uses
   a Reference Scope of type 'op' then it merely needs to keep an
   operation level cache and consume no memory or resources searching
   across the many operations in the CONF_BUNDLE message or the data
   store.

   Agents can also be stateless by only supporting the 'none', 'op' and
   'bundle' reference scopes.  This does not imply they lack storage but
   merely the search space they use when looking up references for an
   entity.  The figure below shows the caching hierarchy provided by the
   Reference Scope

   Caches are temporarily created at each level and as the scope
   includes more caches the amount of entities that are searched
   increases.  Figure 25 21 shows an example containment hierarchy provided
   for all caches.

                             +---------------+
                             | Global Cache  |
                             |  (storage)    |
                             +------+--------+
                                    |
                                    +----------------------+
                                    |                      |
                             +------+--------+      +------+--------+
                             | Bundle Cache  |      | Bundle Cache  |
                             |   (bundle)    | .... |   (bundle)    |
                             +------+--------+      +------+--------+
                                    |
               +--------------------+--------------------+
               |                    |                    |
      +--------+---------+ +--------+---------+ +--------+---------+
      | Operation Cache  | | Operation Cache  | | Operation Cache  |
      |       (op)       | |       (op)       | |       (op)       |
      +------------------+ +------------------+ +------------------+

                                (no cache)

                  Figure 25: 21: Exemplary Hierarchical Cache

5.2.4.  Pre-provisioning

   Although Contexts are used for Session based lifecycle elements,
   Vports may exist outside of a specific lifecycle and represent more
   general policies that may affect multiple Contexts (sessions).  The
   use of pre-provisioning of Vports permits policy and administrative
   use cases to be executed.  For example, creating tunnels to forward
   traffic to a trouble management platform and dropping packets to a
   defective web server can be accomplished via provisioning of Vports.

   The figure below shows a CONFIG (1) message used to install a Policy-
   group, policy-group1, using a Context set aside for pre-provisioning
   on a DPN.

                                      +-------Router--------+
              +-----------+           |+-------+ +---------+|
              |   FPC     |            | FPC   | |  Anchor |
              |  Client   |            | Agent | |   DPN   |
              +-----------+            +-------+ +---------+
                   |                          |           |
                   |------CONFIG(CREATE)----->|           |
                   |  [ VPORT_ID port1,       |           |
                   |     [ policy-group1 ] ]  |           |
                   |  [ CONTEXT_ID preprov,   |           |
                   |     DPN_ID X,            |           |
                   |     [ port1 ] ]          |           |
                   |                          |           |

      Figure 26: Exemplary Config Message for policy pre-provisioning

5.2.4.1.  Basename Registry Feature (Optional)

5.2.3.4.  Basename Registry Feature (Optional)

   The Optional BaseName Registry support feature is provided to permit
   Clients and tenants with common scopes, referred to in this
   specification as BaseNames, to track the state of provisioned policy
   information on an Agent.  The registry records the BaseName and
   Checkpoint set by a Client.  If a new Client attaches to the Agent it
   can query the Registry to determine the amount of work that must be
   executed to configure the Agent to a BaseName / checkpoint revision.
   A State value is also provided in the registry to help Clients
   coordinate work on common BaseNames.

6.  Protocol Message Details

6.1.  Data Structures And Type Assignment

   This section provides a type mapping for FPC structures.  When being
   mapped to a specific information such as YANG the data type MAY
   change.

6.1.1.  Policy Structures
      +--------------+-----------------+----------------------------+
   +------------+------------------+-----------------------------------+
   | Structure  | Field            | Type                              |
      +--------------+-----------------+----------------------------+
   +------------+------------------+-----------------------------------+
   | ACTION     | ACTION_ID        | FPC-Identity (Section 4.4) 4.8)        |
   |            |                  |                                   |
   | ACTION     | TYPE ACTION_TYPE      | [32, unsigned integer]            |
   |            |                  |                                   |
   | ACTION     | VALUE ACTION_VALUE     | Type specific                     |
   |            |                  |                                   |
   | DESCRIPTOR | DESCRIPTOR_ID    | FPC-Identity (Section 4.4) 4.8)        |
   |            |                  |                                   |
   | DESCRIPTOR | TYPE DESCRIPTOR_TYPE  | [32, unsigned integer]            |
   |            |                  |                                   |
   | DESCRIPTOR | VALUE DESCRIPTOR_VALUE | Type specific                     |
   |            |                  |                                   |
   | POLICY     | POLICY_ID        | FPC-Identity (Section 4.4) 4.8)        |
   |            |                  |                                   |
   | POLICY     | RULES            | *[ RULE PRECEDENCE RULE_ID ] (See Table 4)    |
      |              |                 |                            |
      | POLICY-GROUP | POLICY_GROUP_ID | FPC-Identity (Section 4.4)           |
   |            |                  | PRECENDENCE is [32, unsigned      |
   | POLICY-GROUP            | POLICIES                  | *[ POLICY_ID ] integer].  For Rule see Table 4   |
      +--------------+-----------------+----------------------------+
   +------------+------------------+-----------------------------------+

                          Table 3: Action Fields

   Policies contain a list of Rules by their order value.  Each Rule
   contains Descriptors with optional directionality and Actions with
   order values that specifies action execution ordering if the Rule has
   multiple actions.

   Rules consist of the following fields.

   +------------------+---------------+--------------------------------+

   +------------------+-------------------+----------------------------+
   | Field            | Type              | Sub-Fields                 |
   +------------------+---------------+--------------------------------+
   +------------------+-------------------+----------------------------+
   | RULE_ID          | FPC-Identity      |                            |
   |                  | (Section 4.8)     |                            |
   |                  |                   |                            |
   | MATCH_TYPE       | ENUMERATION [2,   |                            |
   |                  | unsigned bits]    |                            | ORDER
   | [16, INTEGER]                  | ('AND' or 'OR')   |                            |
   |                  |                   |                            |
   | RULE_DESCRIPTORS | *[ DESCRIPTOR_ID  | DIRECTION [2, unsigned bits]     |
   |                  | DESCRIPTOR_ID DIRECTION ]       | bits] is an ENUMERATION (uplink,    |
   |                  | DIRECTION ]                   | (uplink, downlink or       |
   |                  |                   | both).                     |
   |                  |                   |                            |
   | RULE_ACTIONS     | *[ ACTION_ID      | ACTION-ORDER [8, unsigned  |
   |                  | ACTION-ORDER ACTION_ORDER ]    | integer] specifies action  |
   |                  | ]                   | execution order.           |
   +------------------+---------------+--------------------------------+
   +------------------+-------------------+----------------------------+

                           Table 4: Rule Fields

6.1.2.  Mobility Structures

                 +----------+----------------------------+

   +---------------------------------+---------------------------------+
   | Field                           | Type                            |
                 +----------+----------------------------+
   +---------------------------------+---------------------------------+
   | VPORT_ID DPN_ID                          | FPC-Identity (Section 4.4) 4.8)      |
   |                                 |                                 |
   | POLICIES | *[ POLICY_GROUP_ID ]       |
                 +----------+----------------------------+

                           Table 5: Vport Fields

     +-----------------------+--------------------------------------+
     | Field 1*[ INSTALLED_POLICY_ID         | Type                                 |
     +-----------------------+--------------------------------------+
   | CONTEXT_ID POLICY_ID_REFERENCE             | FPC-Identity (Section 4.4)                                 |
   | POLICY_SETTINGS ]               |                                 |
   | VPORTS DPN_POLICY_SETTINGS             | *[ VPORT_ID ]                                 |
   |                                 |                                 |
   | DPN_GROUP_ID INSTALLED_POLICY_ID             | FPC-Identity (Section 4.4) 4.8)      |
   |                                 |                                 |
   | DELEGATED IP PREFIXES POLICY_ID_REFERENCE             | *[ IP_PREFIX ] POLICY_ID                       |
   |                                 |                                 |
   | PARENT_CONTEXT_ID POLICY_SETTINGS                 | FPC-Identity (Section 4.4) A collection of policy specific |
   |                                 | setings (properties)            |
   | UPLINK [NOTE 1]                                 | MOB_FIELDS                                 |
   | DPN_POLICY_SETTINGS             | A collection of setings         |
   | DOWNLINK [NOTE 1]                                 | MOB_FIELDS (properties) that affect        |
   |                                 | multiple installed policies.    |
   +---------------------------------+---------------------------------+

                    Table 5: Configurable-Policy Fields

   +-------------------------------------+-----------------------------+
   | DPNS Field                               | Type                        |
   +-------------------------------------+-----------------------------+
   | MOBILITY_CONTEXT_ID                 | FPC-Identity (Section 4.8)  |
   |                                     |                             |
   | DPN_GROUP_ID_REFERENCE              | FPC-Identity (Section 4.8)  |
   |                                     |                             |
   | PARENT_MOBILITY_CONTEXT_ID_REFERNCE | FPC-Identity (Section 4.8)  |
   |                                     |                             |
   | DPNS [NOTE 2]                       | *[ DPN_ID DPN_DIRECTION MOB_FIELDS  DPN_REFERENCE ]         |
   |                                     |                             |
   | MOB_FIELDS REQUEST_POLICY_REFERENCES           | All parameters from Table 7 * [ POLICY_ID ]             |
     +-----------------------+--------------------------------------+

                          Table 6: Context Fields

   NOTE 1 - These fields are present when the Agent supports only a
   single DPN.

   NOTE 2 - This field is present when the Agent supports multiple DPNs.

   +---------------------------+---------------------+-----------------+
   | Field                                     | Type                             | Detail
   |
   +---------------------------+---------------------+-----------------+ CONTEXT_SETTINGS_COMPLEMENTARY      | TUN_LOCAL_ADDRESS A Collection of Settings    | IP Address
   | [NOTE 1]                                     | (properties).               |
   +-------------------------------------+-----------------------------+

                     Table 6: Mobility Context Fields

   +----------------------------+--------------------------------------+
   | Field                      | Type                                 |
   +----------------------------+--------------------------------------+
   | TUN_REMOTE_ADDRESS DPN_ID                     | IP Address FPC-Identity (Section 4.8)           | [NOTE 1]
   |                            |                                      |
   | DIRECTION                  | See Table 4                          | TUN_MTU
   | [32, unsigned                            |                                      |
   | INTERFACE_ID_REF           | integer] FPC-Identity (Section 4.8)           |
   |                            |                                      |
   | EMBEDDED_RULES             | *[ EMBEDDED_RULE ]                   | TUN_PAYLOAD_TYPE
   | [2, bits]                            | Enumeration: pa                                      |
   | DPN_SETTINGS_COMPLEMENTARY | A Collection of Settings             | yload_ipv4(0),
   |                            | (properties).                        |
   | payload_ipv6(1)                            |                                      |
   | ASSIGNED_POLICY_REFERENCES | or payload_dual * [ POLICY_ID ]                      |
   +----------------------------+--------------------------------------+

                       Table 7: DPN_REFERENCE Fields

   +---------------------------+---------------------------------------+
   | Field                     | Type                                  | (2).
   +---------------------------+---------------------------------------+
   | RULE_ID                   | FPC-Identity (Section 4.8)            |
   |                           |                                       | TUN_TYPE
   | [8, unsigned MATCH_TYPE                | Enumeration: See Table 4                           |
   |                           | integer]                                       | IP-in-IP(0),
   | PRECEDENCE                | See Table 3                           |
   | UDP(1), GRE(2)                           |                                       |
   | ACTION_DEFINITION_SET     | and GTP(3). *[ ACTION_ORDER ACTION_ID ACTION_TYPE |
   |                           | ACTION_VALUE ]                        |
   |                           | TUN_IF                                       | [16, unsigned
   | Input interface DESCRIPTOR_DEFINITION_SET | *[ DESCRIPTOR_ID DESCRIPTOR_TYPE      |
   | integer]                           | index. DESCRIPTOR_VALUE ]                    |
   +---------------------------+---------------------------------------+

                       Table 8: EMBEDDED_RULE Fields

6.1.2.1.  Monitors
   +---------------------+-------------------------+-------------------+
   | Field               | Type                    | Description       |
   +---------------------+-------------------------+-------------------+
   | MOBILITY_SPECIFIC_TUN_PAR MONITOR             | [ IETF_PMIP_MOB_PRO MONITOR_ID DETERRABLE   | [NOTE 1]                   |
   | AMS                     | FILE TARGET                  |                   |
   |                     | BINDING_INFORMATION     | 3GPP_MOB_PROFILE ]                   |
   |                     | [REPORT_CONFIG]         |                   |
   |                     | NEXTHOP                         | [ IP Address                   | MAC
   | [NOTE 1] DETERRABLE          | boolean                 | Deterrability     | Address
   | SPI                     |                         | indicator.        |
   |                     | MPLS Label                         | SID                   |
   | BINDING_INFORMATION | String                  |                   | Interface Index ]
   |                     |                         |                   | (See Table 19).
   | MONITOR_ID          | FPC-Identity. See       |                   |
   |                     | Section 4.8             | QOS_PROFILE_PARAMS                   | [ 3GPP_QOS
   |                     | [NOTE 1]                         |                   |
   | PMIP_QOS ] EVENT_TYPE_ID       | [8, Event Type ID]      | Event Type        |
   |                     |                         | (unsigned         | DPN_SPECIFIC_PARAMS
   | [ TUN_IF or Varies]                     | Specifies                         | integer).         |
   |                     | optional node                         |                   |
   | TARGET              | specific OCTET STRING (See       |                   |
   |                     | parameters in Section 4.7)            |                   |
   |                     | need such as                         |                   |
   | REPORT_CONFIG       | if-index, [8, REPORT-TYPE]        |                   |
   |                     | tunnel-if- [TYPE_SPECIFIC_INFO]    |                   |
   |                     | number that                         |                   |
   | PERIODIC_CONFIG     | must be unique [32, period]            | report interval   |
   |                     | in the DPN.                         | (ms).             |
   |                     |                         |                   | VENDOR_SPECIFIC_PARAM
   | *[ Varies ] THRESHOLD_CONFIG    | [NOTE 1] [32, low] [32, hi]      |
   +---------------------------+---------------------+-----------------+

   NOTE 1 - These parameters are extensible.  The Types may be extended
     for Field value by future specifications or in the case of Vendor
                    Specific Attributes by enterprises.

            Table 7: Context Downlink/Uplink Field Definitions

6.1.3.  Topology Structures

          +----------------+------------------------------------+ thresholds (at    | Field
   | Type                     |
          +----------------+------------------------------------+                         | DPN_ID least one value   | FPC-Identity. See Section 4.4
   |                     |                         | must be present)  |
   |                     | DPN_NAME                         | [1024, OCTET STRING]                   |
   | SCHEDULED_CONFIG    | [32, time]              |                   | DPN_GROUPS
   | * [ FPC-Identity ] See Section 4.4                     |                         |                   |
   | EVENTS_CONFIG       | NODE_REFERENCE *[EVENT_TYPE_ID]        | [1024, OCTET STRING]                   |
          +----------------+------------------------------------+
   +---------------------+-------------------------+-------------------+

                Table 8: DPN Fields

                +------------------+----------------------+ 9: Monitor Structures and Attributes

   TRIGGERS include but are not limited to the following values:

   o  Events specified in the Event List of an EVENTS CONFIG

   o  LOW_THRESHOLD_CROSSED

   o  HIGH_THRESHOLD_CROSSED
   o  PERIODIC_REPORT

   o  SCHEDULED_REPORT

   o  PROBED

   o  DEREG_FINAL_VALUE

6.1.3.  Message Attributes

6.1.3.1.  Header

   Each operation contains a header with the following fields:

   +--------------+----------------+-----------------------------------+
   | Field        | Type           |
                +------------------+----------------------+
                | DOMAIN_ID        | [1024, OCTET STRING] Messages                          |
   +--------------+----------------+-----------------------------------+
   | CLIENT_ID    | FPC-Identity   | All                               | DOMAIN_NAME
   | [1024, OCTET STRING]              | (Section 4.8)  |                                   |
   |              | DOMAIN_TYPE                | [1024, OCTET STRING]                                   |
   | DELAY        | [32, unsigned  | All                               | DOMAIN_REFERENCE
   | [1024, OCTET STRING]              |
                +------------------+----------------------+

                          Table 9: Domain Fields

   +------------------+------------------------------------------------+ integer]       | Field                                   | Type
   |
   +------------------+------------------------------------------------+              | DPN_GROUP_ID                | FPC-Identity. See Section 4.4                                   |
   | OP_ID        | [64, unsigned  | All                               | DATA_PLANE_ROLE
   | [4, ENUMERATION (data-plane, such as access-              | integer]       |                                   | dpn, L2/L3 anchor-dpn.)]
   |              |                |                                   |
   | ACCESS_TYPE OP_REF_SCOPE | [4, ENUMERATION ()ethernet(802.3/11), 3gpp     |
   |                  | cellular(S1,RAB)]                              |            | Values are none(0), op(1),        |
   |              | MOBILITY_PROFILE ENUMERATION]   | [4, ENUMERATION (ietf-pmip, 3gpp, bundle(2), storage(3) or new       |
   |                  | profile)]          |
   |              |                | unknown(4)                        | PEER_DPN_GROUPS
   +--------------+----------------+-----------------------------------+

                      Table 10: Message Header Fields

6.1.3.2.  CONFIG and CONF_BUNDLE Attributes and Notifications
   +--------------------+--------------------+-------------------------+
   | * [ DPN_GROUP_ID MOBILITY_PROFILE Field              | Type               | Operation Types         | REMOTE_ENDPOINT_ADDRESS LOCAL_ENDPOINT_ADDRESS
   |                    |                    | TUN_MTU DATA_PLANE_ROLE ] Create(C), Update(U),   |
   +------------------+------------------------------------------------+

                        Table 10: DPN Groups Fields

6.1.4.  Monitors
   +------------------+----------------------+-------------------------+
   | Field                    | Type                    | Description Query(Q) and Delete(D)  |
   +------------------+----------------------+-------------------------+
   +--------------------+--------------------+-------------------------+
   | MONITOR OP_TYPE            | MONITOR_ID TARGET [8, op type]       | CONFIG and CONF_BUNDLE  |
   |                    | [REPORT_CONFIG]                    |                         |
   | COMMAND_SET        | FPC Command        | C,U                     |
   | MONITOR_ID                    | FPC-Identity. Bitset. See        |                         |
   |                    | Section 4.4 5.1.1.2.   |                         |
   |                    |                    |                         |
   | EVENT_TYPE_ID INSTALLED_POLICIES | [8, Event Type ID] *[                 | Event Type (unsigned C,U                     |
   |                    | INSTALLED_POLICY ] | integer).                         |
   |                    |                    |                         |
   | TARGET MOBILITY-CONTEXTS  | OCTET STRING (See *[ MOBILITY-       | C,U                     |
   |                    | Section 4.3.3) CONTEXT [          |                         |
   |                    | COMMAND_SET [NOTE  |                         |
   | REPORT_CONFIG                    | [8, REPORT-TYPE] 1] ] ]             |                         |
   |                    | [TYPE_SPECIFIC_INFO]                    |                         |
   | TARGETS            | FPC-Identity       | Q,D                     |
   | PERIODIC_CONFIG                    | [32, period] (Section 4.8)      | report interval (ms).                         |
   |                    | *[DPN_ID]          |                         |
   | THRESHOLD_CONFIG                    | [32, low] [32, hi]                    | thresholds (at least                         |
   | POLICIES           | *[ POLICY ]        | one value must be C,U                     |
   |                    |                    | present)                         |
   | RULES              | *[ RULE ]          | C,U                     |
   |                    |                    |                         | SCHEDULED_CONFIG
   | [32, time] DESCRIPTORS        | *[ DESCRIPTOR ]    | C,U                     |
   |                    |                    |                         |
   | EVENTS_CONFIG ACTIONS            | *[EVENT_TYPE_ID] *[ ACTION ]        | C,U                     |
   +------------------+----------------------+-------------------------+
   +--------------------+--------------------+-------------------------+

              Table 11: Monitor Structures and Attributes

   TRIGGERS include but are not limited to the following values:

   o  Events specified in the Event List of an EVENTS CONFIG

   o  LOW_THRESHOLD_CROSSED

   o  HIGH_THRESHOLD_CROSSED

   o  PERIODIC_REPORT

   o  SCHEDULED_REPORT

   o  PROBED

   o  DEREG_FINAL_VALUE

6.2.  Message Attributes

6.2.1.  Header

   Each operation contains a header with the following fields:

   +-------------+------------------------+----------------------------+ and CONF_BUNDLE OP_BODY Fields

   +--------------------+------------------+---------------------------+
   | Field              | Type             | Messages                   |
   +-------------+------------------------+----------------------------+
   | CLIENT_ID   | FPC-Identity (Section  | All                        |
   |             | 4.4)                   |                            |
   |             |                        | Operation Types           |
   | DELAY                    | [32, unsigned integer]                  | All Create(C), Update(U),     |
   |                    |                  | Query(Q) and Delete(D)    |
   +--------------------+------------------+---------------------------+
   | OP_ID              | [64, unsigned integer]    | All                       |
   |                    | integer]         |                           |
   | ADMIN_STATE                    | [8, admin state]                  | CONFIG, CONF_BUNDLE and                           |
   | STATUS             | [1, Enumerated]  | REG_MONITOR OK(0) or Error(1)         |
   |                    |                  |                           |
   | OP_TYPE NOTIFY_FOLLOWS     | [8, op type] boolean          | CONFIG and CONF_BUNDLE                           |
   +-------------+------------------------+----------------------------+

                      Table 12: Message Header Fields

6.2.2.  CONFIG and CONF_BUNDLE Attributes and Notifications
   +---------------+----------------------+----------------------------+
   | Field                    | Type                  | Operation Types Create(C),                           |
   | POLICIES           | *[ POLICY ]      | Update(U), Query(Q) and C,U                       |
   |                    |                  | Delete(D)                           |
   +---------------+----------------------+----------------------------+
   | SESSION_STATE RULES              | [8, session state] *[ RULE ]        | C,U                       |
   |                    |                  |                           |
   | COMMAND_SET DESCRIPTORS        | FPC Command Bitset. *[ DESCRIPTOR ]  | C,U [NOTE 1]               |
   |               | See Section 5.1.1.4.                       |
   |                    |                  |                           |
   |
   | CLONES ACTIONS            | *[ FPC-Identity FPC- ACTION ]      | C,U [NOTE 1]                       |
   |                    | Identity ] (Section                  |                           |
   | INSTALLED_POLICIES | 4.4) *[               | C,U [NOTE 1]              |
   |                    | INSTALLED_POLICY |                           |
   | VPORTS                    | *[ VPORT ]                | C,U                           |
   |                    |                  |                           |
   | CONTEXTS           | *[ CONTEXT [     | C,U [NOTE 1]              |
   |                    | COMMAND_SET [NOTE 1]      |                           |
   |                    | [NOTE 1] ] ]     |                           |
   |                    |                  |                           |
   | TARGETS            | *[ FPC-Identity  | Q,D [NOTE 1]              |
   |                    | (Section 4.4) 4.8) ]  |                           |
   |                    | *[DPN_ID]                  |                           |
   | ERROR_TYPE_ID      | [32, unsigned    | All [NOTE 2]              |
   | POLICY_GROUPS                    | *[ POLICY-GROUP ] integer]         | C,U [NOTE 1]                           |
   |                    |                  |                           |
   | POLICIES ERROR_TAG          | *[ POLICY ] [1024, octet     | C,U All [NOTE 1]               |
   | 2, 3]           |
   |                    | string]          | DESCRIPTORS                           | *[ DESCRIPTOR ]      | C,U [NOTE 1]               |
   |               |                      |                            |
   | ACTIONS       | *[ ACTION ]          | C,U [NOTE 1]               |
   +---------------+----------------------+----------------------------+

    NOTE 1 - Only present if the corresponding feature is supported by
                                the Agent.

              Table 13: CONFIG and CONF_BUNDLE OP_BODY Fields

   +-------------------+--------------------+--------------------------+
   | Field             | Type               | Operation Types          |
   |                   |                    | Create(C), Update(U),    |
   |                   |                    | Query(Q) and Delete(D)   |
   +-------------------+--------------------+--------------------------+
   | VPORTS            | *[ VPORT ]         | C,U [NOTE 2]             |
   |                   |                    |                          |
   | CONTEXTS          | *[ CONTEXT [       | C,U [NOTE 2]             |
   |                   | COMMAND_SET [NOTE  |                          |
   |                   | 1] ] ]             |                          |
   |                   |                    |                          |
   | TARGETS           | *[ FPC-Identity    | Q,D [NOTE 2]             |
   |                   | (Section 4.4)      |                          |
   |                   | *[DPN_ID] ]        |                          |
   |                   |                    |                          |
   | ERROR_TYPE_ID     | [32, unsigned      | All [NOTE 3]             |
   |                   | integer]           |                          |
   |                   |                    |                          |
   | ERROR_INFORMATION | [1024, octet       | All [NOTE 3]             |
   |                   | string]            |                          |
   +-------------------+--------------------+--------------------------+
   +--------------------+------------------+---------------------------+

             Table 14: 12: Immediate Response RESPONSE_BODY Fields

   Notes:

      NOTE 1 - Only present if the corresponding feature is supported by
      the Agent.

      NOTE 2 - Present in OK and OK_NOTIFY_FOLLOWS OK with NOTIFY_FOLLOWS for both CONFIG
      and CONF_BUNDLE.  MAY also be present in an CONF_BUNDLE Error
      response (ERR) if one of the operations completed successfully.

      NOTE 3 2 - Present only for Error (ERR) responses.

   +-----------------+--------------------+----------------------------+

      NOTE 3 - Other Error Info (Strings) MAY also be present.

   +-----------------+----------------------+--------------------------+
   | Field           | Type                 | Description              |
   +-----------------+--------------------+----------------------------+
   +-----------------+----------------------+--------------------------+
   | AGENT_ID        | FPC-Identity         |                          |
   |                 | (Section 4.4) 4.8)        |                          |
   |                 |                      |                          |
   | OP_ID           | [64, unsigned        | All                      |
   |                 | integer]             |                          |
   |                 |                      |                          |
   | STATUS          | [1, Enumerated]      | OK(0) or Error(1)        |
   |                 |                      |                          |
   | NOTIFICATION_ID | [32, unsigned        | A Notification Identifier           |
   |                 | integer]             | Identifier used to determine       |
   |                 |                      | determine notification   |
   |                 |                      | order.                   |
   |                 |                      |                          |
   | TIMESTAMP       | [32, unsigned        | The time that the        |
   |                 | integer]             | notification occurred.   |
   |                 |                      |                          |
   | DATA            | *[ OP_ID [OP_ID (if        |                          |
   |                 | RESPONSE_BODY CONF_BUNDLE) ]       |                          |
   |                 | RESPONSE_BODY (Table 14) |                          |
   |                 | 12) ]                |                          |
   +-----------------+--------------------+----------------------------+
   +-----------------+----------------------+--------------------------+

      Table 15: 13: CONFIG_RESULT_NOTIFY Asynchronous Notification Fields

6.2.3.

6.1.3.3.  Monitors
   +-----------------+---------------------+---------------------------+
   | Field           | Type                | Description               |
   +-----------------+---------------------+---------------------------+
   | NOTIFICATION_ID | [32, unsiged        |                           |
   |                 | integer]            |                           |
   |                 |                     |                           |
   | TRIGGER TIMESTAMP       | [32, unsigned       |                           |
   |                 | integer]            |                           |
   |                 |                     |                           |
   | NOTIFY CAUSE           | NOTIFICATION_ID [32, unsigned       | Timestamp notes when the                           |
   |                 | MONITOR_ID TRIGGER integer]            | event occurred.                           |
   |                 | [32, timestamp]                     | Notification Data is                           |
   | NOTIFY          | MONITOR             | NOTIFICATION_DATA is the  |
   |                 | [NOTIFICATION_DATA] | TRIGGER and Monitor type value of the monitored    |
   |                 |                     | target if this is not ean |
   |                 | specific.                     | error.                    |
   +-----------------+---------------------+---------------------------+

                      Table 16: 14: Monitor Notifications

7.  Derived and Subtyped Attributes

   This section notes settings and derived attributes.

   +------------------+-------+---------------+------------------------+

   +---------------------------+---------------------+-----------------+
   | Field                     | Type                | Type Detail          | Description
   +---------------------------+---------------------+-----------------+
   | TUN_LOCAL_ADDRESS         | IP Address          | Value [NOTE 1]        |
   |                           |
   +------------------+-------+---------------+------------------------+                     | TO_PREFIX                 | 0
   | [IP Address] TUN_REMOTE_ADDRESS        | Aggregated or per-host IP Address          | [NOTE 1]        |
   |                           | [ Prefix Len                     | destination IP                 |
   | TUN_MTU                   | [32, unsigned       | ]                 | address/prefix
   |                           | integer]            |                 |
   | descriptor.                           |                     |                 |
   | TUN_PAYLOAD_TYPE          | [2, bits]           | Enumeration: pa | FROM_PREFIX
   | 1                           | [IP Address]                     | Aggregated or per-host yload_ipv4(0),  |
   |                           |                     | [ Prefix Len payload_ipv6(1) | source IP
   |                           |                     | or payload_dual | ]
   | address/prefix                           |                     | (2).            |
   |                           | descriptor.                     |                 |
   | TUN_TYPE                  | [8, unsigned        | Enumeration:    |
   | TRAFFIC_SELECTOR                           | 2 integer]            | Format per IP-in-IP(0),    | Traffic Selector.
   |                           |                     | UDP(1), GRE(2)  | specification
   |                           |                     | and GTP(3).     |
   | [RFC6088].                           |                     |
   +------------------+-------+---------------+------------------------+

                       Table 17: Descriptor Subtypes

   +--------------+-------+---------------------+----------------------+                 | Field
   | Type TUN_IF                    | Type [16, unsigned       | Description Input interface |
   |                           | Value integer]            | index.          |
   |
   +--------------+-------+---------------------+----------------------+                           | DROP                     | 0                 | Empty
   | Drop the associated MOBILITY_SPECIFIC_TUN_PAR | [ IETF_PMIP_MOB_PRO | [NOTE 1]        |
   | AMS                       | packets. FILE |              |                 |
   |                           | 3GPP_MOB_PROFILE ]  |                 | REWRITE
   | 1                           | [in_src_ip]                     | Rewrite IP Address                 |
   | NEXTHOP                   | Varies              | [out_src_ip] [NOTE 1] See    | (NAT) or IP Address
   |                           |                     | Table 18.       | [in_dst_ip]
   | / Port (NAPT).                           |                     |                 |
   | [out_dst_ip] QOS_PROFILE_PARAMS        | [ 3GPP_QOS |        | [NOTE 1]        |
   | [in_src_port]                           | PMIP_QOS ]          |                 |
   +---------------------------+---------------------+-----------------+

   NOTE 1 - These parameters are extensible.  The Types may be extended
     for Field value by future specifications or in the case of Vendor
                    Specific Attributes by enterprises.

                 Table 15: Context Tunnel And QoS Settings

   +-----------+------------------+--------------------+---------------+
   | Field     | [out_src_port] Type Value       | Type               | Description   |
   | (Type     | [in_dst_port]                  |                    |               |
   | Value)    | [out_dst_port]                  |                    |               |
   +-----------+------------------+--------------------+---------------+
   | TO_PREFIX | [IP Address] [   | Aggregated or per- | FROM_PREFIX   | COPY_FORWARD
   | 2 (0)       | FPC-Identity. See Prefix Len ]     | Copy all packets and host destination   | (1)           |
   |           | Section 4.4.                  | forward them to the IP address/prefix  |               |
   |           |                  | provided identity. descriptor.        |               |
   |           |                  | The value of the                    |               |
   | [IP       | Aggregated or    | identity MUST be a TRAFFIC_SELECTOR   | Format per    |
   | Address]  | per-host source  | port or context.     |
   +--------------+-------+---------------------+----------------------+

                         Table 18: Action Subtypes

   +-----------------+-------+-------------------+---------------------+
   | Field           | Type  | Type              | Description (2)                | specification |
   | Value [ Prefix  | IP               |                    |
   +-----------------+-------+-------------------+---------------------+ [RFC6088].    | IP_ADDR
   | 0 Len ]     | IP Address address/prefix   | An IP Address.                    |               |
   |           | descriptor.      |                    |               | MAC_ADDR
   | 1           | MAC Address                  | A MAC Address.                    |               |
   | Traffic   |
   | Selector. |
   +-----------+------------------+--------------------+---------------+

                       Table 16: Descriptor Subtypes

   +--------------+-------------------------+--------------------------+
   | SERVICE_PATH_ID Field (Type  | 2 Type                    | [24, unsigned Description              | Service Path
   | Value)       |                         |                          | integer]
   +--------------+-------------------------+--------------------------+
   | Identifier (SPI) DROP (0)     | Empty                   | Drop the associated      |
   |              |                         | packets.                 | MPLS_LABEL
   | 3              | [20, unsigned                         | MPLS Label                          |
   | REWRITE (1)  | [in_src_ip]             | integer] Rewrite IP Address (NAT) |
   |              | [out_src_ip]            | or IP Address / Port     |
   |              | [in_dst_ip]             | NSH (NAPT).                  | 4
   | [SERVICE_PATH_ID]              | Included NSH which [out_dst_ip]            |                          |
   |              | [8, unsigned [in_src_port]           | is a SPI and                          |
   |              | [out_src_port]          | integer]                          | Service Index (8
   |              | [in_dst_port]           |                          |
   | bits).              | [out_dst_port]          |                          |
   |              |                         |                          | INTERFACE_INDEX
   | 5 COPY_FORWARD | [16, unsigned FPC-Identity. See       | Interface Index (an Copy all packets and     |
   | (2)          | Section 4.8.            | integer] forward them to the      | unsigned integer).
   |              |                         | provided identity.  The  |
   |              |                         | SEGMENT_ID value of the identity    | 5
   | [128, unsigned              | Segement                         | MUST be a port or        |
   |              | integer]                         | Identifier. context.                 |
   +-----------------+-------+-------------------+---------------------+
   +--------------+-------------------------+--------------------------+

                         Table 19: Next Hop 17: Action Subtypes

   +----------+-------+------------------+-----------------------------+

   +--------------------------------+----------------+-----------------+
   | Field    | Type (Type Value)             | Type           | Description     |
   +--------------------------------+----------------+-----------------+
   | IP_ADDR (0)                    | Value IP Address     | An IP Address.  |
   |
   +----------+-------+------------------+-----------------------------+                                | QOS                | 0                 | [qos index type]
   | Refers to a single index MAC_ADDR (1)                   | MAC Address    | A MAC Address.  |
   | [index] [DSCP]                                | and DSCP to write to the                |                 |
   | SERVICE_PATH_ID (2)            | [24, unsigned  | packet. Service Path    |
   |                                | integer]       | Identifier      |
   |                                | GBR                | 1 (SPI)           | [32, unsigned
   | Guaranteed bit rate.                                |                |                 |
   | integer] MPLS_LABEL (3)                 | [20, unsigned  | MPLS Label      |
   |                                | integer]       |                 |
   | MBR                                | 2                | [32, unsigned                 | Maximum bit rate.
   | NSH (4)                        | [SERVICE_PATH_ | See [I-D.ietf-s | integer]
   |                                | ID] [8,        | fc-nsh]         |
   |                                | unsigned       |                 | PMIP_QOS
   | 3                                | Varies by Type integer]       | A non-traffic selector PMIP                 |
   |                                |                |                 | QoS Attribute per [RFC7222]
   |
   +----------+-------+------------------+-----------------------------+

                          Table 20: QoS Subtypes

   +----------+---------+----------------+-----------------------------+ INTERFACE_INDEX (5)            | Field [16, unsigned  | Type Interface Index |
   |                                | integer]       | (an unsigned    |
   |                                |                | integer).       |
   |                                |                |                 |
   | SEGMENT_ID (6)                 | [128, unsigned | Segement        |
   |                                | integer]       | Identifier.     |
   |                                |                |                 |
   | MPLS_LABEL_STACK (7)           | 7              | 1*[20 bit       |
   |                                |                | labels]         |
   |                                |                |                 |
   | MPLS SR Stack. See [I-D.ietf-s | SRV6_STACK (8) | 32+ Bytes       |
   | pring-segment-routing-mpls].   |                |                 |
   |                                |                |                 |
   | See [I-D.ietf-6man-segment-rou |
   | ting-header].                  |
   +--------------------------------+----------------+-----------------+

                        Table 18: Next Hop Subtypes

   +----------+-------+------------------+-----------------------------+
   | Field    | Type  | Type             | Description                 |
   |          | Value |                  |                             |
   +----------+-------+------------------+-----------------------------+
   | QOS      | 0     | [qos index type] | Refers to a single index    |
   |          |       | [index] [DSCP]   | and DSCP to write to the    |
   |          |       |                  | packet.                     |
   |          |       |                  |                             |
   | GBR      | 1     | [32, unsigned    | Guaranteed bit rate.        |
   |          |       | integer]         |                             |
   |          |       |                  |                             |
   | MBR      | 2     | [32, unsigned    | Maximum bit rate.           |
   |          |       | integer]         |                             |
   |          |       |                  |                             |
   | PMIP_QOS | 3     | Varies by Type   | A non-traffic selector PMIP |
   |          |       |                  | QoS Attribute per [RFC7222] |
   +----------+-------+------------------+-----------------------------+

                          Table 19: QoS Subtypes

   +----------+---------+----------------+-----------------------------+
   | Field    | Type    | Type           | Description                 |
   |          | Value   |                |                             |
   +----------+---------+----------------+-----------------------------+
   | IPIP_TUN | 0       |                | IP in IP Configuration      |
   |          |         |                |                             |
   | UDP_TUN  | 1       | [src_port]     | UDP Tunnel - source and/or  |
   |          |         | [dst_port]     | destination port            |
   |          |         |                |                             |
   | GRE_TUN  | 2       | [32, GRE Key]  | GRE Tunnel.                 |
   +----------+---------+----------------+-----------------------------+

                         Table 21: 20: Tunnel Subtypes

   The following COMMAND_SET values are supported for IETF_PMIP.

   o  assign-ip - Assign the IP Address for the mobile session.

   o  assign-dpn - Assign the Dataplane Node.

   o  session - Assign values for the Session Level.

   o  uplink - Command applies to uplink.

   o  downlink - Command applies to downlink.

7.1.  3GPP Specific Extenstions

   3GPP support is optional and detailed in this section.  The following
   acronyms are used:

   APN-AMBR:  Access Point Name Aggregate Maximum Bit Rate

   ARP:  Allocation of Retention Priority

   EBI:  EPS Bearer Identity

   GBR:  Guaranteed Bit Rate

   GTP:  GPRS (General Packet Radio Service) Tunneling Protocol

   IMSI:  International Mobile Subscriber Identity

   MBR:  Maximum Bit Rate

   QCI:  QoS Class Identifier

   TEID:  Tunnel Endpoint Identifier.

   TFT:  Traffic Flow Template (TFT)

   UE-AMBR:  User Equipment Aggregate Maximum Bit Rate

   NOTE: GTP Sequence Number (SEQ_NUMBER) is used in failover and
   handover.

   +-------------+-------+-------------+-------------------------------+
   | Field       | Type  | Namespace / | Type                          |
   |             | Value | Entity      |                               |
   |             |       | Extended    |                               |
   +-------------+-------+-------------+-------------------------------+
   | GTPV1       | 3     | Tunnel      | LOCAL_TEID REMOTE_TEID        |
   |             |       | Subtypes    | SEQ_NUMBER                    |
   |             |       | namespace.  |                               |
   |             |       |             |                               |
   | GTPV2       | 4     | Tunnel      | LOCAL_TEID REMOTE_TEID        |
   |             |       | Subtypes    | SEQ_NUMBER                    |
   |             |       | namespace.  |                               |
   |             |       |             |                               |
   | LOCAL_TEID  | N/A   | N/A         | [32, unisgned integer]        |
   |             |       |             |                               |
   | REMOTE_TEID | N/A   | N/A         | [32, unisgned integer]        |
   |             |       |             |                               |
   | SEQ_NUMBER  | N/A   | N/A         | [32, unisgned integer]        |
   |             |       |             |                               |
   | TFT         | 3     | Descriptors | Format per TS 24.008 Section  |
   |             |       | Subtypes    | 10.5.6.12.                    |
   |             |       | namespace.  |                               |
   |             |       |             |                               |
   | IMSI        | N/A   | Context     | [64, unsigned integer]        |
   |             |       | (new        |                               |
   |             |       | attribute)  |                               |
   |             |       |             |                               |
   | EBI         | N/A   | Context     | [4, unsigned integer]         |
   |             |       | (new        |                               |
   |             |       | attribute)  |                               |
   |             |       |             |                               |
   | 3GPP_QOS    | 4     | QoS         | [8, qci] [32, gbr] [32, mbr]  |
   |             |       | Subtypes    | [32, apn_ambr] [32, ue_ambr]  |
   |             |       | namespace.  | ARP                           |
   |             |       |             |                               |
   | ARP         | N/A   | N/A         | See Allocation-Retention-     |
   |             |       |             | Priority from [RFC7222]       |
   +-------------+-------+-------------+-------------------------------+

                 Table 22: 21: 3GPP Attributes and Structures

   The following COMMAND_SET values are supported for 3GPP.

   o  assign-ip - Assign the IP Address for the mobile session.

   o  assign-dpn - Assign the Dataplane Node.

   o  assign-fteid-ip - Assign the Fully Qualified TEID (F-TEID) LOCAL
      IP address.

   o  assign-fteid-teid - Assign the Fully Qualified TEID (F-TEID) LOCAL
      TEID.

   o  session - Assign values for the Session Level.  When this involves
      'assign-fteid-ip' and 'assign-fteid-teid' this implies the values
      are part of the default bearer.

   o  uplink - Command applies to uplink.

   o  downlink - Command applies to downlink.

8.  Implementation Status

   Two

   Three FPC Agent implementations have been made to date.  The first
   was based upon Version 03 of the draft and followed Model 1.  The
   second follows Version 04 of the document.  Both implementations were
   OpenDaylight plug-ins developed in Java by Sprint.  Version 03 was
   known as fpcagent and version 04's implementation is simply referred
   to as 'fpc'.  A third has been devloped on an ONOS Controller for use
   in MCORD projects.

   fpcagent's intent was to provide a proof of concept for FPC Version
   03 Model 1 in January 2016 and research various errors, corrections
   and optimizations that the Agent could make when supporting multiple
   DPNs.

   As the code developed to support OpenFlow and a proprietary DPN from
   a 3rd party, several of the advantages of a multi-DPN Agent became
   obvious including the use of machine learning to reduce the number of
   Flows and Policy entities placed on the DPN.  This work has driven
   new efforts in the DIME WG, namely Diameter Policy Groups
   [I-D.bertz-dime-policygroups].

   A throughput performance of tens per second using various NetConf
   based solutions in OpenDaylight made fpcagent undesirable for call
   processing.  The RPC implementation improved throughput by an order
   of magnitude but was not useful based upon FPC's Version 03 design
   using two information models.  During this time the features of
   version 04 and its converged model became attractive and the fpcagent
   project was closed in August 2016. fpcagent will no longer be
   developed and will remain a proprietary implementation.

   The learnings of fpcagent has influenced the second project, fpc.
   Fpc is also an OpenDaylight project but is being prepared for an open source release as
   the Opendaylight FpcAgent plugin
   (https://wiki.opendaylight.org/view/Project_Proposals:FpcAgent). (https://wiki.opendaylight.org/view/
   Project_Proposals:FpcAgent).  This project is scoped to be a fully
   compliant FPC Agent that supports multiple DPNs including those that
   communicate via OpenFlow.  The following features present in this
   draft and others developed by the FPC development team have already
   lead to an order of magnitude improvement.

       Migration of non-realtime provisioning of entities such as
       topology and policy allowed the implementation to focus only on
       the rpc.

       Using only 5 messages and 2 notifications has also reduced
       implementation time.

       Command Sets, an optional feature in this specification, have
       eliminated 80% of the time spent determining what needs to be
       done with a Context during a Create or Update operation.

       Op Reference is an optional feature modeled after video delivery.
       It has reduced unnecessary cache lookups.  It also has the
       additional benefit of allowing an Agent to become cacheless and
       effectively act as a FPC protocol adapter remotely with multi-DPN
       support or colocated on the DPN in a single-DPN support model.

       Multi-tenant support allows for Cache searches to be partitioned
       for clustering and performance improvements.  This has not been
       capitalized upon by the current implementation but is part of the
       development roadmap.

       Use of Contexts to pre-provision policy has also eliminated any
       processing of Ports for DPNs which permitted the code for
       CONFIGURE and CONF_BUNDLE to be implemented as a simple nested
       FOR loops (see below).

   Current

   Initial v04 performance results without code optimizations or tuning
   allow 2-5K FPC Contexts processed per second on a 2013 Mac laptop.
   This results in 2x the number of transactions on the southbound
   interface to a proprietary DPN API on the same machine.

   fpc currently supports

   Current v04 performance results without code optimizations or tuning
   allow 1-2K FPC Contexts processed per second on a 2013 Mac laptop.
   This results in 2x the following:

                           1 proprietary number of transactions on the southbound
   interface to a proprietary DPN API on the same machine.

   fpc currently supports the following:

                           1 proprietary DPN API
                           Policy and Topology as defined in this
                           specification using OpenDaylight North Bound
                           Interfaces such as NetConf and RestConf

                           CONFIG and CONF_BUNDLE (all operations)

                           DPN assignment, Tunnel allocations and IPv4
                           address assignment by the Agent or Client.

                           Immediate Response is always an
                           OK_NOTIFY_FOLLOWS.

        assignment system (receives rpc call):
          perform basic operation integrity check
          if CONFIG then
            goto assignments
            if assignments was ok then
              send request to activation system
              respond back to client with assignment data
            else
              send back error
            end if
          else if CONF_BUNDLE then
            for each operation in bundles
            goto assignments
            if assignments was ok then
              hold onto data
            else
              return error with the assignments that occurred in
                prior operations (best effort)
            end if
            end for
            send bundles to activation systems
          end if

        assignments:
          assign DPN, IPv4 Address and/or tunnel info as required
          if an error occurs undo all assignments in this operation
          return result

        activation system:
          build cache according to op-ref and operation type
          for each operation
            for each Context
              for each DPN / direction in Context
                perform actions on DPN according to Command Set
              end for
            end for
          end for
          commit changes to in memory cache
          log transaction for tracking and notification
                                        (CONFIG_RESULT_NOTIFY)

                        Figure 27: 22: fpc pseudo code

   For further information please contact Lyle Bertz who is also a co-
   author of this document.

   NOTE: Tenant support requires binding a Client ID to a Tenant ID (it
   is a one to many relation) but that is outside of the scope of this
   specification.  Otherwise, the specification is complete in terms of
   providing sufficient information to implement an Agent.

9.  Security Considerations

   Detailed protocol implementations for DMM Forwarding Policy
   Configuration must ensure integrity of the information exchanged
   between an FPC Client and an FPC Agent.  Required Security
   Associations may be derived from co-located functions, which utilize
   the FPC Client and FPC Agent respectively.

   The YANG modules defined in this memo is designed to be accessed via
   the NETCONF protocol [RFC6241]. [RFC6241] or RESTCONF [RFC8040] protocol.  The lowest
   NETCONF layer is the secure transport layer and the mandatory-to-implement mandatory-to-
   implement secure transport is SSH [RFC6242].

   The information model defined in the memo is designed to be access by
   protocols specified in extensions to this document or, if using the
   YANG modules, as described above.

   There are a number of data nodes defined which are
   writable/creatable/deletable.  These data nodes may be considered
   sensitive or vulnerable in some network environments.  Write
   operations (e.g., a NETCONF edit-config) to these data nodes without
   proper protection can have a negative effect on network operations.
   These are the subtrees and data nodes and their sensitivity/
   vulnerability:

      Nodes under the Policy tree provide generic policy enforcement and
      traffic classification.  They can be used to block or permit
      traffic.  If this portion of the model was to be compromised it
      may be used to block, identify or permit traffic that was not
      intended by the Tenant or FPC CLient.

      Nodes under the Topology tree provide defintion of the Tenant's
      forwarding topology.  Any compromise of this information will
      provide topology information that could be used for subsequent
      attack vectors.  Removal of topology can limit services.

      Nodes under the Mobility Tree are runtime only and manipulated by
      remote procedure calls.  The unwanted deletion or removal of such
      information would deny users service or provide services to
      unauthorized parties.

   Some of the readable data nodes defined may be considered sensitive
   or vulnerable in some network environments.  It is thus important to
   control read access (e.g., via get, get-config, or notification) to
   these data nodes.  These are the subtrees and data nodes and their
   sensitivity/vulnerability:

      IP address assignments in the Context along with their associated
      tunnel configurations/identifiers (from the FPC base module)

      Internaional Mobile Subscriber Identity (IMSI) and bearer
      identifiers in the Context when using the optional 3GPP module

   Some of the RPC operations defined may be considered sensitive or
   vulnerable in some network environments.  It is thus important to
   control access to these operations.  These are the operations and
   their sensitivity/vulnerability:

      CONFIG and CONF_BUNDLE send Context information which can include
      information of a sensitive or vulnerable nature in some network
      environments as described above.

      Monitor related RPC operations do not specicially provide
      sensitive or vulnerable informaiton but care must be taken by
      users to avoid identifier values that expose sensitive or
      vulnerable information.

      Notications MUST be treated with same level of protection and
      scrutiny as the operations they correspond to.  For example, a
      CONFIG_RESULT_NOTIFY notification provides the same information
      that is sent as part of the input and output of the CONFIG and
      CONF_BUNDLE RPC operations.

   General usage of FPC MUST consider the following:

      FPC Naming Section 4.4 4.8 permits arbirtrary string values but a
      users MUST avoid placing sensitive or vulnerable information in
      those values.

      Policies that are very narrow and permit the identification of
      specific traffic, e.g. that of a single user, SHOULD be avoided.

10.  IANA Considerations

   This document registers six URIs in the "IETF XML Registry"
   [RFC3688].  Following the format in RFC 3688, the following
   registrations have been made.

      URI: urn:ietf:params:xml:ns:yang:ietf-dmm-fpc
      Registrant Contact: The DMM WG of the IETF.
      XML: N/A, the requested URI is an XML namespace.

      URI: urn:ietf:params:xml:ns:yang:ietf-dmm-threegpp
      Registrant Contact: The DMM WG of the IETF.
      XML: N/A, the requested URI is an XML namespace.

      URI: urn:ietf:params:xml:ns:yang:ietf-dmm-pmip-qos
      Registrant Contact: The DMM WG of the IETF.
      XML: N/A, the requested URI is an XML namespace.

      URI: urn:ietf:params:xml:ns:yang:ietf-dmm-traffic-selector-types
      Registrant Contact: The DMM WG of the IETF.
      XML: N/A, the requested URI is an XML namespace.

      URI: urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-policyext
      Registrant Contact: The DMM WG of the IETF.
      XML: N/A, the requested URI is an XML namespace.

      URI: urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-pmip urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-settingsext
      Registrant Contact: The DMM WG of the IETF.
      XML: N/A, the requested URI is an XML namespace.

   This document registers the following YANG modules in the "YANG
   Module Names" registry [RFC6020].

     name:         ietf-dmm-fpc
     namespace:    urn:ietf:params:xml:ns:yang:ietf-dmm-fpc
     prefix:       fpc
     reference:    TBD1

     name:         ietf-dmm-threegpp
     namespace:    urn:ietf:params:xml:ns:yang:ietf-dmm-threegpp
     prefix:       threegpp
     reference:    TBD1

     name:         ietf-dmm-pmip-qos
     namespace:    urn:ietf:params:xml:ns:yang:ietf-dmm-pmip-qos
     prefix:       qos-pmip
     reference:    TBD1    TBD2

     name:         ietf-dmm-traffic-selector-types
     namespace:    urn:ietf:params:xml:ns:yang:
       ietf-dmm-traffic-selector-types
     prefix:       traffic-selectors
     reference:    TBD1

     name:         ietf-dmm-traffic-selector-types
     namespace:    urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-policyext
     prefix:       fpcpolicyext
     reference:    TBD1    TBD3

     name:         ietf-dmm-traffic-selector-types         ietf-dmm-fpc-settingsext
     namespace:    urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-pmip    urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-settingsext
     prefix:       fpc-pmip
     reference:    TBD1

   The document registers the following YANG submodules in the "YANG
   Module Names" registry [RFC6020].

           name:         ietf-dmm-fpc-base
           parent:       ietf-dmm-fpc       fpcbase
     reference:    TBD1    TBD4

11.  Work Team Participants

   Participants in the FPSM work team discussion include Satoru
   Matsushima, Danny Moses, Sri Gundavelli, Marco Liebsch, Pierrick
   Seite, Alper Yegin, Carlos Bernardos, Charles Perkins and Fred
   Templin.

12.  References
12.1.  Normative References

   [I-D.ietf-6man-segment-routing-header]
              Previdi, S., Filsfils, C., Raza, K., Leddy, J., Field, B.,
              daniel.voyer@bell.ca, d., daniel.bernier@bell.ca, d.,
              Matsushima, S., Leung, I., Linkova, J., Aries, E., Kosugi,
              T., Vyncke, E., Lebrun, D., Steinberg, D., and R. Raszuk,
              "IPv6 Segment Routing Header (SRH)", draft-ietf-6man-
              segment-routing-header-07 (work in progress), July 2017.

   [I-D.ietf-sfc-nsh]
              Quinn, P., Elzur, U., and C. Pignataro, "Network Service
              Header (NSH)", draft-ietf-sfc-nsh-20 draft-ietf-sfc-nsh-27 (work in progress),
              September
              October 2017.

   [I-D.ietf-spring-segment-routing-mpls]
              Filsfils, C., Previdi, S., Bashandy, A., Decraene, B.,
              Litkowski, S., and R. Shakir, "Segment Routing with MPLS
              data plane", draft-ietf-spring-segment-routing-mpls-10
              (work in progress), June 2017.

   [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>.
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC6088]  Tsirtsis, G., Giarreta, G., Soliman, H., and N. Montavont,
              "Traffic Selectors for Flow Bindings", RFC 6088,
              DOI 10.17487/RFC6088, January 2011, <https://www.rfc-
              editor.org/info/rfc6088>.

   [RFC6089]  Tsirtsis, G., Soliman, H., Montavont, N., Giaretta, G.,
              and K. Kuladinithi, "Flow Bindings in Mobile IPv6 and
              Network Mobility (NEMO) Basic Support", RFC 6089,
              DOI 10.17487/RFC6089, January 2011, <https://www.rfc-
              editor.org/info/rfc6089>.
              <https://www.rfc-editor.org/info/rfc6088>.

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

   [RFC7333]  Chan, H., Ed., Liu, D., Seite, P., Yokota, H., and J.
              Korhonen, "Requirements for Distributed Mobility
              Management", RFC 7333, DOI 10.17487/RFC7333, August 2014,
              <https://www.rfc-editor.org/info/rfc7333>.

12.2.  Informative References

   [I-D.bertz-dime-policygroups]
              Bertz, L. and M. Bales, "Diameter Policy Groups and Sets",
              draft-bertz-dime-policygroups-04 (work in progress), June
              2017.

   [I-D.ietf-dmm-deployment-models]
              Gundavelli, S. and S. Jeon, "DMM Deployment Models and
              Architectural Considerations", draft-ietf-dmm-deployment-
              models-02 (work in progress), August 2017.

   [I-D.ietf-netconf-restconf]
              Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF
              Protocol", draft-ietf-netconf-restconf-18 (work in
              progress), October 2016.

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

   [RFC5213]  Gundavelli, S., Ed., Leung, K., Devarapalli, V.,
              Chowdhury, K., and B. Patil, "Proxy Mobile IPv6",
              RFC 5213, DOI 10.17487/RFC5213, August 2008,
              <https://www.rfc-editor.org/info/rfc5213>.

   [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>.

   [RFC7222]  Liebsch, M., Seite, P., Yokota, H., Korhonen, J., and S.
              Gundavelli, "Quality-of-Service Option for Proxy Mobile
              IPv6", RFC 7222, DOI 10.17487/RFC7222, May 2014,
              <https://www.rfc-editor.org/info/rfc7222>.

   [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>.

Appendix A.  YANG Data Model for the FPC protocol

   These modules define YANG definitions.  Seven  When mapping from the FPC
   model was performed U-Key values, ACTION_TYPES and DESCRIPTOR_TYPES
   as well as many enumerations were mapped to identity types.
   ACTION_TYPES and DESCRIPTOR_TYPES are also optional as the type can
   be inferred from the value.  Four modules are defined:

   o  ietf-dmm-fpc (fpc) - Defines the base model and messages for FPC
      that are meant to be static in FPC.

   o  ietf-dmm-fpc-base  ietf-dmm-fpc-settingsext An FPC submodule module that defines the
      information model elements that is specified are likely to be extended in this document FPC.

   o  ietf-pmip-qos (pmip-qos) - Defines proxy mobile IPv6 QoS
      parameters per RFC 7222

   o  ietf-traffic-selectors-types  ietf-trafficselectors-types (traffic-selectors) - Defines Traffic
      Selectors per RFC 6088

   o  ietf-dmm-threegpp - Defines the base structures for 3GPP based IP
      mobility and augments fpcagent to support these parameters.

   o  ietf-dmm-fpc-pmip - Augments fpcp-base to include PMIP Traffic
      Selectors as a Traffic Descriptor subtype and pmip-qos QoS
      parameters, where applicable, as properties.

   o  ietf-dmm-fpc-policyext - defines basic policy extensions, e.g.
      Actions and Descriptors, to fpcbase and as defined in this
      document.

A.1.  FPC Agent YANG Model

   This module defines the information model and protocol elements
   specified in this document.

   This module references [RFC6991] [RFC6991], [RFC8040] and the fpc-base fpc-settingsext
   module defined in this document.

   <CODE BEGINS> file "ietf-dmm-fpc@2017-03-08.yang" "ietf-dmm-fpc@2017-09-27.yang"
   module ietf-dmm-fpc {
     yang-version 1.1;
       namespace "urn:ietf:params:xml:ns:yang:ietf-dmm-fpc";
       prefix fpc;

       import ietf-inet-types { prefix inet;
           revision-date 2013-07-15; }

       include ietf-dmm-fpc-base;
       import ietf-restconf { prefix restconf;
           revision-date 2017-01-26; }
       import ietf-dmm-fpc-settingsext { prefix fpcbase;
       revision-date 2017-09-27;
     }

       organization "IETF Distributed Mobility Management (DMM)
         Working Group";

       contact
          "WG Web:   <http://tools.ietf.org/wg/netmod/>
           WG List:  <mailto:netmod@ietf.org>

           WG Chair: Dapeng Liu
                     <mailto:maxpassion@gmail.com>

           WG Chair: Jouni Korhonen
                     <mailto:jouni.nospam@gmail.com>

           Editor:   Satoru Matsushima
                     <mailto:satoru.matsushima@g.softbank.co.jp>

           Editor:   Lyle Bertz
                     <mailto:lylebe551144@gmail.com>";

       description
       "This module contains YANG definition for
        Forwarding Policy Configuration Protocol (FPCP).

        Copyright (c) 2016 IETF Trust and the persons identified as the
        document authors. All rights reserved.

        This document is subject to BCP 78 and the IETF Trust's Legal
        Provisions Relating to IETF Documents
        (http://trustee.ietf.org/license-info) in effect on the date of
        publication of this document. Please review these documents
        carefully, as they describe your rights and restrictions with
        respect to this document. Code Components extracted from this
        document must include Simplified BSD License text as described
        in Section 4.e of the Trust Legal Provisions and are provided
        without warranty as described in the Simplified BSD License.";

       revision 2017-03-08 2017-09-27 {
       description "Version 06 10 updates.";
       reference "draft-ietf-dmm-fpc-cpdp-06"; "draft-ietf-dmm-fpc-cpdp-10";
     }
   revision 2016-08-03 2017-07-22 {
       description "Initial Revision."; "Version 08 updates.";
       reference "draft-ietf-dmm-fpc-cpdp-05"; "draft-ietf-dmm-fpc-cpdp-08";
   }
       feature fpc-cloning
   revision 2017-03-08 {
       description "An ability to support cloning in the RPC."; "Version 06 updates.";
       reference "draft-ietf-dmm-fpc-cpdp-06";
   }
   revision 2016-08-03 {
       description "Initial Revision.";
       reference "draft-ietf-dmm-fpc-cpdp-05";
   }
       feature fpc-basename-registry {
         description "Ability to track Base Names already provisioned
           on the Agent";
       }
       feature fpc-bundles {
         description "Ability for Client to send multiple bundles of
           actions to an Agent";
       }
       feature fpc-client-binding {
         description "Allows a FPC Client to bind a DPN to an Topology
           Object";
       }
       feature fpc-auto-binding {
         description "Allows a FPC Agent to advertise Topology Objects
           that could be DPNs";
       }
       feature instruction-bitset {
         description "Allows the expression of instructions (bit sets)
           over FPC.";
       }
       feature operation-ref-scope {
         description "Provides the scope of refeneces in an operation.
           Used to optmize the Agent processing.";
       }
       feature policy-rpc-provisioning {
         description "Enables the ability to send policy elements
           (Policy Groups, Policies, Descriptors and Actions) to be sent
           in CONF or CONF_BUNDLE operations.";
       }

     //General Structures
       typedef agent-identifier fpc-identity {
           type fpc:fpc-identity;
           description "Agent Identifier";
       }

       typedef client-identifier union {
               type fpc:fpc-identity; uint32;
               type string;
               type instance-identifier;
           }
           description "Client Identifier"; "FPC Identity";
       }
       grouping basename-info target-value {
         leaf basename target {
               if-feature fpc:fpc-basename-registry;
             type fpc:fpc-identity; fpc-identity;
         mandatory true;
         description "Rules Basename"; "Target Identity";
         }
             leaf base-state {
               if-feature fpc:fpc-basename-registry;
               type string;
         description "Current State"; "FPC Target Value";
       }
             leaf base-checkpoint
     // Topology
     typedef fpc-interface-id {
               if-feature fpc:fpc-basename-registry;
           type string; fpc:fpc-identity;
           description "Checkpoint"; "DPN interface Identifier";
     }
       identity interface-protocols {
           description "Basename Information"; "Protocol supported by the interface";
       }

       // Top Level Structures
       container tenants {
           list tenant {
               key "tenant-id";
               leaf tenant-id
       identity features {
                   type fpc:fpc-identity;
           description "Tenant ID"; "Protocol features";
       }

               container fpc-policy
     // Settings
     grouping settings {
                 list policy-groups
       container settings-set {
                     key "policy-group-id";
         uses fpc:fpc-policy-group; fpcbase:fpc-settings;
         description "Policy Groups"; "Settings";
       }
                 list policies {
                     key "policy-id";
                     uses fpc:fpc-policy;
       description "Policies"; "Settings container";
     }
                 list descriptors
     //Topology - Groupings
     grouping interface-settings {
                   key descriptor-id;
                   uses fpc:fpc-descriptor;
                   description "Descriptors";
                 }
                 list actions
       container interface-settings-set {
                     key action-id;
                     uses fpc:fpc-action;
         description "Actions"; "Interface settings";
       }
       description "Policy"; "Generic interface settings container";
     }

               container fpc-mobility
     grouping access-technology-key {
                 config false;
                 list contexts
       leaf access-technology {
                     key context-id;
                     uses fpc:fpc-context;
         type identityref {
           base "fpcbase:access-technology";
         }
         mandatory true;
         description "Contexts"; "Access Technology";
       }
                 list vports {
                     key vport-id;
                     uses fpc:fpc-vport;
       description "Ports"; "Access Technology key";
     }
                 list monitors
     grouping role-key {
                     uses fpc:monitor-config;
       leaf role {
         type identityref {
           base "fpcbase:role";
         }
         mandatory true;
         description "Monitors"; "Access Technology Role";
       }
       description "Mobility"; "Access Technology Role key";
     }
               container fpc-topology
     grouping interface-id-key {
                 // Basic Agent Topology Structures
                 list domains
       leaf interface-id {
                   key domain-id;
                   uses fpc:fpc-domain;
                   uses fpc:basename-info;
         type fpc:fpc-interface-id;
         mandatory true;
         description "interface identifier";
       }
       description "Domains"; "Interface Identifier key";
     }
     grouping dpn-identifier-key {
       leaf dpn-id {
                   if-feature fpc:fpc-basic-agent;
         type fpc:fpc-dpn-id; fpc:fpc-identity;
         mandatory true;
         description "DPN ID";
                 }
                 leaf-list control-protocols {
                   if-feature fpc:fpc-basic-agent;
                   type identityref {
                     base "fpc:fpc-dpn-control-protocol"; Identifier Type";
       }
       description "Control Protocols"; "DPN Identifier key";
     }

                 list dpn-groups
     grouping dpn-interface-reference {
                     if-feature fpc:fpc-multi-dpn;
                     key dpn-group-id;
       uses fpc:fpc-dpn-group;
                     list domains {
                       key domain-id; fpc:access-technology-key;
       uses fpc:fpc-domain; fpc:role-key;
       uses fpc:basename-info;
                       description "Domains";
                     } fpc:interface-id-key;
       description "DPN Groups"; "A reference to a DPN interface";
     }
     // Topology Grouping
     grouping fpc-topology {
       list dpns dpn-set {
                     if-feature fpc:fpc-multi-dpn;
         key dpn-id;
         uses fpc:fpc-dpn;
                     description "DPNs";
                 } fpc:dpn-identifier-key;
         leaf dpn-name {
           type string;
           description "Topology"; "DPN name";
         }
         leaf dpn-resource-mapping-reference {
           type string;
           description "Tenant"; "Reference to underlying DPN resource(s)";
         }
         list interface-set {
           key "access-technology role interface-id";
           uses fpc:dpn-interface-reference;
           uses fpc:interface-settings;
           description "Tenant List"; "DPN interfaces";
         }

       container fpc-agent-info {
         // General Agent Structures
         leaf-list supported-features {
           type string;
         description "Agent Features"; "Set of DPNs";
       }

         // Common Agent Info
       list supported-events dpn-type-set {
         key event; "access-technology role";
         uses fpc:access-technology-key;
         leaf event access-technology-name {
           type identityref {
               base "fpc:event-type";
             } string;
           description "Event Types"; "Access Technology Name";
         }
         uses fpc:role-key;
         leaf event-id role-name {
           type fpc:event-type-id;
             description "Event ID";
           } string;
           description "Supported Events"; "Access Technology Role Name";
         }
         list supported-error-types interface-set {
           key error-type; interface-id;
           uses fpc:interface-id-key;
           leaf error-type interface-name {
             type string;
             description "DPN-Type Interface Name";
           }
           leaf-list interface-protocol-set {
             type identityref {
               base "fpc:error-type"; "interface-protocols";
             }
             description "Error Type"; "Supported protocols";
           }
           leaf error-type-id
           leaf-list feature-set {
             type fpc:error-type-id;
             description "Error Type ID"; identityref {
               base "interface-protocols";
             }
             description "Supported Error Types"; features";
           }
           uses fpc:interface-settings;
           description "General Agent Information"; "A DPN interface types";
         }

       // Multi-DPN Agent Structures
       grouping fpc-dpn-group
         description "Set of DPN types";
       }
       list dpn-group-set {
         key "dpn-group-id";
         leaf dpn-group-id {
           type fpc:fpc-dpn-group-id; fpc:fpc-identity;
           mandatory true;
           description "DPN Group ID"; Identifier";
         }
           leaf data-plane-role
         list referenced-dpns-set {
               type identityref
           key "access-technology role interface-id";
           uses fpc:dpn-interface-reference;
           leaf-list supporting-dpn-id-set {
                   base "fpc:fpc-data-plane-role";
               }
             type fpc:fpc-identity;
             description "Dataplane Role"; "DPNs that suppport this group";
           }
           leaf access-type
           leaf-list dpn-group-peer-id-set {
             type identityref {
                   base "fpc:fpc-access-type"; fpc:fpc-identity;
             description "DPN Peer Groups reference";
           }
           description "Access "A list of DPNs supporting a group
             by DPN Type";
         }
         list dpn-group-peer-set {
           key remote-dpn-group-id;
           leaf mobility-profile remote-dpn-group-id {
             type identityref {
                   base "fpc:fpc-mobility-profile-type"; fpc:fpc-identity;
             mandatory true;
             description "Remote DPN Group identifier";
           }
           uses fpc:interface-settings;
           description "Mobility Profile"; "Locally applied settings used for
             the referenced DPN-Group (peer group).";
         }
           list dpn-group-peers
         leaf domain-id {
               key "remote-dpn-group-id";
               uses fpc:fpc-dpn-peer-group;
           type fpc:fpc-identity;
           description "Peer DPN Groups"; "Domain Identiifer";
         }
         description "FPC "List of DPN Group"; groups";
       }

       // RPC
       // RPC Specific Structures
       //Input Structures
       typedef admin-status {
           type enumeration
       list domain-set {
               enum enabled
         key domain-id;
         leaf domain-id {
                 value 0;
           type fpc:fpc-identity;
           mandatory true;
           description "enabled"; "Domain Identifier";
         }
               enum disabled
         leaf domain-name {
                 value 1;
           type string;
           description "disabled"; "Domain displayname";
         }
               enum virtual
         leaf domain-reference {
                 value 2;
           type string;
           description "virtual"; "Reference to domain resources";
         }
         description "List of Domains";
       }
       description "Adminstrative Status"; "FPC Topology grouping";
     }

       typedef session-status {
           type enumeration {
               enum complete
     // Policy Structures
       // Descriptor Structure
       identity fpc-descriptor-type {
                 value 0;
           description "complete"; "A traffic descriptor";
       }
               enum incomplete
       grouping descriptor-definition {
                 value 1;
           leaf descriptor-id {
               type fpc:fpc-identity;
               mandatory true;
               description "incomplete"; "Descriptor Id";
           }
               enum outdated
           leaf descriptor-type {
                 value 2;
                 description "outdated";
               type identityref {
                 base "fpc-descriptor-type";
               }
               description "Descriptor Type Value";
           }
       uses fpcbase:fpc-descriptor-value;
           description "Session Status"; "FPC Descriptor Definition";
       }

       typedef op-delay
       // Action Structure
       identity fpc-action-type {
           type uint32;
           description "Operation Delay (ms)"; "Action Type";
       }

       typedef op-identifier
       grouping action-definition {
           leaf action-id {
               type uint64; fpc:fpc-identity;
               description "Operation "Action Identifier";
           }
       typedef ref-scope
           leaf action-type {
               type enumeration {
           enum none identityref {
             value 0;
                 base "fpc-action-type";
               }
               description "no references"; "Action Type";
           }
           enum op {
             value 1;
           uses fpcbase:fpc-action-value;
           description "op - All references are contained in the
               operation body (intra-op)"; "FPC Action Definition";

       }
       // Rule Structure
       typedef fpc-direction-type {
          type enumeration {
            enum bundle uplink {
             value 2;
              description "bundle - All references in exist in bundle
               (inter-operation/intra-bundle).
               NOTE - If this value comes in CONFIG call it is
                 equivalent to 'op'."; "uplink";
            }
            enum storage downlink {
             value 3;
              description "storage - One or more references exist outside
               of the operation and bundle. A lookup to a cache /
               storage is required."; "Downlink";
            }
            enum unknown both {
             value 4;
              description " unknown - the location of the references are
               unknown.  This is treated as a 'storage' type."; "Both";
           }
          }
          description "Search scope for references in the operation."; "FPC Direction";
       }
       grouping instructions {
         container instructions fpc-rule-id {
           if-feature instruction-bitset;
           choice instr-type
       leaf rule-id {
         type fpc:fpc-identity;
         mandatory true;
         description "Instruction Value Choice";
           }
           description "Instructions"; "Rule Identifier";
       }
       description "Instructions Value"; "FPC Rule-Id key";
       }
       grouping op-header match-type {
           leaf client-id descriptor-match-type {
             type fpc:client-identifier;
           description "Client ID";

         }
         leaf delay enumeration {
           type op-delay;
               enum or {
                 value 0;
                 description "Delay"; "OR logic";
               }
         leaf session-state
               enum and {
           type session-status;
                 value 1;
                 description "Session State"; "AND logic";
               }
             }
             mandatory true;
             description "Type of Match (OR or AND) applied to the
               descriptor-reference-set.";
         }
           description "Map Type Grouping";
       }
       grouping fpc-action-order {
           leaf admin-state action-order {
               type admin-status; uint32;
               mandatory true;
               description "Admin State"; "Action Execution Order";
           }
         leaf op-type
           description "Action Order Leaf";
       }
       grouping rule-definition {
           type enumeration
           uses fpc:fpc-rule-id;
       uses fpc:match-type;
           list descriptor-reference-set {
             enum create
             key "descriptor-id-reference";
             leaf descriptor-id-reference {
               value 0;
                 type fpc:fpc-identity;
                 mandatory true;
                 description "create"; "Descriptor Id Reference";
             }
             enum update
             leaf direction {
               value 1;
                 type fpc:fpc-direction-type;
                 description "update"; "Direction";
             }
             enum query {
               value 2;
             description "query"; "A set of Descriptor references";
           }
             enum delete
           list action-reference-set {
               value 3;
             key "action-order";
         uses fpc:fpc-action-order;
             leaf action-id-reference {
         type fpc:fpc-identity;
         mandatory true;
         description "delete"; "Action Identifier Reference";
             }
             description "A set of Action references";
           }
           description "Type";
             "Rule.Definition";
       }
       // Policy Structures
       grouping fpc-precedence {
       leaf op-ref-scope precedence {
             if-feature operation-ref-scope;
         type fpc:ref-scope; uint32;
         mandatory true;
         description "Reference Scope"; "Rule Precedence";
       }
         uses fpc:instructions;
       description "Operation Header"; "FPC Rule Precedence";
       }
       grouping clone-ref policy {
           leaf entity policy-id {
               type fpc:fpc-identity;
               description "Clone ID"; "Policy Identifier";
           }
           list rule-set {
               key "precedence";
               unique "rule-id-reference";
               uses fpc:fpc-precedence;
               leaf source rule-id-reference {
                   type fpc:fpc-identity;
                   mandatory true;
                   description "Source";
         }
         description "Clone Reference"; "Rule Identifier";
               }

       identity command-set {
               description "protocol specific commands"; "Rule Entry";
           }

       grouping context-operation {
         uses fpc:fpc-context;
         uses fpc:instructions;
           description "Context Operation"; "FPC Policy";
       }
       // Output Structure FPC Policy
     grouping payload {
         list ports {
           uses fpc:fpc-vport;
           description "Ports";
         }
         list contexts fpc-policy {
           uses fpc:context-operation;
           description "Contexts";
         }
       list policy-groups action-definition-set {
           if-feature fpc:policy-rpc-provisioning;
         key "policy-group-id"; action-id;
         uses fpc:fpc-policy-group; fpc:action-definition;
         description "Policy Groups"; "List of Actions";
       }
       list policies descriptor-definition-set {
           if-feature fpc:policy-rpc-provisioning;
         key "policy-id"; descriptor-id;
         uses fpc:fpc-policy; fpc:descriptor-definition;
         description "Policies"; "List of Descriptors";
       }
       list descriptors rule-definition-set {
           if-feature fpc:policy-rpc-provisioning;
         key descriptor-id; rule-id;
         uses fpc:fpc-descriptor; fpc:rule-definition;
         description "Descriptors"; "List of Rules";
       }
       list actions policy-definition-set {
           if-feature fpc:policy-rpc-provisioning;
         key action-id; policy-id;
         uses fpc:fpc-action; fpc:policy;
         description "Actions"; "List of Policies";
       }
       description "Payload"; "FPC Policy Structures";
     }
       // Mobility Structures
     grouping op-input configurable-policy-set {
         uses fpc:op-header;
       list installed-policy-list {
         key dpn-id-reference;
         leaf op-id dpn-id-reference {
           type op-identifier; fpc:fpc-identity;
           description "Operation ID"; "Installed Policy identifier";
         }
         choice op_body {
           case create_or_update {
         list clones installed-policy-set {
               if-feature fpc-cloning;
           key entity;
               uses fpc:clone-ref; installed-policy-id;
           leaf installed-policy-id {
             type fpc:fpc-identity;
             description "Clones"; "Installed Policy Identifier";
           }
             uses fpc:payload;
           leaf policy-id-reference {
             type fpc:fpc-identity;
             description "Create/Update input"; "Installed Policy Identifier";
           }
           case delete_or_query
           container policy-settings {
             uses fpc:targets-value; fpcbase:fpc-settings;
             description "Delete/Query input"; "Policy Settings";
           }
           description "Opeartion Input value"; "Policy installed upon a DPN";
         }
         description "Operation Input"; "Configurable Policy";
         uses fpc:settings;
       }

       typedef result {
         type enumeration {
           enum ok {
             value 0;
             description "OK";
           }
           enum err {
             value 1;
             description "Error";
           }
           enum ok-notify-follows {
             value 2;
             description "OK with NOTIFY following";
           }
         }
         description "Result Status";

       }

       identity error-type {
         description "Base Error Type";
       }
       identity name-already-exists {
         description "Notification that an entity of the same name
           already exists";
       }

       typedef error-type-id {
         type uint32;
       description "Integer form "List of the Error Type"; installed DPN policies and settings";
     }
       // Dynamic Policy
       grouping op-status-value mobility-context {
       leaf op-status mobility-context-id {
         type enumeration {
             enum ok {
               value 0; fpc:fpc-identity;
         mandatory true;
         description "OK"; "Mobility Context Identifier";
       }
             enum err
       leaf dpn-group-id-reference {
               value 1;
               description "Error";
             }
           }
         type fpc:fpc-identity;
         description "Operation Status"; "Group ID used when DPN selecitons were
           made";
       }
       leaf parent-mobility-context-id-reference {
         type fpc:fpc-identity;
         description "Operation Status Value"; "Parent Mobility Context";
       }

       grouping error-info
       list dpn-reference-list {
         key "dpn-id-reference direction";
         leaf error-type-id dpn-id-reference {
           type fpc:error-type-id; fpc:fpc-identity;
           mandatory true;
           description "Error ID"; "DPN Id reference";
         }
         leaf error-info direction {
           type string {
                 length "1..1024";
               } fpc:fpc-direction-type;
           mandatory true;
           description "Error Detail"; "Direction of DPN assignment";
         }
         container dpn-settings-complementary {
           uses fpcbase:fpc-settings;
           description "Error Information"; "Complentary Settings";
         }

       grouping result-body {
         leaf op-id interface-id-reference {
           type op-identifier; fpc:fpc-interface-id;
           mandatory true;
           description "Operation Identifier"; "referenced interface";
         }
         choice result-type
         list embedded-rule-set {
           case err
           key "precedence";
           unique "rule-id";
           uses fpc:fpc-rule-id;
           uses fpc:match-type;
           uses fpc:fpc-precedence;
           list action-definition-set {
             key "action-order";
             uses fpc:error-info; fpc:fpc-action-order;
             uses fpc:action-definition;
             description "Error Information"; "List of Actions";
           }
           case create-or-update-success
           list descriptor-definition-set {
             key descriptor-id;
             uses fpc:payload; fpc:descriptor-definition;
             description "Create/Update Success"; "List of Descriptors";
           }
           case delete_or_query-success
           description "List of FPC Embedded Rule Definitions";
         }
         leaf-list assigned-policy-reference-set {
             uses fpc:targets-value;
           type fpc:fpc-identity;
           description "Delete/Query Success"; "List of Policies request to be enforced for
             this Mobility Context";
         }
           case empty-case
         description "DPN List";
       }

       leaf-list requested-policy-reference-set {
         type fpc:fpc-identity;
         description "Empty Case"; "List of Policies request to be enforced for
           this Mobility Context";
       }
       container context-settings-complementary {
         uses fpcbase:fpc-settings;
         description "Result Value"; "Context Settings";
       }
       description "Result Body"; "Mobility Context";
       }
       // Common RPCs
       rpc configure Events, Probes & Notifications
     identity event-type {
       description "CONF message";
         input "Base Event Type";
     }
     typedef event-type-id {
           uses fpc:op-input;
       type uint32;
       description "Event ID Type";
     }
         output
     grouping monitor-id {
       leaf result monitor-id {
         type result; fpc:fpc-identity;
         mandatory true;
         description "Result"; "Monitor Identifier";
       }
           uses fpc:result-body;
         }
       }

       rpc configure-bundles {
         if-feature fpc:fpc-bundles;
       description "CONF_BUNDLES message";
         input "Monitor Id";
     }
       grouping monitor-config {
           uses fpc:monitor-id;
       leaf highest-op-ref-scope deterrable {
               if-feature operation-ref-scope;
         type fpc:ref-scope; boolean;
         description "Highest Op-Ref used in the input"; "Indicates reports related to this
           config can be delayed.";
       }
           list bundles
       container binding-information {
             key op-id;
             uses fpc:op-input;
         description "List of operations";
           } "Placeholder for information helpful
           to binding the monitor ot the correct target";
       }
         output
       uses fpc:target-value;
       choice configuration {
           list bundles
         mandatory true;
         case periodic-config {
             key op-id;
             uses fpc:result-body;
           leaf period {
             type uint32;
             description "Operation Identifier";
           } "Period";
           }
           description "Periodic Config Case";
         }

       // Notification Messages & Structures
       typedef notification-id
         case threshold-config {
           leaf lo-thresh {
             type uint32;
             description "Notification Identifier"; "lo threshold";
           }

       grouping notification-header {
           leaf notification-id hi-thresh {
             type fpc:notification-id; uint32;
             description "Notification ID"; "hi threshold";
           }
           description "Threshold Config Case";
         }
         case scheduled-config {
           leaf timestamp report-time {
             type uint32;
             description "timestamp"; "Reporting Time";
           }
           description "Notification Header"; "Scheduled Config Case";

         }

       notification config-result-notification
         case events-config-ident {
         uses fpc:notification-header;
         choice value
           leaf-list event-identities {
           case config-result
             type identityref {
             uses fpc:op-status-value;
             uses fpc:result-body;
               base "fpc:event-type";
             }
             description "CONF Result"; "Event Identities";
           }
           description "Events Config Identities Case";
         }
         case config-bundle-result events-config {
             list bundles
           leaf-list event-ids {
               uses fpc:op-status-value;
               uses fpc:result-body;
             type uint32;
               description "Operation Results"; "Event IDs";
           }
           description "CONF_BUNDLES Result"; "Events Config Case";
         }
         description "Config Result value"; "Event Config Value";
       }
       description "CONF/CONF_BUNDLES Async Result"; "Monitor Configuration";
     }

       rpc event_register {
         description "Used to register monitoring of parameters/events";
           input
       grouping report {
         uses fpc:monitor-config;
           }
           output
         choice report-value {
           leaf monitor-result trigger {
             type fpc:result; fpc:event-type-id;
             description "Result";
             }
             uses fpc:error-info;
           } "Trigger Identifier";
           }

       rpc event_deregister {
         description "Used to de-register monitoring of
             parameters/events";
           input
           case simple-empty {
             list monitors
             leaf nothing {
               uses fpc:monitor-id;
               type empty;
               description "Monitor ID"; "Empty Value";
             }
             description "Empty Case";
           }
           output
           case simple-val32 {
             leaf monitor-result val32 {
               type fpc:result; uint32;
               description "Result";
             }
             uses fpc:error-info; "Unsigned 32 bit value";
             }
             description "Simple Value Case";
           }

       rpc probe
           case list-simple-val32 {
           description "Probe the status of a registered monitor";
           input {
             uses fpc:targets-value;
           }
           output {
             leaf monitor-result
               leaf-list  val32-list {
                 type fpc:result; uint32;
                 description "Result"; "Unsigned 32 bit value";
               }
             uses fpc:error-info;
               description "Simple Value Case";

             }
           description "Report Value";
         }

       notification notify {
           uses fpc:notification-header;
           choice value {
               case dpn-candidate-available {
                 if-feature fpc:fpc-auto-binding;
                 leaf node-id {
                   type inet:uri;
         description "Topology URI"; "Monitor Report";
       }
                 leaf-list access-types
       typedef agent-identifier {
           type identityref {
                     base "fpc:fpc-access-type";
                   } fpc:fpc-identity;
           description "Access Types"; "Agent Identifier";
       }
                 leaf-list mobility-profiles
       typedef client-identifier {
           type identityref {
                     base "fpc:fpc-mobility-profile-type";
                   } fpc:fpc-identity;
           description "Mobility Profiles"; "Client Identifier";
       }
                 leaf-list forwarding-plane-roles
       grouping basename-info {
                   type identityref
             leaf basename {
                     base "fpc:fpc-data-plane-role";
                   }
                   description "Forwarding Plane Role";
                 }
               type fpc:fpc-identity;
               description "DPN Candidate Availability"; "Rules Basename";
             }
               case monitor-notification {
                 choice monitor-notification-value {
                   case monitoring-suspension {
             leaf monitoring-suspended base-state {
               type empty; string;
               description "Indicates that monitoring has
                         uspended"; "Current State";
             }
             leaf suspension-note base-checkpoint {
               type string;
               description "Indicates the monitoring
                         suspension reason"; "Checkpoint";
             }
             description "Basename Information";
       }
                   case monitoring-resumption
       // Top Level Structures
     container tenants {
       list tenant {
         key "tenant-id";
         leaf monitoring-resumed tenant-id {
             type empty; fpc:fpc-identity;
             description "Indicates that monitoring
                         has resumed";
                     } "Tenant ID";
         }
                   case simple-monitor
             container mobility {
              container topology {
                 uses fpc:report; fpc:fpc-topology;
                uses fpc:basename-info {
                  if-feature fpc:fpc-basename-registry;
                }
                 description "Report"; "Topology";
               }
                   case bulk-monitors {
                     list reports
              container policy {
                uses fpc:report;
                       description "Reports"; fpc:fpc-policy;
                uses fpc:basename-info {
                  if-feature fpc:fpc-basename-registry;

                }
                description "Bulk Monitor Response"; "Policy";
              }
               uses fpc:configurable-policy-set;
               list mobility-context-set {
                   key "mobility-context-id";
                   config false;
                   uses fpc:mobility-context;
                   description "Monitor Notification value"; "Mobility Context Set";
               }
               list monitor-set {
                 key monitor-id;
                 uses fpc:monitor-config;
                 description "Monitor Notification"; Configurations";
               }
               description "Notify Value"; "Mobility Elements";
             }
         description "Notify Message"; "Tenant";
       }
       description "Tenant List";
     }
   <CODE ENDS>

A.2.  YANG Models

A.2.1.  FPC YANG Model

   This module defines the base data elements specified in this
   document.

   This module references [RFC6991].

   <CODE BEGINS> file "ietf-dmm-fpc-base@2017-03-08.yang"
   submodule ietf-dmm-fpc-base {
       belongs-to ietf-dmm-fpc
       // RPC
       // RPC Specific Structures
       typedef op-identifier {
          prefix fpc;
           type uint64;
           description "Operation Identifier";
       }

       import ietf-inet-types
       typedef ref-scope { prefix inet; revision-date 2013-07-15; }
       import ietf-yang-types
         type enumeration { prefix ytypes;
           revision-date 2013-07-15;
           enum none {
             value 0;
             description "no references";
           }

       organization "IETF Distributed Mobility Management (DMM)
         Working Group";

       contact
          "WG Web:   <http://tools.ietf.org/wg/netmod/>
           WG List:  <mailto:netmod@ietf.org>

           WG Chair: Dapeng Liu
                     <mailto:maxpassion@gmail.com>

           WG Chair: Jouni Korhonen
                     <mailto:jouni.nospam@gmail.com>

           Editor:   Satoru Matsushima
                     <mailto:satoru.matsushima@g.softbank.co.jp>

           Editor:   Lyle Bertz
                     <mailto:lylebe551144@gmail.com>";
           enum op {
             value 1;
             description
       "This module contains YANG definition for
        Forwarding Policy Configuration Protocol(FPCP).

        Copyright (c) 2016 IETF Trust and the persons identified as the
        document authors. All rights reserved.

        This document is subject to BCP 78 and the IETF Trust's Legal
        Provisions Relating to IETF Documents
        (http://trustee.ietf.org/license-info) in effect on the date of
        publication of this document. Please review these documents
        carefully, as they describe your rights and restrictions with
        respect to this document. Code Components extracted from this
        document must include Simplified BSD License text as described
        in Section 4.e of the Trust Legal Provisions and "All references are provided
        without warranty as described in the Simplified BSD License.";

       revision 2017-03-08 intra-operation";
           }
           enum bundle {
             value 2;
             description "Version 06 updates.";
           reference "draft-ietf-dmm-fpc-cpdp-06"; "All references in exist in bundle";
           }

       revision 2016-08-03
           enum storage {
             value 3;
             description "Initial Revision.";
           reference "draft-ietf-dmm-fpc-cpdp-05"; "One or more references exist in storage.";
           }

       feature fpc-basic-agent
           enum unknown {
             value 4;
             description "This is an agent co-located with a DPN.  In this
           case only DPN Peer Groups, "The location of the DPN Id and Control Protocols references are exposed along with the core structures."; unknown.";

           }
         }
       feature fpc-multi-dpn {
         description "The agent supports multiple DPNs."; "Search scope for references in the operation.";
       }

       typedef fpc-identity {
           type union
       grouping context-operation {
               type uint32;
               type string;
               type instance-identifier;
           }
         uses fpc:mobility-context;
         uses fpcbase:instructions;
         description "FPC Identity"; "Context Operation";
       }
       grouping target-value payload {
         leaf target
           uses fpc:configurable-policy-set;
       list mobility-context-set {
             type fpc-identity;
           key "mobility-context-id";
           uses fpc:mobility-context;
           description "Target Identity"; "Mobility Context Set";
       }
       uses fpc:fpc-policy;
       description "FPC Target Value"; "Payload";
     }
       grouping targets-value {
         list targets op-header {
             key "target";
       leaf target client-id {
         type fpc-identity; fpc:client-identifier;
         mandatory true;
         description "Target Id"; "Client ID";
       }
       leaf dpn-id delay {
         type fpc:fpc-dpn-id; uint32;
         description "DPN Id"; "Operation Delay (ms)";
       }
       leaf op-id {
         type op-identifier;
         mandatory true;
         description "List of Targets"; "Operation Identifier";
       }
       description "Targets Value"; "Common Operation header";
       }

       // Descriptor Structure
       typedef fpc-descriptor-id-type
     grouping fpc-op-type {
       leaf op-type {
         type fpc:fpc-identity; enumeration {
           enum create {
             value 0;
             description "Descriptor-ID"; "create";
           }
       identity fpc-descriptor-type
           enum update {
             value 1;
             description "A traffic descriptor"; "update";
           }
       grouping fpc-descriptor-id
           enum query {
         leaf descriptor-id
             value 2;
             description "query";
           }
           enum delete {
           type fpc:fpc-identity;
             value 3;
             description "Descriptor Id"; "delete";
           }
         }
         mandatory true;
         description "Type";
       }
       description "FPC Descriptor ID value"; Operation Type";
     }
     grouping fpc-descriptor fpc-op-ref-scope {
           uses fpc:fpc-descriptor-id;
       leaf descriptor-type op-ref-scope {
         if-feature operation-ref-scope;
         type identityref {
               base "fpc-descriptor-type"; fpc:ref-scope;
         description "Reference Scope";
       }
             mandatory true;
       description "Descriptor Type"; "FPC OP-REF Scope";
     }
     grouping op-input {
       uses fpc:fpc-op-ref-scope;
       uses fpcbase:instructions;
       choice descriptor-value op_body {
         case all-traffic {
               leaf all-traffic create_or_update {
                 type empty;
           uses fpc:payload;
           description "Empty Value"; "Create/Update input";
         }
         case delete_or_query {
           uses fpc:target-value;
           description "Delete/Query input";
         }
         description "Descriptor Value"; "Opeartion Input value";
       }
       description "FPC Descriptor"; "Operation Input";
     }

       // Action Structure
     typedef fpc-action-id-type result-status {
       type fpc:fpc-identity;
           description "Action-ID";
       }
       identity fpc-action-type enumeration {
         enum ok {
           value 0;
           description "Action Type"; "OK";
         }
       grouping fpc-action-id {
         leaf action-id
         enum err {
           type fpc:fpc-action-id-type;
           value 1;
           description "Action Identifier"; "Error";
         }
       }
       description "FPC Action ID"; "Result Status";
     }
     grouping fpc-action status-value {
           uses fpc:fpc-action-id;
       leaf action-type op-id {
         type identityref {
               base "fpc-action-type";

             } op-identifier;
         mandatory true;
         description "Action Type"; "Operation Identifier";
       }
           choice action-value {
             case drop {
       leaf drop status {
         type empty; result-status;
         mandatory true;
         description "Empty Value";
               } "Status";
       }
       description "FPC Action Value"; "Status value for all messages";
     }
     grouping result {
       uses fpc:status-value;
       uses fpc:result-body;
       description "FPC Action"; "General Result grouping";
     }

       // Rule Structure
     grouping fpc-rule {
           list descriptors result-body {
             key descriptor-id;
             uses fpc:fpc-descriptor-id;
       leaf direction notify-follows {
         type fpc:fpc-direction;
               description "Direction";
             } boolean;
         description "Descriptors"; "Indicates that a notification will
           follow regarding this result";
       }
           list actions
       choice result-type {
             key action-id;
             leaf action-order
         case err {
                 type uint32;
           uses restconf:errors;
           description "Action Execution Order"; "Error Information";
         }
         case create-or-update-success {
           uses fpc:payload;
           description "Create/Update Success";
         }
         case delete_or_query-success {
           uses fpc:fpc-action-id; fpc:target-value;
           description "Actions"; "Delete/Query Success";
         }
         case empty-case {
           description
             "FPC Rule.  When no actions are present the action is DROP.
             When no Descriptors are empty the default is
             'all traffic'."; "Empty Case";
         }
         description "Result Value";
       }
       description "Common Result member body";
     }
     // Policy Structures
       typedef fpc-policy-id Common RPCs
     rpc configure {
           type fpc:fpc-identity;
       description "Policy Identifier"; "CONF message";
       input {
         uses fpc:op-header;
         uses fpc:fpc-op-type;
         uses fpc:op-input;
       }
       grouping fpc-policy
       output {
           leaf policy-id
         uses fpc:result;
       }
     }
     rpc configure-bundles {
               type fpc:fpc-policy-id;
       if-feature fpc:fpc-bundles;
       description "Policy Id";
           } "CONF_BUNDLES message";
       input {
         uses fpc:op-header;
         uses fpc:fpc-op-type;
         uses fpc:fpc-op-ref-scope;
         list rules bundles {
           key order; op-id;
           leaf order op-id {
             type uint32; op-identifier;
             mandatory true;
             description "Rule Order"; "Operation Identifier";
           }
           uses fpc:fpc-rule; fpc:op-input;
           description "Rules"; "List of operations";
         }
           description "FPC Policy";
       }

       // Policy Group
       typedef fpc-policy-group-id
       output {
           type fpc:fpc-identity;
         uses fpc:status-value;
         list bundles {
           key op-id;
           uses fpc:result;
           description "Policy Group "Operation Identifier";
         }
       grouping fpc-policy-group {
         leaf policy-group-id
       }
     }
     rpc reg_monitor {
           type fpc:fpc-policy-group-id;
       description "Policy Group ID"; "Used to register monitoring of parameters/events";
       input {
         uses fpc:op-header;
         uses fpc:monitor-config;
       }
         leaf-list policies
       output {
           type fpc:fpc-policy-id;
           description "Policies";
         uses fpc:status-value;
         uses restconf:errors;
       }
         description "FPC Policy Group";
     }

       // Mobility Structures
       // Port Group
       typedef fpc-vport-id
     rpc dereg_monitor {
       description "Used to de-register monitoring of
         parameters/events";
       input {
         uses fpc:op-header;
         leaf-list monitor-set {
           type fpc:fpc-identity;
           min-elements 1;
           description "FPC Port "Monitor Identifier";
         }
       grouping fpc-vport {
         leaf vport-id send_data {
           type fpc:fpc-vport-id; boolean;
           description "Port ID"; "Indicates if NOTIFY with final data
             is desired upon deregistration";
         }
           leaf-list policy-groups
       }
       output {
               type fpc:fpc-policy-group-id;
               description "Policy Groups";
         uses fpc:status-value;
         uses restconf:errors;
       }
           description "FPC Port";
     }

       // Context Group
       typedef fpc-context-id
     rpc probe {
           type fpc:fpc-identity;
       description "FPC Context Identifier";
       }
       grouping fpc-context-profile {
           leaf tunnel-local-address {
               type inet:ip-address;
               description "endpoint address of "Probe the DPN which status of a
                 gent exists."; registered monitor";
       input {
         uses fpc:op-header;
         uses fpc:monitor-id;
       }
       output {
         uses fpc:status-value;
         uses restconf:errors;
       }
     }
     // Notification Messages & Structures
     grouping notification-header {
       leaf tunnel-remote-address notification-id {
         type inet:ip-address; uint32;
         description "endpoint address of the DPN which
                 agent exists."; "Notification Identifier";
       }
       leaf mtu-size timestamp {
         type uint32;
         description "MTU size"; "timestamp";
       }
           container mobility-tunnel-parameters {
               uses fpc:mobility-info;
       description
               "Specifies profile specific lylebe551144 tunnel
               parameters to the DPN which the agent exists. The
               profiles includes GTP/TEID for 3gpp profile, GRE/Key for
               ietf-pmip profile, or new profile if anyone will define
               it."; "Notification Header";
     }
           container nexthop
     notification config-result-notification {
       uses fpc:fpc-nexthop;
               description "Next Hop";
           }
           container qos-profile-parameters fpc:notification-header;
       uses fpc:status-value;
       choice value {
         case config-result {
           uses fpc:fpc-qos-profile; result-body;
           description "QoS Parameters"; "CONF Result";
         }
           container dpn-parameters
         case config-bundle-result {
               description "DPN Parameters";
           }
           list vendor-parameters bundles {
             key "vendor-id vendor-type"; op-id;
             uses fpc:vendor-attributes; fpc:result;
             description "Vendor Parameters"; "Operation Identifier";
           }
           description "A profile that applies to a specific direction"; "CONF_BUNDLES Result";
         }
         description "Config Result value";
       }

       typedef fpc-direction {
          type enumeration {
            enum lylebe551144 {
       description "lylebe551144"; "CONF/CONF_BUNDLES Async Result";
     }
            enum downlink
     identity notification-cause {
       description "Downlink"; "Notification Cause";
     }
            enum both
     identity dpn-availabilty-change {
       base "notification-cause";
       description "Both";
           } "DPN Candidate/Exisitng DPN Availablity Change";
     }
     identity monitoring-suspension {
       base "notification-cause";
       description "FPC Direction"; "Indicates monitoring suspension";
     }

       grouping fpc-context {
           leaf context-id
     identity monitoring-resumption {
               type fpc:fpc-context-id;
       base "notification-cause";
       description "Context ID"; "Indicates that monitoring has resumed";
     }
           leaf-list vports
     identity monitor-notification {
               type fpc:fpc-vport-id;
       base "notification-cause";
       description "Vports"; "Indicates 1+ monitor reports";
     }
     notification notify {
       uses fpc:notification-header;
       leaf dpn-group cause {
         type fpc:fpc-dpn-group-id; identityref {
           base "notification-cause";
         }
         description "DPN Group"; "Notification Cause";
       }
           leaf-list delegated-ip-prefixes
       choice value {
         case dpn-candidate-available {
           if-feature fpc:fpc-auto-binding;
           leaf node-id {
             type inet:ip-prefix; inet:uri;
             description "Delegated Prefix(es)"; "Topology URI";
           }
           container ul
           list supported-interface-list {
               if-feature fpc:fpc-basic-agent;
             key "access-technology role";
             uses fpc:fpc-context-profile; fpc:access-technology-key;
             uses fpc:role-key;
             description "lylebe551144"; "Support Intefaces";
           }
           container dl {
               if-feature fpc:fpc-basic-agent;
               uses fpc:fpc-context-profile;
           description "Downlink"; "DPN Candidate Information";
         }
           list dpns
         case dpn-unavailable {
               if-feature fpc:fpc-multi-dpn;
               key "dpn-id direction";
           leaf dpn-id {
             type fpc:fpc-dpn-id; fpc:fpc-identity;
             description "DPN"; "DPN Identifier";
           }
               leaf direction {
                   type fpc:fpc-direction;
                   mandatory true;
           description "Direction"; "DPN Unavailable";
         }
         case monitor-notification {
           list reports {
             uses fpc:fpc-context-profile; fpc:report;
             description "DPNs"; "Reports";
           }
           leaf parent-context {
               type fpc:fpc-context-id;
           description "Parent Context"; "Monitor Notification";
         }
         description "FCP Context"; "Notify Value";
       }

       // Mobility (Tunnel) Information
       grouping mobility-info {
           choice profile-parameters {
               case nothing {
                 leaf none {
                   type empty;
                   description "Empty Value";
                 }
                 description "No Parameters Case";
               }
               description "Mobility Profile Parameters";
           }
           description "Mobility Information";
       }

       // Next Hop Structures
       typedef fpc-service-path-id {
           type uint32 {
               range "0..33554431";
           }
           description "SERVICE_PATH_ID";
       }
       typedef fpc-mpls-label {
           type uint32 {
             range "0..1048575";
           }
           description "MPLS label";
       }
       identity fpc-nexthop-type {
       description "Next Hop Type";
       }
       identity fpc-nexthop-ip {
           base "fpc:fpc-nexthop-type";
           description "Nexthop IP";
       }
       identity fpc-nexthop-servicepath {
           base "fpc:fpc-nexthop-type";
           description "Nexthop Service Path";
       }
       identity fpc-nexthop-mac {
           base "fpc:fpc-nexthop-type";
           description "Nexthop MAC-Address"; "Notify Message";
     }
       identity fpc-nexthop-mpls {
           base "fpc:fpc-nexthop-type";
           description "Nexthop MPLS";
   }
       identity fpc-nexthop-if {
   <CODE ENDS>

A.2.  YANG Models

A.2.1.  FPC YANG Settings and Extensions Model

   This module defines the base "fpc:fpc-nexthop-type";
           description "Nexthop If index";
       }
       grouping fpc-nexthop {
           leaf nexthop-type data elements in FPC that are likely to
   be extended.

   This module references [RFC6991], ietf-trafficselector-types and
   ietf-pmip-qos modules.

   <CODE BEGINS> file "ietf-dmm-fpc-settingsext@2017-09-27.yang"
   module ietf-dmm-fpc-settingsext {
               type identityref
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-settingsext";
     prefix fpcbase;

       import ietf-inet-types {
                 base "fpc:fpc-nexthop-type";
               }
               description "Nexthop Type"; prefix inet;
           revision-date 2013-07-15; }
           choice nexthop-value {
               case ip-nexthop {
                   leaf ip
       import ietf-trafficselector-types {
                     type inet:ip-address;
                     description "IP Value";
                   }
                   description "IP Case"; prefix traffic-selectors;
           revision-date 2017-10-29; }
               case macaddress-nexthop {
                   leaf macaddress
       import ietf-yang-types {
                     type ytypes:mac-address;
                     description "MAC Address Value";
                   } prefix ytypes;
           revision-date 2013-07-15; }
               case servicepath-nexthop {
                   leaf servicepath
       import ietf-pmip-qos {
                       type fpc:fpc-service-path-id;
                       description "Service Path Value";

                   }
                   description "Service Path Case"; prefix pmipqos;
           revision-date 2016-02-10; }
               case mplslabel-nexthop {
                   leaf lsp {
                       type fpc:fpc-mpls-label;

       organization "IETF Distributed Mobility Management (DMM)
         Working Group";

       contact
          "WG Web:   <http://tools.ietf.org/wg/netmod/>
           WG List:  <mailto:netmod@ietf.org>

           WG Chair: Dapeng Liu
                     <mailto:maxpassion@gmail.com>

           WG Chair: Jouni Korhonen
                     <mailto:jouni.nospam@gmail.com>

           Editor:   Satoru Matsushima
                     <mailto:satoru.matsushima@g.softbank.co.jp>

           Editor:   Lyle Bertz
                     <mailto:lylebe551144@gmail.com>";

       description "MPLS Value";
                   }
                   description "Service Path Case";
               }
               case if-nexthop {
                   leaf if-index
       "This module contains YANG definition for
        Forwarding Policy Configuration Protocol(FPCP).

         It contains Settings defintions as well as Descriptor and
         Action extensions.

        Copyright (c) 2016 IETF Trust and the persons identified as the
        document authors. All rights reserved.

        This document is subject to BCP 78 and the IETF Trust's Legal
        Provisions Relating to IETF Documents
        (http://trustee.ietf.org/license-info) in effect on the date of
        publication of this document. Please review these documents
        carefully, as they describe your rights and restrictions with
        respect to this document. Code Components extracted from this
        document must include Simplified BSD License text as described
        in Section 4.e of the Trust Legal Provisions and are provided
        without warranty as described in the Simplified BSD License.";

       revision 2017-09-27 {
                       type uint16;
       description "If (interface) Value";
                   }
                   description "Service Path Case"; "Version 10 updates.";
       reference "draft-ietf-dmm-fpc-cpdp-10";
   }
   revision 2017-07-22 {
       description "Value"; "Version 08 updates.";
       reference "draft-ietf-dmm-fpc-cpdp-08";
   }
   revision 2017-03-08 {
       description "Nexthop Value"; "Version 06 updates.";
       reference "draft-ietf-dmm-fpc-cpdp-06";
   }

       // QoS Information
       identity fpc-qos-type
   revision 2016-08-03 {
       description "Base identity from which specific uses of QoS
             types are derived."; "Initial Revision.";
       reference "draft-ietf-dmm-fpc-cpdp-05";
   }
       grouping fpc-qos-profile {
           leaf qos-type

       // Next Hop Structures - SETTING
       typedef fpc-service-path-id {
           type identityref uint32 {
                   base fpc:fpc-qos-type;
               range "0..33554431";
           }
           description "the profile type"; "SERVICE_PATH_ID";
       }
           choice value
       typedef fpc-mpls-label {
               description "QoS Value";
           type uint32 {
             range "0..1048575";
           }
           description "QoS Profile"; "MPLS label";
       }

       // Vendor Specific Attributes
       identity vendor-specific-type fpc-nexthop-type {
           description "Vendor Specific Attribute Type"; "NAT Service";
       }

       grouping vendor-attributes {
           leaf vendor-id fpc-nexthop {
               type fpc:fpc-identity;
               description "Vendor ID";

           }
           leaf vendor-type nexthop-type {
               type identityref {
                 base "fpc:vendor-specific-type"; "fpcbase:fpc-nexthop-type";
               }
               mandatory true;
               description "Attribute "Nexthop Type";
           }
           choice value nexthop-value {
                 mandatory true;
               case empty-type ip-nexthop {
                   leaf empty-type ip {
                     type empty; inet:ip-address;
                     description "Empty "IP Value";
                   }
                   description "Empty "IP Case";
               }
               case macaddress-nexthop {
                   leaf macaddress {
                     type ytypes:mac-address;
                     description "Atttribute "MAC Address Value";
                   }
           description "Vendor Specific Attributes";
       }

       // Topology
       typedef fpc-domain-id {
           type fpc:fpc-identity;
           description "Domain Identifier";
               }
       grouping fpc-domain
               case servicepath-nexthop {
                   leaf domain-id servicepath {
                       type fpc:fpc-domain-id; fpcbase:fpc-service-path-id;
                       description "Domain ID"; "Service Path Value";
                   }
         leaf domain-name {
           type string;
                   description "Domain Name"; "Service Path Case";
               }
               case mplslabel-nexthop {
                   leaf domain-type lsp {
                       type string; fpcbase:fpc-mpls-label;
                       description "Domain Type"; "MPLS Value";
                   }
                   description "Service Path Case";
               }
               case if-nexthop {
                   leaf domain-reference if-index {
                       type instance-identifier; uint16;
                       description "Indicates a set of resources for the domain"; "If (interface) Value";
                   }
                   description "FPC Domain"; "Service Path Case";
               }

       typedef fpc-dpn-id {
           type fpc:fpc-identity;
               description "DPN Identifier"; "Value";
           }
       identity fpc-dpn-control-protocol {
           description "DPN Control Protocol"; "Nexthop Value";
       }

       // Address Translation - ACTION
       grouping fpc-dpn simple-nat {
         leaf dpn-id outbound-nat-address {
           type fpc:fpc-dpn-id; inet:ip-address;
           description "DPN ID"; "Outbound NAT Address";
         }
         description "Simple NAT value";
       }
       grouping simple-napt {
         leaf dpn-name source-port {
           type string; inet:port-number;
           description "DPN Name"; "Source Port";
         }
           leaf-list dpn-groups
         leaf outbound-napt-address {
           type fpc:fpc-dpn-group-id; inet:ip-address;
           description "DPN Groups"; "Outbound NAPT Address";
         }
         leaf node-reference destination-port {
           type instance-identifier; inet:port-number;
           description "DPN => Node (Topology) Mapping"; "Destination Port";
         }
         description "FPC DPN"; "Simple NAPT Configuration";
       }

       typedef fpc-dpn-group-id

       // COPY FORWARD - ACTION
       grouping copy-forward {
           type fpc:fpc-identity;
         container destination {
           choice value {
             case nexthop-case {
         container nexthop {
                 uses fpcbase:fpc-nexthop;
                 description "DPN Group Identifier"; "Next Hop";
             }
       identity fpc-data-plane-role {
               description "Role of DPN Group in the Forwarding Plane"; "Port Forward Case";
             }
             description "Copy Forward Value";
           }
           description "destination";
         }
         description "Copy Then Forward to Port/Context Action";
       }

       //////////////////////////////
       // PMIP Integration         //
         identity fpc-access-dpn-role pmip-tunnel-type {
          base "fpc:fpc-data-plane-role";
             description "Access DPN Role"; "PMIP Tunnel Type";
         }
         identity fpc-anchor-dpn-role grev1 {
             base "fpc:fpc-data-plane-role"; "pmip-tunnel-type";
             description "Anchor DPN Role"; "GRE v1";
         }
         identity fpc-access-type grev2 {
             base "pmip-tunnel-type";
             description "Access Type of the DPN Group"; "GRE v2";
         }
         identity fpc-mobility-profile-type ipinip {
             base "pmip-tunnel-type";
             description "Mobility Profile Type"; "IP in IP";
         }
         grouping fpc-dpn-peer-group {
           leaf remote-dpn-group-id pmip-tunnel-info {
               type fpc:fpc-dpn-group-id;
               description "Remote DPN Group ID";
           }
             leaf remote-mobility-profile pmip-tunnel-type {
                 type identityref {
                     base "fpc:fpc-mobility-profile-type"; "pmip-tunnel-type";
                 }
                 description "Mobility Profile"; "PMIP Mobility";
             }
           leaf remote-data-plane-role
             choice pmip-tunnel-value {
               type identityref
                 case gre {
                   base "fpc:fpc-data-plane-role";
               }
               description "Forwarding Plane Role";
           }
                     leaf remote-endpoint-address gre-key {
                         type inet:ip-address; uint32;
                         description "Remote Endpoint Address"; "GRE_KEY";
                     }
           leaf local-endpoint-address {
               type inet:ip-address;
                     description "Local Endpoint Address";
           }
           leaf mtu-size {
               type uint32;
               description "MTU Size"; "GRE Value";
                 }
                 description "FPC DPN Peer Group"; "PMIP Mobility value";
             }

       // Events, Probes & Notifications
       identity event-type {
             uses traffic-selectors:traffic-selector;
             description "Base Event Type"; "PMIP Tunnel Information";
         }
         typedef event-type-id pmip-commandset {
               type uint32; bits {
                   bit assign-ip {
                     position 0;
                     description "Event ID Type"; "Assign IP";
                   }

       grouping monitor-id {
         leaf monitor-id
                   bit assign-dpn {
           type fpc:fpc-identity;
                     position 1;
                     description "Monitor Identifier"; "Assign DPN";
                   }
                   bit session {
                     position 2;
                     description "Monitor ID"; "Session Level";
                   }
       identity report-type
                   bit uplink {
                     position 3;
                     description "Type of Report"; "Uplink";
                   }
       identity periodic-report
                   bit downlink {
         base "fpc:report-type";
                     position 4;
                     description "Periodic Report"; "Downlink";
                   }
               }
               description "PMIP Instructions";
           }
       ///////////////////////////////
       // 3GPP Integration         //
     //    Tunnel Types
         identity threshold-report threeGPP-tunnel-type {
         base "fpc:report-type";
             description "Threshold Report"; "3GPP Base Tunnel Type";
         }
         identity scheduled-report gtpv1 {
             base "fpc:report-type"; "fpcbase:threeGPP-tunnel-type";
             description "Scheduled Report"; "GTP version 1 Tunnel";
         }
         identity events-report gtpv2 {
             base "fpc:report-type"; "fpcbase:threeGPP-tunnel-type";
             description "Events Report"; "GTP version 2 Tunnel";
         }

       grouping report-config
         // QoS Profile
         typedef fpc-qos-class-identifier {
         choice event-config-value
             type uint8 {
           case periodic-config
                 range "1..9";
             }
             description "QoS Class Identifier (QCI)";
         }
         grouping threeGPP-QoS {
             description "3GPP QoS Attributes";
             leaf period qci {
                 type uint32;
                 description "Period";
               } fpc-qos-class-identifier;
                 description "Periodic Config Case"; "QCI";
             }
           case threshold-config {
             leaf lo-thresh gbr {
                 type uint32;
                 description "lo threshold"; "Guaranteed Bit Rate";
             }
             leaf hi-thresh mbr {
                 type uint32;
                 description "hi threshold";
               }
               description "Threshold Config Case"; "Maximum Bit Rate";
             }
           case scheduled-config {
             leaf report-time apn-ambr {
                 type uint32;
                 description "Reporting Time";
               }
               description "Scheduled Config Case"; "Access Point Name Aggregate Max Bit Rate";
             }
           case events-config-ident {
               leaf-list event-identities
             leaf ue-ambr {
                 type identityref {
                   base "fpc:event-type";
                 } uint32;
                 description "Event Identities"; "User Equipment Aggregate Max Bit Rate";
             }
             container arp {
                 uses pmipqos:Allocation-Retention-Priority-Value;
                 description "Events Config Identities Case"; "Allocation Retention Priority";
             }
           case events-config {
               leaf-list event-ids
         }
         typedef ebi-type {
           type uint32;
                 description "Event IDs";
               }
               description "Events Config Case"; uint8 {
             range "0..15";
           }
           description "Event Config Value"; "EUTRAN Bearere Identifier (EBI) Type";
         }

        // From 3GPP TS 24.008 version 13.5.0 Release 13
        typedef component-type-enum {
             type enumeration {
                 enum ipv4RemoteAddress {
                   value 16;
                   description "Report Configuration"; "IPv4 Remote Address";
                 }

       grouping monitor-config
                 enum ipv4LocalAddress  {
         uses fpc:monitor-id;
         uses fpc:target-value;
         uses fpc:report-config;
                   value 17;
                   description "Monitor Configuration"; "IPv4 Local Address";
                 }

       grouping report
                 enum ipv6RemoteAddress {
         uses fpc:monitor-config;
         choice report-value
                   value 32;
                   description "IPv6 Remote Address";
                 }
                 enum ipv6RemoteAddressPrefix {
           leaf trigger
                   value 33;
                   description "IPv6 Remote Address Prefix";
                 }
                 enum ipv6LocalAddressPrefix {
             type fpc:event-type-id;
                   value 35;
                   description "Trigger Identifier"; "IPv6 Local Address Prefix";
                 }
           case simple-empty
                 enum protocolNextHeader {
             leaf nothing
                   value 48;
                   description "Protocol (IPv4) or NextHeader (IPv6)
                     value";
                 }
                 enum localPort {
               type empty;
                   value 64;
                   description "Empty Value"; "Local Port";
                 }
                 enum localPortRange {
                   value 65;
                   description "Empty Case"; "Local Port Range";
                 }
           case simple-val32
                 enum reomotePort {
             leaf val32
                   value 80;
                   description "Remote Port";
                 }
                 enum remotePortRange {
               type uint32;
                   value 81;
                   description "Unsigned 32 bit value"; "Remote Port Range";
                 }
                 enum secParamIndex {
                   value 96;
                   description "Simple Value Case"; "Security Parameter Index (SPI)";
                 }
                 enum tosTraffClass {
                   value 112;
                   description "Report Value"; "TOS Traffic Class";
                 }
                 enum flowLabel {
                   value 128;
                   description "Monitor Report"; "Flow Label";
                 }
             }
   <CODE ENDS>

A.2.2.  PMIP QoS Model

   This module defines the base protocol elements specified in this
   document.

   This module references [RFC6991] and the traffic-selector-types
   module defined in this document.

<CODE BEGINS> file "ietf-pmip-qos@2016-02-10.yang"
module ietf-pmip-qos
             description "TFT Component Type";
         }
         typedef packet-filter-direction {
    yang-version 1;

    namespace
      "urn:ietf:params:xml:ns:yang:ietf-pmip-qos";

    prefix "qos-pmip";

    import ietf-inet-types
             type enumeration {
        prefix inet;
        revision-date 2013-07-15;
               enum preRel7Tft {
                 value 0;
                 description "Pre-Release 7 TFT";
               }
    import ietf-traffic-selector-types
               enum uplink { prefix traffic-selectors;
                 value 1;
                 description "uplink";
               }

    organization "IETF Distributed Mobility Management (DMM)
      Working Group";

    contact
       "WG Web:   <http://tools.ietf.org/wg/netmod/>
        WG List:  <mailto:netmod@ietf.org>

        WG Chair: Dapeng Liu
                  <mailto:maxpassion@gmail.com>

        WG Chair: Jouni Korhonen
                  <mailto:jouni.nospam@gmail.com>

        Editor:   Satoru Matsushima
                  <mailto:satoru.matsushima@g.softbank.co.jp>

        Editor:   Lyle Bertz
                  <mailto:lylebe551144@gmail.com>";
               enum downlink {
                 value 2;
                 description
      "This module contains a collection of YANG definitions for
     quality of service paramaters used in Proxy Mobile IPv6.

     Copyright (c) 2016 IETF Trust and the persons identified as the
     document authors. All rights reserved.

     This document is subject to BCP 78 and the IETF Trust's Legal
     Provisions Relating to IETF Documents
     (http://trustee.ietf.org/license-info) in effect on the date of
     publication of this document. Please review these documents
     carefully, as they describe your rights and restrictions with
     respect to this document. Code Components extracted from this
     document must include Simplified BSD License text as described
     in Section 4.e of the Trust Legal Provisions and are provided
     without warranty as described in the Simplified BSD License.";

    revision 2016-02-10 "downlink";
               }
               enum bidirectional {
                 value 3;
                 description "Initial revision";
        reference
         "RFC 7222: Quality-of-Service Option for Proxy Mobile IPv6"; "bi-direcitonal";
               }
             }
             description "Packet Filter Direction";
         }

    // Type Definitions

    // QoS Option Field Type Definitions
         typedef sr-id component-type-id {
             type uint8; uint8 {
               range "16 | 17 | 32 | 33 | 35 | 48 | 64 | 65 |"
               + " 80 | 81 | 96 | 112 | 128";
             }
             description
         "An 8-bit unsigned integer used]
        for identifying the QoS Service Request.  Its uniqueness is
        within the scope of a mobility session.  The local mobility
        anchor always allocates the Service Request Identifier.
        When a new QoS Service Request is initiated by a mobile
        access gateway, the Service Request Identifier in "Specifies the initial
        request message is set to a value of (0), and the local
        mobility anchor allocates a Service Request Identifier and
        includes it in the response.  For any new QoS Service
        Requests initiated by a local mobility anchor, the
        Service Request Identifier is set to the allocated value."; Component Type";
         }

    typedef traffic-class
         grouping packet-filter {
           leaf direction {
               type inet:dscp; fpcbase:packet-filter-direction;
               description
        "Traffic Class consists of a 6-bit DSCP field followed by a
         2-bit reserved field.";
       reference
         "RFC 3289: Management Information Base for the Differentiated
                    Services Architecture
          RFC 2474: Definition of the Differentiated Services Field
                    (DS Field) in the IPv4 and IPv6 Headers
          RFC 2780: IANA Allocation Guidelines For Values In
                    the Internet Protocol and Related Headers"; "Filter Direction";
           }

    typedef operational-code
           leaf identifier {
               type enumeration {
            enum RESPONSE uint8 {
          value 0;
                 range "1..15";
               }
               description "Response to a QoS request"; "Filter Identifier";
           }
            enum ALLOCATE
           leaf evaluation-precedence {
          value 1;
               type uint8;
               description "Request to allocate QoS resources"; "Evaluation Precedence";
           }
            enum DE-ALLOCATE
           list contents {
          value 2;
             key component-type-identifier;
             description "Request to de-Allocate QoS resources";
        }
            enum MODIFY "Filter Contents";
             leaf component-type-identifier {
          value 3;
                 type fpcbase:component-type-id;
                 description "Request to modify QoS parameters for a
              previously negotiated QoS Service Request"; "Component Type";
             }
            enum QUERY {
             choice value 4; {
               case ipv4-local {
                 leaf ipv4-local {
                   type inet:ipv4-address;
                   description "Query to list the previously negotiated QoS
              Service Requests that are still active"; "IPv4 Local Address";
                 }
            enum NEGOTIATE
               }
               case ipv6-prefix-local {
          value 5;
                 leaf ipv6-prefix-local {
                   type inet:ipv6-prefix;
                   description "Response to a QoS Service Request with a
            counter QoS proposal"; "IPv6 Local Prefix";
                 }
               }
        description
       "1-octet Operational code indicates the
               case ipv4-ipv6-remote {
                 leaf ipv4-ipv6-remote {
                   type of QoS request.
           Reserved values:   (6) to (255)
                Currently not used.  Receiver MUST ignore the option
                received with any value in this range."; inet:ip-address;
                   description "Ipv4 Ipv6 remote address";
                 }

    // QoS Attribute Types

    //The enumeration value for mapping - don't confuse with the
    //  identities
    typedef qos-attrubite-type-enum
               }
               case ipv6-prefix-remote {
                 leaf ipv6-prefix-remote {
                   type enumeration inet:ipv6-prefix;
                   description "IPv6 Remote Prefix";
                 }
               }
               case next-header {
            enum Reserved
                 leaf next-header {
          value 0;
                   type uint8;
                   description "This value is reserved and cannot be used"; "Next Header";
                 }
            enum Per-MN-Agg-Max-DL-Bit-Rate
               }
               case local-port {
          value 1;
                 leaf local-port {
                   type inet:port-number;
                   description "Per-Mobile-Node Aggregate Maximum Downlink
              Bit Rate."; "Local Port";

                 }
        enum Per-MN-Agg-Max-UL-Bit-Rate
               }
               case local-port-range {
          value 2;
                 leaf local-port-lo {
                   type inet:port-number;
                   description "Per-Mobile-Node Aggregate Maximum Uplink Bit
            Rate."; "Local Port Min Value";
                 }
        enum Per-Session-Agg-Max-DL-Bit-Rate
                 leaf local-port-hi {
          value 3;
                   type inet:port-number;
                   description "Per-Mobility-Session Aggregate Maximum
            Downlink Bit Rate."; "Local Port Max Value";
                 }
        enum Per-Session-Agg-Max-UL-Bit-Rate
               }
               case remote-port {
          value 4;
                 leaf remote-port {
                   type inet:port-number;
                   description "Per-Mobility-Session Aggregate Maximum
             Uplink Bit Rate."; "Remote Port";
                 }
        enum Allocation-Retention-Priority
               }
               case remote-port-range {
          value 5;
                 leaf remote-port-lo {
                   type inet:port-number;
                   description "Allocation and Retention Priority."; "Remote Por Min Value";
                 }
        enum Aggregate-Max-DL-Bit-Rate
                 leaf remote-port-hi {
          value 6;
                   type inet:port-number;
                   description "Aggregate Maximum Downlink Bit Rate."; "Remote Port Max Value";
                 }
        enum Aggregate-Max-UL-Bit-Rate
               }
               case ipsec-index {
          value 7;
                 leaf ipsec-index {
                   type traffic-selectors:ipsec-spi;
                   description "Aggregate Maximum Uplink Bit Rate."; "IPSec Index";
                 }
        enum Guaranteed-DL-Bit-Rate
               }
               case traffic-class {
          value 8;
                 leaf traffic-class {
                   type inet:dscp;
                   description "Guaranteed Downlink Bit Rate."; "Traffic Class";
                 }
        enum Guaranteed-UL-Bit-Rate
               }
               case traffic-class-range {
          value 9;
                   leaf traffic-class-lo {
                     type inet:dscp;
                     description "Guaranteed Uplink Bit Rate."; "Traffic Class Min Value";
                   }
        enum QoS-Traffic-Selector
                   leaf traffic-class-hi {
          value 10;
                     type inet:dscp;
                     description "QoS Traffic Selector."; "Traffic Class Max Value";

                   }
        enum QoS-Vendor-Specific-Attribute
               }
               case flow-label-type {
          value 11;
                 leaf-list flow-label {
                   type inet:ipv6-flow-label;
                   description "QoS Vendor-Specific Attribute."; "Flow Label";
                 }
               }
               description
        "8-bit unsigned integer indicating the type of the QoS
          attribute.  This specification reserves the following
        reserved values.
          (12) to (254) -  Reserved
             These values are reserved for future allocation.

          (255)  Reserved
             This value is reserved and cannot be used."; "Component Value";
             }

    // Attribute Type as Identities
    // Added for convenience of inclusion and extension in
    //    other YANG modules.
    identity qos-attribute-type
           }
           description "Packet Filter";
         }
         grouping tft {
           list packet-filters {
               key identifier;
               uses fpcbase:packet-filter;
               description
            "Base type for Quality "List of Service Attributes"; Packet Filters";
           }

    identity Per-MN-Agg-Max-DL-Bit-Rate-type {
        base qos-attribute-type;
           description
            "Per-Mobile-Node Aggregate Maximum Downlink Bit Rate."; "Packet Filter List";
         }

    identity Per-MN-Agg-Max-UL-Bit-Rate-type
         typedef imsi-type {
        base qos-attribute-type;
             type uint64;
             description
            "Per-Mobile-Node Aggregate Maximum Uplink Bit Rate";
                 "International Mobile Subscriber Identity (IMSI)
                   Value Type";
         }

    identity Per-Session-Agg-Max-DL-Bit-Rate-type
         typedef threegpp-instr {
        base qos-attribute-type;
           type bits {
             bit assign-ip {
               position 0;
               description
       "Per-Mobility-Session Aggregate Maximum Downlink Bit Rate."; "Assign IP Address/Prefix";
             }

    identity Per-Session-Agg-Max-UL-Bit-Rate-type
             bit assign-fteid-ip {
        base qos-attribute-type;
               position 1;
               description

       "Per-Mobility-Session Aggregate Maximum Uplink Bit Rate."; "Assign FTEID-IP";
             }

    identity Allocation-Retention-Priority-type
             bit assign-fteid-teid {
        base qos-attribute-type;
               position 2;
               description
            "Allocation and Retention Priority."; "Assign FTEID-TEID";
             }

    identity Aggregate-Max-DL-Bit-Rate-type
             bit session {
        base qos-attribute-type;
               position 3;
               description "Aggregate Maximum Downlink Bit Rate."; "Commands apply to the Session Level";
             }

  identity Aggregate-Max-UL-Bit-Rate-type
             bit uplink {
      base qos-attribute-type;
               position 4;
               description "Aggregate Maximum Uplink Bit Rate."; "Commands apply to the Uplink";

             }

  identity Guaranteed-DL-Bit-Rate-type
             bit downlink {
      base qos-attribute-type;
               position 5;
               description "Guaranteed Downlink Bit Rate."; "Commands apply to the Downlink";
             }

  identity Guaranteed-UL-Bit-Rate-type
             bit assign-dpn {
      base qos-attribute-type;
               position 6;
               description "Guaranteed Uplink Bit Rate."; "Assign DPN";
             }
           }

  identity QoS-Traffic-Selector-type {
      base qos-attribute-type;
           description "QoS Traffic Selector."; "Instruction Set for 3GPP R11";
         }

  identity QoS-Vendor-Specific-Attribute-type

         grouping threegpp-tunnel-info {
             leaf tunnel-type {
                 type identityref  {
                   base qos-attribute-type; "fpcbase:threeGPP-tunnel-type";
                 }
                 description "QoS Vendor-Specific Attribute."; "3GPP Tunnel Subtype";
             }

  //value definitions
  typedef Per-MN-Agg-Max-DL-Bit-Rate-Value
             leaf tunnel-identifier {
                 type uint32;
                 description
          "This is a 32-bit unsigned integer that
          indicates the aggregate maximum downlink bit rate that is
          requested/allocated for all the mobile node's IP flows.
          The measurement units for Per-MN-Agg-Max-DL-Bit-Rate are
          bits per second."; "Tunnel Endpoint IDentifier (TEID)";
             }

    typedef Per-MN-Agg-Max-UL-Bit-Rate-Value
             choice tft-or-ref {
        type uint32;
               case defined-tft {
                 uses fpcbase:tft;
               }
               description
            "This is a 32-bit unsigned integer that
              indicates the aggregate maximum uplink bit rate that is
            requested/allocated for the mobile node's IP flows.  The
            measurement units for Per-MN-Agg-Max-UL-Bit-Rate are bits
            per second."; "TFT Value";
             }

    // Generic Structure for the uplink
             description "3GPP TFT and downlink Tunnel Information";
           }

         grouping Per-Session-Agg-Max-Bit-Rate-Value threegpp-properties {
             leaf max-rate imsi {
               type uint32;
            mandatory true; fpcbase:imsi-type;
               description
       "This is a 32-bit unsigned integer
        that indicates the aggregate maximum bit rate that is
        requested/allocated for all the IP flows associated with
        that mobility session.  The measurement units for
        Per-Session-Agg-Max-UL/DL-Bit-Rate are bits per second."; "IMSI";
             }
             leaf service-flag ebi {
               type boolean; fpcbase:ebi-type;
               description "EUTRAN Bearere Identifier (EBI)";
             }
             leaf lbi {
               type fpcbase:ebi-type;
               description "Linked Bearer Identifier (LBI)";
             }
             description "3GPP Mobility Session Properties";
           }

       //////////////////////////////
       // ACTION VALUE AUGMENTS
       grouping fpc-action-value {
           choice action-value {
               mandatory true;
               case drop {
                 leaf drop {
                   type empty;
                   description
       "This flag is used for extending the scope of the
            target flows for Per-Session-Agg-Max-UL/DL-Bit-Rate
            from(UL)/to(DL) the mobile node's other mobility sessions
            sharing the same Service Identifier. 3GPP Access Point Name
            (APN) is an example of a Service Identifier, and that
            identifier is carried using the Service Selection mobility
            option [RFC5149].

            -  When the (S) flag is set to a value of (1), then the
               Per-Session-Agg-Max-Bit-Rate is measured as an
               aggregate across all the mobile node's other mobility
               sessions sharing the same Service Identifier associated
               with this mobility session.

            -  When the (S) flag is set to a value of (0), then the
               target flows are limited to the current mobility
               session.

            -  The (S) flag MUST NOT be set to a value of (1) when there
               is no Service Identifier associated with the mobility
               session.";
            reference
        "RFC 5149 - Service Selection mobility option"; "Drop Traffic";
                 }
        leaf exclude-flag
               }
               case simple-nat {
            type boolean;
            mandatory true;
                   uses fpcbase:simple-nat;
                   description
        "This flag is used to request that the uplink/downlink
                  flows for which the network is providing
            Guaranteed-Bit-Rate service be excluded from the
            target IP flows for which
            Per-Session-Agg-Max-UL/DL-Bit-Rate is measured.

            -  When the (E) flag is set to a value of (1), then the
               request is to exclude the IP flows for which
               Guaranteed-UL/DL-Bit-Rate is negotiated from the flows
               for which Per-Session-Agg-Max-UL/DL-Bit-Rate
                   is measured.

            -  When the (E) flag is set to a value of (0), then the
               request is not to exclude any IP flows from the target
               IP flows for which Per-Session-Agg-Max-UL/DL-Bit-Rate
               is measured.

            -  When the (S) flag and (E) flag are both set to a value
               of (1), then the request is to exclude all the IP flows
               sharing the Service Identifier associated with this
               mobility session from the target flows for which
               Per-Session-Agg-Max-UL/DL-Bit-Rate is measured."; "Simple NAT value";
               }
               case simple-napt {
                   uses fpcbase:simple-napt;
                   description "Per-Session-Agg-Max-Bit-Rate "Simple NAPT Value";
               }

    grouping Allocation-Retention-Priority-Value {
        leaf prioirty-level
               case copy-forward {
            type uint8
                   uses fpcbase:copy-forward;
                   description "Copy Forward Value";
               }
               case pmip-selector {
            range "0..15";
                   uses traffic-selectors:traffic-selector;
                   description "PMIP Selector";
               }
               description "Action Value";
           }
           description "FPC Action Value";
       }

       //////////////////////////////
       // DESCRIPTOR DEFINITIONS
     grouping fpc-descriptor-value {
       choice descriptor-value {
         mandatory true;
            description
        "This is a 4-bit unsigned integer value.  It is used to decide
        whether a mobility session establishment or modification
        request can be accepted; this is typically used for
        admission control of Guaranteed Bit Rate traffic in
         case of
        resource limitations.  The priority level can also be used to
        decide which existing mobility session to preempt during
        resource limitations.  The priority level defines the
        relative timeliness of a resource request.

        Values 1 to 15 are defined, with value 1 as the highest level
        of priority.

        Values 1 to 8 should only be assigned for services that are
        authorized to receive prioritized treatment within an
        operator domain.  Values 9 to 15 may be assigned to resources
        that are authorized by the home network and thus applicable
        when a mobile node is roaming."; all-traffic {
           leaf all-traffic {
             type empty;
             description "admit any";
           }
         }
         case no-traffic {
           leaf premption-capability no-traffic {
             type enumeration empty;
             description "deny any";
           }

         }
         case prefix-descriptor {
            enum enabled
           leaf destination-ip {
          value 0;
             type inet:ip-prefix;
             description "enabled"; "Rule of destination IP";
           }
            enum disabled
           leaf source-ip {
          value 1;
             type inet:ip-prefix;
             description "disabled"; "Rule of source IP";
           }
            enum reserved1
           description "Traffic descriptor based upon source/
             destination as IP prefixes";
         }
         case pmip-selector {
          value 2;
           uses traffic-selectors:traffic-selector;
           description "reserved1"; "PMIP Selector";
         }
            enum reserved2
         case threegpp-tft {
          value 3;
             uses fpcbase:tft;
             description "reserved2"; "3GPP TFT";
         }
         description "Descriptor Value";
       }
            mandatory true;
       description
       "This is a 2-bit unsigned integer value.  It defines whether a
        service data flow can get resources that were already
        assigned to another service data flow with a lower priority
        level.  The following values are defined:

         Enabled (0): This value indicates that the service data flow
         is allowed to get resources that were already assigned to
         another IP data flow with a lower priority level.

         Disabled (1): This value indicates that the service data flow
         is not allowed to get resources that were already assigned to
         another IP data flow with a lower priority level.  The values
         (2) and (3) are reserved."; "FPC Descriptor Values";
     }

       //SETTINGS DEFINITIONS
       grouping fpc-settings {
           leaf-list delegated-ip-prefixes {
               type inet:ip-prefix;
               description "Delegated Prefix(es)";
           }
           leaf premption-vulnerability tunnel-local-address {
               type enumeration inet:ip-address;
               description "local tunnel address";
           }
           leaf tunnel-remote-address {
            enum enabled
               type inet:ip-address;
               description "remote tunnel address";
           }
           leaf mtu-size {
          value 0;
               type uint32;
               description "enabled"; "MTU size";
           }
            enum disabled
           container mobility-tunnel-parameters {
          value 1;
               choice profile-parameters {
                   case nothing {
                     leaf none {
                       type empty;
                       description "disabled"; "Empty Value";
                     }
            enum reserved1
                     description "No Parameters Case";
                   }
           case pmip {
          value 2;
             uses pmip-tunnel-info;
           }
           case threegpp {
             uses threegpp-tunnel-info;
             uses threegpp-properties;
           }
                   description "reserved1"; "Mobility Profile Parameters";
               }
            enum reserved2
               description
               "Profile specific tunnel parameters";
           }
           container nexthop {
               uses fpcbase:fpc-nexthop;
               description "Next Hop";
           }
           container qos-profile-parameters {
               choice value 3; {
                   description "reserved2"; "QoS Value";
               }
               description "QoS Parameters";
           }
            mandatory true;
           description
       "This is a 2-bit unsigned integer value.  It defines whether a
         service data flow can lose the resources assigned to it "A collection of settings";
       }
       identity access-technology {
       description "The technology used in
         order to admit a service data flow with a higher priority
         level.  The following values are defined:

           Enabled (0): This value indicates that the resources
           assigned to access network";
     }
       identity role {
       description "The access-technology function of the IP data flow can be preempted and
           allocated to a service data flow with a higher
           priority level.

           Disabled (1): This value indicates that the resources
           assigned to the IP data flow shall not be preempted and
           allocated to a service data flow with a higher priority
           level.  The values (2) and (3) are reserved.";
        }
    description "Allocation-Retention-Priority Value"; DPN";
   }

    typedef Aggregate-Max-DL-Bit-Rate-Value
     identity ietf-pmip-access-type {
        type uint32;
       base "fpcbase:access-technology";
       description
            "This is a 32-bit unsigned integer that
         indicates the aggregate maximum downlink bit rate that is
         requested/allocated for downlink IP flows.  The measurement
         units for Aggregate-Max-DL-Bit-Rate are bits per second."; "PMIP Access";
     }

    typedef Aggregate-Max-UL-Bit-Rate-Value
     identity threeGPP-access-type {
        type uint32;
       base "fpcbase:access-technology";
       description
            "This is a 32-bit unsigned integer that
         indicates the aggregate maximum downlink bit rate that is
         requested/allocated for downlink IP flows.  The measurement
         units for Aggregate-Max-DL-Bit-Rate are bits per second."; "3GPP Access Type";
     }

    typedef Guaranteed-DL-Bit-Rate-Value
      // Instructions
     grouping instructions {
        type uint32;
        description
            "This is a 32-bit unsigned integer that
         indicates the guaranteed bandwidth in bits per second for
         downlink IP flows.  The measurement units for
         Guaranteed-DL-Bit-Rate are bits per second.";
    }

    typedef Guaranteed-UL-Bit-Rate-Value
       container instructions {
        type uint32;
        description
            "This is a 32-bit unsigned integer that
         indicates the guaranteed bandwidth in bits per second
         for uplink IP flows.  The measurement units for
         Guaranteed-UL-Bit-Rate are bits per second.";
    }

    grouping QoS-Vendor-Specific-Attribute-Value-Base
         choice instr-type {
           case threegpp-instr {
             leaf vendorid instr-3gpp-mob {
               type uint32;
            mandatory true; fpcbase:threegpp-instr;
               description
         "The Vendor ID is the SMI (Structure of Management
          Information) Network Management Private Enterprise Code of
          the IANA-maintained 'Private Enterprise Numbers'
          registry.";
            reference
          "'PRIVATE ENTERPRISE NUMBERS', SMI Network Management
            Private Enterprise Codes, April 2014,
             <http://www.iana.org/assignments/enterprise-numbers>"; "3GPP GTP Mobility Instructions";
             }
           }
           case pmip-instr {
             leaf subtype instr-pmip {
               type uint8;
            mandatory true; pmip-commandset;
               description
          "An 8-bit field indicating the type of vendor-specific
           information carried in the option.  The namespace for this
           sub-type is managed by the vendor identified by the
           Vendor ID field.";
        }
        description
        "QoS Vendor-Specific Attribute.";
    }

    //NOTE - We do NOT add the Status Codes or other changes in
    // PMIP in this module

    //Primary Structures (groupings)
    grouping qosattribute {
        leaf attributetype {
            type identityref {
                base qos-attribute-type; "PMIP Instructions";
             }
            mandatory true;
            description "the attribute type";
           }

          //All of the sub-types by constraint
        choice attribute-choice {
            case per-mn-agg-max-dl-case {
                when "./attributetype = "
                   + "'Per-MN-Agg-Max-DL-Bit-Rate-type'";
                leaf per-mn-agg-max-dl {
                    type qos-pmip:Per-MN-Agg-Max-DL-Bit-Rate-Value;
           description "Per-MN-Agg-Max-DL-Bit-Rate Value"; "Instruction Value Choice";
         }
         description "Per-MN-Agg-Max-DL-Bit-Rate Case"; "Instructions";
       }
            case per-mn-agg-max-ul-case {
                when "./attributetype = "
                  + "'Per-MN-Agg-Max-UL-Bit-Rate-type'";
                leaf per-mn-agg-max-ul {
                    type qos-pmip:Per-MN-Agg-Max-UL-Bit-Rate-Value;
       description "Per-MN-Agg-Max-UL-Bit-Rate "Instructions Value";
     }
                description "Per-MN-Agg-Max-UL-Bit-Rate Case";
   }
            case per-session-agg-max-dl-case
   <CODE ENDS>

A.2.2.  PMIP QoS Model

   This module defines the base protocol elements specified in this
   document.

   This module references [RFC6991].

   <CODE BEGINS> file "ietf-pmip-qos@2017-10-29.yang"
   module ietf-pmip-qos {
                when "./attributetype = "
                + "'Per-Session-Agg-Max-DL-Bit-Rate-type'";
                container per-session-agg-max-dl
       yang-version 1.1;

       namespace
         "urn:ietf:params:xml:ns:yang:ietf-pmip-qos";

       prefix "qos-pmip";

       import ietf-inet-types {
                    uses qos-pmip:Per-Session-Agg-Max-Bit-Rate-Value;
                    description "Per-Session-Agg-Max-Bit-Rate Value";
                }
                description "Per-Session-Agg-Max-Bit-Rate Case";
         prefix inet;
         revision-date 2013-07-15;
       }
            case per-session-agg-max-ul-case {
                when "./attributetype = "
                + "'Per-Session-Agg-Max-UL-Bit-Rate-type'";
                container per-session-agg-max-ul
       import ietf-trafficselector-types {
                    uses qos-pmip:Per-Session-Agg-Max-Bit-Rate-Value;
                    description "Per-Session-Agg-Max-Bit-Rate Value";
                }
                description "Per-Session-Agg-Max-Bit-Rate Case"; prefix traffic-selectors; }
            case allocation-retention-priority-case {
                when "./attributetype = "
                   + "'Allocation-Retention-Priority-type'";
                uses qos-pmip:Allocation-Retention-Priority-Value;
                description "Allocation-Retention-Priority Case";
            }
            case agg-max-dl-case {
                when "./attributetype = "
                  + "'Aggregate-Max-DL-Bit-Rate-type'";
                leaf agg-max-dl {
                    type qos-pmip:Aggregate-Max-DL-Bit-Rate-Value;
                    description "Aggregate-Max-DL-Bit-Rate Value";
                }
                description "Aggregate-Max-DL-Bit-Rate Case";
            }
            case agg-max-ul-case {
                when "./attributetype = "
                  + "'Aggregate-Max-UL-Bit-Rate-type'";
                leaf agg-max-ul {
                    type qos-pmip:Aggregate-Max-UL-Bit-Rate-Value;
                    description "Aggregate-Max-UL-Bit-Rate Value";
                }
                description "Aggregate-Max-UL-Bit-Rate Case";
            }
            case gbr-dl-case {
                when "./attributetype = 'Guaranteed-DL-Bit-Rate-type'";
                leaf gbr-dl {
                    type qos-pmip:Guaranteed-DL-Bit-Rate-Value;
                    description "Guaranteed-DL-Bit-Rate Value";
                }
                description "Guaranteed-DL-Bit-Rate Case";
            }
            case gbr-ul-case {
                when "./attributetype = 'Guaranteed-UL-Bit-Rate-type'";
                leaf gbr-ul {
                    type qos-pmip:Guaranteed-UL-Bit-Rate-Value;
                    description "Guaranteed-UL-Bit-Rate Value";
                }
                description "Guaranteed-UL-Bit-Rate Case";
            }
            case traffic-selector-case {
                when "./attributetype = 'QoS-Traffic-Selector-type'";
                container traffic-selector {
                    uses traffic-selectors:traffic-selector;
                    description "traffic selector";
                }
                description "traffic selector Case";
            }
            description "Attribute Value";
        }
        description "PMIP QoS Attribute";
    }

    grouping qosoption {
        leaf srid {
            type sr-id;
            mandatory true;
            description "Service Request Identifier";
        }
        leaf trafficclass {
            type traffic-class;
            mandatory true;
            description "Traffic Class";
        }
        leaf operationcode {
            type operational-code;
            mandatory true;
            description "Operation Code";
        }
        list attributes {
            unique "attributetype";
            uses qosattribute;
            min-elements 1;
            description "Attributes";
        }
        description "PMIP QoS Option";
    }
}

<CODE ENDS>

A.2.3.  Traffic Selectors YANG Model

   This module defines traffic selector types commonly used in Proxy
   Mobile IP (PMIP).

   This module references [RFC6991].

 <CODE BEGINS> file "ietf-traffic-selector-types@2016-01-14.yang"
 module ietf-traffic-selector-types {
  yang-version 1;

  namespace
  "urn:ietf:params:xml:ns:yang:ietf-traffic-selector-types";

  prefix "traffic-selectors";

  import ietf-inet-types {
     prefix inet;
     revision-date 2013-07-15;
  }

  organization "IETF Distributed Mobility Management (DMM)
  Working Group";

  contact
  "WG Web: <http://tools.ietf.org/wg/netmod/>
  WG List: <mailto:netmod@ietf.org>

  WG Chair: Dapeng Liu
  <mailto:maxpassion@gmail.com>

  WG Chair: Jouni Korhonen
  <mailto:jouni.nospam@gmail.com>

  Editor: Satoru Matsushima
  <mailto:satoru.matsushima@g.softbank.co.jp>

  Editor: Lyle Bertz
  <mailto:lylebe551144@gmail.com>";

       organization "IETF Distributed Mobility Management (DMM)
         Working Group";

       contact
          "WG Web:   <http://tools.ietf.org/wg/netmod/>
           WG List:  <mailto:netmod@ietf.org>
           WG Chair: Dapeng Liu
                     <mailto:maxpassion@gmail.com>

           WG Chair: Jouni Korhonen
                     <mailto:jouni.nospam@gmail.com>

           Editor:   Satoru Matsushima
                     <mailto:satoru.matsushima@g.softbank.co.jp>

           Editor:   Lyle Bertz
                     <mailto:lylebe551144@gmail.com>";

       description
         "This module contains a collection of YANG definitions for
  traffic selectors for flow bindings.
        quality of service paramaters used in Proxy Mobile IPv6.

        Copyright (c) 2016 IETF Trust and the persons identified as the
        document authors. All rights reserved.

        This document is subject to BCP 78 and the IETF Trust's Legal
        Provisions Relating to IETF Documents
        (http://trustee.ietf.org/license-info) in effect on the date of
        publication of this document. Please review these documents
        carefully, as they describe your rights and restrictions with
        respect to this document. Code Components extracted from this
        document must include Simplified BSD License text as described
        in Section 4.e of the Trust Legal Provisions and are provided
        without warranty as described in the Simplified BSD License.";

     revision 2016-01-14 {
     description "Updated for IETF-PACKET-FIELDS module alignment";
     reference
         "draft-ietf-netmod-acl-model-06";
  }

  revision 2016-01-12 2017-10-29 {
        description "Initial revision"; "Base Version";
         reference
           "RFC 6088: Traffic Selectors for Flow Bindings";
      }

       // Identities
     identity traffic-selector-format Type Definitions

       // QoS Option Field Type Definitions
     typedef sr-id {
         description
          "The base
       type for Traffic-Selector Formats";
     }

     identity ipv4-binary-selector-format {
         base traffic-selector-format;
         description
             "IPv4 Binary Traffic Selector Format";
     }

     identity ipv6-binary-selector-format {
         base traffic-selector-format; uint8;
         description
             "IPv6 Binary Traffic Selector Format";
          "An 8-bit unsigned integer used for identifying the QoS
           Service Request.";
       }

     // Type definitions and groupings

       typedef ipsec-spi traffic-class {
         type uint32; inet:dscp;
         description
             "This type defines the first 32-bit IPsec
              Security Parameter Index (SPI) value on data
              packets sent from
           "Traffic Class consists of a corresponding node to the
        mobile node as seen by the home agent. This 6-bit DSCP field
        is defined in [RFC4303]."; followed by a
            2-bit reserved field.";
        reference
            "RFC 4303: IP Encapsulating Security
              Payload (ESP)";
     }

     grouping traffic-selector-base {
         description "A grouping 3289: Management Information Base for the
                Differentiated Services Architecture
             RFC 2474: Definition of the commen leaves between Differentiated Services Field
                       (DS Field) in the
        v4 IPv4 and v6 Traffic Selectors";
       container ipsec-spi-range IPv6 Headers
             RFC 2780: IANA Allocation Guidelines For Values In
                       the Internet Protocol and Related Headers";
       }

       typedef operational-code {
         presence "Enables setting ipsec spi range";
         type enumeration {
           enum RESPONSE {
             value 0;
             description
        "Inclusive range representing IPSec Security Parameter
        Indices "Response to be used. When only start-spi is present, it
        represents a single spi.";
           leaf start-spi QoS request";
           }
           enum ALLOCATE {
        type ipsec-spi;
        mandatory true;
             value 1;
             description
          "This field identifies the first 32-bit IPsec SPI value,
          from the range of SPI values to be matched, on data
          packets sent from a corresponding node "Request to the mobile
          node as seen by the home agent.
          This field is defined in [RFC4303]."; allocate QoS resources";
           }
             leaf end-spi {
               type ipsec-spi;
               must ". >= ../start-spi"
           enum DE-ALLOCATE {
                 error-message
                   "The end-spi must be greater than or equal
             value 2;
             description "Request to start-spi"; de-Allocate QoS resources";
           }
       description
         "If more than one contiguous SPI
           enum MODIFY {
             value needs 3;
             description "Request to be matched,
         then this field can be used modify QoS parameters for a
                 previously negotiated QoS Service Request";
           }
           enum QUERY {
             value 4;
             description "Query to indicate list the end previously negotiated QoS
                 Service Requests that are still active";
           }
           enum NEGOTIATE {
             value of 5;
             description "Response to a range starting from the value QoS Service Request with a
               counter QoS proposal";
           }
         }
         description
          "The type of the Start SPI field.
         This field QoS request. Reserved values:   (6) to (255)
                   Currently not used.  Receiver MUST NOT be included unless ignore the Start SPI
         field is included and has a option
                   received with any value less than or equal to
         this field.

         When in this field is included, the receiver will match all
         of range.";
       }

       // QoS Attribute Types
       //The enumeration value for mapping - don't confuse with the SPI values between fields start-spi and end-spi,
         inclusive of start-spi
       //  identities
       typedef qos-attrubite-type-enum {
         type enumeration {
           enum Reserved {
             value 0;
             description "This value is reserved and end-spi."; cannot be used";
           }
           enum Per-MN-Agg-Max-DL-Bit-Rate {
             value 1;
             description "Per-Mobile-Node Aggregate Maximum Downlink
                 Bit Rate.";
           }
      container source-port-range
           enum Per-MN-Agg-Max-UL-Bit-Rate {
        presence "Enables setting source port range";
             value 2;
             description
        "Inclusive range representing source ports to be used.
         When only start-port is present, it represents a single
               port.";
          leaf start-port "Per-Mobile-Node Aggregate Maximum Uplink Bit
               Rate.";
           }
           enum Per-Session-Agg-Max-DL-Bit-Rate {
             type inet:port-number;
             mandatory true;
             value 3;
             description
          "This field identifies the first 16-bit source port number,
          from the range of port numbers to be matched, on data
          packets sent from a corresponding node to the mobile node
          as seen by the home agent.
          This is from the range of port numbers defined by IANA
                (http://www.iana.org)."; "Per-Mobility-Session Aggregate Maximum
               Downlink Bit Rate.";
           }
          leaf end-port
           enum Per-Session-Agg-Max-UL-Bit-Rate {
             type inet:port-number;
             must ". >= ../start-port"
             value 4;
             description "Per-Mobility-Session Aggregate Maximum
                Uplink Bit Rate.";
           }
           enum Allocation-Retention-Priority {
             error-message
           "The end-port must be greater than or equal to start-port";
             value 5;
             description "Allocation and Retention Priority.";
           }
           enum Aggregate-Max-DL-Bit-Rate {
             value 6;
             description
          "If more than one contiguous source port number needs to be
           matched, then this field can be used to indicate the end "Aggregate Maximum Downlink Bit Rate.";
           }
           enum Aggregate-Max-UL-Bit-Rate {
             value of a range starting from the 7;
             description "Aggregate Maximum Uplink Bit Rate.";
           }
           enum Guaranteed-DL-Bit-Rate {
             value 8;
             description "Guaranteed Downlink Bit Rate.";
           }
           enum Guaranteed-UL-Bit-Rate {
             value 9;
             description "Guaranteed Uplink Bit Rate.";
           }
           enum QoS-Traffic-Selector {
             value 10;
             description "QoS Traffic Selector.";
           }
           enum QoS-Vendor-Specific-Attribute {
             value 11;
             description "QoS Vendor-Specific Attribute.";
           }
         }
        description
       "The type of the Start
           Port field. QoS attribute.  This field MUST NOT be included unless specification reserves
          the
           Start Port field is included and has a value less than
           or equal following reserved values.
            (12) to this field.

           When this field (254) -  Reserved
               These values are reserved for future allocation.

            (255)  Reserved
               This value is included, the receiver will match
           all of the port numbers between fields start-port reserved and
           end-port, inclusive cannot be used.";
       }

       // Attribute Type as Identities
       // Added for convenience of start-port inclusion and end-port.";
             }
      }
      container destination-port-range extension in
       //    other YANG modules.
       identity qos-attribute-type {
        presence "Enables setting destination port range";
         description
        "Inclusive range representing destination ports to be used.
        When only start-port is present, it represents a single
        port.";
              leaf start-port {
           "Base type inet:port-number;
              mandatory true;
              description
           "This field identifies the first 16-bit destination port
           number, from the range for Quality of port numbers to be matched, on
           data packets sent from a corresponding node to the mobile
           node as seen by the home agent."; Service Attributes";
       }
             leaf end-port {
             type inet:port-number;
             must ". >= ../start-port"

       identity Per-MN-Agg-Max-DL-Bit-Rate-type {
             error-message
               "The end-port must be greater than or equal to
           start-port";
            }
         base qos-attribute-type;
         description
         "If more than one contiguous destination port number needs
         to be matched, then this field can be used to indicate
         the end value of a range starting from the value of the
         Start Destination Port field. This field MUST NOT be
         included unless the Start Port field is included and has
         a value less than or equal to this field.

         When this field is included, the receiver will match
         all of the port numbers between fields start-port and
         end-port, inclusive of start-port and end-port.";
           "Per-Mobile-Node Aggregate Maximum Downlink Bit Rate.";
       }

      identity Per-MN-Agg-Max-UL-Bit-Rate-type {
         base qos-attribute-type;
         description
           "Per-Mobile-Node Aggregate Maximum Uplink Bit Rate";
      }

      identity Per-Session-Agg-Max-DL-Bit-Rate-type {
         base qos-attribute-type;
         description
          "Per-Mobility-Session Aggregate Maximum Downlink Bit Rate.";
     }

  grouping ipv4-binary-traffic-selector

      identity Per-Session-Agg-Max-UL-Bit-Rate-type {
      container source-address-range-v4
         base qos-attribute-type;
         description
          "Per-Mobility-Session Aggregate Maximum Uplink Bit Rate.";
      }

      identity Allocation-Retention-Priority-type {
        presence "Enables setting source IPv4 address range";
         base qos-attribute-type;
         description
        "Inclusive range representing IPv4 addresses to be used. When
        only start-address is present, it represents a single
        address.";
          leaf start-address
           "Allocation and Retention Priority.";
      }

      identity Aggregate-Max-DL-Bit-Rate-type {
              type inet:ipv4-address;
              mandatory true;
         base qos-attribute-type;
         description
         "This field identifies the first source address, from the range
         of 32-bit IPv4 addresses to be matched, on data packets sent
         from a corresponding node to the mobile node as seen by the
         home agent. In other words, this is one of the addresses of
         the correspondent node."; "Aggregate Maximum Downlink Bit Rate.";
      }
          leaf end-address

     identity Aggregate-Max-UL-Bit-Rate-type {
              type inet:ipv4-address;
         base qos-attribute-type;
         description
          "If more than one contiguous source address needs to be
          matched, then this field can be used to indicate the end
          value of a range starting from the value of the Start
          Address field. This field MUST NOT be included unless the
          Start Address field is included. When this field is
          included, the receiver will match all of the addresses
          between fields start-address and end-address, inclusive of
          start-address and end-address."; "Aggregate Maximum Uplink Bit Rate.";
     }

     identity Guaranteed-DL-Bit-Rate-type {
         base qos-attribute-type;
         description "Guaranteed Downlink Bit Rate.";
     }
      container destination-address-range-v4

     identity Guaranteed-UL-Bit-Rate-type {
        presence "Enables setting destination IPv4 address range";
         base qos-attribute-type;
         description
          "Inclusive range representing IPv4 addresses to be used.
         When only start-address is present, it represents a
         single address.";
          leaf start-address "Guaranteed Uplink Bit Rate.";
     }

     identity QoS-Traffic-Selector-type {
         base qos-attribute-type;
         description "QoS Traffic Selector.";
     }

     identity QoS-Vendor-Specific-Attribute-type {
         base qos-attribute-type;
         description "QoS Vendor-Specific Attribute.";
     }

     //value definitions
     typedef Per-MN-Agg-Max-DL-Bit-Rate-Value {
         type inet:ipv4-address;
              mandatory true; uint32;
         description
          "This field identifies the first destination address, from the
          range of 32-bit IPv4 addresses to be matched, on data packets
          sent from a corresponding node to the mobile node as seen by
          the home agent. In other words, this
             "The aggregate maximum downlink bit rate that is one of the registered
          home addresses of
             requested/allocated for all the mobile node."; node's IP flows.
             The measurement units are bits per second.";
     }
          leaf end-address
      typedef Per-MN-Agg-Max-UL-Bit-Rate-Value {
         type inet:ipv4-address; uint32;
         description
          "If more than one contiguous destination address needs to be
          matched, then this field can be used to indicate the end
          value of a range starting from the value of the Start
          Destination Address field. This field MUST NOT be included
          unless the Start Address field is included. When this field
           "The aggregate maximum uplink bit rate that is included,
               requested/allocated for the receiver will match all of mobile node's IP flows. The
               measurement units are bits per second.";
      }

      // Generic Structure for the addresses
          between fields start-address and end-address, inclusive of
          start-address uplink and end-address.";
          }
      }
      container ds-range downlink
      grouping Per-Session-Agg-Max-Bit-Rate-Value {
        presence "Enables setting dscp range";
        description
        "Inclusive range representing DiffServ Codepoints to be used.
        When only start-ds is present, it represents a single
        Codepoint.";
        leaf start-ds max-rate {
          type inet:dscp; uint32;
          mandatory true;
          description
          "This field identifies the first differential service value,
          from the range of differential services values to be
          matched, on data packets sent from a corresponding node to
          the mobile node as seen by the home agent. Note
          "The aggregate maximum bit rate that this
          field is called a 'Type of Service field' in [RFC0791].
          [RFC3260] then clarified that requested/allocated
        for all the field has been redefined
          as a 6-bit DS field IP flows associated with 2 that mobility session.
        The measurement units are bits reserved, later claimed by
          Explicit Congestion Notification (ECN) [RFC3168]. For per second.";
        }
        leaf service-flag {
         type boolean;
         mandatory true;
         description
          "This flag is used for extending the
          purpose scope of this specification, the Start DS field is 8 bits
          long, where the 6 most significant bits indicate
           target flows for Per-Session-Agg-Max-UL/DL-Bit-Rate
           from(UL)/to(DL) the DS field
          to be matched and mobile node's other mobility sessions
           sharing the 2 least significant bits' values MUST be
          ignored in any comparison."; same Service Identifier.";
         reference
           "RFC 5149 - Service Selection mobility option";
        }
        leaf end-ds exclude-flag {
          type inet:dscp;
       must ". >= ../start-ds" {
         error-message
           "The end-ds must be greater than or equal to start-ds";
       } boolean;
          mandatory true;
          description
        "If more than one contiguous DS value needs to be matched, then
        this field can be
           "This flag is used to indicate the end value of a range
        starting from the value of request that the Start DS field. This field MUST
        NOT be included unless uplink/downlink
          flows for which the Start DS field is included. When this
        field network is included, it MUST providing
               Guaranteed-Bit-Rate service be coded excluded from the same way as defined
               target IP flows for
        start-ds. When this field which
               Per-Session-Agg-Max-UL/DL-Bit-Rate is included, the receiver will match
        all of the values between fields start-ds and end-ds, inclusive
        of start-ds and end-ds."; measured.";
        }
       description "Per-Session-Agg-Max-Bit-Rate Value";
      }
     container protocol-range

      grouping Allocation-Retention-Priority-Value {
     presence "Enables setting protocol range";
     description
       "Inclusive range representing IP protocol(s) to be used. When
        only start-protocol is present, it represents a single
        protocol.";
        leaf start-protocol prioirty-level {
          type uint8; uint8 {
            range "0..15";
          }
          mandatory true;
          description
           "This field identifies the first 8-bit protocol value, from the
          range of protocol values to be matched, on data packets sent
          from is a corresponding node 4-bit unsigned integer value.  It is used to the mobile node as seen by the
          home agent.";
           decide whether a mobility session establishment or
           modification request can be accepted; this is typically used
           for admission control of Guaranteed Bit Rate traffic in
           case of resource limitations.";
        }
        leaf end-protocol premption-capability {
          type uint8;
         must ". >= ../start-protocol" enumeration {
           error-message
             "The end-protocol must be greater than or equal to
           start-protocol";
           enum enabled {
             value 0;
             description "enabled";
           }
           enum disabled {
             value 1;
             description
        "If more than one contiguous protocol "disabled";
           }
           enum reserved1 {
             value needs to be matched,
        then this field can be used to indicate the end value of a range
        starting from the value of the Start Protocol field. This field
        MUST NOT be included unless the Start Protocol field is
        included. When this field is included, the receiver will match
        all of the values between fields start-protocol and
        end-protocol, inclusive of start-protocol and end-protocol.";
         }
      } 2;
             description "ipv4 binary traffic selector"; "reserved1";
           }

     grouping ipv6-binary-traffic-selector {
      container source-address-range-v6
           enum reserved2 {
      presence "Enables setting source IPv6 address range";
             value 3;
             description
        "Inclusive range representing IPv6 addresses to be used.
        When only start-address "reserved2";
           }
          }
          mandatory true;
          description
          "This is present, it represents a
        single address."; 2-bit unsigned integer value.  It defines whether a
           service data flow can get resources that were already
           assigned to another service data flow with a lower priority
           level.";
        }
        leaf start-address premption-vulnerability {
          type inet:ipv6-address; enumeration {
           enum enabled {
             value 0;
             description "enabled";
           }
           enum disabled {
             value 1;
             description "disabled";
           }
           enum reserved1 {
             value 2;
             description "reserved1";
           }
           enum reserved2 {
             value 3;
             description "reserved2";
           }
          }
          mandatory true;
          description
          "This field identifies the first source address, from is a 2-bit unsigned integer value.  It defines whether a
            service data flow can lose the
         range of 128-bit IPv6 addresses resources assigned to be matched, on it in
            order to admit a service data
         packets sent from flow with a corresponding node to the mobile node as
         seen by the home agent. In other words, this higher priority
            level.";
        }
       description "Allocation-Retention-Priority Value";
      }

      typedef Aggregate-Max-DL-Bit-Rate-Value {
         type uint32;
         description
           "The aggregate maximum downlink bit rate that is one of the
         addresses of the correspondent node.";
            requested/allocated for downlink IP flows.  The measurement
            units are bits per second.";
      }
       leaf end-address

       typedef Aggregate-Max-UL-Bit-Rate-Value {
         type inet:ipv6-address; uint32;
         description
          "If more than one contiguous source address needs to be
          matched, then this field can be used to indicate the end
          value of a range starting from the value of the Start
          Address field. This field MUST NOT be included unless the
          Start Address field is included. When this field
           "The aggregate maximum downlink bit rate that is
          included, the receiver will match all of the addresses
          between fields start-address and end-address, inclusive of
          start-address and end-address .";
            requested/allocated for downlink IP flows.  The measurement
            units are bits per second.";
       }

       typedef Guaranteed-DL-Bit-Rate-Value {
         type uint32;
         description
         "The guaranteed bandwidth in bits per second for downlink
           IP flows.  The measurement units are bits per second.";
       }
    container destination-address-range-v6

       typedef Guaranteed-UL-Bit-Rate-Value {
      presence "Enables setting destination IPv6 address range";
         type uint32;
         description
        "Inclusive range representing IPv6 addresses to be used.
         When only start-address is present, it represents a
         single address.";
           "The guaranteed bandwidth in bits per second for uplink
            IP flows.  The measurement units are bits per second.";
       }

       grouping QoS-Vendor-Specific-Attribute-Value-Base {
         leaf start-address vendorid {
           type inet:ipv6-address; uint32;
           mandatory true;
           description
          "This field identifies the first destination address, from
          the range of 128-bit IPv6 addresses to be matched, on data
          packets sent from a corresponding node to the mobile node as
          seen by the home agent. In other words, this
            "The Vendor ID is one of the
          registered home addresses SMI (Structure of Management
             Information) Network Management Private Enterprise Code of
             the mobile node."; IANA-maintained 'Private Enterprise Numbers'
             registry.";
           reference
             "'PRIVATE ENTERPRISE NUMBERS', SMI Network Management
               Private Enterprise Codes, April 2014,
                <http://www.iana.org/assignments/enterprise-numbers>";
         }
         leaf end-address subtype {
           type inet:ipv6-address; uint8;
           mandatory true;
           description
          "If more than one contiguous destination address needs to be
           matched, then this
             "An 8-bit field can be used to indicate indicating the end
           value type of a range starting from the value of the Start
           Address field. This field MUST NOT be included unless vendor-specific
              information carried in the
           Start Address field is included. When option.  The namespace for this field
              sub-type is
           included, managed by the receiver will match all of vendor identified by the addresses
           between fields start-address and end-address, inclusive of
           start-address and end-address.";
              Vendor ID field.";
         }
         description
           "QoS Vendor-Specific Attribute.";
       }
   container flow-label-range

       //NOTE - We do NOT add the Status Codes or other changes in
       // PMIP in this module

       //Primary Structures (groupings)
       grouping qosattribute {
     presence "Enables setting Flow Label range";
     description
       "Inclusive range representing IPv4 addresses to be used. When
        only start-flow-label is present, it represents a single
        flow label.";
           leaf start-flow-label attributetype {
               type inet:ipv6-flow-label; identityref {
                   base qos-attribute-type;
               }
               mandatory true;
               description
         "This field identifies the first flow label value, from the
         range "the attribute type";
           }

           //All of flow label values to be matched, on data packets
         sent from a corresponding node to the mobile node as seen sub-types by the home agent. According to [RFC2460], the flow label
         is 24 bits long. For the purpose of this specification, the
         sender of this option MUST prefix the flow label value with
         8 bits of '0' before inserting it in the start-flow-label
         field. The receiver SHOULD ignore the first 8 bits of this
         field before using it in comparisons with flow labels in
         packets.";
     } constraint
           choice attribute-choice {
               case per-mn-agg-max-dl-case {
                   when "./attributetype = "
                      + "'Per-MN-Agg-Max-DL-Bit-Rate-type'";
                   leaf end-flow-label per-mn-agg-max-dl {
                       type inet:ipv6-flow-label;
       must ". >= ../start-flow-label" qos-pmip:Per-MN-Agg-Max-DL-Bit-Rate-Value;
                       description "Per-MN-Agg-Max-DL-Bit-Rate Value";
                   }
                   description "Per-MN-Agg-Max-DL-Bit-Rate Case";
               }
               case per-mn-agg-max-ul-case {
         error-message
           "The end-flow-lable must be greater than or equal to
            start-flow-label";
                   when "./attributetype = "
                     + "'Per-MN-Agg-Max-UL-Bit-Rate-type'";
                   leaf per-mn-agg-max-ul {
                       type qos-pmip:Per-MN-Agg-Max-UL-Bit-Rate-Value;
                       description "Per-MN-Agg-Max-UL-Bit-Rate Value";
                   }
                   description
         "If more than one contiguous flow label value needs to be
          matched, then this field can be used to indicate the end
          value of a range starting from the value of the Start Flow
          Label field. This field MUST NOT be included unless the
          Start Flow Label field is included. When this field is
          included, the receiver will match all of the flow label
          values between fields start-flow-label and end-flow-label,
          inclusive of start-flow-label and end-flow-label. When this
          field is included, it MUST be coded the same way as defined
          for end-flow-label."; "Per-MN-Agg-Max-UL-Bit-Rate Case";
               }
               case per-session-agg-max-dl-case {
                   when "./attributetype = "
                   + "'Per-Session-Agg-Max-DL-Bit-Rate-type'";
                   container per-session-agg-max-dl {
                       uses qos-pmip:Per-Session-Agg-Max-Bit-Rate-Value;
                       description "Per-Session-Agg-Max-Bit-Rate Value";
                   }
                   description "Per-Session-Agg-Max-Bit-Rate Case";
               }
               case per-session-agg-max-ul-case {
                   when "./attributetype = "
                   + "'Per-Session-Agg-Max-UL-Bit-Rate-type'";
                   container traffic-class-range per-session-agg-max-ul {
     presence "Enables setting the traffic class range";
                       uses qos-pmip:Per-Session-Agg-Max-Bit-Rate-Value;
                       description
      "Inclusive range representing IPv4 addresses to be used. When
       only start-traffic-class is present, it represents a single
       traffic class."; "Per-Session-Agg-Max-Bit-Rate Value";
                   }
                   description "Per-Session-Agg-Max-Bit-Rate Case";
               }
               case allocation-retention-priority-case {
                   when "./attributetype = "
                      + "'Allocation-Retention-Priority-type'";
                   uses qos-pmip:Allocation-Retention-Priority-Value;
                   description "Allocation-Retention-Priority Case";
               }
               case agg-max-dl-case {
                   when "./attributetype = "
                     + "'Aggregate-Max-DL-Bit-Rate-type'";
                   leaf start-traffic-class agg-max-dl {
                       type inet:dscp; qos-pmip:Aggregate-Max-DL-Bit-Rate-Value;
                       description
        "This field identifies the first traffic class value, from the
         range of traffic class values to be matched, on data packets
         sent from a corresponding node to the mobile node as seen by
         the home agent. This field is equivalent to the Start DS field
         in the IPv4 traffic selector in Figure 1. As per RFC 3260, the
         field is defined as a 6-bit DS field with 2 bits reserved,
         later claimed by Explicit Congestion Notification (ECN)
         RFC 3168. For the purpose of this specification, the
         start-traffic-class field is 8 bits long, where the 6 most
         significant bits indicate the DS field to be matched and the 2
         least significant bits' values MUST be ignored in any
         comparison.";
       reference
        "RFC 3260: New Terminology and Clarifications for Diffserv
         RFC 3168: The Addition of Explicit Congestion Notification
         (ECN) to IP"; "Aggregate-Max-DL-Bit-Rate Value";
                   }
                   description "Aggregate-Max-DL-Bit-Rate Case";
               }
               case agg-max-ul-case {
                   when "./attributetype = "
                     + "'Aggregate-Max-UL-Bit-Rate-type'";
                   leaf end-traffic-class agg-max-ul {
                       type inet:dscp;
       must ". >= ../start-traffic-class" {
         error-message
           "The end-traffic-class must be greater than or equal to
            start-traffic-class";
       } qos-pmip:Aggregate-Max-UL-Bit-Rate-Value;
                       description
        "If more than one contiguous TC value needs to be matched,
        then this field can be used to indicate the end value of a
        range starting from the value of the Start TC field. This
        field MUST NOT be included unless the Start TC field is
        included. When this field is included, it MUST be coded the
        same way as defined for start-traffic-class. When this field
        is included, the receiver will match all of the values
        between fields start-traffic-class and end-traffic-class,
        inclusive of start-traffic-class and end-traffic-class."; "Aggregate-Max-UL-Bit-Rate Value";
                   }
                   description "Aggregate-Max-UL-Bit-Rate Case";
               }
   container next-header-range
               case gbr-dl-case {
     presence "Enables setting Next Header range";
     description
      "Inclusive range representing Next Headers to be used. When
       only start-next-header is present, it represents a
       single Next Header.";
                   when "./attributetype =
                      'Guaranteed-DL-Bit-Rate-type'";
                   leaf start-next-header gbr-dl {
                       type uint8; qos-pmip:Guaranteed-DL-Bit-Rate-Value;
                       description
        "This field identifies the first 8-bit next header value, from
        the range of next header values to be matched, on data packets
        sent from a corresponding node to the mobile node as seen by
        the home agent."; "Guaranteed-DL-Bit-Rate Value";
                   }
                   description "Guaranteed-DL-Bit-Rate Case";
               }
               case gbr-ul-case {
                   when "./attributetype =
                    'Guaranteed-UL-Bit-Rate-type'";
                   leaf end-next-header gbr-ul {
                       type uint8;
       must ". >= ../start-next-header" {
         error-message
           "The end-next-header must be greater than or equal to
           start-next-header"; qos-pmip:Guaranteed-UL-Bit-Rate-Value;
                       description "Guaranteed-UL-Bit-Rate Value";
                   }
                   description
       "If more than one contiguous next header value needs to be
        matched, then this field can be used to indicate the end value
        of a range starting from the value of the Start NH field. This
        field MUST NOT be included unless the Start next header field
        is included. When this field is included, the receiver will
        match all of the values between fields start-next-header and
        end-next-header, inclusive of start-next-header and
        end-next-header.";
     } "Guaranteed-UL-Bit-Rate Case";
               }
               case traffic-selector-case {
                   when "./attributetype = 'QoS-Traffic-Selector-type'";
                   container traffic-selector {
                       uses traffic-selectors:traffic-selector;
                       description "ipv6 binary traffic "traffic selector";
                   }
                   description "traffic selector Case";
               }
               description "Attribute Value";
           }
           description "PMIP QoS Attribute";
       }

       grouping traffic-selector qosoption {
           leaf ts-format srid {
               type identityref {
             base traffic-selector-format;
             } sr-id;
               mandatory true;
               description "Traffic Selector Format";
         }
         uses traffic-selector-base {
             when "boolean(../ts-format/text() ="
             + "'ipv6-binary-selector-format') |"
             + " boolean(../ts-format/text() ="
             + " 'ipv4-binary-selector-format')";
         }
         uses ipv4-binary-traffic-selector {
             when "boolean(../ts-format/text() ="
             + " 'ipv4-binary-selector-format')"; "Service Request Identifier";
           }
         uses ipv6-binary-traffic-selector
           leaf trafficclass {
             when "boolean(../ts-format/text() = "
         + "'ipv6-binary-selector-format')";
         }
               type traffic-class;
               mandatory true;
               description
      "The traffic selector includes the parameters used to match
              packets for a specific flow binding.";
         reference
      "RFC 6089: Flow Bindings in Mobile IPv6 and Network
        Mobility (NEMO) Basic Support"; "Traffic Class";
           }

     grouping ts-list {
         list selectors {
             key index;
           leaf index operationcode {
               type uint64; operational-code;
               mandatory true;
               description "index"; "Operation Code";

           }
           list attributes {
               unique "attributetype";
               uses traffic-selector; qosattribute;
               min-elements 1;
               description "traffic selectors"; "Attributes";
           }
           description "traffic selector list"; "PMIP QoS Option";
       }
   }
   <CODE ENDS>

A.2.4.  FPC 3GPP Mobility

A.2.3.  Traffic Selectors YANG Model

   This module defines the base protocol elements of 3GPP mobility.. traffic selector types commonly used in Proxy
   Mobile IP (PMIP).

   This module references [RFC6991], the fpc-base, fpc-agent, ietf-
   traffic-selector and pmip-qos modules defined in this document. [RFC6991].

   <CODE BEGINS> file "ietf-dmm-threegpp@2017-03-08.yang" "ietf-trafficselector-types@2017-10-29.yang"
   module ietf-dmm-threegpp ietf-trafficselector-types {
    yang-version 1.1;

    namespace "urn:ietf:params:xml:ns:yang:ietf-dmm-threegpp";
    "urn:ietf:params:xml:ns:yang:ietf-trafficselector-types";

    prefix threegpp; "traffic-selectors";

    import ietf-inet-types {
      prefix inet;
      revision-date 2013-07-15;
    }
       import ietf-dmm-fpc { prefix fpc; revision-date 2017-03-08; }
       import ietf-traffic-selector-types { prefix traffic-selectors;
         revision-date 2016-01-14; }
       import ietf-pmip-qos { prefix pmipqos;
           revision-date 2016-02-10; }

    organization "IETF Distributed Mobility Management (DMM)
    Working Group";

    contact
    "WG Web: <http://tools.ietf.org/wg/netmod/>
    WG List: <mailto:netmod@ietf.org>

    WG Chair: Dapeng Liu
    <mailto:maxpassion@gmail.com>

    WG Chair: Jouni Korhonen
    <mailto:jouni.nospam@gmail.com>

    Editor: Satoru Matsushima
    <mailto:satoru.matsushima@g.softbank.co.jp>
    Editor: Lyle Bertz
    <mailto:lylebe551144@gmail.com>";

    description
    "This module contains a collection of YANG definition definitions for 3GPP Related Mobility
        Structures.
    traffic selectors for flow bindings.

    Copyright (c) 2016 IETF Trust and the persons identified as the
    document authors. All rights reserved.

    This document is subject to BCP 78 and the IETF Trust's Legal
    Provisions Relating to IETF Documents
    (http://trustee.ietf.org/license-info) in effect on the date of
    publication of this document. Please review these documents
    carefully, as they describe your rights and restrictions with
    respect to this document. Code Components extracted from this
    document must include Simplified BSD License text as described
    in Section 4.e of the Trust Legal Provisions and are provided
    without warranty as described in the Simplified BSD License.";

     revision 2017-03-08 2017-10-29 {
        description "Version 06 updates."; "Base Version";
         reference "draft-ietf-dmm-fpc-cpdp-06";
           "RFC 6088: Traffic Selectors for Flow Bindings";
      }

       revision 2016-08-03

    // Identities
      identity traffic-selector-format {
        description "Initial";
           reference "draft-ietf-dmm-fpc-cpdp-04";
        "The base type for Traffic-Selector Formats";
      }

      identity threeGPP-access-type ipv4-binary-selector-format {
        base "fpc:fpc-access-type"; traffic-selector-format;
        description "3GPP Access Type";
          "IPv4 Binary Traffic Selector Format";
      }

       // Profile Type

      identity threeGPP-mobility ipv6-binary-selector-format {
        base "fpc:fpc-mobility-profile-type"; traffic-selector-format;
        description "3GPP Mobility Profile";
          "IPv6 Binary Traffic Selector Format";
      }

      // Tunnel Types
       identity threeGPP-tunnel-type {
           description "3GPP Base Tunnel Type";
       }

       identity gtpv1 Type definitions and groupings
      typedef ipsec-spi {
           base "threegpp:threeGPP-tunnel-type";
        type uint32;
        description "GTP version 1 Tunnel";
         "The first 32-bit IPsec Security Parameter Index (SPI)
         value on data. This field is defined in [RFC4303].";
          reference
          "RFC 4303: IP Encapsulating Security
          Payload (ESP)";
      }

       identity gtpv2

      grouping traffic-selector-base {
           base "threegpp:threeGPP-tunnel-type";
        description "GTP version 2 Tunnel";
       } "A grouping teid-value of the commen leaves between the
          v4 and v6 Traffic Selectors";
        container ipsec-spi-range {
          presence "Enables setting ipsec spi range";
          description "TEID value holder";
          "Inclusive range representing IPSec Security Parameter
          Indices to be used. When only start-spi is present, it
          represents a single spi.";
      leaf tunnel-identifier start-spi {
          type uint32; ipsec-spi;
          mandatory true;
          description "Tunnel Endpoint IDentifier (TEID)";
           }
            "The first 32-bit IPsec SPI value on data.";
          }

       grouping threeGPP-tunnel {
           description "3GPP Tunnel Definition";
      leaf tunnel-type end-spi {
            type identityref ipsec-spi;
            must ". >= ../start-spi" {
                 base "threegpp:threeGPP-tunnel-type";
              error-message
                "The end-spi must be greater than or equal
                 to start-spi";
          }
         description "3GPP Tunnel Subtype";
           "If more than one contiguous SPI value needs to be matched,
           then this field indicates the end value of a range.";
          }
           uses threegpp:teid-value;
       }

       // QoS Profile
       identity threeGPP-qos-profile-parameters
       container source-port-range {
           base "fpc:fpc-qos-type";
         presence "Enables setting source port range";
         description "3GPP QoS Profile";
       }

       typedef fpc-qos-class-identifier {
           type uint8 {
          "Inclusive range "1..9";
           }
           description "QoS Class Identifier (QCI)";
       }

       grouping threeGPP-QoS {
           description "3GPP QoS Attributes"; representing source ports to be used.
           When only start-port is present, it represents a single
        port. These value(s) are from the range of port numbers
           defined by IANA (http://www.iana.org).";
         leaf qci start-port {
            type fpc-qos-class-identifier; inet:port-number;
            mandatory true;
            description "QCI";
            "The first 16-bit source port number to be matched";
         }
         leaf gbr end-port {
            type uint32; inet:port-number;
            must ". >= ../start-port" {
            error-message
             "The end-port must be greater than or equal to start-port";
           }
           description "Guaranteed Bit Rate";
            "The last 16-bit source port number to be matched";
          }
           leaf mbr
       }
       container destination-port-range {
               type uint32;
         presence "Enables setting destination port range";
         description "Maximum Bit Rate";
           }
          "Inclusive range representing destination ports to be used.
          When only start-port is present, it represents a single
          port.";
           leaf apn-ambr start-port {
             type uint32; inet:port-number;
             mandatory true;
             description "Access Point Name Aggregate Max Bit Rate";
             "The first 16-bit destination port number to be matched";
          }
          leaf ue-ambr end-port {
            type uint32;
               description "User Equipment Aggregate Max Bit Rate";
           }
           container arp inet:port-number;
            must ". >= ../start-port" {
               uses pmipqos:Allocation-Retention-Priority-Value;
            error-message
              "The end-port must be greater than or equal to
             start-port";
           }
           description "Allocation Retention Priority";
        "The last 16-bit destination port number to be matched";
        }
      }

       typedef ebi-type
    }

    grouping ipv4-binary-traffic-selector {
         type uint8
      container source-address-range-v4 {
         presence "Enables setting source IPv4 address range";
         description
          "Inclusive range "0..15";
         } representing IPv4 addresses to be used. When
          only start-address is present, it represents a single
          address.";
         leaf start-address {
           type inet:ipv4-address;
           mandatory true;
          description "EUTRAN Bearere Identifier (EBI) Type";
           "The first source address to be matched";
         }

      // From 3GPP TS 24.008 version 13.5.0 Release 13
      typedef component-type-enum
         leaf end-address {
           type enumeration {
               enum ipv4RemoteAddress {
                 value 16; inet:ipv4-address;
           description "IPv4 Remote Address";
            "The last source address to be matched";
          }
               enum ipv4LocalAddress  {
                 value 17;
                 description "IPv4 Local Address";
      }
               enum ipv6RemoteAddress
      container destination-address-range-v4 {
                 value 32;
         presence "Enables setting destination IPv4 address range";
         description "IPv6 Remote Address";
               }
               enum ipv6RemoteAddressPrefix
           "Inclusive range representing IPv4 addresses to be used.
           When only start-address is present, it represents a
           single address.";
         leaf start-address {
                 value 33;
           type inet:ipv4-address;
           mandatory true;
           description "IPv6 Remote Address Prefix";
            "The first destination address to be matched";
         }
               enum ipv6LocalAddressPrefix
         leaf end-address {
                 value 35;
           type inet:ipv4-address;
           description "IPv6 Local Address Prefix";
            "The last destination address to be matched";
         }
               enum protocolNextHeader {
                 value 48;
                 description "Protocol (IPv4) or NextHeader (IPv6)
                   value";
      }
               enum localPort
      container ds-range {
                 value 64;
         presence "Enables setting dscp range";
         description "Local Port";
               }
               enum localPortRange
          "Inclusive range representing DiffServ Codepoints to be used.
          When only start-ds is present, it represents a single
          Codepoint.";
         leaf start-ds {
                 value 65;
           type inet:dscp;
           mandatory true;
           description "Local Port Range";
               }
               enum reomotePort {
            "The first differential service value 80;
                 description "Remote Port"; to be matched";
       }
               enum remotePortRange
       leaf end-ds {
                 value 81;
                 description "Remote Port Range";
               }
               enum secParamIndex
         type inet:dscp;
         must ". >= ../start-ds" {
                 value 96;
                 description "Security Parameter Index (SPI)";
           error-message
             "The end-ds must be greater than or equal to start-ds";
         }
               enum tosTraffClass {
                 value 112;
         description "TOS Traffic Class";
               }
               enum flowLabel {
           "The last differential service value 128;
                 description "Flow Label"; to be matched";
      }
     }
     container protocol-range {
       presence "Enables setting protocol range";
       description "TFT Component Type";
       }

       typedef packet-filter-direction
         "Inclusive range representing IP protocol(s) to be used. When
          only start-protocol is present, it represents a single
          protocol.";
       leaf start-protocol {
         type enumeration {
             enum preRel7Tft {
               value 0; uint8;
         mandatory true;
         description "Pre-Release 7 TFT";
             }
             enum uplink {
           "The first 8-bit protocol value 1;
               description "uplink"; to be matched.";
        }
             enum downlink
        leaf end-protocol {
               value 2;
               description "downlink";
             }
             enum bidirectional
          type uint8;
          must ". >= ../start-protocol" {
               value 3;
               description "bi-direcitonal";
             }
            error-message
              "The end-protocol must be greater than or equal to
             start-protocol";
          }
        description "Packet Filter Direction";
          "The last 8-bit protocol value to be matched.";
        }

       typedef component-type-id {
           type uint8 {
             range "16 | 17 | 32 | 33 | 35 | 48 | 64 | 65 |"
             + " 80 | 81 | 96 | 112 | 128";
      }
      description "Specifies the Component Type"; "ipv4 binary traffic selector";
    }
     grouping packet-filter ipv6-binary-traffic-selector {
         leaf direction
      container source-address-range-v6 {
             type threegpp:packet-filter-direction;
        presence "Enables setting source IPv6 address range";
         description "Filter Direction";
         }
          "Inclusive range representing IPv6 addresses to be used.
          When only start-address is present, it represents a
          single address.";
         leaf identifier start-address {
           type uint8 {
               range "1..15";
             } inet:ipv6-address;
           mandatory true;
           description "Filter Identifier";
           "The first source address, from the
           range of 128-bit IPv6 addresses to be matched";
         }
         leaf evaluation-precedence end-address {
           type uint8; inet:ipv6-address;
           description "Evaluation Precedence";
               "The last source address, from the
               range of 128-bit IPv6 addresses to be matched";
         }
         list contents
      }
      container destination-address-range-v6 {
           key component-type-identifier;
        presence "Enables setting destination IPv6 address range";
        description "Filter Contents";
          "Inclusive range representing IPv6 addresses to be used.

           When only start-address is present, it represents a
           single address.";
        leaf component-type-identifier start-address {
          type threegpp:component-type-id; inet:ipv6-address;
          mandatory true;
          description "Component Type";
              "The first destination address, from the
              range of 128-bit IPv6 addresses to be matched";
        }
           choice value {
             case ipv4-local {
        leaf ipv4-local end-address {
          type inet:ipv4-address; inet:ipv6-address;
          description "IPv4 Local Address";
               }
             }
             case ipv6-prefix-local {
               leaf ipv6-prefix-local {
                 type inet:ipv6-prefix;
                 description "IPv6 Local Prefix";
              "The last destination address, from the
              range of 128-bit IPv6 addresses to be matched";
       }
     }
             case ipv4-ipv6-remote
     container flow-label-range {
       presence "Enables setting Flow Label range";
       description
         "Inclusive range representing IPv4 addresses to be used. When
          only start-flow-label is present, it represents a single
          flow label.";
       leaf ipv4-ipv6-remote start-flow-label {
         type inet:ip-address; inet:ipv6-flow-label;
         description "Ipv4 Ipv6 remote address";
               }
           "The first flow label value to be matched";
       }
             case ipv6-prefix-remote {
       leaf ipv6-prefix-remote end-flow-label {
         type inet:ipv6-prefix; inet:ipv6-flow-label;
         must ". >= ../start-flow-label" {
           error-message
             "The end-flow-lable must be greater than or equal to
              start-flow-label";
         }
         description "IPv6 Remote Prefix";
            "The first flow label value to be matched";
       }
      }
             case next-header
     container traffic-class-range {
       presence "Enables setting the traffic class range";
       description
        "Inclusive range representing IPv4 addresses to be used. When
         only start-traffic-class is present, it represents a single
         traffic class.";
       leaf next-header start-traffic-class {
         type uint8; inet:dscp;
         description "Next Header";
               }
          "The first traffic class value to be matched";

         reference
          "RFC 3260: New Terminology and Clarifications for Diffserv
           RFC 3168: The Addition of Explicit Congestion Notification
           (ECN) to IP";
       }
             case local-port {
       leaf local-port end-traffic-class {
         type inet:port-number; inet:dscp;
         must ". >= ../start-traffic-class" {
           error-message
             "The end-traffic-class must be greater than or equal to
              start-traffic-class";
         }
         description "Local Port";
           "The last traffic class value to be matched";
       }
     }
             case local-port-range
     container next-header-range {
       presence "Enables setting Next Header range";
       description
        "Inclusive range representing Next Headers to be used. When
         only start-next-header is present, it represents a
         single Next Header.";
       leaf local-port-lo start-next-header {
         type inet:port-number; uint8;
         description "Local Port Min Value";
          "The first 8-bit next header value to be matched.";
       }
       leaf local-port-hi end-next-header {
         type inet:port-number;
                 description "Local Port Max Value";
               }
             }
             case remote-port {
               leaf remote-port {
                 type inet:port-number;
                 description "Remote Port";
               }
             }
             case remote-port-range {
               leaf remote-port-lo uint8;
         must ". >= ../start-next-header" {
                 type inet:port-number;
                 description "Remote Por Min Value";
           error-message
             "The end-next-header must be greater than or equal to
             start-next-header";
         }
               leaf remote-port-hi {
                 type inet:port-number;
         description "Remote Port Max Value";
           "The last 8-bit next header value to be matched.";
       }
     }
             case ipsec-index {
               leaf ipsec-index {
                 type traffic-selectors:ipsec-spi;
     description "IPSec Index";
               } "ipv6 binary traffic selector";
   }
             case traffic-class
     grouping traffic-selector {
       leaf traffic-class ts-format {
          type inet:dscp;
                 description "Traffic Class";
               }
             }
             case traffic-class-range {
                 leaf traffic-class-lo identityref {
                   type inet:dscp;
                   description "Traffic Class Min Value";
            base traffic-selector-format;
          }
                 leaf traffic-class-hi {
                   type inet:dscp;
          description "Traffic Class Max Value";
                 }
             }
             case flow-label-type {
               leaf-list flow-label {
                 type inet:ipv6-flow-label;
                 description "Flow Label";
               }
             }
             description "Component Value";
           } Selector Format";
        }
       uses traffic-selector-base;
       uses ipv4-binary-traffic-selector;
       uses ipv6-binary-traffic-selector;
       description "Packet Filter";
        "The traffic selector includes the parameters used to match
          packets for a specific flow binding.";
       reference
        "RFC 6089: Flow Bindings in Mobile IPv6 and Network
          Mobility (NEMO) Basic Support";
     }

     grouping tft ts-list {
       list packet-filters selectors {
         key identifier;
             uses threegpp:packet-filter;
             description "List of Packet Filters";
         }
         description "Packet Filter List";
       }

       typedef imsi-type index;
         leaf index {
           type uint64;
           description
               "International Mobile Subscriber Identity (IMSI)
                 Value Type";
       }

       typedef threegpp-instr {
         type bits {
           bit assign-ip {
             position 0;
             description "Assign IP Address/Prefix";
           }
           bit assign-fteid-ip {
             position 1;
             description "Assign FTEID-IP"; "index";
         }
           bit assign-fteid-teid {
             position 2;
         uses traffic-selector;
         description "Assign FTEID-TEID"; "traffic selectors";
       }
           bit session {
             position 3;
       description "Commands apply to the Session Level"; "traffic selector list";
     }
           bit uplink {
             position 4;
             description "Commands apply to the Uplink";
   }
           bit downlink {
             position 5;
             description "Commands apply to the Downlink";
           }
           bit assign-dpn {
             position 6;
             description "Assign DPN";
           }
         }
         description "Instruction Set for 3GPP R11";
       }

       // Descriptors update - goes to Entities, Configure
       //              and Configure Bundles
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-policy/fpc:"
          + "descriptors/fpc:descriptor-value" {
         case threegpp-tft {
             uses threegpp:tft;
             description "3GPP TFT";
         }
         description "3GPP TFT Descriptor";
       }

       grouping threegpp-tunnel-info {
         uses threegpp:threeGPP-tunnel;
         choice tft-or-ref {
           case defined-tft {
             uses threegpp:tft;
           }
           case predefined-tft {
             leaf tft-reference {
               type fpc:fpc-identity;
               description "Pre-configured TFT";
             }
           }
           description "TFT Value";
         }
         description "3GPP TFT and Tunnel Information";
       }

       // Contexts Update - Contexts / UL / mob-profile
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:ul/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Context UL Tunnel";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:ul/fpc:"
           + "mobility-tunnel-parameters/fpc:profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Create Context UL Tunnel";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:"
           + "ul/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Bundles Create Context UL Tunnel";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts/fpc:"
           + "ul/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Create Context UL Tunnel Response";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:bundles/fpc:"
          + "result-type/fpc:create-or-update-success/fpc:contexts/fpc:"
          + "ul/fpc:mobility-tunnel-parameters/fpc:profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Bundles Create Context UL Tunnel Response";
       }

       // Contexts Update - Contexts / DL / mob-profile
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:dl/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;

         }
         description "Context DL Tunnel";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:dl/fpc:"
           + "mobility-tunnel-parameters/fpc:profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Bundles Create Context DL Tunnel";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:dl/fpc:"
           + "mobility-tunnel-parameters/fpc:profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Bundles Create Context DL Tunnel";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts/fpc:dl/fpc:"
           + "mobility-tunnel-parameters/fpc:profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Create Context DL Tunnel Response";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:bundles/fpc:"
           + "result-type/fpc:create-or-update-success/fpc:"
           + "contexts/fpc:dl/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Bundles Create Context DL Tunnel Response";
       }

       // Contexts Update -  Contexts / dpns /
       //   mobility-tunnel-parameters
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:dpns/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Context 3GPP TFT and Tunnel Information";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:dpns/fpc:"
           + "mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Configure 3GPP TFT and Tunnel Information";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:"
           + "dpns/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Configure Bundles 3GPP TFT and Tunnel
           Information";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts/fpc:"
           + "dpns/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Configure 3GPP TFT and Tunnel Information
           Response";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:bundles/fpc:"
           + "result-type/fpc:create-or-update-success/fpc:"
           + "contexts/fpc:dpns/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case threegpp-tunnel {
             uses threegpp:threegpp-tunnel-info;
         }
         description "Configure Bundles 3GPP TFT and Tunnel Information
           Response";
       }

       // QoS Updates - Context / UL / qosprofile
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:ul/fpc:qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Context UL 3GPP QoS Values";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:ul/fpc:"
           + "qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Context UL 3GPP QoS Values";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:"
           + "ul/fpc:qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Bundles Context UL 3GPP QoS Values";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts/fpc:ul/fpc:"
           + "qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Context UL 3GPP QoS Values Response";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:bundles/fpc:"
           + "result-type/fpc:create-or-update-success/fpc:"
           + "contexts/fpc:ul/fpc:qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Bundles Context UL 3GPP QoS Values
           Response";
       }

       // QoS Updates -  Context / DL / QoS Profile
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:dl/fpc:qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Context DL 3GPP QoS Values";

       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:dl/fpc:"
           + "qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Context DL 3GPP QoS Values";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:dl/fpc:"
           + "qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Bundles Context DL 3GPP QoS Values";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts/fpc:dl/fpc:"
           + "qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Context DL 3GPP QoS Values Response";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:bundles/fpc:"
           + "result-type/fpc:create-or-update-success/fpc:"
           + "contexts/fpc:dl/fpc:qos-profile-parameters/fpc:value" {
         case threegpp-qos {
             uses threegpp:threeGPP-QoS;
             description "3GPP QoS Values";
         }
         description "Configure Bundles Context DL 3GPP QoS Values
           Response";
       }

       grouping threegpp-properties {
         leaf imsi {
           type threegpp:imsi-type;
           description "IMSI";
         }
         leaf ebi {
           type threegpp:ebi-type;
           description "EUTRAN Bearere Identifier (EBI)";
         }
         leaf lbi {
           type threegpp:ebi-type;
           description "Linked Bearer Identifier (LBI)";
         }
         description "3GPP Mobility Session Properties";
       }

       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:contexts" {
         uses threegpp:threegpp-properties;
         description "3GPP Mobility Session Properties";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts" {
         uses threegpp:threegpp-properties;
         description "3GPP Mobility Session Properties";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:"
           + "bundles/fpc:op_body/fpc:create_or_update/fpc:contexts" {
          uses threegpp:threegpp-properties;
          description "3GPP Mobility Session Properties";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts" {
         uses threegpp:threegpp-properties;
         description "3GPP Mobility Session Properties";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:bundles/fpc:"
           + "result-type/fpc:create-or-update-success/fpc:contexts" {
          uses threegpp:threegpp-properties;
          description "3GPP Mobility Session Properties";
       }

       grouping threegpp-commandset {
         leaf instr-3gpp-mob {
           type threegpp:threegpp-instr;
           description "3GPP Specific Command Set";
         }
         description "3GPP Instructions";
       }

       augment "/fpc:configure/fpc:input/fpc:instructions/fpc:"
           + "instr-type" {
         case instr-3gpp-mob {
           uses threegpp:threegpp-commandset;
           description "3GPP Instructions";
         }
         description "Configure 3GPP Instructions";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:instructions/fpc:"
           + "instr-type" {
         case instr-3gpp-mob {
           uses threegpp:threegpp-commandset;
           description "3GPP Instructions";
         }
         description "Configure 3GPP Context Instructions";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts/fpc:"
           + "instructions/fpc:instr-type" {
         case instr-3gpp-mob {
           uses threegpp:threegpp-commandset;
           description "3GPP Instructions";
         }
         description "Configure 3GPP Context Instructions Response";
       }

       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "instructions/fpc:instr-type" {
         case instr-3gpp-mob {
           uses threegpp:threegpp-commandset;
           description "3GPP Instructions";
         }
         description "Configure Bundles 3GPP Instructions";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:"
           + "instructions/fpc:instr-type" {
         case instr-3gpp-mob {
           uses threegpp:threegpp-commandset;
           description "3GPP Instructions";
         }
         description "Configure Bundles 3GPP Context Instructions";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:bundles/fpc:"
           + "result-type/fpc:create-or-update-success/fpc:"
           + "contexts/fpc:instructions/fpc:instr-type" {
         case instr-3gpp-mob {
           uses threegpp:threegpp-commandset;
           description "3GPP Instructions";
         }
         description "Configure Bundles 3GPP Context Instructions
             Response";
       }
   }
   <CODE ENDS>

A.2.5.  FPC / PMIP Integration YANG Model

   This module defines the integration between FPC and PMIP models.

   This module references the fpc-base, fpc-agent, pmip-qos and traffic-
   selector-types module defined in this document.

   <CODE BEGINS> file "ietf-dmm-fpc-pmip@2017-03-08.yang"
   module ietf-dmm-fpc-pmip {
       namespace "urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-pmip";
       prefix fpc-pmip;

       import ietf-dmm-fpc { prefix fpc; revision-date 2017-03-08; }
       import ietf-pmip-qos { prefix qos-pmip; }
       import ietf-traffic-selector-types { prefix traffic-selectors; }

       organization "IETF Distributed Mobility Management (DMM)
         Working Group";

       contact
          "WG Web:   <http://tools.ietf.org/wg/netmod/>
           WG List:  <mailto:netmod@ietf.org>

           WG Chair: Dapeng Liu
                     <mailto:maxpassion@gmail.com>

           WG Chair: Jouni Korhonen
                     <mailto:jouni.nospam@gmail.com>

           Editor:   Satoru Matsushima
                     <mailto:satoru.matsushima@g.softbank.co.jp>

           Editor:   Lyle Bertz
                     <mailto:lylebe551144@gmail.com>";

       description
       "This module contains YANG definition for Forwarding Policy
        Configuration Protocol (FPCP).

        Copyright (c) 2016 IETF Trust and the persons identified as the
        document authors. All rights reserved.

        This document is subject to BCP 78 and the IETF Trust's Legal
        Provisions Relating to IETF Documents
        (http://trustee.ietf.org/license-info) in effect on the date of
        publication of this document. Please review these documents
        carefully, as they describe your rights and restrictions with
        respect to this document. Code Components extracted from this
        document must include Simplified BSD License text as described
        in Section 4.e of the Trust Legal Provisions and are provided
        without warranty as described in the Simplified BSD License.";

       revision 2017-03-08 {
           description "Version 06 update. Adds predfined selector.";
           reference "draft-ietf-dmm-fpc-cpdp-06";
       }

       revision 2016-01-19 {
           description "Changes based on -01 version of FPCP draft.";
           reference "draft-ietf-dmm-fpc-cpdp-01";
       }

       identity ietf-pmip-access-type {
         base "fpc:fpc-access-type";
         description "PMIP Access";
       }

       identity fpcp-qos-index-pmip {
           base "fpc:fpc-qos-type";
           description "PMIP QoS";
       }
       identity traffic-selector-mip6 {
           base "fpc:fpc-descriptor-type";
           description "MIP6 Traffic Selector";
       }
       identity ietf-pmip {
           base "fpc:fpc-mobility-profile-type";
           description "PMIP Mobility";
       }

       identity pmip-tunnel-type {
           description "PMIP Tunnel Type";
       }
       identity grev1 {
           base "fpc-pmip:pmip-tunnel-type";
           description "GRE v1";
       }
       identity grev2 {
           base "fpc-pmip:pmip-tunnel-type";
           description "GRE v2";
       }
       identity ipinip {
           base "fpc-pmip:pmip-tunnel-type";
           description "IP in IP";

       }
       grouping pmip-mobility {
           leaf type {
               type identityref {
                   base "fpc-pmip:pmip-tunnel-type";
               }
               description "PMIP Mobility";
           }
           choice value {
               case gre {
                   leaf key {
                       type uint32;
                       description "GRE_KEY";
                   }
                   description "GRE Value";
               }
               description "PMIP Mobility value";
           }
           description "PMIP Mobility Value";
       }

       typedef pmip-instr {
         type bits {
           bit assign-ip {
             position 0;
             description "Assign IP";
           }
           bit assign-dpn {
             position 1;
             description "Assign DPN";
           }
           bit session {
             position 2;
             description "Session Level";
           }
           bit uplink {
             position 3;
             description "Uplink";
           }
           bit downlink {
             position 4;
             description "Downlink";
           }
         }
         description "Instruction Set for PMIP";
       }

       // Descriptors update - goes to Entities, Configure and
       // Configure Bundles
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-policy/"
         + "fpc:descriptors/fpc:descriptor-value" {
         case pmip-selector {
             uses traffic-selectors:traffic-selector;
             description "PMIP Selector";
         }
         description "Policy Descriptor";
       }

       grouping pmip-tunnel-info {
           uses fpc-pmip:pmip-mobility;
           choice pmiptunnel-or-ref {
             case defined-selector {
               uses traffic-selectors:traffic-selector;
             }
             case predefined-selector {
               leaf selector-reference {
                 type fpc:fpc-identity;
                 description "Pre-configured selector";
               }
             }
             description "Traffic Selector Value";
           }
           description "PMIP Tunnel Information";
       }

       // Contexts Update - Contexts/UL/mob-profile, Contexts/DL/
       //   mob-profile and Contexts/dpns/mobility-tunnel-parameters
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:ul/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "Context UL Mobility";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:ul/fpc:"
           + "mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "CONF Context UL Mobility";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:"
           + "ul/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "CONF_BUNDLES Context UL Mobility";
       }

       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:dl/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "Context DL Mobility";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:dl/fpc:"
           + "mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "CONF Context DL Mobility";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:"
           + "bundles/fpc:op_body/fpc:create_or_update/fpc:"
           + "contexts/fpc:dl/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "CONF_BUNDLES Context DL Mobility";
       }

       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:dpns/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "Context DPN Mobility";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:dpns/fpc:"
           + "mobility-tunnel-parameters/fpc:profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;

         }
         description "CONF Context DPN Mobility";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:"
           + "bundles/fpc:op_body/fpc:create_or_update/fpc:"
           + "contexts/fpc:dpns/fpc:mobility-tunnel-parameters/fpc:"
           + "profile-parameters" {
         case pmip-tunnel {
           uses fpc-pmip:pmip-tunnel-info;
         }
         description "CONF_BUNDLES Context DPN Mobility";
       }

       // QoS Updates - Context / UL / qosprofile, Context / DL /
       // QoS Profile
       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:ul/fpc:qos-profile-parameters/fpc:value" {
         case qos-pmip {
             uses qos-pmip:qosattribute;
             description "PMIP QoS Information";
         }
         description "Context UL QoS";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:ul/fpc:"
           + "qos-profile-parameters/fpc:value" {
         case qos-pmip {
             uses qos-pmip:qosattribute;
             description "PMIP QoS Information";
         }
         description "CONF Context UL QoS";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:"
           + "bundles/fpc:op_body/fpc:create_or_update/fpc:"
           + "contexts/fpc:ul/fpc:qos-profile-parameters/fpc:value" {
         case qos-pmip {
             uses qos-pmip:qosattribute;
             description "PMIP QoS Information";
         }
         description "CONF_BUNDLES Context UL QoS";
       }

       augment "/fpc:tenants/fpc:tenant/fpc:fpc-mobility/fpc:"
           + "contexts/fpc:dl/fpc:qos-profile-parameters/fpc:value" {
         case qos-pmip {
             uses qos-pmip:qosattribute;
             description "PMIP QoS Information";
         }
         description "Context DL QoS";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:dl/fpc:"
           + "qos-profile-parameters/fpc:value" {
         case qos-pmip {
             uses qos-pmip:qosattribute;
             description "PMIP QoS Information";
         }
         description "CONF Context DL QoS";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:"
           + "bundles/fpc:op_body/fpc:create_or_update/fpc:"
           + "contexts/fpc:dl/fpc:qos-profile-parameters/fpc:value" {
         case qos-pmip {
             uses qos-pmip:qosattribute;
             description "PMIP QoS Information";
         }
         description "CONF_BUNDLES Context DL QoS";
       }

       grouping pmip-commandset {
         leaf instr-pmip {
           type fpc-pmip:pmip-instr;
           description "PMIP Instructions";
         }
         description "PMIP Commandset";
       }

       // Instructions Update - OP BODY, Context, Port
       augment "/fpc:configure/fpc:input/fpc:instructions/fpc:"
           + "instr-type" {
         case pmip-instr {
           uses fpc-pmip:pmip-commandset;
           description "PMIP Commandset";
         }
         description "CONF Instructions";
       }
       augment "/fpc:configure/fpc:input/fpc:op_body/fpc:"
           + "create_or_update/fpc:contexts/fpc:instructions/fpc:"
           + "instr-type" {
         case pmip-instr {
           uses fpc-pmip:pmip-commandset;
           description "PMIP Commandset";
         }
         description "CONF Context Instructions";
       }
       augment "/fpc:configure/fpc:output/fpc:result-type/fpc:"
           + "create-or-update-success/fpc:contexts/fpc:"
           + "instructions/fpc:instr-type" {
         case pmip-instr {
           uses fpc-pmip:pmip-commandset;
           description "PMIP Commandset";
         }
         description "CONF Result Context Instructions";
       }

       augment "/fpc:configure-bundles/fpc:input/fpc:"
           + "bundles/fpc:instructions/fpc:instr-type" {
         case pmip-instr {
           uses fpc-pmip:pmip-commandset;
           description "PMIP Commandset";
         }
         description "CONF_BUNDLES Instructions";
       }
       augment "/fpc:configure-bundles/fpc:input/fpc:bundles/fpc:"
           + "op_body/fpc:create_or_update/fpc:contexts/fpc:"
           + "instructions/fpc:instr-type" {
         case pmip-instr {
           uses fpc-pmip:pmip-commandset;
           description "PMIP Commandset";
         }
         description "CONF_BUNDLES Context Instructions";
       }
       augment "/fpc:configure-bundles/fpc:output/fpc:"
           + "bundles/fpc:result-type/fpc:create-or-update-success/fpc:"
           + "contexts/fpc:instructions/fpc:instr-type" {
         case pmip-instr {
           uses fpc-pmip:pmip-commandset;
           description "PMIP Commandset";
         }
         description "CONF_BUNDLES Result Context Instructions";
       }
   }
   <CODE ENDS>

A.2.6.  FPC Policy Extension YANG Model

   This module defines extensions to FPC policy structures.

   This module references [RFC6991], the fpc-base and fpcagent module
   defined in this document.

   <CODE BEGINS> file "ietf-dmm-fpc-policyext@2017-03-08.yang"
   module ietf-dmm-fpc-policyext {
       namespace "urn:ietf:params:xml:ns:yang:ietf-dmm-fpc-policyext";
       prefix fpcpolicyext;

       import ietf-dmm-fpc { prefix fpc; revision-date 2017-03-08; }
       import ietf-inet-types { prefix inet; revision-date 2013-07-15; }

       organization "IETF Distributed Mobility Management (DMM)
         Working Group";

       contact
          "WG Web:   <http://tools.ietf.org/wg/netmod/>
           WG List:  <mailto:netmod@ietf.org>

           WG Chair: Dapeng Liu
                     <mailto:maxpassion@gmail.com>

           WG Chair: Jouni Korhonen
                     <mailto:jouni.nospam@gmail.com>

           Editor:   Satoru Matsushima
                     <mailto:satoru.matsushima@g.softbank.co.jp>

           Editor:   Lyle Bertz
                     <mailto:lylebe551144@gmail.com>";

       description
       "This module contains YANG definition for Forwarding Policy
        Configuration Protocol (FPCP) common Policy Action and
        Descriptor extensions.

        Copyright (c) 2016 IETF Trust and the persons identified as the
        document authors. All rights reserved.

        This document is subject to BCP 78 and the IETF Trust's Legal
        Provisions Relating to IETF Documents
        (http://trustee.ietf.org/license-info) in effect on the date of
        publication of this document. Please review these documents
        carefully, as they describe your rights and restrictions with
        respect to this document. Code Components extracted from this
        document must include Simplified BSD License text as described
        in Section 4.e of the Trust Legal Provisions and are provided
        without warranty as described in the Simplified BSD License.";

       revision 2017-03-08 {
           description "Version 06 update.";
           reference "draft-ietf-dmm-fpc-cpdp-06";
       }

       revision 2016-08-03 {
           description "Changes based on -04 version of FPC draft.";
           reference "draft-ietf-dmm-fpc-cpdp-04";
       }

       identity service-function {
           base "fpc:fpc-descriptor-type";
           description "Base Identifier for Service Functions.";
       }
       identity napt-service {
           base "service-function";
           description "NAPT Service";
       }
       grouping simple-nat {
         leaf outbound-nat-address {
           type inet:ip-address;
           description "Outbound NAT Address";
         }
         description "Simple NAT value";
       }

       identity nat-service {
           base "service-function";
           description "NAT Service";
       }
       grouping simple-napt {
         leaf source-port {
           type inet:port-number;
           description "Source Port";
         }
         leaf outbound-napt-address {
           type inet:ip-address;
           description "Outbound NAPT Address";
         }
         leaf destination-port {
           type inet:port-number;
           description "Destination Port";
         }
         description "Simple NAPT Configuration";
       }

       identity copy-forward {
         base "fpc:fpc-descriptor-type";
         description "Copies a packet then forwards to a specific
           destination";
       }
       grouping copy-forward {
         container destination {
           choice value {
             case port-ref {
               leaf port-ref {
                 type fpc:fpc-vport-id;
                 description "Port";
               }
               description "Port Forward Case";
             }
             case context-ref {
               leaf context-ref {
                 type fpc:fpc-context-id;
                 description "Context";
               }
               description "Context Forward Case";
             }
             description "Copy Forward Value";
           }
           description "destination";
         }
         description "Copy Then Forward to Port/Context Action";
       }

       augment "/fpc:tenants/fpc:tenant/fpc:fpc-policy/fpc:actions/fpc:"
           + "action-value" {
         case simple-nat {
             uses fpcpolicyext:simple-nat;
             description "Simple NAT value";
         }
         case simple-napt {
             uses fpcpolicyext:simple-napt;
             description "Simple NAPT Value";
         }
         case copy-forward {
             uses fpcpolicyext:copy-forward;
             description "Copy Forward Value";
         }
         description "Policy Actions Augmentations";
       }

       grouping prefix-traffic-descriptor {
           leaf destination-ip {
               type inet:ip-prefix;
               description "Rule of destination IP";
           }
           leaf source-ip {
               type inet:ip-prefix;
               description "Rule of source IP";
           }
           description
           "Traffic descriptor group collects parameters to
            identify target traffic flow.  It represents
            source/destination as IP prefixes";
       }

       augment "/fpc:tenants/fpc:tenant/fpc:fpc-policy/fpc:"
           + "descriptors/fpc:descriptor-value" {
         case prefix-descriptor {
             uses fpcpolicyext:prefix-traffic-descriptor;
             description "traffic descriptor value";
         }
         description "Descriptor Augments";
       }
   }
   <CODE ENDS>

A.3.  FPC YANG Data Model Structure

   This section only shows the structure for FPC YANG model.

   module: ietf-dmm-fpc
   +--rw tenants
   |  +--rw tenant* [tenant-id]
   |     +--rw tenant-id       fpc:fpc-identity
   |     +--rw fpc-policy
   |     |  +--rw policy-groups* [policy-group-id]
   |     |  |  +--rw policy-group-id    fpc:fpc-policy-group-id
   |     |  |  +--rw policies*          fpc:fpc-policy-id
   |     |  +--rw policies* [policy-id]
   |     |  |  +--rw policy-id    fpc:fpc-policy-id
   |     |  |  +--rw rules* [order]
   |     |  |     +--rw order          uint32
   |     |  |     +--rw descriptors* [descriptor-id]
   |     |  |     |  +--rw descriptor-id    fpc:fpc-identity
   |     |  |     |  +--rw direction?       fpc:fpc-direction
   |     |  |     +--rw actions* [action-id]
   |     |  |        +--rw action-order?   uint32
   |     |  |        +--rw action-id       fpc:fpc-action-id-type
   |     |  +--rw descriptors* [descriptor-id]
   |     |  |  +--rw descriptor-id      fpc:fpc-identity
   |     |  |  +--rw descriptor-type    identityref
   |     |  |  +--rw (descriptor-value)?
   |     |  |     +--:(all-traffic)
   |     |  |        +--rw all-traffic?       empty
   |     |  +--rw actions* [action-id]
   |     |     +--rw action-id      fpc:fpc-action-id-type
   |     |     +--rw action-type    identityref
   |     |     +--rw (action-value)?
   |     |        +--:(drop)
   |     |           +--rw drop?          empty
   |     +--ro fpc-mobility
   |     |  +--ro contexts* [context-id]
   |     |  |  +--ro context-id               fpc:fpc-context-id
   |     |  |  +--ro vports*                  fpc:fpc-vport-id
   |     |  |  +--ro dpn-group?               fpc:fpc-dpn-group-id
   |     |  |  +--ro delegated-ip-prefixes*   inet:ip-prefix
   |     |  |  +--ro ul {fpc:fpc-basic-agent}?
   |     |  |  |  +--ro tunnel-local-address?         inet:ip-address
   |     |  |  |  +--ro tunnel-remote-address?        inet:ip-address
   |     |  |  |  +--ro mtu-size?                     uint32
   |     |  |  |  +--ro mobility-tunnel-parameters
   |     |  |  |  |  +--ro (profile-parameters)?
   |     |  |  |  |     +--:(nothing)
   |     |  |  |  |        +--ro none?   empty
   |     |  |  |  +--ro nexthop
   |     |  |  |  |  +--ro nexthop-type?   identityref
   |     |  |  |  |  +--ro (nexthop-value)?
   |     |  |  |  |     +--:(ip-nexthop)
   |     |  |  |  |     |  +--ro ip?             inet:ip-address
   |     |  |  |  |     +--:(macaddress-nexthop)
   |     |  |  |  |     |  +--ro macaddress?     ytypes:mac-address
   |     |  |  |  |     +--:(servicepath-nexthop)
   |     |  |  |  |     |  +--ro servicepath?  fpc:fpc-service-path-id
   |     |  |  |  |     +--:(mplslabel-nexthop)
   |     |  |  |  |     |  +--ro lsp?            fpc:fpc-mpls-label
   |     |  |  |  |     +--:(if-nexthop)
   |     |  |  |  |        +--ro if-index?       uint16
   |     |  |  |  +--ro qos-profile-parameters
   |     |  |  |  |  +--ro qos-type?   identityref
   |     |  |  |  |  +--ro (value)?
   |     |  |  |  +--ro dpn-parameters
   |     |  |  |  +--ro vendor-parameters* [vendor-id vendor-type]
   |     |  |  |     +--ro vendor-id      fpc:fpc-identity
   |     |  |  |     +--ro vendor-type    identityref
   |     |  |  |     +--ro (value)?
   |     |  |  |        +--:(empty-type)
   |     |  |  |           +--ro empty-type?    empty
   |     |  |  +--ro dl {fpc:fpc-basic-agent}?
   |     |  |  |  +--ro tunnel-local-address?         inet:ip-address
   |     |  |  |  +--ro tunnel-remote-address?        inet:ip-address
   |     |  |  |  +--ro mtu-size?                     uint32
   |     |  |  |  +--ro mobility-tunnel-parameters
   |     |  |  |  |  +--ro (profile-parameters)?
   |     |  |  |  |     +--:(nothing)
   |     |  |  |  |        +--ro none?   empty
   |     |  |  |  +--ro nexthop
   |     |  |  |  |  +--ro nexthop-type?   identityref
   |     |  |  |  |  +--ro (nexthop-value)?
   |     |  |  |  |     +--:(ip-nexthop)
   |     |  |  |  |     |  +--ro ip?             inet:ip-address
   |     |  |  |  |     +--:(macaddress-nexthop)
   |     |  |  |  |     |  +--ro macaddress?     ytypes:mac-address
   |     |  |  |  |     +--:(servicepath-nexthop)
   |     |  |  |  |     |  +--ro servicepath?  fpc:fpc-service-path-id
   |     |  |  |  |     +--:(mplslabel-nexthop)
   |     |  |  |  |     |  +--ro lsp?            fpc:fpc-mpls-label
   |     |  |  |  |     +--:(if-nexthop)
   |     |  |

   <CODE ENDS>

A.3.  FPC YANG Data Model Structure

   This section only shows the structure for FPC YANG model.  NOTE, it
   does NOT show the settings, Action values or Descriptor Value.

   module: ietf-dmm-fpc
   +--rw mobility
      +--rw topology
      |  +--rw dpn-set* [dpn-id]
      |        +--ro if-index?       uint16  |  +--rw dpn-id                            fpc:fpc-identity
      |  |  +--rw dpn-name?                         string
      |  +--ro qos-profile-parameters  |  +--rw dpn-resource-mapping-reference?   string
      |  |  +--rw interface-set* [access-technology role interface-id]
      |  |  +--ro qos-type?     +--rw access-technology         identityref
      |  |  |  |  |  +--ro (value)?
   |     |  |  |  +--ro dpn-parameters
   |     |  |  |  +--ro vendor-parameters* [vendor-id vendor-type]
   |     |  |  |     +--ro vendor-id      fpc:fpc-identity
   |     |  |  |     +--ro vendor-type     +--rw role                      identityref
      |  |     +--rw interface-id              fpc:fpc-interface-id
      |  |     +--ro (value)?
   |     |  |  |        +--:(empty-type)
   |     |  |  |           +--ro empty-type?    empty
   |     |  |  +--ro dpns* [dpn-id direction] {fpc:fpc-multi-dpn}?
   |     |  |  |  +--ro dpn-id                        fpc:fpc-dpn-id
   |     |  |  |  +--ro direction                     fpc:fpc-direction
   |     |  |  |  +--ro tunnel-local-address?         inet:ip-address
   |     |  |  |  +--ro tunnel-remote-address?        inet:ip-address
   |     |  |  |  +--ro mtu-size?                     uint32
   |     |  |  |  +--ro mobility-tunnel-parameters
   |     |  |  |  |  +--ro (profile-parameters)?
   |     |  |  |  |     +--:(nothing)
   |     |  |  |  |        +--ro none?   empty
   |     |  |  |  +--ro nexthop
   |     |     +--rw interface-settings-set
      |  +--rw dpn-type-set* [access-technology role]
      |  |  +--ro nexthop-type?  +--rw access-technology         identityref
      |  |  +--rw access-technology-name?   string
      |  |  +--rw role                      identityref
      |  +--ro (nexthop-value)?
   |     |  |  |  |     +--:(ip-nexthop)
   |     |  |  |  |     |  +--ro ip?             inet:ip-address
   |     |  |  |  |     +--:(macaddress-nexthop)
   |     |  |  |  |     |  +--ro macaddress?     ytypes:mac-address
   |     |  |  |  |     +--:(servicepath-nexthop)
   |     |  |  |  |     |  +--ro servicepath? fpc:fpc-service-path-id
   |     |  |  |  |     +--:(mplslabel-nexthop)
   |     |  |  |  |     |  +--ro lsp?            fpc:fpc-mpls-label
   |     |  |  |  |     +--:(if-nexthop)
   |     |  |  |  |        +--ro if-index?       uint16  |  +--rw role-name?                string
      |  |  +--rw interface-set* [interface-id]
      |  +--ro qos-profile-parameters  |     +--rw interface-id              fpc:fpc-interface-id
      |  |     +--rw interface-name?           string
      |  |  +--ro qos-type?     +--rw interface-protocol-set*   identityref
      |  |     +--rw feature-set*              identityref
      |  |     +--rw interface-settings-set
      |  +--ro (value)?
   |     |  |  |  +--ro dpn-parameters  +--rw dpn-group-set* [dpn-group-id]
      |  |  +--rw dpn-group-id           fpc:fpc-identity
      |  |  +--ro vendor-parameters* [vendor-id vendor-type]  +--rw referenced-dpns-set*
                          [access-technology role interface-id]
      |  |  |  +--rw access-technology        identityref
      |     +--ro vendor-id      fpc:fpc-identity  |  |  +--rw role                     identityref
      |  |     +--ro vendor-type    identityref  |  +--rw interface-id             fpc:fpc-interface-id
      |  |  |     +--ro (value)?  +--rw supporting-dpn-id-set*   fpc:fpc-identity
      |  |  |  +--rw dpn-group-peer-id-set*   fpc:fpc-identity
      |        +--:(empty-type)  |  +--rw dpn-group-peer-set* [remote-dpn-group-id]
      |  |  |           +--ro empty-type?    empty  +--rw remote-dpn-group-id       fpc:fpc-identity
      |  |  |  +--ro parent-context?          fpc:fpc-context-id  +--rw interface-settings-set
      |  |  +--ro vports* [vport-id]  +--rw domain-id?             fpc:fpc-identity
      |  +--rw domain-set* [domain-id]
      |  |  +--ro vport-id         fpc:fpc-vport-id  +--rw domain-id           fpc:fpc-identity
      |  |  +--rw domain-name?        string
      |  +--ro policy-groups*   fpc:fpc-policy-group-id  |  +--rw domain-reference?   string
      |  +--ro monitors*  +--rw basename?          fpc:fpc-identity
      |  +--rw base-state?        string
      |     +--ro monitor-id?         fpc:fpc-identity  +--rw base-checkpoint?   string
      +--rw policy
      |  +--rw action-definition-set* [action-id]
      |     +--ro target?             fpc-identity  |  +--rw action-id      fpc:fpc-identity
      |     +--ro (event-config-value)?  |  +--rw action-type?   identityref
      |        +--:(periodic-config)  |  +--rw (action-value)?
      |  +--rw descriptor-definition-set* [descriptor-id]
      |  +--ro period?             uint32  |  +--rw descriptor-id      fpc:fpc-identity
      |        +--:(threshold-config)  |  +--rw descriptor-type?   identityref
      |  |  +--ro lo-thresh?          uint32  +--rw (descriptor-value)?
      |  +--rw rule-definition-set* [rule-id]
      |  |  +--ro hi-thresh?          uint32  +--rw rule-id                     fpc:fpc-identity
      |  |        +--:(scheduled-config)  +--rw descriptor-match-type       enumeration
      |  |  +--rw descriptor-reference-set* [descriptor-id-reference]
      |  +--ro report-time?        uint32  |  |        +--:(events-config-ident)  +--rw descriptor-id-reference    fpc:fpc-identity
      |  |  |  +--ro event-identities*   identityref  +--rw direction?                 fpc:fpc-direction-type
      |  |        +--:(events-config)  +--rw action-reference-set* [action-order]
      |  |           +--ro event-ids*     +--rw action-order           uint32
      |  |     +--rw fpc-topology action-id-reference    fpc:fpc-identity
      |  +--rw domains* [domain-id] policy-definition-set* [policy-id]
      |  |  +--rw domain-id           fpc:fpc-domain-id policy-id    fpc:fpc-identity
      |  |  +--rw domain-name?        string rule-set* [precedence]
      |  |     +--rw domain-type?        string precedence           uint32
      |  |     +--rw domain-reference?   instance-identifier
   | rule-id-reference    fpc:fpc-identity
      |  +--rw basename?                    fpc:fpc-identity
      |        |  |       {fpc:fpc-basename-registry}?
   |        |  +--rw base-state?                  string
      |        |  |       {fpc:fpc-basename-registry}?
   |        |  +--rw base-checkpoint?             string
      +--rw installed-policy-list* [dpn-id-reference]
      |        |          {fpc:fpc-basename-registry}?  +--rw dpn-id-reference        fpc:fpc-identity
      |  +--rw dpn-id?              fpc:fpc-dpn-id installed-policy-set* [installed-policy-id]
      |  |  +--rw installed-policy-id    fpc:fpc-identity
      |       {fpc:fpc-basic-agent}?  |  +--rw control-protocols*   identityref policy-id-reference?   fpc:fpc-identity
      |  |       {fpc:fpc-basic-agent}?  +--rw policy-settings
      |  +--rw dpn-groups* [dpn-group-id] {fpc:fpc-multi-dpn}? settings-set
      +--ro mobility-context-set* [mobility-context-id]
      |  +--ro mobility-context-id                     fpc:fpc-identity
      |  +--rw dpn-group-id        fpc:fpc-dpn-group-id  +--ro dpn-group-id-reference?                 fpc:fpc-identity
      |  +--ro parent-mobility-context-id-reference?   fpc:fpc-identity
      |  +--rw data-plane-role?    identityref  +--ro dpn-reference-list* [dpn-id-reference direction]
      |  |  +--rw access-type?        identityref  +--ro dpn-id-reference                 fpc:fpc-identity
      |  |  +--rw mobility-profile?   identityref  +--ro direction
                                     fpc:fpc-direction-type
      |  |  +--rw dpn-group-peers* [remote-dpn-group-id]  +--ro dpn-settings-complementary
      |  |  +--ro interface-id-reference           fpc:fpc-interface-id
      |  +--rw remote-dpn-group-id     fpc:fpc-dpn-group-id  |  +--ro embedded-rule-set* [precedence]
      |  |  |  +--rw remote-mobility-profile?   identityref  +--ro rule-id                      fpc:fpc-identity
      |  |  |  +--rw remote-data-plane-role?    identityref  +--ro descriptor-match-type        enumeration
      |  |  |  +--rw remote-endpoint-address?   inet:ip-address  +--ro precedence                   uint32
      |  |  |  +--rw local-endpoint-address?    inet:ip-address  +--ro action-definition-set* [action-order]
      |  |  |  +--rw mtu-size?  |  +--ro action-order    uint32
      |  |  +--rw domains* [domain-id]  |  |     +--rw domain-id           fpc:fpc-domain-id  +--ro action-id?      fpc:fpc-identity
      |  |     +--rw domain-name?        string  |  |     +--rw domain-type?        string  +--ro action-type?    identityref
      |  |     +--rw domain-reference?   instance-identifier  |  |     +--rw basename?           fpc:fpc-identity  +--ro (action-value)?
      |  |  |       {fpc:fpc-basename-registry}?  +--ro descriptor-definition-set* [descriptor-id]
      |  |     +--rw base-state?         string  |     +--ro descriptor-id      fpc:fpc-identity
      |  |       {fpc:fpc-basename-registry}?  |     +--ro descriptor-type?   identityref
      |     +--rw base-checkpoint?    string  |  |             {fpc:fpc-basename-registry}?     +--ro (descriptor-value)?
      |        +--rw dpns* [dpn-id] {fpc:fpc-multi-dpn}?  |           +--rw dpn-id            fpc:fpc-dpn-id  +--ro assigned-policy-reference-set*   fpc:fpc-identity
      |           +--rw dpn-name?         string  +--ro requested-policy-reference-set*         fpc:fpc-identity
      |  +--ro context-settings-complementary
      +--rw dpn-groups*       fpc:fpc-dpn-group-id
   | monitor-set* [monitor-id]
         +--rw monitor-id             fpc:fpc-identity
         +--rw node-reference?   instance-identifier deterrable?            boolean
         +--rw fpc-agent-info binding-information
         +--rw supported-features*      string target                 fpc-identity
         +--rw supported-events* [event] (configuration)
            +--:(periodic-config)
            |  +--rw event       identityref period?                uint32
            +--:(threshold-config)
            |  +--rw lo-thresh?             uint32
            |  +--rw event-id?   fpc:event-type-id hi-thresh?             uint32
            +--:(scheduled-config)
            |  +--rw supported-error-types* [error-type] report-time?           uint32
            +--:(events-config-ident)
            |  +--rw error-type event-identities*      identityref
            +--:(events-config)
               +--rw error-type-id?   fpc:error-type-id event-ids*             uint32

                      Figure 28: 23: YANG FPC Agent Tree

Authors' Addresses

   Satoru Matsushima
   SoftBank
   1-9-1,Higashi-Shimbashi,Minato-Ku
   Tokyo  105-7322
   Japan

   Email: satoru.matsushima@g.softbank.co.jp

   Lyle Bertz
   6220 Sprint Parkway
   Overland Park  KS, 66251
   USA

   Email: lylebe551144@gmail.com

   Marco Liebsch
   NEC Laboratories Europe
   NEC Europe Ltd.
   Kurfuersten-Anlage 36
   D-69115 Heidelberg
   Germany

   Phone: +49 6221 4342146
   Email: liebsch@neclab.eu

   Sri Gundavelli
   Cisco
   170 West Tasman Drive
   San Jose, CA  95134
   USA

   Email: sgundave@cisco.com
   Danny Moses

   Email: danny.moses@intel.com

   Charles E. Perkins
   Futurewei Inc.
   2330 Central Expressway
   Santa Clara, CA  95050
   USA

   Phone: +1-408-330-4586
   Email: charliep@computer.org