From acf5a8a052e2f7f7c2b03c023df3dd489688cb00 Mon Sep 17 00:00:00 2001
From: Michal Cmarada <mcmarada@cisco.com>
Date: Mon, 28 Jan 2019 14:23:11 +0100
Subject: remove vpp deprecated tap-cli interface

Change-Id: I5b78cd2c9d8250b6af691d124fd31bb1bf822fb1
Signed-off-by: Michal Cmarada <mcmarada@cisco.com>
---
 v3po/api/src/main/yang/v3po@2018-10-08.yang | 963 ----------------------------
 v3po/api/src/main/yang/v3po@2019-01-28.yang | 931 +++++++++++++++++++++++++++
 2 files changed, 931 insertions(+), 963 deletions(-)
 delete mode 100644 v3po/api/src/main/yang/v3po@2018-10-08.yang
 create mode 100644 v3po/api/src/main/yang/v3po@2019-01-28.yang

(limited to 'v3po/api')

diff --git a/v3po/api/src/main/yang/v3po@2018-10-08.yang b/v3po/api/src/main/yang/v3po@2018-10-08.yang
deleted file mode 100644
index b93cd3386..000000000
--- a/v3po/api/src/main/yang/v3po@2018-10-08.yang
+++ /dev/null
@@ -1,963 +0,0 @@
-module v3po {
-  yang-version 1;
-  namespace "http://fd.io/hc2vpp/yang/v3po";
-  prefix "v3po";
-
-  import iana-if-type {
-    prefix "ianaift";
-  }
-  import ietf-interfaces {
-    prefix "if";
-  }
-  import ietf-yang-types {
-    prefix "yang";
-  }
-  import ietf-inet-types {
-    prefix "inet";
-  }
-  import yang-ext {
-    prefix "ext";
-  }
-  import vpp-fib-table-management {
-      prefix fib-management;
-      revision-date 2018-05-21;
-  }
-
-  organization
-    "FD.io - The Fast Data Project";
-
-  contact
-    "Hc2vpp Wiki <https://wiki.fd.io/view/Hc2vpp>
-     Mailing List <hc2vpp@lists.fd.io>";
-
-  description
-    "This module contains a collection of YANG definitions
-     that extend ietf-interfaces module with VPP specific interface types.
-
-     Copyright (c) 2015-2017 Cisco and/or its affiliates.
-
-     Licensed under the Apache License, Version 2.0 (the 'License');
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at:
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an 'AS IS' BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.";
-
-  revision "2018-10-08" {
-    description
-      "Revision changes:
-       - adds support for Tap v2 interface
-       - fixes tap-name pattern";
-  }
-
-  revision "2018-07-03" {
-    description
-      "Revision changes:
-       - adds support for af-packet interface
-       - uses references to fib-management module instead of uint32 identifiers
-       - changes type of IP addresses from inet:ip-address to inet:ip-address-no-zone
-       - fixes some minor issues";
-  }
-
-  revision "2017-06-07" {
-    description "Eliminated config leafrefs in operational tree";
-  }
-
-  revision "2017-03-15" {
-    description
-      "Revision changes:
-       - acl and ietf-acl moved to vpp-interface-acl
-       - vpp-state and rpc moved to vpp-management
-       - bridge domains moved to standalone container";
-  }
-
-  revision "2016-12-14" {
-    description
-      "This revision adds the following new features:
-       - ingress/egress ACLs support
-       - moved ACL definitions to vpp-acl module
-       - updated l2 container constraint (permit IP address on BVI interface)
-       - added PID of vpp process to vpp-state
-       - added support for Loopback interfaces
-       - added support for port mirroring";
-  }
-
-  revision "2015-01-05" {
-    description "Initial revision of v3po model";
-  }
-
-  typedef bridge-domain-ref {
-    type leafref {
-      path "/bridge-domains/bridge-domain/name";
-    }
-    description
-      "This type is used by to reference a bridge domain table";
-  }
-
-  typedef bridged-virtual-interface-ref {
-    type leafref {
-      path "/if:interfaces/if:interface/l2/bridged-virtual-interface";
-    }
-    description
-      "This type is used by to reference a bridged virtual interface";
-  }
-
-  identity vxlan-tunnel {
-    base if:interface-type;
-  }
-
-  identity gre-tunnel {
-    base if:interface-type;
-  }
-
-  identity vhost-user {
-    base if:interface-type;
-  }
-
-  identity tap {
-    base if:interface-type;
-  }
-
-  identity tap-v2 {
-    base if:interface-type;
-  }
-
-  identity loopback {
-    base if:interface-type;
-  }
-
-  identity l2-fib-action {
-    description "Base identity for l2-fib actions";
-  }
-
-  identity l2-fib-forward {
-    base l2-fib-action;
-    description
-      "Forwards packet with configured mac address";
-  }
-
-  identity l2-fib-filter {
-    base l2-fib-action;
-    description
-      "Drops packet with configured mac address";
-  }
-
-  typedef l2-fib-action {
-    type identityref {
-      base "l2-fib-action";
-    }
-    description "Identifies a specific L2 FIB action";
-  }
-
-  typedef vxlan-vni {
-    // FIXME: should be in a vxlan-specific model
-    description "VXLAN Network Identifier";
-    type uint32 {
-      range "0..16777215";
-    }
-  }
-
-  typedef vhost-user-role {
-    type enumeration {
-      enum "server";
-      enum "client";
-    }
-  }
-
-  identity vxlan-gpe-tunnel {
-    base if:interface-type;
-  }
-
-  identity af-packet {
-    base if:interface-type;
-  }
-
-  typedef vxlan-gpe-vni {
-    description "VNI used in a VXLAN-GPE tunnel";
-    type uint32 {
-      range "0..16777215";
-    }
-  }
-
-  typedef vxlan-gpe-next-protocol {
-    type enumeration {
-      enum "ipv4" {
-        value 1;
-      }
-      enum "ipv6" {
-        value 2;
-      }
-      enum "ethernet" {
-        value 3;
-      }
-      enum "nsh" {
-        value 4;
-      }
-    }
-  }
-
-
-  typedef span-state {
-    type enumeration {
-      enum "receive" {
-        value "1";
-        description
-            "Receive (Rx) SPAN—The goal of receive (or ingress) SPAN
-             is to monitor as much as possible all the packets received by the source interface.
-             A copy of each packet received by the source is sent to the destination port for that SPAN session.
-             You can monitor a series or range of ingress ports in a SPAN session.";
-      }
-
-      enum "transmit" {
-        value "2";
-        description
-            "Transmit (Tx) SPAN—The goal of transmit (or egress) SPAN is to monitor as much as possible all the packets
-             sent by the source interface after all modification and processing is performed by the switch.
-             A copy of each packet sent by the source is sent to the destination port for that SPAN session.
-             The copy is provided after the packet is modified. Monitors a range of egress ports in a SPAN session.";
-      }
-
-      enum "both" {
-        value "3";
-        description
-            "In a SPAN session, you can monitor a series or range of ports for both received and sent packets.";
-      }
-    }
-  }
-
-  grouping bridge-domain-attributes {
-    leaf flood {
-      type boolean;
-      default true;
-      description
-      "Enable/disable L2 flooding.";
-    }
-    leaf forward {
-      type boolean;
-      default true;
-      description
-      "Enable/disable L2 forwarding.";
-    }
-    leaf learn {
-      type boolean;
-      default true;
-      description
-      "Enable/disable L2 learning.";
-    }
-    leaf unknown-unicast-flood {
-      type boolean;
-      default true;
-    }
-    leaf arp-termination {
-      type boolean;
-      default false;
-    }
-
-    container arp-termination-table {
-      when "../v3po:arp-termination = 'true'";
-
-      // TODO(HONEYCOMB-133): add support for read (after VPP-230 is done)
-      list arp-termination-table-entry {
-        key "ip-address phys-address";
-        leaf ip-address {
-          type inet:ip-address-no-zone;
-        }
-        leaf phys-address {
-          type yang:phys-address;
-        }
-      }
-    }
-  }
-
-  // TODO express constraints for L2 FIB entries in YANG if possible
-  grouping l2-fib-attributes {
-    container l2-fib-table {
-      list l2-fib-entry {
-        key "phys-address";
-
-        leaf phys-address {
-          type yang:phys-address;
-        }
-
-        leaf outgoing-interface {
-          // either filter must be specified or interface(can't be both)
-          when "../action != 'l2-fib-filter'";
-          type if:interface-ref;
-          // mandatory true; - when is not actually resolved, so mandatory can't be in place
-          description
-            "One of interfaces assigned to the FIB table's bridge-domain.";
-        }
-        leaf static-config {
-          type boolean;
-          default false;
-          description
-            "Static entries cannot be overridden by mac learning.";
-        }
-        leaf action {
-          type l2-fib-action;
-          mandatory true;
-          description
-            "L2 FIB action. For filter action, entry must be configured as static.";
-        }
-        leaf bridged-virtual-interface {
-          when "../action = 'l2-fib-forward'";
-          type boolean;
-          config false; // FIXME setting bvi is currently not supported by VPP's binary api
-        }
-      }
-    }
-  }
-
-  grouping interface-tag {
-    leaf tag {
-      type string {
-        length 1..63;
-      }
-      description
-        "ASCII string placeholder for interface metadata. Value is stored in vpp,
-         and returned in read requests. No processing involved.";
-    }
-  }
-
-  grouping tap-interface-base-attributes {
-    leaf tap-name {
-      type string{
-        pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
-      }
-    }
-    uses interface-tag;
-  }
-
-  grouping tap-interface-config-attributes {
-    leaf mac {
-      type yang:phys-address;
-      mandatory false;
-      description "Mac address to be set for the tap interface. Random will be used if not configured";
-    }
-
-    leaf device-instance {
-      type uint32;
-      mandatory false;
-      description "Custom device instance. Autogenerated will be used if not configured";
-    }
-  }
-
-  grouping tap-v2-interface-base-attributes {
-    leaf id {
-      type uint32;
-      description "Interface ID.";
-    }
-
-    leaf tx-ring-size {
-      type uint16;
-      description "Optional transmit ring size, default is 256 entries, must be power of 2.";
-      default 256;
-    }
-
-    leaf rx-ring-size {
-      type uint16;
-      description "Optional receive ring size, default is 256 entries, must be power of 2.";
-      default 256;
-    }
-
-    leaf host-mac {
-      type yang:phys-address;
-      description "Mac address to be set for the tap host interface.";
-    }
-
-    leaf host-interface-name {
-      type string {
-        pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
-        length 1..63;
-      }
-      description "Name of the tap host interface.";
-    }
-
-    leaf host-namespace {
-      type string {
-        pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
-        length 1..63;
-      }
-      description "Host namespace to assign this tap interface to.";
-    }
-
-    leaf host-bridge {
-      type string {
-        pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
-        length 1..63;
-      }
-      description "Host bridge to assign this tap interface to.";
-    }
-
-    leaf host-ipv4-address {
-      type inet:ipv4-prefix;
-      description "Host IPv4 address in form of IPv4Prefix.";
-    }
-
-    leaf host-ipv6-address {
-      type inet:ipv6-prefix;
-      description "Host IPv6 address in form of IPv6Prefix.";
-    }
-
-    uses interface-tag;
-  }
-
-  grouping tap-v2-interface-config-attributes {
-    leaf mac {
-      type yang:phys-address;
-      description "Mac address to be set for the tap v2 interface. Random will be used if not configured.";
-    }
-    leaf host-ipv4-gateway {
-      type inet:ipv4-address;
-      description "Host IPv4 gateway address.";
-    }
-
-    leaf host-ipv6-gateway {
-      type inet:ipv6-address;
-      description "Host IPv6 gateway address.";
-    }
-  }
-
-  grouping tap-v2-interface-state-attributes {
-      leaf device-name {
-        config false;
-        type string{
-          pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
-          length 1..63;
-        }
-        description "Device name of the Tap v2 interface in VPP.";
-      }
-  }
-
-  grouping loopback-interface-base-attributes {
-    leaf mac {
-      type yang:phys-address;
-      mandatory false;
-      description "Mac address of the loopback interface";
-    }
-  }
-
-  grouping ethernet-base-attributes {
-    leaf mtu {
-      type uint16 {
-        range "64..9216";
-      }
-      units "octets";
-      default 9216;
-      description
-      "The size, in octets, of the largest packet that the
-       hardware interface will send and receive.
-
-       Mapped to hw_interface_set_mtu VPP API message which programs the NIC.";
-    }
-  }
-
-  grouping routing-base-attributes {
-    leaf ipv4-vrf-id {
-      type fib-management:fib-table-list-ref;
-    }
-    leaf ipv6-vrf-id {
-      type fib-management:fib-table-list-ref;
-    }
-    description
-      "Defines VRF tables used for ipv4 and ipv6 traffic";
-  }
-
-  grouping ethernet-state-attributes {
-    leaf manufacturer-description {
-      type string;
-      config false;
-    }
-    leaf duplex {
-      type enumeration {
-        enum "half";
-        enum "full";
-      }
-      config false;
-    }
-  }
-
-  grouping vhost-user-interface-base-attributes {
-    leaf socket {
-      type string {
-        length 1..255;
-      }
-    }
-    leaf role {
-      type vhost-user-role;
-      default "server";
-    }
-    uses interface-tag;
-    description "vhost-user settings";
-  }
-
-  grouping vhost-user-interface-config-attributes {
-    leaf device-instance {
-      type uint32;
-      mandatory false;
-      description "Custom device instance. Autogenerated will be used if not configured";
-    }
-    description "vhost-user settings";
-  }
-
-  grouping vhost-user-interface-state-attributes {
-    leaf features {
-      type uint64;
-      config false;
-    }
-    leaf virtio-net-hdr-size {
-      type uint32;
-      config false;
-    }
-    leaf num-memory-regions {
-      type uint32;
-      config false;
-    }
-    leaf connect-error {
-      type string;
-      config false;
-    }
-  }
-
-  /*
-   * Defines the supported decap node for vxlan.
-   */
-  identity decap-node {
-    description
-    "Define the supported decap node";
-  }
-  identity l2-input {
-    base decap-node;
-    description
-    "The next decap node is l2-input";
-  }
-  identity nsh-proxy {
-    base decap-node;
-    description
-    "The next decap node is nsh-proxy";
-  }
-  typedef vxlan-decap-node {
-    type identityref {
-      base "decap-node";
-    }
-  }
-  grouping vxlan-base-attributes {
-    // FIXME: this should be in an vxlan-specific extension
-    leaf src {
-      /*mandatory true;*/
-      type inet:ip-address-no-zone;
-    }
-    leaf dst {
-      /*mandatory true;*/
-      type inet:ip-address-no-zone;
-    }
-    leaf vni {
-      /*mandatory true;*/
-      type vxlan-vni;
-    }
-    leaf encap-vrf-id {
-      /*mandatory true;*/
-      type fib-management:fib-table-list-ref;
-    }
-    leaf decap-next {
-      type vxlan-decap-node;
-      default "l2-input";
-    }
-  }
-
-  grouping gre-base-attributes {
-    leaf src {
-      /*mandatory true;*/
-      type inet:ip-address-no-zone;
-    }
-    leaf dst {
-      /*mandatory true;*/
-      type inet:ip-address-no-zone;
-    }
-    leaf outer-fib-id {
-      type uint32;
-    }
-  }
-
-  grouping vxlan-gpe-base-attributes {
-    leaf local {
-      /*mandatory true;*/
-      type inet:ip-address-no-zone;
-    }
-    leaf remote {
-      /*mandatory true;*/
-      type inet:ip-address-no-zone;
-    }
-    leaf vni {
-      /*mandatory true;*/
-      type vxlan-gpe-vni;
-    }
-    leaf next-protocol {
-      type vxlan-gpe-next-protocol;
-    }
-    leaf encap-vrf-id {
-      type uint32;
-    }
-    leaf decap-vrf-id {
-      type uint32;
-    }
-  }
-
-  grouping af-packet-base-attributes {
-    leaf host-interface-name {
-      type string {
-        length "1..63";
-      }
-      /* mandatory true; */
-      description "Name of the host interface (veth end point).";
-    }
-    leaf mac {
-      type yang:phys-address;
-      mandatory false;
-      description "Mac address to be set for the af-packet interface. Random will be used if not configured.";
-    }
-    reference
-      "https://docs.fd.io/vpp/18.07/clicmd_src_vnet_devices_af_packet.html";
-  }
-
-  grouping l2-config-attributes {
-      description
-      "Parameters for configuring Layer2 features on interfaces.";
-
-      choice interconnection {
-        case xconnect-based {
-          leaf xconnect-outgoing-interface {
-            /* Don't allow selection of this interface */
-            must "../../if:name != current()";
-            type if:interface-ref;
-            description
-              "L2 xconnect mode";
-          }
-        }
-        case bridge-based {
-          uses bridge-based-attributes;
-        }
-      }
-  }
-
-  grouping l2-state-attributes {
-    description
-    "Parameters for configuring Layer2 features on interfaces.";
-
-    choice interconnection {
-      case xconnect-based {
-        leaf xconnect-outgoing-interface {
-          /* Don't allow selection of this interface */
-          must "../../if:name != current()";
-          type if:interface-state-ref;
-          description
-            "L2 xconnect mode";
-        }
-      }
-      case bridge-based {
-        uses bridge-based-attributes;
-      }
-    }
-  }
-
-  grouping bridge-based-attributes {
-    leaf bridge-domain {
-      type bridge-domain-ref;
-      mandatory true;
-      description
-        "Interfaces in a bridge-domain forward packets to other
-         interfaces in the same bridge-domain based on
-         destination mac address.";
-    }
-    leaf split-horizon-group {
-      when "../bridge-domain";
-      type uint8 {
-        range "0..255";
-      }
-      default 0; //no split horizon group
-      description
-        "Interface's split-horizon group. Interfaces in the same
-         bridge-domain and split-horizon group can not forward
-         packets between each other. ";
-    }
-    leaf bridged-virtual-interface {
-      when "../bridge-domain";
-      type boolean;
-      default false;
-      description
-        "Interface forward packets in the bridge-domain
-         associated with the BVI.";
-    }
-  }
-
-  grouping span-attributes {
-    description "Parameters of the SPAN feature";
-
-    container mirrored-interfaces {
-      list mirrored-interface {
-        key "iface-ref";
-        leaf iface-ref {
-          type if:interface-ref;
-        }
-
-        leaf state {
-          type span-state;
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping span-state-attributes {
-      description "Parameters of the SPAN feature";
-
-      container mirrored-interfaces {
-        list mirrored-interface {
-          key "iface-ref";
-          leaf iface-ref {
-            type if:interface-state-ref;
-          }
-
-          leaf state {
-            type span-state;
-            mandatory true;
-          }
-        }
-      }
-    }
-
-  augment /if:interfaces/if:interface {
-    ext:augment-identifier "vpp-interface-augmentation";
-
-    // FIXME using ietf-interfaces model for vpp interfaces makes it hard to implement because:
-    // 1. The link between interface type and this augmentation is unclear
-    // 2. Only this augmentation with combination of ifc type is trigger to do something for vpp, what if user only configures base interface stuff ? + We need to get leaves defined by ietf-interfaces when we are processing this augment
-    // 3. The ietf-interfaces model does not define groupings which makes types reuse difficult
-
-    container tap {
-      when "../if:type = 'v3po:tap'";
-      uses tap-interface-base-attributes;
-      uses tap-interface-config-attributes;
-    }
-
-    container tap-v2 {
-      when "../if:type = 'v3po:tap-v2'";
-      uses tap-v2-interface-base-attributes;
-      uses tap-v2-interface-config-attributes;
-    }
-
-    container loopback {
-      presence "Presence of this container indicates loopback nature of the interface";
-      when "../if:type = 'v3po:loopback'";
-      uses loopback-interface-base-attributes;
-    }
-
-    container ethernet {
-      when "../if:type = 'ianaift:ethernetCsmacd'";
-      uses ethernet-base-attributes;
-    }
-
-    container routing {
-      uses routing-base-attributes;
-    }
-
-    container vhost-user {
-      when "../if:type = 'v3po:vhost-user'";
-      uses vhost-user-interface-base-attributes;
-      uses vhost-user-interface-config-attributes;
-    }
-
-    container vxlan {
-      when "../if:type = 'v3po:vxlan-tunnel'";
-      uses vxlan-base-attributes;
-    }
-
-    container gre {
-      when "../if:type = 'v3po:gre-tunnel'";
-      uses gre-base-attributes;
-    }
-
-    container l2 {
-      must "bridged-virtual-interface = 'true' or " +
-           "(not (../if:ipv4[if:enabled = 'true']/if:address/if:ip) and " +
-           "not (../if:ipv6[if:enabled = 'true']/if:address/if:ip))";
-
-      uses l2-config-attributes;
-    }
-
-    container vxlan-gpe {
-      when "../if:type = 'v3po:vxlan-gpe-tunnel'";
-
-      uses vxlan-gpe-base-attributes;
-    }
-
-    container af-packet {
-      when "../if:type = 'v3po:af-packet'";
-      uses af-packet-base-attributes;
-    }
-
-    container span {
-      uses span-attributes;
-    }
-  }
-
-  container bridge-domains {
-    presence "Bridge domains configuration";
-    list bridge-domain {
-      key "name";
-
-      leaf name {
-        type string;
-      }
-
-      uses bridge-domain-attributes;
-      uses l2-fib-attributes;
-
-      description
-        "bridge-domain configuration";
-    }
-  }
-
-  augment /if:interfaces-state/if:interface {
-    ext:augment-identifier "vpp-interface-state-augmentation";
-
-    leaf description {
-      type string;
-    }
-
-    container tap {
-      when "../if:type = 'v3po:tap'";
-      uses tap-interface-base-attributes;
-    }
-
-    container tap-v2 {
-      when "../if:type = 'v3po:tap-v2'";
-      uses tap-v2-interface-base-attributes;
-      uses tap-v2-interface-state-attributes;
-    }
-
-    container ethernet {
-      when "../if:type = 'ianaift:ethernetCsmacd'";
-      uses ethernet-base-attributes;
-      uses ethernet-state-attributes;
-    }
-
-    container routing {
-      uses routing-base-attributes;
-    }
-
-    container vhost-user {
-      when "../if:type = 'v3po:vhost-user'";
-      uses vhost-user-interface-base-attributes;
-      uses vhost-user-interface-state-attributes;
-    }
-
-    container vxlan {
-      when "../if:type = 'v3po:vxlan-tunnel'";
-      uses vxlan-base-attributes;
-    }
-    container vxlan-gpe {
-      when "../if:type = 'v3po:vxlan-gpe-tunnel'";
-
-      uses vxlan-gpe-base-attributes;
-    }
-
-    container gre {
-      when "../if:type = 'gre-tunnel'";
-      uses gre-base-attributes;
-    }
-
-    container l2 {
-      must "bridged-virtual-interface = 'true' or " +
-           "(not (../if:ipv4[if:enabled = 'true']/if:address/if:ip) and " +
-           "not (../if:ipv6[if:enabled = 'true']/if:address/if:ip))";
-
-      uses l2-state-attributes;
-    }
-
-    container af-packet {
-      when "../if:type = 'v3po:af-packet'";
-      uses af-packet-base-attributes;
-    }
-
-    container span {
-      uses span-state-attributes;
-    }
-  }
-
-  augment /if:interfaces-state/if:interface/if:statistics {
-    ext:augment-identifier "vpp-interface-statistics-augmentation";
-    leaf in-errors-no-buf {
-      type yang:counter64;
-    }
-    leaf in-errors-miss {
-      type yang:counter64;
-    }
-    leaf out-discards-fifo-full {
-      type yang:counter64;
-    }
-  }
-
-  container bridge-domains-state {
-      // FIXME: Should this live in bridge-domain.yang in a modular fashion ?
-      config "false";
-      list bridge-domain {
-
-        key "name";
-        leaf name {
-          type string;
-        }
-
-        uses bridge-domain-attributes;
-        uses l2-fib-attributes;
-
-        description
-          "bridge-domain operational data";
-      }
-  }
-
-  // VPP Notifications
-
-  typedef interface-status {
-    type enumeration {
-      enum up {
-        value 1;
-      }
-      enum down {
-        value 0;
-      }
-    }
-  }
-
-  typedef interface-name-or-index {
-    type union {
-      type string;
-      type uint32;
-    }
-  }
-
-  notification interface-state-change {
-    leaf name {
-        type interface-name-or-index;
-    }
-
-    leaf admin-status {
-        type interface-status;
-    }
-
-    leaf oper-status {
-        type interface-status;
-    }
-  }
-
-  notification interface-deleted {
-    leaf name {
-        type interface-name-or-index;
-    }
-  }
-}
diff --git a/v3po/api/src/main/yang/v3po@2019-01-28.yang b/v3po/api/src/main/yang/v3po@2019-01-28.yang
new file mode 100644
index 000000000..9fbb6c6d3
--- /dev/null
+++ b/v3po/api/src/main/yang/v3po@2019-01-28.yang
@@ -0,0 +1,931 @@
+module v3po {
+  yang-version 1;
+  namespace "http://fd.io/hc2vpp/yang/v3po";
+  prefix "v3po";
+
+  import iana-if-type {
+    prefix "ianaift";
+  }
+  import ietf-interfaces {
+    prefix "if";
+  }
+  import ietf-yang-types {
+    prefix "yang";
+  }
+  import ietf-inet-types {
+    prefix "inet";
+  }
+  import yang-ext {
+    prefix "ext";
+  }
+  import vpp-fib-table-management {
+      prefix fib-management;
+      revision-date 2018-05-21;
+  }
+
+  organization
+    "FD.io - The Fast Data Project";
+
+  contact
+    "Hc2vpp Wiki <https://wiki.fd.io/view/Hc2vpp>
+     Mailing List <hc2vpp@lists.fd.io>";
+
+  description
+    "This module contains a collection of YANG definitions
+     that extend ietf-interfaces module with VPP specific interface types.
+
+     Copyright (c) 2015-2017 Cisco and/or its affiliates.
+
+     Licensed under the Apache License, Version 2.0 (the 'License');
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at:
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an 'AS IS' BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.";
+
+  revision "2019-01-28" {
+    description
+      "Revision changes:
+       - removed deprecated tap-cli interface";
+  }
+
+  revision "2018-10-08" {
+    description
+      "Revision changes:
+       - adds support for Tap v2 interface
+       - fixes tap-name pattern";
+  }
+
+  revision "2018-07-03" {
+    description
+      "Revision changes:
+       - adds support for af-packet interface
+       - uses references to fib-management module instead of uint32 identifiers
+       - changes type of IP addresses from inet:ip-address to inet:ip-address-no-zone
+       - fixes some minor issues";
+  }
+
+  revision "2017-06-07" {
+    description "Eliminated config leafrefs in operational tree";
+  }
+
+  revision "2017-03-15" {
+    description
+      "Revision changes:
+       - acl and ietf-acl moved to vpp-interface-acl
+       - vpp-state and rpc moved to vpp-management
+       - bridge domains moved to standalone container";
+  }
+
+  revision "2016-12-14" {
+    description
+      "This revision adds the following new features:
+       - ingress/egress ACLs support
+       - moved ACL definitions to vpp-acl module
+       - updated l2 container constraint (permit IP address on BVI interface)
+       - added PID of vpp process to vpp-state
+       - added support for Loopback interfaces
+       - added support for port mirroring";
+  }
+
+  revision "2015-01-05" {
+    description "Initial revision of v3po model";
+  }
+
+  typedef bridge-domain-ref {
+    type leafref {
+      path "/bridge-domains/bridge-domain/name";
+    }
+    description
+      "This type is used by to reference a bridge domain table";
+  }
+
+  typedef bridged-virtual-interface-ref {
+    type leafref {
+      path "/if:interfaces/if:interface/l2/bridged-virtual-interface";
+    }
+    description
+      "This type is used by to reference a bridged virtual interface";
+  }
+
+  identity vxlan-tunnel {
+    base if:interface-type;
+  }
+
+  identity gre-tunnel {
+    base if:interface-type;
+  }
+
+  identity vhost-user {
+    base if:interface-type;
+  }
+
+  identity tap-v2 {
+    base if:interface-type;
+  }
+
+  identity loopback {
+    base if:interface-type;
+  }
+
+  identity l2-fib-action {
+    description "Base identity for l2-fib actions";
+  }
+
+  identity l2-fib-forward {
+    base l2-fib-action;
+    description
+      "Forwards packet with configured mac address";
+  }
+
+  identity l2-fib-filter {
+    base l2-fib-action;
+    description
+      "Drops packet with configured mac address";
+  }
+
+  typedef l2-fib-action {
+    type identityref {
+      base "l2-fib-action";
+    }
+    description "Identifies a specific L2 FIB action";
+  }
+
+  typedef vxlan-vni {
+    // FIXME: should be in a vxlan-specific model
+    description "VXLAN Network Identifier";
+    type uint32 {
+      range "0..16777215";
+    }
+  }
+
+  typedef vhost-user-role {
+    type enumeration {
+      enum "server";
+      enum "client";
+    }
+  }
+
+  identity vxlan-gpe-tunnel {
+    base if:interface-type;
+  }
+
+  identity af-packet {
+    base if:interface-type;
+  }
+
+  typedef vxlan-gpe-vni {
+    description "VNI used in a VXLAN-GPE tunnel";
+    type uint32 {
+      range "0..16777215";
+    }
+  }
+
+  typedef vxlan-gpe-next-protocol {
+    type enumeration {
+      enum "ipv4" {
+        value 1;
+      }
+      enum "ipv6" {
+        value 2;
+      }
+      enum "ethernet" {
+        value 3;
+      }
+      enum "nsh" {
+        value 4;
+      }
+    }
+  }
+
+
+  typedef span-state {
+    type enumeration {
+      enum "receive" {
+        value "1";
+        description
+            "Receive (Rx) SPAN—The goal of receive (or ingress) SPAN
+             is to monitor as much as possible all the packets received by the source interface.
+             A copy of each packet received by the source is sent to the destination port for that SPAN session.
+             You can monitor a series or range of ingress ports in a SPAN session.";
+      }
+
+      enum "transmit" {
+        value "2";
+        description
+            "Transmit (Tx) SPAN—The goal of transmit (or egress) SPAN is to monitor as much as possible all the packets
+             sent by the source interface after all modification and processing is performed by the switch.
+             A copy of each packet sent by the source is sent to the destination port for that SPAN session.
+             The copy is provided after the packet is modified. Monitors a range of egress ports in a SPAN session.";
+      }
+
+      enum "both" {
+        value "3";
+        description
+            "In a SPAN session, you can monitor a series or range of ports for both received and sent packets.";
+      }
+    }
+  }
+
+  grouping bridge-domain-attributes {
+    leaf flood {
+      type boolean;
+      default true;
+      description
+      "Enable/disable L2 flooding.";
+    }
+    leaf forward {
+      type boolean;
+      default true;
+      description
+      "Enable/disable L2 forwarding.";
+    }
+    leaf learn {
+      type boolean;
+      default true;
+      description
+      "Enable/disable L2 learning.";
+    }
+    leaf unknown-unicast-flood {
+      type boolean;
+      default true;
+    }
+    leaf arp-termination {
+      type boolean;
+      default false;
+    }
+
+    container arp-termination-table {
+      when "../v3po:arp-termination = 'true'";
+
+      // TODO(HONEYCOMB-133): add support for read (after VPP-230 is done)
+      list arp-termination-table-entry {
+        key "ip-address phys-address";
+        leaf ip-address {
+          type inet:ip-address-no-zone;
+        }
+        leaf phys-address {
+          type yang:phys-address;
+        }
+      }
+    }
+  }
+
+  // TODO express constraints for L2 FIB entries in YANG if possible
+  grouping l2-fib-attributes {
+    container l2-fib-table {
+      list l2-fib-entry {
+        key "phys-address";
+
+        leaf phys-address {
+          type yang:phys-address;
+        }
+
+        leaf outgoing-interface {
+          // either filter must be specified or interface(can't be both)
+          when "../action != 'l2-fib-filter'";
+          type if:interface-ref;
+          // mandatory true; - when is not actually resolved, so mandatory can't be in place
+          description
+            "One of interfaces assigned to the FIB table's bridge-domain.";
+        }
+        leaf static-config {
+          type boolean;
+          default false;
+          description
+            "Static entries cannot be overridden by mac learning.";
+        }
+        leaf action {
+          type l2-fib-action;
+          mandatory true;
+          description
+            "L2 FIB action. For filter action, entry must be configured as static.";
+        }
+        leaf bridged-virtual-interface {
+          when "../action = 'l2-fib-forward'";
+          type boolean;
+          config false; // FIXME setting bvi is currently not supported by VPP's binary api
+        }
+      }
+    }
+  }
+
+  grouping interface-tag {
+    leaf tag {
+      type string {
+        length 1..63;
+      }
+      description
+        "ASCII string placeholder for interface metadata. Value is stored in vpp,
+         and returned in read requests. No processing involved.";
+    }
+  }
+
+  grouping tap-v2-interface-base-attributes {
+    leaf id {
+      type uint32;
+      description "Interface ID.";
+    }
+
+    leaf tx-ring-size {
+      type uint16;
+      description "Optional transmit ring size, default is 256 entries, must be power of 2.";
+      default 256;
+    }
+
+    leaf rx-ring-size {
+      type uint16;
+      description "Optional receive ring size, default is 256 entries, must be power of 2.";
+      default 256;
+    }
+
+    leaf host-mac {
+      type yang:phys-address;
+      description "Mac address to be set for the tap host interface.";
+    }
+
+    leaf host-interface-name {
+      type string {
+        pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
+        length 1..63;
+      }
+      description "Name of the tap host interface.";
+    }
+
+    leaf host-namespace {
+      type string {
+        pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
+        length 1..63;
+      }
+      description "Host namespace to assign this tap interface to.";
+    }
+
+    leaf host-bridge {
+      type string {
+        pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
+        length 1..63;
+      }
+      description "Host bridge to assign this tap interface to.";
+    }
+
+    leaf host-ipv4-address {
+      type inet:ipv4-prefix;
+      description "Host IPv4 address in form of IPv4Prefix.";
+    }
+
+    leaf host-ipv6-address {
+      type inet:ipv6-prefix;
+      description "Host IPv6 address in form of IPv6Prefix.";
+    }
+
+    uses interface-tag;
+  }
+
+  grouping tap-v2-interface-config-attributes {
+    leaf mac {
+      type yang:phys-address;
+      description "Mac address to be set for the tap v2 interface. Random will be used if not configured.";
+    }
+    leaf host-ipv4-gateway {
+      type inet:ipv4-address;
+      description "Host IPv4 gateway address.";
+    }
+
+    leaf host-ipv6-gateway {
+      type inet:ipv6-address;
+      description "Host IPv6 gateway address.";
+    }
+  }
+
+  grouping tap-v2-interface-state-attributes {
+      leaf device-name {
+        config false;
+        type string{
+          pattern '[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*';
+          length 1..63;
+        }
+        description "Device name of the Tap v2 interface in VPP.";
+      }
+  }
+
+  grouping loopback-interface-base-attributes {
+    leaf mac {
+      type yang:phys-address;
+      mandatory false;
+      description "Mac address of the loopback interface";
+    }
+  }
+
+  grouping ethernet-base-attributes {
+    leaf mtu {
+      type uint16 {
+        range "64..9216";
+      }
+      units "octets";
+      default 9216;
+      description
+      "The size, in octets, of the largest packet that the
+       hardware interface will send and receive.
+
+       Mapped to hw_interface_set_mtu VPP API message which programs the NIC.";
+    }
+  }
+
+  grouping routing-base-attributes {
+    leaf ipv4-vrf-id {
+      type fib-management:fib-table-list-ref;
+    }
+    leaf ipv6-vrf-id {
+      type fib-management:fib-table-list-ref;
+    }
+    description
+      "Defines VRF tables used for ipv4 and ipv6 traffic";
+  }
+
+  grouping ethernet-state-attributes {
+    leaf manufacturer-description {
+      type string;
+      config false;
+    }
+    leaf duplex {
+      type enumeration {
+        enum "half";
+        enum "full";
+      }
+      config false;
+    }
+  }
+
+  grouping vhost-user-interface-base-attributes {
+    leaf socket {
+      type string {
+        length 1..255;
+      }
+    }
+    leaf role {
+      type vhost-user-role;
+      default "server";
+    }
+    uses interface-tag;
+    description "vhost-user settings";
+  }
+
+  grouping vhost-user-interface-config-attributes {
+    leaf device-instance {
+      type uint32;
+      mandatory false;
+      description "Custom device instance. Autogenerated will be used if not configured";
+    }
+    description "vhost-user settings";
+  }
+
+  grouping vhost-user-interface-state-attributes {
+    leaf features {
+      type uint64;
+      config false;
+    }
+    leaf virtio-net-hdr-size {
+      type uint32;
+      config false;
+    }
+    leaf num-memory-regions {
+      type uint32;
+      config false;
+    }
+    leaf connect-error {
+      type string;
+      config false;
+    }
+  }
+
+  /*
+   * Defines the supported decap node for vxlan.
+   */
+  identity decap-node {
+    description
+    "Define the supported decap node";
+  }
+  identity l2-input {
+    base decap-node;
+    description
+    "The next decap node is l2-input";
+  }
+  identity nsh-proxy {
+    base decap-node;
+    description
+    "The next decap node is nsh-proxy";
+  }
+  typedef vxlan-decap-node {
+    type identityref {
+      base "decap-node";
+    }
+  }
+  grouping vxlan-base-attributes {
+    // FIXME: this should be in an vxlan-specific extension
+    leaf src {
+      /*mandatory true;*/
+      type inet:ip-address-no-zone;
+    }
+    leaf dst {
+      /*mandatory true;*/
+      type inet:ip-address-no-zone;
+    }
+    leaf vni {
+      /*mandatory true;*/
+      type vxlan-vni;
+    }
+    leaf encap-vrf-id {
+      /*mandatory true;*/
+      type fib-management:fib-table-list-ref;
+    }
+    leaf decap-next {
+      type vxlan-decap-node;
+      default "l2-input";
+    }
+  }
+
+  grouping gre-base-attributes {
+    leaf src {
+      /*mandatory true;*/
+      type inet:ip-address-no-zone;
+    }
+    leaf dst {
+      /*mandatory true;*/
+      type inet:ip-address-no-zone;
+    }
+    leaf outer-fib-id {
+      type uint32;
+    }
+  }
+
+  grouping vxlan-gpe-base-attributes {
+    leaf local {
+      /*mandatory true;*/
+      type inet:ip-address-no-zone;
+    }
+    leaf remote {
+      /*mandatory true;*/
+      type inet:ip-address-no-zone;
+    }
+    leaf vni {
+      /*mandatory true;*/
+      type vxlan-gpe-vni;
+    }
+    leaf next-protocol {
+      type vxlan-gpe-next-protocol;
+    }
+    leaf encap-vrf-id {
+      type uint32;
+    }
+    leaf decap-vrf-id {
+      type uint32;
+    }
+  }
+
+  grouping af-packet-base-attributes {
+    leaf host-interface-name {
+      type string {
+        length "1..63";
+      }
+      /* mandatory true; */
+      description "Name of the host interface (veth end point).";
+    }
+    leaf mac {
+      type yang:phys-address;
+      mandatory false;
+      description "Mac address to be set for the af-packet interface. Random will be used if not configured.";
+    }
+    reference
+      "https://docs.fd.io/vpp/18.07/clicmd_src_vnet_devices_af_packet.html";
+  }
+
+  grouping l2-config-attributes {
+      description
+      "Parameters for configuring Layer2 features on interfaces.";
+
+      choice interconnection {
+        case xconnect-based {
+          leaf xconnect-outgoing-interface {
+            /* Don't allow selection of this interface */
+            must "../../if:name != current()";
+            type if:interface-ref;
+            description
+              "L2 xconnect mode";
+          }
+        }
+        case bridge-based {
+          uses bridge-based-attributes;
+        }
+      }
+  }
+
+  grouping l2-state-attributes {
+    description
+    "Parameters for configuring Layer2 features on interfaces.";
+
+    choice interconnection {
+      case xconnect-based {
+        leaf xconnect-outgoing-interface {
+          /* Don't allow selection of this interface */
+          must "../../if:name != current()";
+          type if:interface-state-ref;
+          description
+            "L2 xconnect mode";
+        }
+      }
+      case bridge-based {
+        uses bridge-based-attributes;
+      }
+    }
+  }
+
+  grouping bridge-based-attributes {
+    leaf bridge-domain {
+      type bridge-domain-ref;
+      mandatory true;
+      description
+        "Interfaces in a bridge-domain forward packets to other
+         interfaces in the same bridge-domain based on
+         destination mac address.";
+    }
+    leaf split-horizon-group {
+      when "../bridge-domain";
+      type uint8 {
+        range "0..255";
+      }
+      default 0; //no split horizon group
+      description
+        "Interface's split-horizon group. Interfaces in the same
+         bridge-domain and split-horizon group can not forward
+         packets between each other. ";
+    }
+    leaf bridged-virtual-interface {
+      when "../bridge-domain";
+      type boolean;
+      default false;
+      description
+        "Interface forward packets in the bridge-domain
+         associated with the BVI.";
+    }
+  }
+
+  grouping span-attributes {
+    description "Parameters of the SPAN feature";
+
+    container mirrored-interfaces {
+      list mirrored-interface {
+        key "iface-ref";
+        leaf iface-ref {
+          type if:interface-ref;
+        }
+
+        leaf state {
+          type span-state;
+          mandatory true;
+        }
+      }
+    }
+  }
+
+  grouping span-state-attributes {
+      description "Parameters of the SPAN feature";
+
+      container mirrored-interfaces {
+        list mirrored-interface {
+          key "iface-ref";
+          leaf iface-ref {
+            type if:interface-state-ref;
+          }
+
+          leaf state {
+            type span-state;
+            mandatory true;
+          }
+        }
+      }
+    }
+
+  augment /if:interfaces/if:interface {
+    ext:augment-identifier "vpp-interface-augmentation";
+
+    // FIXME using ietf-interfaces model for vpp interfaces makes it hard to implement because:
+    // 1. The link between interface type and this augmentation is unclear
+    // 2. Only this augmentation with combination of ifc type is trigger to do something for vpp, what if user only configures base interface stuff ? + We need to get leaves defined by ietf-interfaces when we are processing this augment
+    // 3. The ietf-interfaces model does not define groupings which makes types reuse difficult
+
+    container tap-v2 {
+      when "../if:type = 'v3po:tap-v2'";
+      uses tap-v2-interface-base-attributes;
+      uses tap-v2-interface-config-attributes;
+    }
+
+    container loopback {
+      presence "Presence of this container indicates loopback nature of the interface";
+      when "../if:type = 'v3po:loopback'";
+      uses loopback-interface-base-attributes;
+    }
+
+    container ethernet {
+      when "../if:type = 'ianaift:ethernetCsmacd'";
+      uses ethernet-base-attributes;
+    }
+
+    container routing {
+      uses routing-base-attributes;
+    }
+
+    container vhost-user {
+      when "../if:type = 'v3po:vhost-user'";
+      uses vhost-user-interface-base-attributes;
+      uses vhost-user-interface-config-attributes;
+    }
+
+    container vxlan {
+      when "../if:type = 'v3po:vxlan-tunnel'";
+      uses vxlan-base-attributes;
+    }
+
+    container gre {
+      when "../if:type = 'v3po:gre-tunnel'";
+      uses gre-base-attributes;
+    }
+
+    container l2 {
+      must "bridged-virtual-interface = 'true' or " +
+           "(not (../if:ipv4[if:enabled = 'true']/if:address/if:ip) and " +
+           "not (../if:ipv6[if:enabled = 'true']/if:address/if:ip))";
+
+      uses l2-config-attributes;
+    }
+
+    container vxlan-gpe {
+      when "../if:type = 'v3po:vxlan-gpe-tunnel'";
+
+      uses vxlan-gpe-base-attributes;
+    }
+
+    container af-packet {
+      when "../if:type = 'v3po:af-packet'";
+      uses af-packet-base-attributes;
+    }
+
+    container span {
+      uses span-attributes;
+    }
+  }
+
+  container bridge-domains {
+    presence "Bridge domains configuration";
+    list bridge-domain {
+      key "name";
+
+      leaf name {
+        type string;
+      }
+
+      uses bridge-domain-attributes;
+      uses l2-fib-attributes;
+
+      description
+        "bridge-domain configuration";
+    }
+  }
+
+  augment /if:interfaces-state/if:interface {
+    ext:augment-identifier "vpp-interface-state-augmentation";
+
+    leaf description {
+      type string;
+    }
+
+    container tap-v2 {
+      when "../if:type = 'v3po:tap-v2'";
+      uses tap-v2-interface-base-attributes;
+      uses tap-v2-interface-state-attributes;
+    }
+
+    container ethernet {
+      when "../if:type = 'ianaift:ethernetCsmacd'";
+      uses ethernet-base-attributes;
+      uses ethernet-state-attributes;
+    }
+
+    container routing {
+      uses routing-base-attributes;
+    }
+
+    container vhost-user {
+      when "../if:type = 'v3po:vhost-user'";
+      uses vhost-user-interface-base-attributes;
+      uses vhost-user-interface-state-attributes;
+    }
+
+    container vxlan {
+      when "../if:type = 'v3po:vxlan-tunnel'";
+      uses vxlan-base-attributes;
+    }
+    container vxlan-gpe {
+      when "../if:type = 'v3po:vxlan-gpe-tunnel'";
+
+      uses vxlan-gpe-base-attributes;
+    }
+
+    container gre {
+      when "../if:type = 'gre-tunnel'";
+      uses gre-base-attributes;
+    }
+
+    container l2 {
+      must "bridged-virtual-interface = 'true' or " +
+           "(not (../if:ipv4[if:enabled = 'true']/if:address/if:ip) and " +
+           "not (../if:ipv6[if:enabled = 'true']/if:address/if:ip))";
+
+      uses l2-state-attributes;
+    }
+
+    container af-packet {
+      when "../if:type = 'v3po:af-packet'";
+      uses af-packet-base-attributes;
+    }
+
+    container span {
+      uses span-state-attributes;
+    }
+  }
+
+  augment /if:interfaces-state/if:interface/if:statistics {
+    ext:augment-identifier "vpp-interface-statistics-augmentation";
+    leaf in-errors-no-buf {
+      type yang:counter64;
+    }
+    leaf in-errors-miss {
+      type yang:counter64;
+    }
+    leaf out-discards-fifo-full {
+      type yang:counter64;
+    }
+  }
+
+  container bridge-domains-state {
+      // FIXME: Should this live in bridge-domain.yang in a modular fashion ?
+      config "false";
+      list bridge-domain {
+
+        key "name";
+        leaf name {
+          type string;
+        }
+
+        uses bridge-domain-attributes;
+        uses l2-fib-attributes;
+
+        description
+          "bridge-domain operational data";
+      }
+  }
+
+  // VPP Notifications
+
+  typedef interface-status {
+    type enumeration {
+      enum up {
+        value 1;
+      }
+      enum down {
+        value 0;
+      }
+    }
+  }
+
+  typedef interface-name-or-index {
+    type union {
+      type string;
+      type uint32;
+    }
+  }
+
+  notification interface-state-change {
+    leaf name {
+        type interface-name-or-index;
+    }
+
+    leaf admin-status {
+        type interface-status;
+    }
+
+    leaf oper-status {
+        type interface-status;
+    }
+  }
+
+  notification interface-deleted {
+    leaf name {
+        type interface-name-or-index;
+    }
+  }
+}
-- 
cgit 1.2.3-korg