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

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

  prefix "oc-types";

  // import statements
  import openconfig-extensions { prefix oc-ext; }

  // 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.3";

  revision "2017-08-16" {
    description
      "Apply fix for ieetfloat32 length parameter";
    reference "0.3.3";
  }

  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 "4";
    }
    description
      "An IEEE 32-bit floating point number. The format of this number
      is of the form:
        1-bit  sign
        8-bit  exponent
        23-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";
  }

}
