/*
 * This module has been generated by smidump 0.4.8:
 *
 *      smidump -f yang ENTITY-STATE-TC-MIB
 *
 * Do not edit. Edit the source file instead!
 */

module ENTITY-STATE-TC-MIB {

  /*** NAMESPACE / PREFIX DEFINITION ***/

  namespace "urn:ietf:params:xml:ns:yang:smiv2:ENTITY-STATE-TC-MIB";
  prefix "entity-state";

  /*** LINKAGE (IMPORTS / INCLUDES) ***/


  /*** META INFORMATION ***/

  organization
   "IETF Entity MIB Working Group";

  contact
   "General Discussion: entmib@ietf.org
    To Subscribe:
    http://www.ietf.org/mailman/listinfo/entmib

    http://www.ietf.org/html.charters/entmib-charter.html

    Sharon Chisholm
    Nortel Networks
    PO Box 3511 Station C
    Ottawa, Ont.  K1Y 4H7
    Canada
    schishol@nortel.com

    David T. Perkins
    548 Qualbrook Ct
    San Jose, CA 95110
    USA
    Phone: 408 394-8702
    dperkins@snmpinfo.com";

  description
   "This MIB defines state textual conventions.

    Copyright (C) The Internet Society 2005.  This version
    of this MIB module is part of RFC 4268;  see the RFC
    itself for full legal notices.";

  revision "2005-11-22" {
    description
     "Initial version, published as RFC 4268.";
  }

  /*** TYPE DEFINITIONS ***/

  typedef EntityAdminState {
    type enumeration {
      enum unknown      { value 1; }
      enum locked       { value 2; }
      enum shuttingDown { value 3; }
      enum unlocked     { value 4; }
    }
    description
     " Represents the various possible administrative states.





      A value of 'locked' means the resource is administratively
      prohibited from use.  A value of 'shuttingDown' means that
      usage is administratively limited to current instances of
      use.  A value of 'unlocked' means the resource is not
      administratively prohibited from use.  A value of
      'unknown' means that this resource is unable to
      report administrative state.";
  }

  typedef EntityOperState {
    type enumeration {
      enum unknown  { value 1; }
      enum disabled { value 2; }
      enum enabled  { value 3; }
      enum testing  { value 4; }
    }
    description
     " Represents the possible values of operational states.

      A value of 'disabled' means the resource is totally
      inoperable.  A value of 'enabled' means the resource
      is partially or fully operable.  A value of 'testing'
      means the resource is currently being tested
      and cannot therefore report whether it is operational
      or not.  A value of 'unknown' means that this
      resource is unable to report operational state.";
  }

  typedef EntityUsageState {
    type enumeration {
      enum unknown { value 1; }
      enum idle    { value 2; }
      enum active  { value 3; }
      enum busy    { value 4; }
    }
    description
     " Represents the possible values of usage states.
      A value of 'idle' means the resource is servicing no
      users.  A value of 'active' means the resource is
      currently in use and it has sufficient spare capacity
      to provide for additional users.  A value of 'busy'
      means the resource is currently in use, but it
      currently has no spare capacity to provide for
      additional users.  A value of 'unknown' means
      that this resource is unable to report usage state.";
  }

  typedef EntityAlarmStatus {
    type bits {
      bit unknown       { position 0; }
      bit underRepair   { position 1; }
      bit critical      { position 2; }
      bit major         { position 3; }
      bit minor         { position 4; }
      bit warning       { position 5; }
      bit indeterminate { position 6; }
    }
    description     
     " Represents the possible values of alarm status.
      An Alarm [RFC3877] is a persistent indication
      of an error or warning condition.

      When no bits of this attribute are set, then no active
      alarms are known against this entity and it is not under
      repair.

      When the 'value of underRepair' is set, the resource is
      currently being repaired, which, depending on the
      implementation, may make the other values in this bit
      string not meaningful.

      When the value of 'critical' is set, one or more critical
      alarms are active against the resource.  When the value
      of 'major' is set, one or more major alarms are active
      against the resource.  When the value of 'minor' is set,
      one or more minor alarms are active against the resource.
      When the value of 'warning' is set, one or more warning
      alarms are active against the resource.  When the value
      of 'indeterminate' is set, one or more alarms of whose
      perceived severity cannot be determined are active
      against this resource.

      A value of 'unknown' means that this resource is
      unable to report alarm state.";
  }

  typedef EntityStandbyStatus {
    type enumeration {
      enum unknown          { value 1; }
      enum hotStandby       { value 2; }
      enum coldStandby      { value 3; }
      enum providingService { value 4; }
    }
    description     
     " Represents the possible values of standby status.

      A value of 'hotStandby' means the resource is not
      providing service, but it will be immediately able to
      take over the role of the resource to be backed up,
      without the need for initialization activity, and will
      contain the same information as the resource to be
      backed up.  A value of 'coldStandy' means that the
      resource is to back up another resource, but will not
      be immediately able to take over the role of a resource
      to be backed up, and will require some initialization
      activity.  A value of 'providingService' means the
      resource is providing service.  A value of
      'unknown' means that this resource is unable to
      report standby state.";
  }

} /* end of module ENTITY-STATE-TC-MIB */
