module openconfig-types {
  yang-version "1";

  namespace "http://openconfig.net/yang/openconfig-types";

  prefix "oc-types";

  // import statements
  import openconfig-extensions {
    prefix oc-ext;
    revision-date "2015-10-09";
  }

  // meta
  organization
    "OpenConfig working group";

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

  description
    "This module contains a set of general type definitions that
    are used across OpenConfig models. It can be imported by modules
    that make use of these types.";

  oc-ext:openconfig-version "0.3.2";

  revision "2017-01-13" {
    description
      "Add ADDRESS_FAMILY identity";
    reference "0.3.2";
  }

  revision "2016-11-14" {
    description
      "Correct length of ieeefloat32";
    reference "0.3.1";
  }

  revision "2016-11-11" {
    description
      "Additional types - ieeefloat32 and routing-password";
    reference "0.3.0";
  }

  revision "2016-05-31" {
    description
      "OpenConfig public release";
    reference "0.2.0";
  }

  typedef percentage {
    type uint8 {
      range "0..100";
    }
    description
      "Integer indicating a percentage value";
  }

  typedef std-regexp {
    type string;
    description
      "This type definition is a placeholder for a standard
      definition of a regular expression that can be utilised in
      OpenConfig models. Further discussion is required to
      consider the type of regular expressions that are to be
      supported. An initial proposal is POSIX compatible.";
  }

  typedef timeticks64 {
    type uint64;
    description
     "This type is based on the timeticks type defined in
     RFC 6991, but with 64-bit width.  It represents the time,
     modulo 2^64, in hundredths of a second between two epochs.";
    reference
      "RFC 6991 - Common YANG Data Types";
  }

  typedef ieeefloat32 {
    type binary {
      length "32";
    }
    description
      "An IEEE 32-bit floating point number. The format of this number
      is of the form:
        1-bit  sign
        8-bit  exponent
        24-bit fraction
      The floating point value is calculated using:
        (-1)**S * 2**(Exponent-127) * (1+Fraction)";
  }

  typedef routing-password {
    type string;
    description
      "This type is indicative of a password that is used within
      a routing protocol which can be returned in plain text to the
      NMS by the local system. Such passwords are typically stored
      as encrypted strings. Since the encryption used is generally
      well known, it is possible to extract the original value from
      the string - and hence this format is not considered secure.
      Leaves specified with this type should not be modified by
      the system, and should be returned to the end-user in plain
      text. This type exists to differentiate passwords, which
      may be sensitive, from other string leaves. It could, for
      example, be used by the NMS to censor this data when
      viewed by particular users.";
  }

  grouping avg-min-max-stats-precision1 {
    description
      "Common nodes for recording average, minimum, and
      maximum values for a statistic.  These values all have
      fraction-digits set to 1.";

    leaf avg {
      type decimal64 {
        fraction-digits 1;
      }
      description
        "The arithmetic mean value of the statistic over the
        sampling period.";
    }

    leaf min {
      type decimal64 {
        fraction-digits 1;
      }
      description
        "The minimum value of the statistic over the sampling
        period";
    }

    leaf max {
      type decimal64 {
        fraction-digits 1;
      }
      description
        "The maximum value of the statitic over the sampling
        period";
    }
  }

  grouping avg-min-max-instant-stats-precision1 {
    description
      "Common grouping for recording an instantaneous statistic value
      in addition to avg-min-max stats";

    leaf instant {
      type decimal64 {
        fraction-digits 1;
      }
      description
        "The instantaneous value of the statistic.";
    }

    uses avg-min-max-stats-precision1;
  }

  grouping avg-min-max-instant-stats-precision2-dB {
    description
      "Common grouping for recording dB values with 2 decimal
      precision. Values include the instantaneous, average,
      minimum, and maximum statistics";

    leaf instant {
      type decimal64 {
        fraction-digits 2;
      }
      units dB;
      description
        "The instantaneous value of the statistic.";
    }

    leaf avg {
      type decimal64 {
        fraction-digits 2;
      }
      units dB;
      description
        "The arithmetic mean value of the statistic over the
        sampling period.";
    }

    leaf min {
      type decimal64 {
        fraction-digits 2;
      }
      units dB;
      description
        "The minimum value of the statistic over the sampling
        period";
    }

    leaf max {
      type decimal64 {
        fraction-digits 2;
      }
      units dB;
      description
        "The maximum value of the statistic over the sampling
        period";
    }
  }

  grouping avg-min-max-instant-stats-precision2-dBm {
    description
      "Common grouping for recording dBm values with 2 decimal
      precision. Values include the instantaneous, average,
      minimum, and maximum statistics";

    leaf instant {
      type decimal64 {
        fraction-digits 2;
      }
      units dBm;
      description
        "The instantaneous value of the statistic.";
    }

    leaf avg {
      type decimal64 {
        fraction-digits 2;
      }
      units dBm;
      description
        "The arithmetic mean value of the statistic over the
        sampling period.";
    }

    leaf min {
      type decimal64 {
        fraction-digits 2;
      }
      units dBm;
      description
        "The minimum value of the statistic over the sampling
        period";
    }

    leaf max {
      type decimal64 {
        fraction-digits 2;
      }
      units dBm;
      description
        "The maximum value of the statistic over the sampling
        period";
    }
  }

  grouping avg-min-max-instant-stats-precision2-mA {
    description
      "Common grouping for recording mA values with 2 decimal
      precision. Values include the instantaneous, average,
      minimum, and maximum statistics";

    leaf instant {
      type decimal64 {
        fraction-digits 2;
      }
      units mA;
      description
        "The instantaneous value of the statistic.";
    }

    leaf avg {
      type decimal64 {
        fraction-digits 2;
      }
      units mA;
      description
        "The arithmetic mean value of the statistic over the
        sampling period.";
    }

    leaf min {
      type decimal64 {
        fraction-digits 2;
      }
      units mA;
      description
        "The minimum value of the statistic over the sampling
        period";
    }

    leaf max {
      type decimal64 {
        fraction-digits 2;
      }
      units mA;
      description
        "The maximum value of the statistic over the sampling
        period";
    }
  }

  identity ADDRESS_FAMILY {
    description
      "A base identity for all address families";
  }

  identity IPV4 {
    base ADDRESS_FAMILY;
    description
      "The IPv4 address family";
  }

  identity IPV6 {
    base ADDRESS_FAMILY;
    description
      "The IPv6 address family";
  }

  identity MPLS {
    base ADDRESS_FAMILY;
    description
      "The MPLS address family";
  }

  identity L2_ETHERNET {
    base ADDRESS_FAMILY;
    description
      "The 802.3 Ethernet address family";
  }
}
