
// ===================================================================
// Title:       Network Model MOF specification (this includes the
//              BGP, Multi-Protocol Bridge, and VLAN sub-models.)
// Filename:    NetworkModel-f.mof
// Editor:      John Strassner
// Authors:     John Strassner, Al Grimstad, and Thomas McNeill,
//              with valuable input from other Networks WG team
//              members, including Andrea Westerinen, Lee Rafalow,
//              Marc Lavine, Walter Weiss, and Bernie Volz.
//
//              The information model represented here is based on
//              the following RFCs: BGP: 1657, 1700, 1771, 1965, 1966,
//              and 1997; Bridge: 1493 and 1525; VLAN includes
//              compliance with the 802.1q specification. Also, MAC
//              address formats are required to be in canonical form,
//              as stated in RFC 2469.
//
// Date:  04/21/1999 - Version 1.2 (consolidated each of the
//                     sub-models into a single model)
//        05/06/1999 - Version 1.3 (incorporated CR324, deleted
//                     references to User Model (this functionality
//                     will be added back in CIM 2.3)
//        05/16/1999 - Version 1.4 (fixed typos); incorporated Novell
//                     member review comments
//        06/10/1999 - Version 1.5 added CRs 308a, 324a, 356a, 390a,
//                     391b, 404a, 413
//        07/03/1999 - Miscellaneous changes according to CR cisco022
//        02/26/2000 - Incorporated the following CRs: 448b (this added
//                     ManagedElement to the Core model, which changed
//                     many of the relationships in this model since
//                     now ManagedElement is the root of everything
//                     whereas before there wasn't a root; 454 and 455
//                     misc changes to the Network model)
//        02/27/2000 - Incorporated CR464, which promotes the
//                     CIM_ServiceComponent and the
//                     CIM_AdapterActiveConnection classes to Core
//
// ===================================================================
// Generic Pragmas
// ===================================================================

#pragma Locale ("en_US")


// ==================================================================
//     AdminDomain
// ==================================================================
	  [Abstract, Description (
         "This is a special grouping of ManagedSystemElements that "
         "are all administered by the same user or group of users. "
         "It serves as an aggregation point to associate one or more "
         "of the following elements: network devices, such as "
         "routers and switches, servers, and other resources that "
         "can be accessed by end systems. This grouping of devices "
         "plays an essential role in ensuring that the same "
         "administrative POLICY is applied to all of the devices "
         "in the grouping.") ]

class CIM_AdminDomain : CIM_System
{
        [Override ("NameFormat"), Description (
 	   "The System class and its subclasses provide the scope for "
         "numerous types of managed objects. As such, these classes "
         "must have the ability to create unique keys. This attribute "
         "is used by the System class and its subclasses to define a "
         "unique Name, independent of the specific discovery protocol "
         "used. Use of the heuristic is optional, but recommended."
         "\n\n"
         "AdminDomain is used in the Networks Model to group "
         "together various network resources that must be "
         "administered the same way, perhaps using the same "
         "policies. Viewed in this light, its principal subclass is "
         "AutonomousSystem."
         "\n\n"
	   "The NameFormat property identifies how the Name of the "
         "AdminDomain is generated, using the heuristic specified "
	   "in the CIM V2 System Model spec. It assumes that the "
         "documented rules are traversed in order, to determine and "
         "assign a Name. The NameFormat Values list defines the "
         "precedence order for assigning the Name of the "
         "AdminDomain."), 
         ValueMap {"Other", "AS", "NAP", "NOC", "POP", "RNP", "IP",
          "IPX", "SNA", "Dial", "WAN", "LAN", "ISDN", "Frame Relay",
          "ATM", "E.164" },
         Values {"Other", "Autonomous System",
          "Network Access Provider", "Network Operations Center",
          "Point of Presence", "Regional Network Provider",
          "IP", "IPX", "SNA", "Dial", "WAN", "LAN", "ISDN",
          "Frame Relay", "ATM", "E.164"} ]
    string NameFormat;
};


// ==================================================================
//     NetworkService
// ==================================================================
        [Abstract, Description (
         "This is an abstract base class, derived from the Service "
         "class. It serves as the root of the network service "
         "hierarchy. Network services represent generic functions "
         "that are available from the network that configure and/or "
         "modify the traffic being sent. For example, FTP is not a "
         "network service, as it simply passes data unchanged from "
         "source to destination. On the other hand, services "
         "that provide quality of service (e.g., DiffServ) and "
         "security (e.g., IPSec) do affect the traffic stream. "
         "Quality of service, IPSec, and other services are "
         "subclasses of this class. This class hierarchy enables "
         "developers to match services to users, groups, "
         "and other objects in the network.") ]

class CIM_NetworkService : CIM_Service
{
        [Description (
         "This is a free-form array of strings that provide "
         "descriptive words and phrases that can be used in queries "
         "to help locate and identify instances of this service.") ] 
    string Keywords [ ];
        [Description (
         "This is a URL that provides the protocol, network "
         "location, and other service-specific information required "
         "in order to access the service. This should be implemented "
         "as a LabeledURI, with syntax DirectoryString and a "
         "matching rule of CaseExactMatch, for directory "
         "implementors.") ]
    string ServiceURL;
        [Description (
         "This is a free-form array of strings that specify any "
         "specific pre-conditions that must be met in order for this "
         "service to start correctly. It is expected that subclasses "
         "will refine the inherited StartService() and StopService()"
         "methods to suit their own application-specific needs. This "
         "property is used to specify application-specific conditions "
         "needed by the refined StartService and StopService"
         "methods.") ]
    string StartupConditions [ ];
         [Description (
         "This is a free-form array of strings that specify any "
         "specific parameters that must be supplied to the "
         "StartService() method in order for this service to start "
         "correctly. It is expected that subclasses will refine the "
         "inherited StartService() and StopService() methods to suit "
         "their own application-specific needs. This property is used "
         "to specify application-specific parameters needed by the "
         "refined StartService and StopService methods.") ]
    string StartupParameters [ ];
};

// ==================================================================
//     NetworkServicesInAdminDomain
// ==================================================================
        [Association, Description (
         "This is a specialization of the CIM_HostedService "
         "association that establishes dependency relationships "
         "between an administrative domain and the NetworkServices "
         "that it hosts. This also has the semantics that this set "
         "of services are commonly administered.") ]

class CIM_NetworkServicesInAdminDomain : CIM_HostedService
{
        [Override ("Antecedent"), Min(1), Max(1), Description (
         "The AdminDomain that aggregates the various "
         "network services and administers them.") ]
    CIM_AdminDomain REF Antecedent;
        [Override ("Dependent"), Description (
         "The network service that is hosted in the administrative "
         "domain.") ] 
    CIM_NetworkService REF Dependent;
};

// ==================================================================
//    ForwardingService
// ==================================================================
        [Description (
         "This class represents the forwarding of network traffic by "
         "receiving data from one or more ProtocolEndpoints and "
         "sending that data via other ProtocolEndpoints. "
         "\n\n"
         "This class is different than the RouteCalculationService "
         "class in that it represents a way to forward traffic "
         "independent of calculating routing information (e.g., using "
         "static routing). Generally, the endpoints among which a "
         "ForwardingService routes data are at the same protocol "
         "layer and are usually of similar types or of the same type. "
         "Examples of this kind of service include routing, bridging, "
         "and repeating services. Instances of this class will have "
         "ForwardsAmong associations to the ProtocolEndpoint "
         "instances among which forwarding is occurring.") ] 

class CIM_ForwardingService : CIM_NetworkService
{
        [Description (
         "This defines the type of protocol that is being "
         "forwarded. "),
        ValueMap { "0", "1", "2", "3", "4", "5", "6", "7", "8",
                   "9", "10", "11", "12" },
        Values { "Unknown", "Other", "IPv4", "IPv6", "IPv4/IPv6",
                 "IPX", "AppleTalk", "DECnet", "SNA", "CONP",
                 "CLNP", "VINES", "XNS" } ]
    uint16 ProtocolType;
        [MaxLen(32), Description (
         "This defines the type of protocol that is being forwarded "
         "when the value of the ProtocolType attribute is 1 (e.g., "
         "'Other'). This provides for future extensibility."),
        ModelCorrespondence { "CIM_ForwardingService.ProtocolType" } ]
    string OtherProtocolType;
};

// ==================================================================
//     AutonomousSystem
// ==================================================================
	  [Description (
         "An Autonomous System (AS) is a fundamental concept in "
         "networking. An AS provides a structured view of routing by "
         "segregating the system that is using routing (e.g., the "
         "Internet, or an extranet) into a set of separately "
         "administered domains that each have their own independent "
         "routing policies. These domains are called  autonomous "
         "systems."
         "\n\n"
         "The classic definition of an AS, from RFC1771, is '...a set "
         "of  routers under a single technical administration, using "
         "an interior gateway protocol and common metrics to route "
         "packets within the AS, and using an exterior gateway "
         "protocol to route packets to other ASs'. The RFC continues: "
         "'Since this classic definition was developed, it has become "
         "common for a single AS to use several interior gateway "
         "protocols and sometimes several sets of metrics "
         "within an AS.  The use of the term Autonomous System here "
         "stresses the fact that, even when multiple IGPs and metrics "
         "are used, the administration of an AS appears to other ASs "
         "to have a single coherent interior routing plan and "
         "presents a consistent picture of what destinations are "
         "reachable through it.") ]

class CIM_AutonomousSystem : CIM_AdminDomain
{
        [Description (
	   "An ASNumber is an integer between 1 and 65535, with the "
         "range 64512 through 65535 reserved for private use. Every "
         "AS has a unique AS number, which is assigned to it by an "
         "Internet Registry or a provider. IANA assigns and "
         "administers AS numbers.") ]
    uint16 ASNumber;
        [Description (
         "IsSingleHomed is a boolean that, when its value is TRUE, "
         "indicates that this AS reaches networks outside of its "
         "domain through a single exit point. Whether a given AS is "
         "single-homed or not has important ramifications for BGP "
         "configuration.") ]
    boolean IsSingleHomed;
        [Description (
         "IsTransit is a boolean that, when its value is TRUE, "
         "indicates that this AS will advertise routes that it "
         "learns from other ASs. A non-transit AS will only "
         "advertise its own routes.") ]
    boolean IsTransit;
        [Description (
         "RequireIGPSync is a boolean that, when its value is TRUE, "
         "indicates that this AS must obey the following BGP rule: a "
         "BGP router should not advertise destinations learned from "
         "internal BGP neighbors to external BGP destinations unless "
         "those destinations are also known via some internal gateway "
         "protocol. Otherwise, a BGP router may receive traffic that "
         "cannot yet be routed. However, since this is a costly "
         "choice, it is common practice to allow this rule to be "
         "broken under certain carefully controlled circumstances.") ]
    boolean RequireIGPSync;
        [Description (
         "RoutingUpdateSource defines how routing information is to "
         "be injected into BGP. Statically injected routes are "
         "maintained by the routing table and are independent of the "
         "status of the networks that they refer to. This is done by "
         "defining static routes in the BGP routing table. "
         "Dynamically injected routes are of two types. "
         "Dynamic routes refer to distributing all of the IGP routes "
         "into BGP. Semi-dynamic routes define a set of specific IGP "
         "routes that will be injected into BGP."),
        ValueMap { "0", "1", "2", "3" },
        Values { "Unknown", "Static", "Dynamic", "Semi-Dynamic" } ]
    uint16 RoutingUpdateSource; 
        [Description (
         "Route aggregation refers to summarizing ranges of routes "
         "into one or more aggregate routes. This is done to minimize "
         "the number of routes in the global routing table. A "
         "potential drawback is that specific path information (e.g., "
         "AS_Path attribute value) is lost, which may lead to "
         "potential routing loops. There are a variety of ways to "
         "ensure that this does not happen. Note, however, that BGP4 "
         "is required to do this. "
         "\n\n"
         "There are many ways to form aggregate routes. The following "
         "are the most popular: 'Aggregate only', where only the "
         "aggregate is advertised, and all of its more specific "
         "routes are suppressed; 'Aggregate Plus Specific Routes', "
         "where both the aggregate as well as its more specific "
         "routes are advertised (e.g., send the aggregate to the NAP, "
         "but send the more specific routes to providers); "
         "'Aggregate Based on a Subset of Specific Routes', where the "
         "aggregate route is formed by looking at certain more "
         "specific routes and forming an aggregate on them, "
         "suppressing all others."),
        ValueMap { "0", "1", "2", "3", "4" },
        Values { "Unknown", "None", "Aggregate Only ",
                 "Aggregate And All Specific Routes ",
                 "Aggregate Based on Subset of Specific Routes" } ]
    uint16 AggregationType;
};

// ==================================================================
//     LogicalNetwork
// ==================================================================
        [Description (
         "A LogicalNetwork groups together a set of "
         "ProtocolEndpoints of a given type which are able to "
         "communicate with each other directly. It is used for "
         "describing the characteristics of the grouping "
         "and/or its associated medium. A LogicalNetwork "
         "represents the ability to send and/or receive data "
         "over a network.") ]

class CIM_LogicalNetwork : CIM_CollectionOfMSEs
{
        [Propagated ("CIM_System.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping System's CreationClassName.") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_System.Name"), Key, MaxLen (256),
	   Description ("The scoping System's Name.") ] 
    string SystemName;
        [Key, MaxLen (256), Description (
         "CreationClassName indicates the name of the class or the "
         "subclass used in the creation of an instance. When used "
         "with the other key properties of this class, this property "
         "allows all instances of this class and its subclasses to "
         "be uniquely identified.") ]
    string CreationClassName;
        [Key, MaxLen (256), Description (
         "The Name property defines the label by which the object is "
	   "known.") ] 
    string Name;
        [MaxLen(64), Description (
         "Type is an enumeration that provides additional "
         "information that can be used to help categorize and "
         "classify different instances of this class . "
         "\n\n"
         "Subclasses should ensure that they are of the "
         "appropriate type defined in the Type enumeration. "
         "That is, the IPSubnet subclass should define its "
         "property as either IPv4 or IPv6, as opposed to, "
         "for example, ATM."),
        ValueMap { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                   "10", "11", "12", "13", "14", "15", "16" },
        Values { "Unknown", "Other", "IPv4", "IPv6",
                 "IPX", "AppleTalk", "DECnet", "SNA", "CONP",
                 "CLNP", "VINES", "XNS", "ATM", "Frame Relay",
                 "Ethernet", "TokenRing", "FDDI" },
	  ModelCorrespondence {
         "CIM_LogicalNetwork.OtherTypeDescription"} ]
   string NetworkType;
        [MaxLen(64), Description (
         "A string describing the type of protocol that is being "
         "run by this LogicalNetwork when the value of the Type "
         "property of the Collection class (or any of its subclasses "
         "is set to 1 (e.g., 'Other'). The format of the string "
         "inserted in this property should be similar in format to "
         "the values defined for the Type property. This property "
         "should be set to NULL when the Type property is any value "
         "other than 1."),
	 ModelCorrespondence {"CIM_LogicalNetwork.NetworkType"} ]
   string OtherTypeDescription;
};

// ==================================================================
//     LogicalNetworkService
// ==================================================================
        [Association, Description (
         "A LogicalNetworkService represents network services that "
         "either originate and/or terminate in a LogicalNetwork. This "
         "enables management applications to more easily identify "
         "services that are provided by particular network devices.") ]

class CIM_LogicalNetworkService : CIM_Dependency
{
        [Description (
         "The LogicalNetwork that contains the network service."), 
         Override ("Antecedent")]
    CIM_LogicalNetwork REF Network;
        [Description (
	   "The NetworkService that is running in the LogicalNetwork. "),
         Override ("Dependent")] 
    CIM_NetworkService REF NetworkService;
        [Description (
	   "An enumeration that explicitly defines this network service "
         "as originating, terminating, or residing in this "
         "LogicalNetwork. "),
        ValueMap { "0", "1", "2", "3" },
        Values {"Unknown", "Originates In", "Terminates In",
         "Resides In" } ]
    uint16 ContainmentType;
};

// ==================================================================
//     IPSubnet
// ==================================================================
        [Description (
         "An IPSubnet represents a group of related "
         "IPProtocolEndpoints that can communicate with each other "
         "directly using IP. It is used for describing the "
         "characteristics of the grouping.") ]

class CIM_IPSubnet : CIM_LogicalNetwork
{
        [Description (
         "The IP address of the entire subnet, formatted according "
         "to the appropriate convention as defined in the AddressType "
         "property of this class. "
         "\n\n"
         "Note that CIDR format is not supported for this release. " 
         "This is because, without more formal methods like "
         "constraints, it is possible to create different instances "
         "of the same object that have different naming formats."
         "\n\n"
         "IPv4-compatible addresses should be used instead of IPv6 "
         "addresses (see RFC 2373, section 2.5.4). In order to have a "
         "consistent format for IPv4 addresses in a mixed IPv4/v6 "
         "environment, all IPv4 addresses and both IPv4-compatible "
         "IPv6 addresses and IPv4-mapped IPv6 addresses, per "
         "RFC 2373, section 2.5.4, should be formatted in standard "
         "IPv4 format. However, this (the 2.2) version of the Network "
         "Common Model will not explicitly support mixed IPv4/IPv6 "
         "environments. This will be added in a future release.") ]
    string SubnetNumber;
        [Description (
         "The mask for the starting IP address of the IPSubnet, "
         "formatted according to the appropriate convention as "
         "defined in the AddressType property of this class " 
         " (e.g., '255.255.252.0').") ] 
    string SubnetMask;
        [Description (
         "An enumeration that describes the format of the address "
         "property. Addresses that can be formatted in IPv4 format, "
         "must be formatted that way to ensure mixed IPv4/IPv6 "
         "support."),
        ValueMap { "0", "1", "2" },
        Values { "Unknown", "IPv4", "IPv6" } ]
    uint16 AddressType;
};

// ==================================================================
//     ProtocolEndpoint
// ==================================================================
        [Description (
         "A communication point from which data may be sent or "
         "received. ProtocolEndpoints link router interfaces and "
         "switch ports to LogicalNetworks.") ]

class CIM_ProtocolEndpoint : CIM_ServiceAccessPoint
{
        [Override ("Name"), MaxLen(256), Description (
         "A string which identifies this ProtocolEndpoint with either "
         "a port or an interface on a device. To ensure uniqueness, "
         "the Name property should be prepended or appended with "
         "information from the Type or OtherTypeDescription "
         "properties. The method chosen is described in the "
         "NameFormat property of this class.") ]
    string Name;
        [MaxLen (256), Description (
         "NameFormat contains the naming heuristic that is chosen to "
         "ensure that the value of the Name property is unique. For "
         "example, one might choose to prepend the name of the port "
         "or interface with the Type of ProtocolEndpoint that this "
         "instance is (e.g., IPv4)followed by an underscore.") ]
    string NameFormat;
        [MaxLen (64), Description (
         "ProtocolType is an enumeration that provides additional "
         "information that can be used to help categorize and "
         "classify different instances of this class."),
        ValueMap { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                   "10", "11", "12", "13", "14", "15", "16" },
        Values { "Unknown", "Other", "IPv4", "IPv6",
                 "IPX", "AppleTalk", "DECnet", "SNA", "CONP",
                 "CLNP", "VINES", "XNS", "ATM", "Frame Relay",
                 "Ethernet", "TokenRing", "FDDI" },
	  ModelCorrespondence {
         "CIM_ProtocolEndpoint.OtherTypeDescription"} ]
    string ProtocolType;
        [MaxLen(64), Description (
         "A string describing the type of ProtocolEndpoint that this "
         "instance is when the Type property of this class (or any of "
         "its  subclasses) is set to 1 (e.g., 'Other'). The format of "
         "the string inserted in this property should be similar in "
         "format to the values defined for the Type property. This "
         "property should be set to NULL when the Type property is "
         "any value other than 1."),
	  ModelCorrespondence {"CIM_ProtocolEndpoint.ProtocolType"} ]
   string OtherTypeDescription;
};

// ==================================================================
//    ForwardsAmong
// ==================================================================
        [Association, Description (
         "This association represents the dependency that exists "
         "between the ProtocolEndpoints that are used to forward data "
         "and the ForwardingService that is performing the forwarding "
         "of data.") ]

class CIM_ForwardsAmong : CIM_ServiceSAPDependency
{
        [Override ("Antecedent"), Description(
         "The ProtocolEndpoints that are used to forward the data") ] 
    CIM_ProtocolEndpoint REF Antecedent;
        [Override ("Dependent"), Description(
         "The service that is forwarding the data") ]
    CIM_ForwardingService REF Dependent;
};

// ==================================================================
//     LANEndpoint
// ==================================================================

        [Description (
         "A communication endpoint which, when its associated "
         "interface device is connected to a LAN, may send and "
         "receive data frames. LANEndpoints link switch ports and "
         "host interfaces to LANs. ") ]

class CIM_LANEndpoint : CIM_ProtocolEndpoint
{
        [Description (
         "A label or identifier for the LAN Segment."),
	  ModelCorrespondence {"CIM_LANSegment.LANID"} ]
    string LANID;
        [Description (
         "An indication of the kind of technology used on the LAN."), 
        ValueMap { "0", "1", "2", "3", "4" },
        Values { "Unknown", "Other", "Ethernet", "TokenRing", "FDDI" },
        ModelCorrespondence {"CIM_LANSegment.LANType"} ]
    uint16 LANType;
        [Description (
         "A free-form string that describes the type of technology "
         "used on the LAN when the value of the LANType property "
         "is equal to 1 (e.g., 'Other'). This provides built-in "
         "extensibility."),
        ModelCorrespondence {"CIM_LANEndpoint.LANType"} ]
    string OtherLANType;
        [MaxLen(12), Description (
         "The principal unicast address used in communication "
         "with the LANEndpoint. The MAC address is formatted as "
         "twelve hexadecimal digits (e.g., \"010203040506\"), "
         "with each pair representing one of the six octets "
         "of the MAC address in \"canonical\" bit order "
         "according to RFC 2469.") ]
    string MACAddress;
        [Description (
         "Other unicast addresses that may be used to communicate "
         "with the LANEndpoint.") ]
    string AliasAddresses[];
        [Description (
         "Multicast addresses to which the LANEndpoint "
         "listens.") ]
    string GroupAddresses[];
        [Description (
         "The largest information field that may be sent or received "
         "by the LANEndpoint."), Units ("Bits") ]
    uint32 MaxDataSize;
};

// ==================================================================
//     LANSegment
// ==================================================================
        [Description (
         "A collection of LAN Endpoints of a particular type "
         "that are able to intercommunicate directly without "
         "the assistance of bridging or routing services.") ]

class CIM_LANSegment : CIM_LogicalNetwork
{
        [MaxLen(64), Description (
         "A label or identifier for the LAN Segment."),
	  ModelCorrespondence {"CIM_LANEndpoint.LANID"} ]
    string LANID;
        [Description (
         "An indication of the kind of technology used on the LAN."), 
        ValueMap { "0", "1", "2", "3", "4" },
        Values { "Unknown", "Other", "Ethernet", "TokenRing", "FDDI" },
        ModelCorrespondence {"CIM_LANEndpoint.LANType"} ]
    uint16 LANType;
        [MaxLen(64), Description (
         "A string describing the type of technology used on the LAN "
         "when the value of the LANType property of this class (or "
         "any of its subclasses) is set to 1 (e.g., 'Other'). The "
         "format of the string inserted in this property should be "
         "similar in format to the values defined for the LANType "
         "property. This property should be set to NULL when the "
         "LANType property is any value other than 1."),
	 ModelCorrespondence {"CIM_LANSegment.LANType"} ]
   string OtherLANType;
};

// ==================================================================
//    InLogicalNetwork
// ==================================================================
        [Association, Aggregation, Description (
         "This association defines a ProtocolEndpoint as a member of "
         "a specific LogicalNetwork.") ]

class CIM_InLogicalNetwork : CIM_CollectedMSEs
{
        [Aggregate, Max(1), Override ("Collection"), Description (
         "The LogicalNetwork that groups the ProtocolEndpoint instances.") ]
    CIM_LogicalNetwork REF Collection;
        [Override ("Member"), Description (
         "The child ProtocolEndpoints that are components of the "
         "LogicalNetwork.") ]
    CIM_ProtocolEndpoint REF Member;
};

// ==================================================================
//    InSegment
// ==================================================================
        [Association, Aggregation, Description (
         "Defines a LANEndpoint as a member of a specific "
         "LANSegment.") ]

class CIM_InSegment : CIM_InLogicalNetwork
{
        [Aggregate, Max(1), Override ("Collection"), Description (
         "The LANSegment that groups the LANEndpoint instances.") ]
    CIM_LANSegment REF Collection;
        [Override ("Member"), Description (
         "A child LANEndpoint that is a component of the "
         "LANSegment.") ]
    CIM_LANEndpoint REF Member;
};

// ==================================================================
//    ActiveConnection
// ==================================================================
        [Association, Description (
         "This association defines a connection that is currently "
         "carrying traffic between two ProtocolEndpoints.") ] 

class CIM_ActiveConnection : CIM_SAPSAPDependency
{
        [Override ("Antecedent"), Description (
         "A ProtocolEndpoint in active communication with the "
         "dependent ProtocolEndpoint.") ]
    CIM_ProtocolEndpoint REF Antecedent;
        [Override ("Dependent"), Description (
         "A second ProtocolEndpoint communicating with the "
         "Antecedent ProtocolEndpoint.") ] 
    CIM_ProtocolEndpoint REF Dependent;
        [Description ("The type of traffic that is carried "
         "over this connection."),
        ValueMap { "0", "1", "2", "3", "4", "5" },
        Values { "Unknown", "Other", "Unicast", "Broadcast",
         "Multicast", "Anycast" },
	  ModelCorrespondence {
         "CIM_ActiveConnection.OtherTrafficDescription" } ]
    uint16 TrafficType;
        [MaxLen(64), Description (
         "A string describing the type of traffic that is being "
         "carried over this instance when its Type property is set "
         "to 1 (e.g., 'Other'). The format of the string inserted "
         "in this property should be similar in format to the "
         "values defined for the TrafficType property. This "
         "property should be set to NULL when the TrafficType "
         "property is any value other than 1."),
	  ModelCorrespondence {
           "CIM_ActiveConnection.TrafficType" } ]
    string OtherTrafficDescription;
        [Description (
         "TRUE means that this connection is uni-directional; FALSE "
         "means that this connection is bi-directional.") ]
    boolean IsUnidirectional;
};

// ==================================================================
//     IPAddressRange
// ==================================================================
        [Abstract, Description (
         "This represents a grouping of specific addresses, and "
         "provides additional semantics for this group if "
         "appropriate.") ]

class CIM_IPAddressRange : CIM_CollectionOfMSEs
{
        [Description (
         "The starting IP address of the AddressRange, formatted "
         "according to the appropriate convention as defined in the "
         "AddressType property of this class (e.g., 171.79.6.40).") ] 
    string StartAddress;
        [Description (
         "The ending IP address of the AddressRange, formatted "
         "according to the appropriate convention as defined in the "
         "AddressType property of this class (e.g., 171.79.6.40).") ] 
    string EndAddress;
        [Description (
         "An enumeration that defines how to format the address and "
         "mask of the address range that defines this IPSubnet)." 
         "\n\n"
         "Whenever possible, IPv4-compatible addresses should "
         "be used instead of IPv6 addresses (see RFC 2373, "
         "section 2.5.4). In order to have a consistent format "
         "for IPv4 addresses in a mixed IPv4/v6 environment, all "
         "IPv4 addresses and both IPv4-compatible IPv6 addresses "
         "and IPv4-mapped IPv6 addresses, per RFC 2373, section "
         "2.5.4, should be formatted in standard IPv4 format. "
         "However, this (the 2.2) version of the Network Common "
         "Model will not explicitly support mixed IPv4/IPv6 "
         "environments. This will be added in a future release."),
        ValueMap { "0", "1", "2" },
        Values { "Unknown", "IPv4", "IPv6" } ]
    uint16 TypeOfAddress;
        [Description (
         "This attribute defines the region that addresses can be "
         "allocated to."),
       ValueMap {"0", "1", "2", "3", "4", "5", "6", "7", "8" },
       Values {"Unknown",
               "Multiregional: 192.0.0.0 to 193.255.255.255",
               "Europe: 194.0.0.0 to 195.255.255.255",
               "Others: 196.0.0.0 to 197.255.255.255",
               "North America: 198.0.0.0 to 199.255.255.255",
               "Central & South America: 200.0.0.0 to 201.255.255.255",
               "Pacific Rim: 202.0.0.0 to 203.255.255.255",
               "Others: 204.0.0.0 to 205.255.255.255",
               "Others: 206.0.0.0 to 207.255.255.255" } ]
    uint16 AllocationRegion;
};

// ==================================================================
//     IPProtocolEndpoint
// ==================================================================
        [Description (
         "A ProtocolEndpoint that is dedicated to running IP.") ]

class CIM_IPProtocolEndpoint : CIM_ProtocolEndpoint
{
        [Description (
         "The IP address that this ProtocolEndpoint represents, "
         "formatted according to the appropriate convention as "
         "defined in the AddressType property of this class " 
         " (e.g., 171.79.6.40).") ] 
    string Address;
        [Description (
         "The mask for the IP address of this ProtocolEndpoint, "
         "formatted according to the appropriate convention as "
         "defined in the AddressType property of this class " 
         " (e.g., 255.255.252.0).") ] 
    string SubnetMask;
        [Description (
         "An enumeration that describes the format of the address "
         "property. Whenever possible, IPv4-compatible addresses "
         "should be used instead of native IPv6 addresses (see "
         "RFC 2373, section 2.5.4). In order to have a consistent "
         "format for IPv4 addresses in a mixed IPv4/v6 environment, "
         "all IPv4 addresses and both IPv4-compatible IPv6 addresses "
         "and IPv4-mapped IPv6 addresses, per RFC 2373, section 2.5.4, "
         "should be formatted in standard IPv4 format. However, this " 
         " (the 2.2) version of the Network Common Model will not "
         "explicitly support mixed IPv4/IPv6 environments. This will "
         "be added in a future release."),
        ValueMap { "0", "1", "2" },
        Values { "Unknown", "IPv4", "IPv6" } ]
    uint16 AddressType;
        [Description (
         "It is not possible to tell from the address alone if a given "
         "IPProtocolEndpoint can support IPv4 and IPv6, or just one of "
         "these. This property explicitly defines the support for "
         "different versions of IP that this IPProtocolEndpoint has. "
         "\n\n"
         "More implementation experience is needed in order to "
         "correctly model mixed IPv4/IPv6 networks; therefore, this "
         "version (2.2) of the Network Common Model will not support "
         "mixed IPv4/IPv6 environments. This will be looked at more in "
         "a future version."),
        ValueMap { "0", "1", "2" },
        Values { "Unknown", "IPv4 Only", "IPv6 Only" } ]
    uint16 IPVersionSupport;
};

// ==================================================================
//     BGPProtocolEndpoint
// ==================================================================
        [Description (
         "A ProtocolEndpoint that is dedicated to running BGP.") ]

class CIM_BGPProtocolEndpoint : CIM_ProtocolEndpoint
{
        [Description (
         "A boolean that, when TRUE, signifies that this is an "
         "instance of the external version of BGP (FALSE is the "
         "internal version).") ]
    boolean IsEBGP;
        [Description (
         "Normally, two routers running EBGP must be physically "
         "connected. This boolean, when TRUE, denotes a LOGICAL "
         "connection between two routers that are running EBGP " 
         "(e.g., there is an intermediate router or interface "
         "between them.") ] 
    boolean IsEBGPMultihop;
        [Description (
         "This is the unique identifier of the local BGP router. "
         "This is often the router ID (e.g., an IP address)."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpIdentifier"} ]
    string LocalIdentifier;
        [Description (
         "This is the unique identifier of the peer BGP router. "
         "This is often the router ID (e.g., an IP address)."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerIdentifier"} ]
    string PeerIdentifier;
        [Description (
         "This defines the current connection state of the "
         "BGP Peer."),
        ValueMap { "1", "2", "3", "4", "5", "6" },
        Values { "Idle", "Connect", "Active", "OpenSet",
         "OpenConfirm", "Established" },
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerState"} ]
    uint16 State;
        [Description (
         "This defines the desired state of the BGP connection."),
        ValueMap { "1", "2" },
        Values { "Stop", "Start" },
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerAdminStatus"} ]
    uint16 AdminStatus;
        [Description (
         "This defines the negotiated version of BGP that is "
         "running between the two peers."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgpPeerNegotiatedVersion"} ]
    string NegotiatedVersion;
        [Description (
         "This is the local IP address of this router's BGP "
         "connection."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerLocalAddr"} ]
    string LocalAddress; 
        [Description (
         "This is the local port number for the TCP connection of "
         "this router's BGP connection."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerLocalPort"} ]
    uint16 LocalPort; 
        [Description (
         "This is the remote IP address of this router's BGP "
         "connection."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerRemoteAddr"} ]
    string RemoteAddress;
        [Description (
         "This is the remote port number for the TCP connection of "
         "this router's BGP connection."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerRemotePort"} ]
    uint16 RemotePort; 
        [Description (
         "This is the remote AS number for this router's BGP "
         "connection."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerRemoteAs"} ]
    uint16 RemoteAS;
        [Description (
         "This defines the maximum amount of time in seconds that "
         "may elapse between the receipt of successive KEEPALIVE or "
         "UPDATE messages. This is instrumented as a counter that "
         "increments from zero to the value specified in this "
         "property. The value of this property is calculated by "
         "this BGP speaker by using the smaller of the values of "
         "bgpPeerHoldTimeConfigured and the Hold Time received in "
         "the OPEN message. This value, if not zero seconds, must "
         "be at least three seconds, up to a maximum of 65535 "
         "seconds. Receipt of either a KEEPALIVE or an UPDATE "
         "message resets this value."),
        Units ("Seconds"),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerHoldTime"} ]
    uint16 HoldTime;
        [Description (
         "This defines the time interval in seconds for the KeepAlive "
         "timer established with the peer. The value of this property "
         "is calculated by this speaker such that, when compared with "
         "the HoldTime property, it has the same proportion as the "
         "KeepAliveConfigured property has with the "
         "HoldTimeConfigured property. A value of 0 indicates that "
         "the KeepAlive timer has not yet been established. The "
         "maximum value of this property is 21845 seconds."),
        Units ("Seconds"),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerKeepAlive"} ]
    uint16 KeepAlive;
};

// ==================================================================
//    IPXProtocolEndpoint
// ==================================================================
        [Description (
         "An IPX communication point from which data may be sent "
         "or received.") ]

class CIM_IPXProtocolEndpoint : CIM_ProtocolEndpoint
{
        [Description (
         "An IPX address formatted as eight hexadecimal digits representing "
         "the network number, followed by a colon, followed by twelve "
         "hexadecimal digits representing the host address " 
         "(e.g. \"00112233:010203040506\").") ]
    string Address;
};

// ==================================================================
//    IPXNetwork
// ==================================================================
        [Description ("A network or subnet that uses the IPX "
         "protocol") ]

class CIM_IPXNetwork : CIM_LogicalNetwork
{
        [Description (
         "An IPX network number formatted as eight hexadecimal digits " 
         " (e.g., \"00112233\").") ]
    string NetworkNumber;
};


// ==================================================================
//     IPRoute
// ==================================================================
        [Abstract, Description (
         "An IPRoute relates a remote IP address (destination) to a "
         "local IP address (source) through which the remote address "
         "may be reached. The local and remote addresses may be "
         "either specific IP endpoints or IP subnets. This class may "
         "used to represent a generic routing table entry.") ]

class CIM_IPRoute : CIM_LogicalElement
{
        [Propagated("CIM_System.CreationClassName"), 
         Key, MaxLen (256), Description (
          "The scoping System's CreationClassName.") ]
    string SystemCreationClassName;
        [Propagated("CIM_System.Name"), Key, MaxLen (256),
         Description (
          "The scoping System's Name.") ]
    string SystemName;
        [Propagated("CIM_Service.CreationClassName"), 
         Key, MaxLen (256), Description (
          "The scoping Service's CreationClassName.") ]
    string ServiceCreationClassName;
        [Propagated("CIM_Service.Name"), Key, MaxLen (256),
         Description (
          "The scoping Service's Name.") ]
    string ServiceName;
        [Key, MaxLen (256), Description (
	   "CreationClassName indicates the name of the class or the "
	   "subclass used in the creation of an instance. When used "
	   "with the other key properties of this class, this property "
	   "allows all instances of this class and its subclasses to "
	   "be uniquely identified.") ]
    string CreationClassName;
        [Key, Description (
         "The IP address which serves as the destination of the "
         "traffic, formatted according to the appropriate convention "
         "as defined in the AddressType property of this class.") ] 
    string IPDestinationAddress;
        [Key, Description (
         "The mask for the destination IP address, formatted "
         "according to the appropriate convention as defined in the "
         "AddressType property of this class.") ] 
    string IPDestinationMask;
        [Key, Description (
         "This contains either the address of the directly connected "
         "interface of the next-hop router or the address of the "
         "interface to which the destination is connected to.") ]
    string NextHop;
        [Key, Description (
         "An enumeration that describes the format of the address "
         "property. Addresses that can be formatted in IPv4 format, "
         "must be formatted that way to ensure mixed IPv4/IPv6 "
         "support. "
         "\n\n"
         "AddressType is part of the key so that an IPv4 and an IPv6 "
         "route to IP subnets with the same network number but "
         "different versions (v4/v6) can coexist "),
        ValueMap { "0", "1", "2" },
        Values { "Unknown", "IPv4", "IPv6" } ]
    uint16 AddressType;
        [Description (
         "TRUE indicates that this ProtocolEndpoint represents a "
         "static route, and FALSE means that it represents a "
         "dynamically-learned route.") ]
    boolean IsStatic;
};

// ==================================================================
//    ForwardedRoutes
// ==================================================================
        [Association, Description (
         "This assocation makes explicit the routes that are used by "
         "a specific ForwardingService. Thus, every ForwardingService "
         "can have its own unique set of routing destinations.") ]

class CIM_ForwardedRoutes : CIM_Dependency
{
        [Override ("Antecedent"), Max(1) ]
    CIM_ForwardingService REF Antecedent;
        [Override ("Dependent"), Weak ]
    CIM_IPRoute REF Dependent;

        [Description (
         "This property contains the current administrative distance "
         "of this route. Note that the AdministrativeDistance class "
         "contains the default values, not the current values, of "
         "administrative distances that are to be used with routes.") ]
    uint16 AdminDistance;
        [Description (
         "This contains an integer which provides an indication as to "
         "the preference of this route compared to other routes that "
         "reach the same destination.") ]
    uint16 PathMetric;
};

// ==================================================================
//    BindsTo
// ==================================================================
        [Association, Description (
         "This association establishes a ServiceAccessPoint "
         "as a requestor of protocol services from a "
         "ProtocolEndpoint. Typically, this association runs "
         "between SAPs and endpoints on a single system. Since a "
         "ProtocolEndpoint is a kind of ServiceAccessPoint, this "
         "binding can be used to establish a layering of two "
         "protocols, the upper layer represented by the Dependent "
         "and the lower layer represented by the Antecedent.") ]

class CIM_BindsTo : CIM_SAPSAPDependency
{
        [Override ("Antecedent") ]
    CIM_ProtocolEndpoint REF Antecedent;
        [Override ("Dependent") ]
    CIM_ServiceAccessPoint REF Dependent;
};

// ==================================================================
//    BindsToLANEndpoint
// ==================================================================
        [Association, Description (
         "This association makes explicit the dependency of a "
         "ProtocolEndpoint on some lower layer ProtocolEndpoint on "
         "the same system.") ]

class CIM_BindsToLANEndpoint : CIM_BindsTo
{
        [Override ("Antecedent") ]
    CIM_LANEndpoint REF Antecedent;
        [Description (
         "This describes the framing method for the upper layer "
         "protocol endpoint that is bound to a LANEndpoint. Note: "
         "\"Raw802.3\" is only known to be used with the IPX "
         "protocol."),
        ValueMap { "0", "1", "2", "3", "4" },
        Values { "Unknown", "Ethernet", "802.2", "SNAP", "Raw802.3" } ]
    uint16 FrameType;
};

// ==================================================================
//     BGPIPRoute
// ==================================================================
        [Description (
         "BGPIPRoute describes a BGP routing entry that connects two "
         "peer routers that are running BGP. The source and "
         "destination addresses may be either specific IP endpoints "
         "or IP subnets.") ]

class CIM_BGPIPRoute : CIM_IPRoute
{
        [Description (
         "Usually, the administrative distance is used to determine "
         "which route gets installed in the routing table. Using this "
         "scheme, routes learned via EBGP will win over routes "
         "learned via an IGP. If this is not desired, then this "
         "assigns the administrative distance of this route to be "
         "equal to that of a local route, which means that the same "
         "route learned by an IGP will have a lower administrative "
         "distance and be installed instead.") ]
    boolean IsBackDoorRoute;
        [Description (
         "Loopback interfaces are often used by IBGP peers, because "
         "they eliminate a dependency that would otherwise occur if "
         "the actual IP address of a physical interface was used to "
         "configure BGP. The loopback interface instead instructs the "
         "router to use any available interface.") ]
    boolean UsesLoopbackPeering;
};

// ==================================================================
//    RoutesBGP
// ==================================================================
        [Association, Description (
         "This association defines a BGP route, and makes explicit "
         "the dependency between a BGPIPRoute and a "
         "BGPProtocolEndpoint.") ]

class CIM_RoutesBGP : CIM_Dependency
{
        [Max (2), Override ("Antecedent"), Description (
         "The BGPProtocolEndpoints that represent the source and "
         "destination (or at least the next hop) of the BGP route.") ]
    CIM_BGPProtocolEndpoint REF Antecedent;
        [Min (1), Max (1), Override ("Dependent"), Description (
         "The routing table entry that represents a BGP route.") ]
    CIM_BGPIPRoute REF Dependent;
};

// ==================================================================
//     NetworksInAdminDomain
// ==================================================================
        [Association, Description (
         "This association is used to define the set of "
         "LogicalNetworks that it contains. This has the implied "
         "semantics that this set of LogicalNetworks are all "
         "administered by the same network administrator that "
         "administrates the AdminDomain.") ]

class CIM_NetworksInAdminDomain : CIM_Dependency
{
        [Min(1), Max(1), Description (
         "The AdminDomain that hosts the various LogicalNetworks."),
	Override("Antecedent") ] 
    CIM_AdminDomain REF Domain;
        [Weak, Description (
         "The LogicalNetworks that are hosted by the AdminDomain."),
	Override("Dependent") ] 
    CIM_LogicalNetwork REF Network;
};

// ==================================================================
//     BGPCluster
// ==================================================================
        [Description (
         "The BGP speakers in an AS are required to be fully meshed. "
         "This can lead to a huge number of TCP connections per "
         "router. One way to reduce the peering requirements is to "
         "use a route reflector. This is based on specifying one or "
         "more routers to act as focal points for IBGP sessions. "
         "\n\n"
         "The route reflector as a whole is called a cluster. It is "
         "logically divided into three types of routers: reflectors, "
         "clients of the route reflector(s), and non-clients of the "
         "route reflector. "
         "\n\n"
         "An AS can have more than one route reflector. There can be "
         "more than one route reflector in a cluster, and there can "
         "be more than one cluster in an AS.") ]

class CIM_BGPCluster : CIM_CollectionOfMSEs
{
        [Key, Description (
         "If a cluster has more than one route reflector, all of the "
         "route reflectors in the cluster need to be configured with "
         "a 4-byte cluster ID. This allows route reflectors to "
         "recognize updates from other route reflectors in the "
         "same cluster.") ] 
    uint32 ClusterID;
};

// ==================================================================
//     RoutersInBGPCluster
// ==================================================================
        [Association, Aggregation, Description (
         "This aggregation establishes 'whole-part' relationships "
         "between a BGPCluster and the ComputerSystems (e.g., the "
         "routers) that it contains. At least three routers are "
         "required to form a cluster - a reflector and two clients. "
         "In addition, the routers that form a cluster share common "
         "configuration information, and are commonly administered.") ]

class CIM_RoutersInBGPCluster : CIM_CollectedMSEs
{
        [Override ("Collection"), Aggregate, Max(1), Description (
         "The Cluster that aggregates the routers belonging to it and "
         "administers them.") ]
    CIM_BGPCluster REF Collection;
        [Override ("Member"), Min(3), Description (
         "The routers that form the Cluster.") ] 
    CIM_ComputerSystem REF Member;
};

// ==================================================================
//     BGPClustersInAS
// ==================================================================
        [Association, Aggregation, Description (
         "This aggregation establishes 'whole-part' relationships "
         "between an AutonomousSystem and the BGPClusters that it "
         "In addition, the routers that form a cluster share common "
         "configuration information, and are commonly administered.") ]

class CIM_BGPClustersInAS
{
        [Key, Aggregate, Max(1), Description (
         "The AutonomousSystem that aggregates the Clusters belonging "
         "to it and administers them.") ]
    CIM_AutonomousSystem REF GroupAS;
        [Key, Description (
         "The Clusters that are contained in the AS.") ] 
    CIM_BGPCluster REF PartAS;
};

// ==================================================================
//     RoutersInAS
// ==================================================================
        [Association, Aggregation, Description (
         "This aggregation establishes 'whole-part' relationships "
         "between an AutonomousSystem and the routers that it "
         "contains. In addition, the routers in the AS share common "
         "configuration information, and are commonly administered.") ]

class CIM_RoutersInAS : CIM_SystemComponent
{
        [Aggregate, Override ("GroupComponent"), Max(1), Description (
         "The AutonomousSystem that aggregates the routers belonging "
         "to it and administers them.") ]
    CIM_AutonomousSystem REF GroupComponent;
        [Override ("PartComponent"), Description (
         "The Routers that are contained in the AS.") ] 
    CIM_ComputerSystem REF PartComponent;
        [Description (
         "This is an array of strings that contain the BGP attributes "
         "supported by this router.") ]
    string BGPSupportedAttributes [];
        [Description (
         "TRUE means that the community value of this router is added "
         "to the existing community value, and FALSE means that the "
         "community value of this router replaces the existing "
         "community value.") ]
    boolean AddCommunityValue;
        [Description (
         "This is an enumeration that defines the function, from the "
         "point of view of BGP, of this router."),
        ValueMap { "0", "1", "2", "3", "4", "5", "6", "7" },
        Values { "Unknown", "Other", "Conventional BGP Speaker",
         "Route Reflector", "Router Reflector Client",
         "Route Reflector Non-Client", "Peer Group Member",
         "Confederation Member" },
	  ModelCorrespondence {"CIM_BGPService.OtherRoleDescription"} ]
    uint16 Role;
        [MaxLen(64), Description (
         "A string describing the type of function that this router "
         "has in its AS when the value of the Role property of this "
         "class is set to 1 (e.g., 'Other'). The format of the string "
         "inserted in this property should be similar in format to "
         "the values defined for the Role property. This property "
         "should be set to NULL when the Role property is any value "
         "other than 1."),
	 ModelCorrespondence {"CIM_BGPService.Role"} ]
   string OtherRoleDescription;
};

// ==================================================================
//    ProvidesEndpoint
// ==================================================================
        [Association, Description (
         "This association represents the endpoints that a network "
         "service provides to access it.") ]

class CIM_ProvidesEndpoint : CIM_ServiceAccessBySAP
{
        [Override ("Antecedent"), Max(1), Description (
         "The NetworkService that is being accessed by the "
         "ProtocolEndpoints.") ]
    CIM_NetworkService REF Antecedent;
        [Override ("Dependent"), Description (
         "The ProtocolEndpoints that provide access to the "
         "NetworkService.") ] 
    CIM_ProtocolEndpoint REF Dependent;
};

// ==================================================================
//     ASBGPEndpoints
// ==================================================================
        [Association, Aggregation, Description (
         "This aggregation defines the different router interfaces "
         "that are running BGP in the AutonomousSystem.") ]

class CIM_ASBGPEndpoints : CIM_SystemComponent
{
        [Aggregate, Override ("GroupComponent"), Max(1), Description (
         "The AutonomousSystem that aggregates the router interfaces "
         "that are running BGP.") ]
    CIM_AutonomousSystem REF GroupComponent;
        [Override ("PartComponent"), Description (
         "The router interfaces that are contained in the AS.") ] 
    CIM_BGPProtocolEndpoint REF PartComponent;
};

// ==================================================================
//     Confederation
// ==================================================================
        [Association, Aggregation, Description (
         "The BGP speakers in an AS are required to be fully meshed. "
         "This can lead to a huge number of TCP connections per "
         "router. One way to reduce the peering requirements is to "
         "use a confederation. A confederation effectively partitions "
         "one AS into a group of 'sub-ASs'. This enables all of the "
         "benefits of IBGP to be applied inside the confederation, "
         "while enabling EBGP to be run between each confederation. "
         "This enables certain BGP attribute values to be preserved "
         "between confederations. However, to the outside world, the "
         "AS with its confederations appear to be a single AS.") ]

class CIM_Confederation : CIM_SystemComponent
{
        [Aggregate, Min(1), Max(1), Override ("GroupComponent"), Description (
         "The AutonomousSystem that contains the confederations.") ]
    CIM_AutonomousSystem REF GroupComponent;
        [Override ("PartComponent"), Description (
         "The Confederation within the AutonomousSystem.") ]
    CIM_AutonomousSystem REF PartComponent;
        [Description (
         "A unique identifier of the AutonomousSystem that contains "
         "the confederations.") ]
    uint32 ParentASNumber;
        [Description (
         "A unique identifier of the Confederation within the "
         "AutonomousSystem.") ]
    uint32 ChildASNumber;
};

// ==================================================================
//     RouteCalculationService
// ==================================================================
        [Abstract, Description (
         "This is a concrete base class, derived from NetworkService, "
         "that represents the route calculation aspects performed by "
         "a router. This also include functions performed by the "
         "router when it exchanges routing information. "
         "\n\n"
         "There are a large variety of additional routing protocols "
         "that are not listed below that will use this service. "
         "These will be added when they are modeled.") ]

class CIM_RouteCalculationService : CIM_NetworkService
{
        [Description (
         "The RouterID uniquely identifies the router that is "
         "performing the route calculation. It is the highest IP "
         "address on the router (or the highest loopback interface, "
         "if there is one).") ] 
    string RouterID;
        [Description (
         "This is an enumerated value that defines the routing "
         "algorithm used that this route calculation is being "
         "performed for."),
        ValueMap { "0", "1", "2", "3", "4", "5", "6", "7", "8" },
        Values { "Unknown", "RIPv1", "RIPv2", "OSPFv1", "OSPFv2",
         "BGPv1", "BGPv2", "BGPv3", "BGPv4" } ]
    uint16 Type;
};

// ==================================================================
//    CalculatedRoutes
// ==================================================================
        [Association, Description (
         "This assocation makes explicit the routes that are "
         "calculated by a specific RouteCalculationService. Thus, "
         "every RouteCalculationService can have its own unique set "
         "of calculated routes.") ]

class CIM_CalculatedRoutes : CIM_Dependency
{
        [Override ("Antecedent"), Max(1) ]
    CIM_RouteCalculationService REF Antecedent;
        [Override ("Dependent") ]
    CIM_IPRoute REF Dependent;
};

// ==================================================================
//    HostedRoutingServices
// ==================================================================
        [Association, Description (
         "This is a specialization of CIM_HostedService, which is an"
         "association between a Service and the System on which the "
         "functionality resides. The ComputerSystem is made up of "
         "different routing services, which take the form of internal "
         "and external routing protocols. These are different "
         "NetworkServices, and are weak with respect to their hosting "
         "ComputerSystem.") ] 

class CIM_HostedRoutingServices : CIM_HostedService 
{
        [Override ("Antecedent"), Max(1), Min(1),
	   Description ("The hosting router.") ]
    CIM_ComputerSystem REF Antecedent;
        [Override ("Dependent"), Description (
         "The Service hosted on the System.") ]
    CIM_RouteCalculationService REF Dependent;
};

// ==================================================================
//    HostedForwardingServices
// ==================================================================
        [Association, Description (
         "This is a specialization of CIM_HostedService, which is an"
         "association between a Service and the System on which the "
         "functionality resides. The ComputerSystem is made up of "
         "different forwarding services, which take the form of "
         "internal and external routing protocols. These are "
         "different NetworkServices, and are weak with respect to "
         "their hosting ComputerSystem.") ] 

class CIM_HostedForwardingServices : CIM_HostedService 
{
        [Override ("Antecedent"), Max(1), Min(1),
	   Description ("The hosting router.") ]
    CIM_ComputerSystem REF Antecedent;
        [Override ("Dependent"), Description (
         "The Service hosted on the System.") ]
    CIM_ForwardingService REF Dependent;
};

// ==================================================================
//    EGPRouteCalcDependency
// ==================================================================
        [Association, Description (
         "This is a specialization of ServiceServiceDependency, and "
         "captures the dependency that external gateway protocols " 
         "(such as BGP) have on interior gateway protocols (such "
         "as OSPF).") ] 

class CIM_EGPRouteCalcDependency : CIM_ServiceServiceDependency
{
        [Override ("Antecedent"), Min(1), Max(1), Description (
         "The independent RouteCalculationService (e.g., the "
         "RouteCalculationService that is functioning as an EGP.") ]
    CIM_RouteCalculationService REF Antecedent;
        [Override ("Dependent"), Description (
         "The dependent RouteCalculationService that provides routing "
         "information within an AS for the RouteCalculationService "
         "that is functioning as an EGP to use.") ]
    CIM_RouteCalculationService REF Dependent;
        [Description (
         "Sometimes it is necessary to inject EGP information, such as "
         "that from BGP, into IGPs. This attribute defines whether this "
         "should be done for the two routing protocols that are "
         "defined by this association. The values below mean that no, "
         " partial, and full EGP information is injected into the "
         "IGP, respectively."),
        ValueMap { "1", "2", "3" },
        Values { "None", "Partial", "Full" } ]
    uint16 IGPInjection;
};

// ==================================================================
//     BGPService
// ==================================================================
        [Description (
         "This class is used to represent the basic operation of BGP. "
         "It is derived from RouteCalculationService, the superclass "
         "of all routing protocols.") ]

class CIM_BGPService : CIM_RouteCalculationService 
{
        [Description (
         "The BGPVersion property defines the version of BGP that "
         "this router is using. This is part of the BGP peer "
         "negotiation  process)."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpVersion"} ]
    uint8 BGPVersion; 
        [Description (
         "BGP sends errors using a NOTIFICATION message. This message "
         "contains an error code, an error subcode, and error data. "
         "The error code defines the type of the notification. The "
         "'Cease' error is for all fatal errors that are not one of "
         "the other five types of errors."),
        ValueMap { "0", "1", "2", "3", "4", "5", "6" },
        Values { "None", "Message Header Error", "OPEN Message Error",
         "UPDATE Message Error", "Hold Timer Expired",
         "Finite State Machine Error", "Cease" } ]
    uint16 LastErrorCode;
        [Description (
         "This defines the BGP error subcode for message header "
         "errors. If the ErrorCode property is any other value, "
         "then this property should be set to NULL."),
        ValueMap { "0", "1", "2", "3" },
        Values { "None", "Connection Not Synchronized",
         "Bad Message Length", "Bad Message Type" },
        ModelCorrespondence {"BGPService.ErrorCode"} ]
    uint16 LastMessageErrorSubCode;
        [Description (
         "This defines the BGP error subcode for OPEN message "
         "errors. If the ErrorCode property is any other value, "
         "then this property should be set to NULL."),
        ValueMap { "0", "1", "2", "3", "4", "5", "6" },
        Values { "None", "Unsupported Version Number", "Bad Peer AS",
         "Bad BGP Identifier", "Unsupported Optional Parameter", 
         "Authentication Failure", "Unacceptable Hold Time"},
        ModelCorrespondence {"BGPService.ErrorCode"} ]
    uint16 LastOpenErrorSubCode;
        [Description (
         "This defines the BGP error subcode for UPDATE message "
         "errors. If the ErrorCode property is any other value, "
         "then this property should be set to NULL."),
        ValueMap { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                   "10", "11" },
        Values { "None", "Malformed Attribute List",
         "Unrecognized Well-Known Attribute",
         "Missing Well-Known Attribute", "Attribute Flags Error", 
         "Attribute Length Error", "Invalid Origin Attribute",
         "AS Routing Loop", "Invalid NEXT_HOP Attribute",
         "Optional Attribute Error", "Invalid Network Field",
         "Malformed AS_path" },
        ModelCorrespondence {"BGPService.ErrorCode"} ]
    uint16 LastUpdateErrorSubCode;
};

// ==================================================================
//     BGPPeerGroup
// ==================================================================
        [Description (
         "A BGP Peer Group is a set of BGP neighbors that share the "
         "same update policies. This enables an administrator to "
         "assign policies to the peer group, instead of individually. "
         "This enables the routers in the Peer Group to optimize "
         "UPDATE messages. Consequently, Peer Groups have a set of "
         "restrictions that must be followed in order to work "
         "correctly with external BGP peers. Otherwise, loss of "
         "routing information could occur."
         "\n\n"
         "A BGPPeerGroup is weak to the AutonomousSystem that "
         "contains it. Therefore, the keys from System must be "
         "propagated to it.") ]

class CIM_BGPPeerGroup : CIM_CollectionOfMSEs
{
        [Propagated ("CIM_AutonomousSystem.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping AutonomousSystem's CreationClassName. ") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_AutonomousSystem.Name"), Key, MaxLen (256),
         Description ("The scoping AutonomousSystem's Name.") ] 
    string SystemName;
        [Key, Description (
         "The type of class that this instance is.") ]
    string CreationClassName;
        [MaxLen(256), Key, Description (
         "This is the name of the BGP Peer Group.") ]
    string Name;
        [Description (
         "This defines the time interval, in seconds, for the "
         "ConnectRetry timer. The suggested value is 120 seconds."),
        Units ("Seconds"),
        Mappingstrings {
         "MIB.IETF|RFC1657-MIB.bgpConnectRetryInterval"} ]
    uint32 ConnectRetryInterval;
        [Description (
         "This defines the time interval in seconds for the Hold "
         "Time configured for this BGP speaker with a peer. This "
         "value is placed in an OPEN message sent to a peer by "
         "this BGP speaker, and is compared with the Hold Time "
         "field in the OPEN message received from the peer. This "
         "enables this speaker to establish a mutually agreeable "
         "Hold Time with the peer. This value must not be less "
         "than three seconds. If it is zero, then the Hold Time "
         "is NOT to be established with the peer. The suggested"
         "value for this timer is 90 seconds."),
        Units ("Seconds"),
        Mappingstrings
         {"MIB.IETF|RFC1657-MIB.bgpPeerHoldTimeConfigured"} ]
    uint16 HoldTimeConfigured;
        [Description (
         "This defines the time interval in seconds for the "
         "KeepAlive timer configured for this BGP speaker with "
         "a peer. This value will determine the frequency of "
         "the KEEPALIVE messages relative to the value of the "
         "HoldTimeConfigured property; the actual frequency is "
         "specified by the value of the KeepAlive property. A "
         "reasonable value is one third of that of the value of "
         "the HoldTimeConfigured property. If it is zero, then "
         "NO periodic KEEPALIVE messages are sent to the peer. "
         "The suggested value for this property is 30 seconds. "
         "The maximum value of this property is 21845 seconds."),
        Units ("Seconds"),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerKeepAliveConfigured"} ]
    uint16 KeepAliveConfigured;
        [Description (
         "This defines the time interval in seconds for the "
         "MinASOriginationInterval timer. The suggested value for "
         "this property is 15 seconds."),
        Units ("Seconds"),
        Mappingstrings
         {"MIB.IETF|RFC1657-MIB.bgpPeerMinASOriginationInterval"} ]
    uint16 MinASOriginationInterval; 
        [Description (
         "This defines the time interval in seconds for the "
         "MinRouteAdvertisementInterval timer. The suggested value "
         "for this property is 30 seconds."),
        Units ("Seconds"),
        Mappingstrings {
         "MIB.IETF|RFC1657-MIB.bgpPeerMinRouteAdvertisementInterval"} ]
    uint16 MinRouteAdvertisementInterval;
};

// ==================================================================
//    ReflectorService
// ==================================================================
        [Association, Description (
         "This association will serve as the base class for defining "
         "BGP routing policies for the reflector of this Cluster.") ] 

class CIM_ReflectorService : CIM_Dependency
{
        [Max(1), Description (
         "The Cluster for which this policy is being defined."),
	 Override ("Antecedent") ] 
    CIM_BGPCluster REF Antecedent;
        [Min(1), Description (
         "The BGPService to which the policy will be applied in "
         "the Cluster."),
	 Override ("Dependent") ]
    CIM_BGPService REF Dependent;
};

// ==================================================================
//    ReflectorClientService
// ==================================================================
        [Association, Description (
         "This association will serve as the base class for defining "
         "BGP routing policies for clients of the reflector of "
         "this Cluster.") ] 

class CIM_ReflectorClientService : CIM_Dependency
{
        [Max(1), Description (
         "The Cluster for which this policy is being defined."),
	 Override("Antecedent") ] 
    CIM_BGPCluster REF Antecedent;
        [Min(1), Description (
         "The BGPService to which the policy will be applied in "
         "the Cluster."),
	 Override ("Dependent") ]
    CIM_BGPService REF Dependent;
};

// ==================================================================
//    ReflectorNonClientService
// ==================================================================
        [Association, Description (
         "This association will serve as the base class for defining "
         "BGP routing policies for the non-clients of the reflector "
         "of this Cluster.") ] 

class CIM_ReflectorNonClientService : CIM_Dependency
{
        [Max(1), Description (
         "The Cluster for which this policy is being defined."),
	 Override ("Antecedent") ] 
    CIM_BGPCluster REF Antecedent;
        [Description (
         "The BGPService to which the policy will be applied in "
         "the Cluster."),
	 Override ("Dependent") ]
    CIM_BGPService REF Dependent;
};

// ==================================================================
//     FilterEntry
// ==================================================================
        [Description (
         "A FilterEntry is used by network devices to identify "
         "traffic and either forward them (with possibly further "
         "processing) to their destination, or to deny their "
         "forwarding. They are the building block of FilterLists."
         "\n\n"
         "A FilterEntry is weak to the network device (e.g., the "
         "ComputerSystem) that contains it. Hence, the ComputerSystem "
         "keys are propagated to this class.") ]

class CIM_FilterEntry : CIM_LogicalElement
{
        [Propagated ("CIM_ComputerSystem.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping ComputerSystem's CreationClassName. ") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_ComputerSystem.Name"), Key, MaxLen (256),
         Description ("The scoping ComputerSystem's Name.") ] 
    string SystemName;
        [Key, Description (
         "The type of class that this instance is.") ]
    string CreationClassName;
        [Key, MaxLen(256), Description (
         "This is the name of the FilterEntry.") ]
    string Name;
        [Description (
         "This defines the type of traffic that is being filtered. "
         "This will affect the filtering rules in the MatchCondition "
         "property of this class."),
        ValueMap { "0", "1", "2" },
        Values { "Unknown", "IP", "IPX" } ]
    uint16 TrafficType;
        [Description (
         "This specifies one of a set of ways to identify traffic. "
         "if the value is 1 (e.g., 'Other'), then the specific "
         "type of filtering is specified in the "
         "OtherMatchConditionType property of this class."),
        ValueMap { "1", "2", "3", "4", "5", "6", "7", "8", "9" },
        Values {"Other", "Source Address and Mask",
         "Destination Address and Mask", "Source Port",
         "Source Port Range", "Destination Port",
         "Destination Port Range", "Protocol Type",
         "Protocol Type and Option" },
        ModelCorrespondence { "FilterEntry.OtherMatchConditionType" } ]
    uint16 MatchConditionType;
        [Description (
         "If the value of the MatchConditionType property in this "
         "class is 1 (e.g., 'Other'), then the specific type of "
         "filtering is specified in this property."),
        ModelCorrespondence { "FilterEntry.MatchConditionType" } ]
    string OtherMatchConditionType;
        [Description (
         "This is the value of the condition that filters the "

         "traffic. It corresponds to the condition specified in the "
         "MatchConditionType property. If, however, the value of the "
         "MatchConditionProperty is 1, then it corresponds to the "
         "condition specified in the OtherMatchConditionType "
         "property.") ]
    string MatchConditionValue;
        [Description (
         "This defines whether the action should be to forward or "
         "deny traffic meeting the match condition specified in "
         "this filter."),
        ValueMap { "1", "2" },
        Values { "Permit", "Deny" } ]
    uint16 Action;
};
    
    
// ==================================================================
//     FilterList
// ==================================================================
        [Description (
         "A FilterList is used by network devices to identify routes "
         "by aggregating a set of FilterEntries into a unit, called a "
         "FilterList. FilterLists can also be used to accept or deny "
         "routing updates." 
         "\n\n"
         "A FilterList is weak to the network device (e.g., the "
         "ComputerSystem) that contains it. Hence, the ComputerSystem "
         "keys are propagated to this class.") ]

class CIM_FilterList : CIM_LogicalElement
{
        [Propagated ("CIM_ComputerSystem.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping ComputerSystem's CreationClassName. ") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_ComputerSystem.Name"), Key, MaxLen (256),
         Description ("The scoping ComputerSystem's Name.") ] 
    string SystemName;
        [Key, Description (
         "The type of class that this instance is.") ]
    string CreationClassName;
        [Key, MaxLen(256), Description (
         "This is the name of the FilterList.") ]
    string Name;
        [Description (
         "This defines whether this FilterList is used for input, "
         "output, or both input and output filtering."),
        ValueMap { "1", "2", "3" },
        Values { "Input", "Output", "Both" } ]
    uint16 Direction;
};

// ==================================================================
//     RoutingPolicy
// ==================================================================
        [Description (
         "This class is used to implement routing policies. It "
         "aggregates a set of FilterLists, along with other "
         "appropriate constructs, into a unit. One of the most "
         "important uses of this class is to change the routing "
         "policy by changing values of various BGP attributes in a "
         "consistent manner." 
         "\n\n"
         "A RoutingPolicy is weak to the network device (e.g., the "
         "ComputerSystem) that contains it. Hence, the ComputerSystem "
         "keys are propagated to this class.") ]

class CIM_RoutingPolicy : CIM_LogicalElement
{
        [Propagated ("CIM_ComputerSystem.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping ComputerSystem's CreationClassName. ") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_ComputerSystem.Name"), Key, MaxLen (256),
         Description ("The scoping ComputerSystem's Name.") ] 
    string SystemName;
        [Key, MaxLen(256), Description (
         "CreationClassName indicates the name of the class or the "
         "subclass used in the creation of an instance. When used "
         "with the other key properties of this class, this property "
         "allows all instances of this class and its subclasses to "
         "be uniquely identified.") ]
    string CreationClassName;
        [Key, MaxLen(256), Description (
         "This is the name of the Routing Policy.") ]
    string Name;
        [Description (
         "The Description property is a free-form string that "
         "provides a textual description of the routing policy.") ] 
    string Description;
        [Description (
         "This defines the type of action that will be performed "
         "if the match conditions of this filter policy are met. "
         "There are essentially three choices: forward the traffic "
         "unmodified, forward the traffic, but modify either the "
         "BGP attributes describing the route and/or other "
         "attributes that define how to condition the traffic "
         "(e.g., its ToS byte settings), or prevent the traffic "
         "from being forwarded."),
        ValueMap { "1", "2", "3", "4", "5", "6", "7", "8", "9" },
        Values { "Accept As Is", "Accept With BGP Changes", 
         "Accept and Remark Packet",
         "Accept With BGP and Remark Changes",
         "Accept With Other Actions",
         "Accept With BGP Changes and Other Actions",
         "Accept with Remark Changes and Other Actions",
         "Accept with BGP and Remark Changes and Other Actions",
         "Deny" } ]
    uint16 Action;
        [Description (
         "This defines one or more BGP attributes that should be"
         "used to modify this routing update."),
        ValueMap { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" },
        Values { "Origin", "AS_Path", "NEXT_HOP", "Multi_Exit_Disc",
         "Local_Pref", "Atomic_Aggregate", "Aggregator", "Community",
         "Originator_ID", "Cluster_List" } ]
    uint16 BGPAction;
        [Description (
         "The value for the corresponding BGPAction.") ]
    string BGPValue;
        [Description (
         "This defines a remarking action for this traffic."),
        ValueMap { "1", "2", "3", "4", "5", "6", "7" },
        Values { "Change DSCP", "Change ToS", "Change 802.1Q Value",
         "Change CIR", "Change CBR", "Change ABR", "Change VBR" } ]
    uint16 RemarkAction; 
        [Description (
         "The value for the corresponding RemarkAction.") ]
    string RemarkValue;
        [Description (
         "This defines other actions to be taken for this traffic."),
        ValueMap { "1", "2", "3", "4", "5", "6", "7" },
        Values { "Other", "Input Flow Policing",
         "Output Flow Policing", "Input Aggregate Policing",
         "Output Aggregate Policing",
         "PoliceByMarkingDown", "PoliceByDroppingDown" } ]
    uint16 ConditioningAction;
        [Description (
         "If the value of the ConditioningAction property of this "
         "class is 1, this contains an application-specific type of "
         "conditioning that is to be performed. Otherwise, if the "
         "ConditioningAction property is any other value, the value "
         "of this property should be NULL."),
        ModelCorrespondence { "RoutingPolicy.ConditioningAction" } ]
    string OtherConditioningAction; 
        [Description (
         "The value for the corresponding ConditioningAction.") ]
    string ConditioningValue;
        [Description (
         "This controls whether BGP attribute values replace, get "
         "prepended, or get appended to their existing values."),
        ValueMap { "1", "2", "3" },
        Values { "Replace", "Prepend", "Append" } ]
    uint16 AttributeAction;
};

// ==================================================================
//    EntriesInFilterList
// ==================================================================
        [Association, Aggregation, Description (
         "This is a specialization of the CIM_Component aggregation "
         "which is used to define a set of FilterEntries that are "
         "aggregated by a particular FilterList.") ]

class CIM_EntriesInFilterList : CIM_Component
{
        [Aggregate, Min(1), Max(1), Override ("GroupComponent"),
         Description (
         "The FilterList, which aggregates the set "
         "of FilterEntries.") ] 
    CIM_FilterList REF GroupComponent;
        [Override ("PartComponent"), Description (
         "A FilterEntry, which is part-of the FilterList.") ] 
    CIM_FilterEntry REF PartComponent;
        [Description ("The position of the FilterEntry relative "
         "to all other entries in the FilterList.") ]
    uint16 Sequence;
};

// ==================================================================
//    ListsInRoutingPolicy
// ==================================================================
        [Association, Aggregation, Description (
         "This is a specialization of the CIM_Component aggregation "
         "which is used to define a set of FilterLists that are "
         "aggregated by a particular RoutingPolicy.") ]

class CIM_ListsInRoutingPolicy : CIM_Component
{
        [Aggregate, Override ("GroupComponent"), Description (
         "The RoutingPolicy, which aggregates the set "
         "of FilterLists.") ] 
    CIM_RoutingPolicy REF GroupComponent;
        [Override ("PartComponent"), Description (
         "A FilterList, which is part-of the RoutingPolicy.") ] 
    CIM_FilterList REF PartComponent;
        [Description ("the position of the FilterList relative "
         "to all other entries in the RoutingPolicy.") ]
    uint16 Sequence;
};

// ==================================================================
//    BGPRoutingPolicy
// ==================================================================
        [Association, Description (
         "This is a specialization of the Dependency association, and "
         "defines the relationship between a BGPService and the "
         "RoutingPolicy that control it.") ] 

class CIM_BGPRoutingPolicy : CIM_Dependency
{
        [Override ("Antecedent"), Description (
         "The BGP routing policy object.") ] 
    CIM_RoutingPolicy REF Antecedent;
        [Override ("Dependent"), Description (
         "The BGPService that is controlled by the routing policy.") ] 
    CIM_BGPService REF Dependent;
};

// ==================================================================
//    BGPPeerGroupService
// ==================================================================
        [Association, Description (
         "This defines the relationship between a BGPService and the "
         "BGP Peer Group that hosts it.") ] 

class CIM_BGPPeerGroupService : CIM_Dependency
{
        [Min(1), Max(1), Description (
         "The BGP Peer Group that hosts the BGP Service."),
	Override("Antecedent") ] 
    CIM_BGPPeerGroup REF Antecedent;
        [Description (
         "The BGPService that is hosted in the BGP Peer Group."),
	Override ("Dependent") ] 
    CIM_BGPService REF Dependent;
};

// ==================================================================
// AdministrativeDistance
// ==================================================================
        [Description (
         "This class is used to control the choosing of which "
         "protocol to give preference over when two protocols learn "
         "the same route. This preference parameter is called the "
         "distance of the protocol. The lower the distance, the "
         "higher the preference for that protocol. This table "
         "affects ALL routes. "
         "\n\n"
         "AdministrativeDistance, being a global object, is weak to "
         "the AdminDomain that contains it. Hence, the AdminDomain "
         "keys are propagated to this class.") ]

class CIM_AdministrativeDistance : CIM_LogicalElement
{
        [Propagated ("CIM_ComputerSystem.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping ComputerSystem's CreationClassName. ") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_ComputerSystem.Name"), Key, MaxLen (256),
         Description ("The scoping ComputerSystem's Name.") ] 
    string SystemName; 
        [Key, Description (
         "The type of class that this instance is.") ]
    string CreationClassName;
        [Key, MaxLen(256), Description (
         "This is the name of the AdministrativeDistance class.") ]
    string Name; 
        [Description (
         "The distance for directly connected peers. It has a default "
         "value of 0.") ]
    uint8 DirectConnect;
        [Description (
         "The distance for staticly connected peers. It has a default "
         "value of 1.") ]
    uint8 Static;
        [Description (
         "The distance for peers using EBGP. It has a default value "
         "of 20.") ]
    uint8 EBGP; 
        [Description (
         "The distance for peers using internal EIGRP. It has a "
         "default value of 90.") ]
    uint8 EIGRPInternal; 
        [Description (
         "The distance for peers using IGRP. It has a default value "
         "of 100.") ]
    uint8 IGRP; 
        [Description (
         "The distance for peers using OSPF. It has a default value "
         "of 110.") ]
    uint8 OSPF; 
        [Description (
         "The distance for peers using ISIS. It has a default value "
         "of 115.") ]
    uint8 ISIS; 
        [Description (
         "The distance for peers using RIP. It has a default value "
         "of 120.") ]
    uint8 RIP; 
        [Description (
         "The distance for peers using EGP. It has a default value "
         "of 140.") ]
    uint8 EGP; 
        [Description (
         "The distance for peers using external EIGRP. It has a "
         "default value of 170.") ]
    uint8 EIGRPExternal; 
        [Description (
         "The distance for peers using IBGP. It has a default value "
         "of 200.") ]
    uint8 IBGP; 
        [Description (
         "The distance for peers using BGP locally. It has a default "
         "value of 200.") ]
    uint8 BGPLocal; 
        [Description (
         "The distance for peers using an unknown protocol. It has a "
         "default value of 255.") ]
    uint8 Unknown;
};

// ==================================================================
//    BGPAdminDistance
// ==================================================================
        [Association, Description (
         "This is a specialization of the Dependency association, and "
         "defines the relationship between a BGPService and the "
         "Administrative Distances that it uses to control the "
         "(BGP) routing decisions that it makes.") ] 

class CIM_BGPAdminDistance : CIM_Dependency
{
        [Override ("Antecedent"), Min(1), Max(1), Description (
         "The table of (global) administrative distances that are "
         " used by all BGP services.") ] 
    CIM_AdministrativeDistance REF Antecedent;
        [Override ("Dependent"), Description (
         "The BGP service object, that makes BGP routing decisions.") ]
    CIM_BGPService REF Dependent;
};

// ==================================================================
//     BGPRouteMap
// ==================================================================
        [Description (
         "A route map is used to control and modify routing "
         "information as well as to define when a route is "
         "redistributed between routing domains. Route maps are "
         "placed in router configuration files, and several "
         "instances of the same route map may be used to implement "
         "different actions (see accompanying white paper). "
         "\n\n"
         "Route maps may use FilterLists to identify the route " 
         " (again, see the accompanying white paper). "
         "\n\n"
         "A BGPRouteMap is specific to a given AutonomousSystem that "
         "contains it. Hence, the keys of the AutonomousSystem are "
         "propagated to this class.") ]

class CIM_BGPRouteMap : CIM_LogicalElement
{
        [Propagated ("CIM_AutonomousSystem.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping AutonomousSystem's CreationClassName. ") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_AutonomousSystem.Name"), Key, MaxLen (256),
         Description ("The scoping AutonomousSystem's Name.") ] 
    string SystemName; 
        [Key, Description (
         "The type of class that this instance is.") ]
    string CreationClassName;
        [Key, MaxLen(256), Description (
         "This is the name of the RouteMap class.") ]
    string Name; 
        [Description (
         "This defines whether this RouteMap is used for input, "
         "output, or both input and output filtering."),
        ValueMap { "1", "2", "3" },
        Values { "Input", "Output", "Both" } ]
    uint16 Direction;
        [Description (
         "This defines whether the action should be to forward or "
         "deny traffic meeting the match condition specified in this "
         "RouteMap"),
        ValueMap { "1", "2" },
        Values { "Permit", "Deny" } ] 
    uint16 Action;
        [Description (
         "This specifies the criteria that must be matched in order "
         "for the corresponding MatchAction to take effect. The "
         "matching of the criteria may be specified by using a "
         "FilterList. For example, the command 'match ip address foo' "
         "uses the FilterList named 'foo' to do the matching of IP "
         "addresses."),
        ValueMap { "1", "2", "3", "4", "5", "6", "7", "8", "9" },
        Values {"Other", "Source Address and Mask",
         "Destination Address and Mask", "Source Port",
         "Source Port Range", "Destination Port",
         "Destination Port Range", "Protocol Type",
         "Protocol Type and Option" },
        ModelCorrespondence { "RouteMap.OtherMatchConditionType" } ]
    uint16 MatchConditionType;
        [Description (
         "If the value of the MatchConditionType property in this "
         "class is 1 (e.g., 'Other'), then the specific type of "
         "filtering is specified in this property."),
        ModelCorrespondence { "RouteMap.MatchConditionType" } ]
    string OtherMatchConditionType; 
        [Description (
         "This defines an additional action to take if the "
         "MatchCondition is satisfied. This definition is "
         "specifically limited to BGP filtering for now (e.g., its "
         "use is limited to setting a BGP attribute to a specific "
         "value), and will be upgraded in a subsequent release. The "
         "actual value of the metric is specified in the "
         "SetMetricValue property. "),
        ValueMap { "1", "2", "3", "4", "5", "6", "7", "8", "9" },
        Values { "Origin", "AS_Path", "NEXT_HOP", "Multi_Exit_Disc",
         "Local_Pref", "Atomic_Aggregate", "Aggregator", "Community",
         "Originator_ID" } ]
    uint16 SetMetricType;
        [Description (
         "This is the value of the metric that is being set for the "
         "BGP attribute defined in the SetMetricType property.") ]
    string SetMetricValue;
};

// ==================================================================
//    BGPRouteMapsInRoutingPolicy
// ==================================================================
        [Association, Aggregation, Description (
         "This aggregation defines the RouteMaps that are used by a "
         "particular RoutingPolicy object. Multiple instances of the "
         "same RouteMap may be used in the same RoutingPolicy "
         "instance; if this is desired, then the Sequence attribute "
         "of this aggregation can be used to disambiguate them.") ]

class CIM_BGPRouteMapsInRoutingPolicy : CIM_Component
{
        [Aggregate, Override ("GroupComponent"), Description (
         "The RoutingPolicy that aggregates the RouteMaps.") ] 
    CIM_RoutingPolicy REF GroupComponent;
        [Override ("PartComponent"), Description (
         "The RouteMaps that are used by the RoutingPolicy.") ] 
    CIM_BGPRouteMap REF PartComponent;
        [Description (
         "This defines the position of this RouteMap instance "
         "relative to all other instances of the same RouteMap.") ]
    uint16 Sequence;
};

// ==================================================================
//    BGPPeerUsesRouteMap
// ==================================================================
        [Association, Aggregation, Description (
         "This association defines the RouteMaps that are used by a "
         "particular BGPPeerGroup object. Multiple instances of the "
         "same RouteMap may be used in the same BGPPeerGroup "
         "instance; if this is desired, then the Sequence attribute "
         "of this association can be used to disambiguate them.") ]

class CIM_BGPPeerUsesRouteMap
{
        [Aggregate, Description (
         "The BGPPeerGroup that aggregates the RouteMaps.") ] 
    CIM_BGPPeerGroup REF Antecedent;
        [Description (
         "The RouteMaps that are used by the BGPPeerGroup.") ] 
    CIM_BGPRouteMap REF Dependent;
        [Description (
         "This defines the position of this RouteMap instance "
         "relative to all other instances of the same RouteMap.") ]
    uint16 Sequence;
};

// ==================================================================
//    FilterListsInBGPRouteMap
// ==================================================================
        [Association, Description (
         "RouteMaps do not have to use FilterLists, but if they do, "
         "this association defines which FilterList is used by a "
         "particular RouteMap.") ] 

class CIM_FilterListsInBGPRouteMap : CIM_Dependency
{
        [Override ("Antecedent"), Max(1), Description (
         "The FilterList used by a RouteMap.") ] 
    CIM_FilterList REF Antecedent;
        [Override ("Dependent"), Min(1), Max(1), Description (
         "The RouteMap using the FilterList.") ] 
    CIM_BGPRouteMap REF Dependent;
};

// ==================================================================
//    InBGPPeerGroup
// ==================================================================
        [Association, Aggregation, Description (
         "This aggregation defines the specific routers (e.g., "
         "ComputerSystems) that participate in a PeerGroup.") ] 

class CIM_InBGPPeerGroup : CIM_CollectedMSEs
{
        [Aggregate, Override ("Collection"), Max(1), Description (
         "The PeerGroup that aggregates the routers.") ] 
    CIM_BGPPeerGroup REF Collection;
        [Min(2), Override ("Member"), Description (
         "The routers that comprise the PeerGroup.") ] 
    CIM_ComputerSystem REF Member;
};

// ==================================================================
//    CalculatesAmong 
// ==================================================================
        [Association, Description (
         "This is a specialization of the ServiceSAPDependency "
         "association, indicating that the referenced "
         "ProtocolEndpoint is utilized by the "
         "RouteCalculationService to provide its functionality.") ]

class CIM_CalculatesAmong : CIM_ServiceSAPDependency
{
        [Override ("Antecedent"), 
	   Description ("The required ProtocolEndpoint") ] 
    CIM_ProtocolEndpoint REF Antecedent;
        [Override ("Dependent"), Description (
         "The RouteCalculationService, which is dependent on the "
         "underlying ProtocolEndpoint.") ] 
    CIM_RouteCalculationService REF Dependent;
        [Description (
         "TRUE indicates that this ProtocolEndpoint represents a "
         "static route, and FALSE means that it represents a "
         "dynamically-learned route.") ]
    boolean IsStatic;
};

// ==================================================================
//    BGPAttributes 
// ==================================================================
        [Description (
         "This class defines all of the BGP Attributes, for a given "
         "version of the BGP protocol, that can be used to affect "
         "routing decisions. "
         "\n\n"
         "BGPAttributes are specific to a given AutonomousSystem that "
         "contains it. Hence, the keys of the AutonomousSystem are "
         "propagated to this class.") ]

class CIM_BGPAttributes : CIM_LogicalElement
{
        [Propagated ("CIM_AutonomousSystem.CreationClassName"), Key, 
	   MaxLen (256), Description (
         "The scoping AutonomousSystem's CreationClassName. ") ] 
    string SystemCreationClassName;
        [Propagated ("CIM_AutonomousSystem.Name"), Key, MaxLen (256),
         Description ("The scoping AutonomousSystem's Name.") ] 
    string SystemName; 
        [Key, Description (
         "This defines the version of the BGP protocol.") ]
    string Version;
        [Description (
         "This defines the priority, or preference, of a route, in "
         "order to better compare it with other routes for the same "
         "destination. Higher values indicate a higher preference "
         "for a route."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrLocalPref"} ]
    uint16 LocalPreference;
        [Description (
         "This attribute is a sequences of the AS numbers through "
         "which routing information carried in this UPDATE message "
         "has passed. The components of this list can be AS_SETs "
         "or AS_SEQUENCEs."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrASPath"} ]
    string ASPath;
        [Description (
         "This is the set of all elements contained in all specific "
         "paths that are being summarized, so that those attributes "
         "will remain available to the routing decision process.") ]
    string AS_Set;
        [Description (
         "This attribute defines the IP address of the border router "
         "that should be used as the next hop to the destinations "
         "listed in the UPDATE message."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrNextHop"} ]
    string NextHop; 
        [Description (
         "This defines the next hop to be the IP address of the "
         "border IBGP neighbor.") ]
    string NextHopSelf;
        [Description (
         "This is used on external (e.g., inter-AS) links to indicate "
         "which is the preferred entry point into an AS, when that AS "
         "has multiple entry points. Lower MED values have "
         "preference."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrMultiExitDisc"} ]
    uint32 MED;
        [Description (
         "This defines a group of destinations that share a similar "
         "property. Communities are not restricted to a single AS, "
         "and can span multiple ASs. This attribute is used to "
         "simplify routing policies by basing policies on a logical "
         "value, as opposed to an IP address or an AS number. ") ]
    uint32 BGPCommunityValue;
        [Description (
         "This attribute gets set if there are overlapping routes, "
         "and a less-specific route is selected instead of a more "
         "specific one (e.g., a system propagates an aggregate "
         "that causes loss of information."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrAtomicAggregate"} ]
    boolean AtomicAggregate;
        [Description (
         "This specifies the AS and IP address of the router that has "
         "generated an aggregate."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrAggregatorAS"} ]
    string Aggregator;
        [Description (
         "This is generated by the AS that originates the routing "
         "information. There are three types of origins - IGP, EGP, "
         "and INCOMPLETE. These correspond to whether the information "
         "was learned internally in the AS, externally via an EGP, "
         "or by some other means."),
        ValueMap { "1", "2", "3" },
        Values { "IGP", "EGP", "INCOMPLETE" },
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrOrigin"} ]
    uint16 Origin; 
        [Description (
         "This is the router ID for the ORIGIN attribute.") ]
    string OriginatorID;
};

// ==================================================================
//    FilteredBGPAttributes 
// ==================================================================
        [Association, Aggregation, Description (
         "This is a specialization of the Component aggregation, "
         "which is used to define the set of BGP Attributes that are "
         "used by a particular Routing Policy.") ]

class CIM_FilteredBGPAttributes : CIM_Component
{
        [Aggregate, Override ("GroupComponent"), Description (
         "The RoutingPolicy, which aggregates a set of BGP "
         "attributes.") ]
    CIM_RoutingPolicy REF GroupComponent;
        [Override ("PartComponent"), Description (
         "A BGP attribute, which is part-of the RoutingPolicy.") ]
    CIM_BGPAttributes REF PartComponent;
};

// ==================================================================
//    BGPPathAttributes 
// ==================================================================
        [Description (
         "This class defines the per-path information used to process "
         "specific BGP attribute information, as defined in the "
         "bgp4PathAttrTable of RFC 1657. WARNING! This class has "
         "been modified, the array key has been commented out "
         "for compilation purposes") ]

class CIM_BGPPathAttributes : CIM_LogicalElement
{
    /*
        [Key, Description (
         "This property represents a sequence of AS path segments. "
         "Each AS path segment is represented by the tuple: "
         "     <type, length, value>."
         "\n\n"
         "The type is a 1-octet field which has two possible values: "
         "    1   AS_SET: unordered set of ASs a route in the UPDATE "
         "                message has traversed. "
         "    2      AS_SEQUENCE: ordered set of ASs a route in the "
         "                        UPDATE message has traversed. "
         "\n\n"
         "An AS_SET is an unordered set of ASs representing the path "
         "that an UPDATE message has traversed, and an AS_SEQUENCE is "
         "an ordered set of ASs representing the path that an UPDATE "
         "message has traversed. "
         "\n\n"
         "The length is a 1-octet field containing the number of ASs "
         "in the value field. "
         "\n\n"
         "The value field contains one or more AS numbers, each AS is "
         "represented in the octet string as a pair of octets "
         "according to the following algorithm: "
         "    first-byte-of-pair = ASNumber / 256; "
         "    second-byte-of-pair = ASNumber & 255;"
         "\n\n"
         "The bgp4PathAttrASPathSegment MIB variable is actually an "
         "OctetString. Its length is defined as a minimum of 2 and a "
         "maximum of 256 octets. "),
        ArrayType ("Indexed"),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrASPathSegment"} ]
    uint8 PathAttrASPathSegment[ ];
    */
        [Key, Description (
         "This is the address of the border router that should be "
         "used for the destination network."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrNextHop"} ]
    string PathAttrNextHop;
        [Description (
         "This is an enumeration that defines the ultimate origin of "
         "the path information. The value 'IGP' means that the origin "
         "is interior; the value 'EGP' means that it was learned via "
         "an EGP; the value 'INCOMPLETE' means that the origin is "
         "undetermined."),
        ValueMap { "1", "2", "3" },
        Values {"IGP", "EGP", "INCOMPLETE"},
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrOrigin"} ]
    uint16 PathAttrOrigin;
        [Description (
         "This metric is used to discriminate between multiple "
         "adjacent autonomous systems. A value of -1 indicates the "
         "absence of this attribute. The range of this attribute "
         "is defined to be -1 to 2147483647."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrMultiExitDisc"} ]
    sint32 PathAttrMultiExitDisc;
        [Description (
         "This is the originating BGP4 speaker's degree of preference "
         "for an advertised route. A value of -1 indicates the "
         "absence of this attribute. The range of this attribute is "
         "defined to be -1 to 2147483647."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrLocalPref"} ]
    sint32 PathAttrLocalPref;
        [Description (
         "This is an enumeration that defines whether or not the "
         "local system has selected a less specific route without "
         "selecting a more specific route. There are two values, 1 "
         "and 2, indicating that a less specific route has not and "
         "has been selected, respectively. This is a 32-bit integer "
         "to correspond to the IETF MIB."),
        ValueMap { "1", "2" },
        Values {"Less Specific Not Selected",
                "Less Specific Selected"},
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrAtomicAggregate"} ]
    uint32 PathAttrAtomicAggregate;
        [Description (
         "This is the AS number of the last BGP4 speaker that "
         "performed route aggregation. A value of 0 indicates the "
         "absence of this attribute. The range of this attribute is "
         "defined to be 0 to 65535."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrAggregatorAS"} ]
    uint16 PathAttrAggregatorAS; 
        [Description (
         "This is the IP address of the last BGP4 speaker that "
         "performed route aggregation. A value of 0.0.0.0 indicates "
         "the absence of this attribute."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrAggregatorAddr"} ]
    string PathAttrAggregatorAddr;
        [Description (
         "This is the degree of preference calculated by the "
         "receiving BGP4 speaker for an advertised route. A value of "
         "-1 indicates the absence of this attribute. The range of "
         "this attribute is defined to be -1 to 2147483647."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrCalcLocalPref"} ]
    sint16 PathAttrCalcLocalPref;
        [Description (
         "This is an indication of whether or not this route was "
         "chosen as the best BGP4 route. There are two possible "
         "values, 1 (FALSE) and 2 (TRUE)."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrBest"} ]
    uint16 PathAttrBest;
        [Description (
         "This contains one or more path atributes not understood by "
         "this BGP4 speaker. The MIB variable is an OctetString, and "
         "contains a 1-octet length field and up to 254 additional "
         "octets of data. The length is placed in a separate "
         "attribute of this class, PathAttrUnknownNumber."),
        ModelCorrespondence { "PathAttrUnknownNumber" },
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrUnknown"} ]
    string PathAttrUnknown[ ];
        [Description (
         "The MIB variable is an OctetString, and contains a 1-octet "
         "length field and up to 255 additional octets of data. The "
         "length is placed in this attribute."),
        ModelCorrespondence { "PathAttrUnknown" },
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrUnknown"} ]
    uint16 PathAttrUnknownNumber;
};

// ==================================================================
//    BGPAttributesForRoute
// ==================================================================
        [Association, Description (
         "This defines the attributes that are transmitted between "
         "BGP peers on a per-route basis.") ]

class CIM_BGPAttributesForRoute : CIM_Dependency
{
        [Min(1), Max(1), Override ("Antecedent"), Description (
         "The BGPIPRoute that may have an associated set of "
         "per-peer attributes.") ]
    CIM_BGPIPRoute REF Antecedent;
        [Override ("Dependent"), Max(1), Description (
         "The BGPPathAttribute object that may be associated with "
         "a BGP route.") ]
    CIM_BGPPathAttributes REF Dependent;
        [Description (
         "This defines the IP address of the peer where the path "
         "information was learned."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgp4PathAttrPeer"} ]
    string PathAttrPeer;
        [Description (
         "This defines the length in bits of the IP address prefix "
         "in the Network Layer Reachability information field. The "
         "range of this attribute is defined to be 0 to 32."),
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrIpAddrPrefixLen"} ]
    uint8 PathAttrIPAddrPrefixLen; 
        [Description (
         "An IP address prefix in the Network Layer Reachability "
         "Information field. This object is an IP address "
         "containing the prefix with length specified by the "
         "PathAttrIpAddrPrefixLen attribute."),
        ModelCorrespondence {
         "BGPPathAttributes.PathAttrIpAddrPrefixLen" },
        Mappingstrings {"MIB.IETF|RFC1657- MIB.bgp4PathAttrIpAddrPrefix"} ]
    string PathAttrIPAddrPrefix; 
};

// ==================================================================
//    BGPServiceAttributes 
// ==================================================================
        [Association, Aggregation, Description (
         "This is a specialization of the Component aggregation. This "
         "aggregation defines the set of BGP Attributes that are "
         "transmitted in per-path UPDATE messages.") ]

class CIM_BGPServiceAttributes : CIM_Component
{
        [Aggregate, Max(1),
         Override ("GroupComponent"), Description (
         "The BGPService that aggregates BGP attributes as part of "
         "its routing information.") ]
    CIM_BGPService REF GroupComponent;
        [Override ("PartComponent"), Min(1), Max(1), Description (
         "The BGP attribute, which are part-of the BGP UPDATE "
         "message.") ]
    CIM_BGPPathAttributes REF PartComponent;
};

// ===================================================================
//     SwitchService
// ===================================================================
      [Description (
       "Generic switch (bridging) service class. Additional "
       "switching functions are incorporated as subordinate "
       "services related to this class via ServiceComponent "
       "associations.")
      ] 

class CIM_SwitchService : CIM_ForwardingService
{
         [MaxLen(12), Description (
          "MAC address used by this switch service when it must be "
          "uniquely identified. When concatenated with a "
          "SpanningTreeService Priority, a unique bridge identifier "
          "results. The MAC address is formatted as twelve "
          "hexadecimal digits (e.g., \"010203040506\"), with each "
          "pair representing one of the six octets of the MAC address "
          "in \"canonical\" bit order according to RFC 2469."),
        Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dBaseBridgeAddress"}  ]
    string BridgeAddress ;
         [Description (
          "The number of switch ports controlled by this "
          "switching service.") , 
        Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dBaseNumPorts"} ] 
    uint16 NumPorts ;
         [Description (
          "Indicates what type of switching service can be "
          "performed."), 
       ValueMap {"1", "2", "3", "4"},
        Values {"unknown", "transparent-only", "sourceroute-only",
                "srt"},
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dBaseType"} ] 
    uint8 BridgeType ;
};


// ===================================================================
//     SwitchPort
// ===================================================================
      [Description (
       "Switch Port from which frames are received "
       "and out which they are transmitted.")
      ]

class CIM_SwitchPort : CIM_ProtocolEndpoint
{
      [Description (
          "Numeric identifier for a switch port."),
          Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dPort"}
      ]
   uint16 PortNumber;
};

// ===================================================================
//     SwitchesAmong
// ===================================================================
      [Association, Description (
       "A SwitchService switches frames between SwitchPorts. "
       "This association makes that relationship explicit.")
      ]

class CIM_SwitchesAmong : CIM_ForwardsAmong
{
      [Override ("Antecedent"),
       Description ("The switch port.")
      ]
   CIM_SwitchPort REF Antecedent;
      [Override ("Dependent"),  Max(1),
       Description ("The switching service.")
      ]
   CIM_SwitchService REF Dependent;
};

// ===================================================================
//     Switchable
// ===================================================================
      [Association,
       Description (
       "A switch port has a LANEndpoint that is "
       "exposed via this relationship.")
      ] 

class CIM_Switchable : CIM_BindsToLANEndpoint
{
      [Override ("Antecedent"), Max(1),
       Description ("The switch port.")
      ]
    CIM_LANEndpoint REF Antecedent;
      [Override ("Dependent"), Max(1),
       Description ("The LAN endpoint.") 
      ]
    CIM_SwitchPort REF Dependent;
};

// ===================================================================
//     TransparentBridgingService
// ===================================================================
      [Description (
       "This service class represents the learning/transparent "
       "bridging aspect of switch service.")
      ]

class CIM_TransparentBridgingService : CIM_Service
{
      [Description (
          "The timeout period in seconds for aging out "
          "dynamically learned forwarding information. "
          "802.1D-1990 recommends a default of 300 seconds."),
       Units("Seconds"), 
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dTpAgingTime"}
      ]
   uint32 AgingTime;
      [Description (
          "Filtering Database Identifier. Used by VLAN-aware "
          "switch having more than one filtering database."),
       Mappingstrings {"MIB.IETF|RFC????-MIB.dot1qFdbId"}
      ]
   uint32 FID;
};

// ===================================================================
//     SpanningTreeService
// ===================================================================
      [Description (
       "This service class represents the capability of a switch "
       "to participate in the distributed construction of a "
       "spanning tree.")
      ]

class CIM_SpanningTreeService : CIM_Service
{
      [Description (
       "The version of the spanning tree protocol "
       "used by the switch."),
       ValueMap {"1", "2", "3"},
       Values {"unknown", "decLb100", "ieee802d"},
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpProtocolSpecification"}
      ]
   uint16 ProtocolSpec;
      [Description (
       "The format of the priority bits are the first two octets of "
       "the 8-octet long Bridge ID. The other (last) 6 octets of the "
       "Bridge ID are given by the value of the Bridge Address. "
       "\n\n"
       "A priority that can be assigned to the switch for use in "
       "constructing the spanning tree. The unique identifier for "
       "a switch is constructed by concatenating the MAC address "
       "associated with the switch for spanning tree operations "
       "to the two-byte priority. Choice of the priority value "
       "influences election of the root bridge."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpPriority"} ]
   uint16 Priority;
      [MaxLen(16), Description (
       "The Bridge ID (Priority + MAC Address) of the root bridge."
       "\n\n"
       "The format of the priority bits are the first two octets of "
       "the 8-octet long Bridge ID. The other (last) 6 octets of the "
       "Bridge ID are given by the value of the Bridge Address. "
       "Note that the MAC address is formatted as twelve "
       "hexadecimal digits (e.g., \"010203040506\"), with each "
       "pair representing one of the six octets of the MAC address "
       "in \"canonical\" bit order according to RFC 2469. The "
       "priority "),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpDesignatedRoot"}
      ]
   string DesignatedRoot;
      [Description (
       "The cost of the path from the switch to the root."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpRootCost"}
      ]
   uint16 RootCost;
      [Description (
       "The port number of the port having the lowest cost path "
       "to the root bridge."),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpRootPort"}
      ]
   uint16 RootPort;
      [Description (
       "The current value for the maximum age of Spanning Tree "
       "information before discard, as learned from the network."),
      Units ("Hundredths of Seconds"),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpMaxAge"}
      ]
   uint32 MaxAge;
      [Description (
       "The current value of the interval between transmission "
       "of bridge PDUs by the switch on any port for which it is "
       "the spanning tree root or trying to become so, as learned "
       "from the network."),
      Units ("Hundredths of Seconds"),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpHelloTime"}
      ]
   uint32 HelloTime;
      [Description (
       "The minimum interval between transmission of bridge PDUs "
       "through a given port, as learned from the network."),
      Units ("Hundredths of Seconds"),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpHoldTime"}
      ]
   uint32 HoldTime;
      [Description (
       "The time spent by a port in the listening state before "
       "transitioning to the learning state and in the learning "
       "state before transitioning to the forwarding state, as "
       "learned from the network. This value is also used during "
       "the period of a topology change as the maximum age of "
       "Spanning Tree information before discard. "),
      Units ("Hundredths of Seconds"),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpForwardDelay"}
      ]
   uint32 ForwardDelay;
      [Description (
       "The MaxAge parameter to be used by all switches in the "
       "network if this switch becomes the root."),
      Units ("Hundredths of Seconds"),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpBridgeMaxAge"}
      ]
   uint32 BridgeMaxAge;
      [Description (
       "The HelloTime parameter to be used by all switches in the "
       "network if this switch becomes the root."),
      Units ("Hundredths of Seconds"),
      Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpBridgeHelloTime"}
      ]
   uint32 BridgeHelloTime;
      [Description (
       "The ForwardDelay parameter to be used by all switches in "
	 "the network if this switch becomes the root."),
      Units ("Hundredths of Seconds"),
      Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpBridgeForwardDelay"}
      ]
   uint32 BridgeForwardDelay;
      [Description (
       "MAC address used by the spanning tree service when it "
       "must be uniquely identified. When concatenated with a "
       "SpanningTreeService Priority, a unique bridge identifier "
       "results. This property is defined for use of switches "
       "supporting multiple spanning tree services. "
       "\n\n"
       "Note that the MAC address is formatted as twelve "
       "hexadecimal digits (e.g., \"010203040506\"), with each "
       "pair representing one of the six octets of the MAC address "
       "in \"canonical\" bit order according to RFC 2469.")
      ]
   string SpanningTreeBridgeAddress;
};

// ===================================================================
//     SwitchPortSpanningTree
// ===================================================================
      [Association,
       Description (
       "A switch participating in the spanning tree maintains "
       "spanning-tree specific information about each port "
       "whose forwarding is determined by the spanning tree. "
       "This association represents that information.")
   ] 
class CIM_SwitchPortSpanningTree : CIM_ServiceSAPDependency
{
      [Override ("Antecedent"), Description ("The switch port.")]
   CIM_SwitchPort REF Antecedent;
      [Override ("Dependent"),
       Description ("The spanning tree service.")
      ]
   CIM_SpanningTreeService REF Dependent;
      [Description (
       "The priority assigned to the port. Contained in "
       "the first octet of the two-octet port ID; the other "
       "octet is the port number."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpPortPriority"}
      ]
   uint8 Priority;
      [Description (
       "The current state of the port as determined by the "
       "spanning tree protocol."),
       ValueMap {"1", "2", "3", "4", "5", "6"},
        Values {"disabled", "blocking", "listening", "learning",
                "forwarding", "broken"},
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpPortState"}
      ]
   uint16 State;
      [Description (
       "The enabled/disabled status of the port."),
       ValueMap {"1", "2"},
        Values {"enabled", "disabled"},
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpPortEnable"}
      ]
   uint16 Enable;
      [Description (
       "The contribution of this port to the path cost of "
       "paths towards the spanning tree root which include "
       "this port."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpPortPathCost"}
      ]
   uint16 PathCost;
      [Description (
       "The bridge identifier of the root bridge for the segment "
       "to which the port is attached, as transmitted by the "
       "designated bridge for the segment."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpPortDesignatedRoot"}
      ]
   string DesignatedRoot;
      [Description (
       "The cost of the path to the root offered by the "
       "designated bridge for the segment."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpPortDesignatedCost"}
      ]
   uint16 DesignatedCost;
      [Description (
       "The bridge identifier of the designated bridge for the "
       "segment to which the port is attached."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpPortDesignatedBridge"}
      ]
   string DesignatedBridge;
      [Description (
       "The port identifier of the port on the designated bridge "
       "serving the segment to which the port is attached."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpPortDesignatedPort"}
      ]
   uint16 DesignatedPort;
};

// ===================================================================
//     DynamicForwardingEntry
// ===================================================================
      [Description (
       "A DynamicForwardingEntry represents an entry in the "
       "forwarding (filtering) database associated with the "
       "transparent bridging service.")
      ] 
class CIM_DynamicForwardingEntry : CIM_LogicalElement
{
      [Propagated("CIM_System.CreationClassName"), 
       Key, MaxLen (256),
       Description ("The scoping System's CreationClassName.")
      ]
   string SystemCreationClassName;
      [Propagated("CIM_System.Name"),
       Key, MaxLen (256),
       Description ("The scoping System's Name.")
      ]
   string SystemName;
      [Propagated("CIM_Service.CreationClassName"), 
       Key, MaxLen (256),
       Description ("The scoping Service's CreationClassName.")
      ]
   string ServiceCreationClassName;
      [Propagated("CIM_Service.Name"),
       Key, MaxLen (256),
       Description ("The scoping Service's Name.")
      ]
   string ServiceName;
      [Key, MaxLen (256),
       Description (
	  "CreationClassName indicates the name of the class or the "
	  "subclass used in the creation of an instance. When used "
	  "with the other key properties of this class, this property "
	  "allows all instances of this class and its subclasses to "
	  "be uniquely identified.")
      ]
   string CreationClassName;
      [Key, MaxLen (6), Description (
        "Unicast MAC address for which the transparent bridging "
        "service has forwarding and/or filtering information. "
        "\n\n"
        "Note that the MAC address is formatted as twelve "
        "hexadecimal digits (e.g., \"010203040506\"), with each "
        "pair representing one of the six octets of the MAC address "
        "in \"canonical\" bit order according to RFC 2469."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dTpFdbAddress"}
       ] 
   string MACAddress;
      [Description (
        "The status of the entry."),
       ValueMap {"1", "2", "3", "4", "5"},
        Values {"other", "invalid", "learned", "self", "mgmt"},
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dTpFdbStatus"}
      ]
   uint16 DynamicStatus;
};

// ==================================================================
//    TransparentBridgingDynamicForwarding
// ==================================================================
     [Association,
      Description (
       "This association links an instance of the transparent "
       "bridging service to the entries of its forwarding database. "
       "The forwarding database is weak to the service.")
      ] 
class CIM_TransparentBridgingDynamicForwarding : CIM_Dependency
{
      [Override ("Antecedent"), Min(1), Max(1),
       Description ("The transparent bridging service.")
      ]
   CIM_TransparentBridgingService REF Antecedent;
      [Override ("Dependent"), Weak,
       Description ("Dynamic Forwarding Entry of forwarding database.")
      ] 
   CIM_DynamicForwardingEntry REF Dependent;
};

// ==================================================================
//    SwitchPortDynamicForwarding
// ==================================================================
      [Association,
       Description (
       "This association links a dynamic forwarding entry "
       "and the switch port to which the entry applies.")
      ] 

class CIM_SwitchPortDynamicForwarding : CIM_Dependency
{
      [Override ("Antecedent"), Min(1), Max(1),
       Description ("The switch port.")
      ]
   CIM_SwitchPort REF Antecedent;
      [Override ("Dependent"),
       Description ("Dynamic Forwarding Entry of forwarding database.")
      ] 
   CIM_DynamicForwardingEntry REF Dependent;
};

// ===================================================================
//     StaticForwardingEntry
// ===================================================================
      [Description (
       "A StaticForwardingEntry represents an entry in the "
       "static (destination-address filtering) database associated "
       "with the switch service.")
      ]

class CIM_StaticForwardingEntry : CIM_LogicalElement
{

      [Propagated("CIM_System.CreationClassName"), 
       Key, MaxLen (256),
       Description ("The scoping System's CreationClassName.")
      ]
   string SystemCreationClassName;
      [Propagated("CIM_System.Name"),
       Key, MaxLen (256),
       Description ("The scoping System's Name.")
      ]
   string SystemName;
      [Propagated("CIM_Service.CreationClassName"), 
       Key, MaxLen (256),
       Description ("The scoping Service's CreationClassName.")
      ]
   string ServiceCreationClassName;
      [Propagated("CIM_Service.Name"),
       Key, MaxLen (256),
       Description ("The scoping Service's Name.")
      ]
   string ServiceName;
      [Key, MaxLen (256),
       Description (
	  "CreationClassName indicates the name of the class or the "
	  "subclass used in the creation of an instance. When used "
	  "with the other key properties of this class, this property "
	  "allows all instances of this class and its subclasses to "
	  "be uniquely identified.")
      ]
   string CreationClassName;
      [Key, MaxLen (6), Description (
        "Destination MAC address (unicast, multicast or broadcast) "
        "to which the filtering information applies. "
        "\n\n"
        "Note that the MAC address is formatted as twelve "
        "hexadecimal digits (e.g., \"010203040506\"), with each "
        "pair representing one of the six octets of the MAC address "
        "in \"canonical\" bit order according to RFC 2469."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStaticAddress"}
      ] 
   string MACAddress;
      [Description (
        "The status of the entry."),
       ValueMap {"1", "2", "3", "4", "5"},
        Values {"other", "invalid", "permanent", "deleteOnReset",
                "DeleteOnTimeout"},
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStaticStatus"}
      ]
   uint16 StaticStatus;
      [Description (
        "The ports to which frames with the destination MAC "
        "address arriving on the port represented by the "
        "SwitchPortStaticForwarding association are allowed "
        "to be forwarded.")
      ]
   uint16 AllowedToGo[];
};


// ==================================================================
//    TransparentBridgingStaticForwarding
// ==================================================================
      [Association,
       Description (
       "This association links an instance of the transparent "
       "bridging service to the entries of its static "
       "(destination-address filtering) database.")
      ] 

class CIM_SwitchServiceStaticForwarding : CIM_Dependency
{
      [Override ("Antecedent"), Min(1), Max(1),
       Description ("The transparent bridging service.")
      ]
   CIM_TransparentBridgingService REF Antecedent;
      [Override ("Dependent"), Weak,
       Description ("Static Forwarding Entry of forwarding database.")
      ] 
   CIM_StaticForwardingEntry REF Dependent;
};

// ==================================================================
//    SwitchPortStaticForwarding
// ==================================================================
      [Association,
       Description (
       "This association links a static database entry "
       "and the switch port to which the entry applies.")
      ] 
class CIM_SwitchPortStaticForwarding : CIM_Dependency
{
      [Override ("Antecedent"), Min(1),
       Description ("The switch port.")
      ]
   CIM_SwitchPort REF Antecedent;
      [Override ("Dependent"),
       Description ("Static Forwarding Entry of static database.")
      ] 
   CIM_StaticForwardingEntry REF Dependent;
};

// ==================================================================
//    SwitchServiceTransparentBridging
// ==================================================================
      [Association, Aggregation, Description (
       "An association linking SwitchService to a component "
       "TransparentBridgingService. The cardinality of the "
       "TransparentBridgingService is 0..1 for a VLAN-unaware "
       "switch.")
      ]

class CIM_SwitchServiceTransparentBridging : CIM_ServiceComponent
{
      [Override ("GroupComponent"), Aggregate, Min(1),
       Description ("The parent service.")
      ]
   CIM_SwitchService REF GroupComponent;
      [Override ("PartComponent"),
       Description ("The component service.")
      ] 
   CIM_TransparentBridgingService REF PartComponent;
};

// ==================================================================
//    SwitchServiceSpanningTree
// ==================================================================
      [Association, Aggregation, Description (
       "An association linking SwitchService to a component "
       "SpanningTreeService. The cardinality of the "
       "SpanningTreeService is 0..1 for a VLAN-unaware "
       "switch.")
      ] 

class CIM_SwitchServiceSpanningTree : CIM_ServiceComponent
{
      [Override ("GroupComponent"), Aggregate, Min(1),
       Description ("The parent service.")
      ]
   CIM_SwitchService REF GroupComponent;
      [Override ("PartComponent"),
       Description ("The component service.")
      ] 
   CIM_SpanningTreeService REF PartComponent;
};

// ===================================================================
//     SourceRoutingService
// ===================================================================
      [Description (
       "This service class represents the capability of a switch "
       "to participate in the source routing of frames received "
       "at its ports.")
      ]

class CIM_SourceRoutingService : CIM_Service
{
      [Description (
       "Indicates whether the bridge operates using older "
       "3 bit length negotiation fields or the newer 6 bit "
       "length field in its RIF."),
       ValueMap {"1", "2"},
        Values {"mode3", "mode6"},
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrBridgeLfMode"}
      ] 
   uint16 BridgeLfMode;
};

// ==================================================================
//    SwitchServiceSourceRouting
// ==================================================================
      [Association, Aggregation, Description (
       "An association linking SwitchService to a component "
       "SourceRoutingService. The cardinality of the "
       "SourceRoutingService is 0..1 for a VLAN-unaware "
       "switch.")
      ] 

class CIM_SwitchServiceSourceRouting : CIM_ServiceComponent
{
      [Override ("GroupComponent"), Aggregate, Min(1),
       Description ("The parent service.")
      ]
   CIM_SwitchService REF GroupComponent;
      [Override ("PartComponent"),
       Description ("The component service.")
      ] 
   CIM_SourceRoutingService REF PartComponent;
};

// ==================================================================
//    SwitchPortPair
// ==================================================================
      [Association, Description (
        "This association represents information regarding port "
        "pairings that is used by the SourceRoutingService of a "
        "switch.") 
      ]

class CIM_SwitchPortPair : CIM_SAPSAPDependency
{
      [Override ("Antecedent"), Min(1), Description (
       "The lower numbered port.")]
   CIM_SwitchPort REF Antecedent;
      [Override ("Dependent"), Min(1), Description (
       "The higher numbered port.")]
   CIM_SwitchPort REF Dependent;
      [Description (
       "A bridge number that uniquely identifies the path "
       "provided by this source routing bridge between the "
       "segments connected to high and low ports. The purpose "
       "of bridge number is to disambiguate between multiple paths "
       "connecting the same two LANs."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dPortPairBridgeNum"}
      ]
   uint16 BridgeNum;
      [Description (
       "The state of dot1dPortPairBridgeNum. Writing "
       "'invalid(3)' to this property removes the "
       "association instance."),
       ValueMap {"1", "2", "3"},
        Values {"enabled", "disabled", "invalid"},
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dPortPairBridgeState"}
      ]
   uint16 BridgeState;
};

// ===================================================================
//     SwitchPortSourceRouting
// ===================================================================
      [Association, Description (
       "A switch capable of source routing maintains "
       "source-routing specific information about each port. "
       "This association represents that information.")
      ]

class CIM_SwitchPortSourceRouting : CIM_ServiceSAPDependency
{
      [Override ("Antecedent"), Description ("The switch port.")]
   CIM_SwitchPort REF Antecedent;
      [Override ("Dependent"), Min(0), Max(1),
       Description ("The source routing service.")
      ]
   CIM_SourceRoutingService REF Dependent;
      [Description (
       "The maximum number of routing descriptors allowed "
       "in an All Paths or Spanning Tree Explorer frames."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortHopCount"}
      ]
   uint16 HopCount;
      [Description (
       "The segment number that uniquely identifies the "
       "segment to which this port is connected. Current "
       "source routing protocols limit this value to the "
       "range: 0 through 4095. (The value 0 is used by "
       "some management applications for special test "
       "cases.) A value of 65535 signifies that no segment "
       "number is assigned to this port."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortLocalSegment"}
      ]
   uint16 LocalSegment;
      [Description (
       "A bridge number uniquely identifies a bridge when "
       "more than one bridge is used to span the same two "
       "segments.  Current source routing protocols limit "
       "this value to the range: 0 through 15. A value of "
       "65535 signifies that no bridge number is assigned "
       "to this bridge."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortBridgeNum"}
      ]
   uint16 BridgeNum;
      [Description (
       "The segment number that corresponds to the target "
       "segment this port is considered to be connected to "
       "by the switch.  Current source routing protocols "
       "limit this value to the range: 0 through 4095. "
       "(The value 0 is used by some management "
       "applications for special test cases.) A value of "
       "65535 signifies that no target segment is assigned "
       "to this port."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortTargetSegment"}
      ]
   uint16 TargetSegment;
      [Description (
       "Determines how the port behaves when presented "
       "with a Spanning Tree Explorer frame.  The value "
       "'disabled(2)' indicates that the port will not "
       "accept or send Spanning Tree Explorer packets; any "
       "STE packets received will be silently discarded. "
       "The value 'forced(3)' indicates the port will "
       "always accept and propagate Spanning Tree Explorer "
       "frames. This allows a manually configured "
       "Spanning Tree for this class of packet to be "
       "configured. Note that unlike transparent "
       "bridging, this is not catastrophic to the network "
       "if there are loops. The value 'auto-span(1)' can "
       "only be returned by a bridge that both implements "
       "the Spanning Tree Protocol and has use of the "
       "protocol enabled on this port. The behavior of the "
       "port for Spanning Tree Explorer frames is "
       "determined by the value of the State property of "
       "the SwitchPortSpanningTree association for the port. "
       "If the port is in the 'forwarding' state, the frame "
       "will be accepted or propagated.  Otherwise, it "
       "will be silently discarded."),
       ValueMap {"1", "2", "3"},
        Values {"auto-span", "disabled", "forced"},
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortSTESpanMod"}
      ]
   uint16 STESpanMode;
};

// ==================================================================
//     VLAN
// ==================================================================
       [Description (
        "An instance of VLAN represents a VLAN within a switch. "
        "In a particular switch, there should be an instance of VLAN "
        "for every VLAN available in the switch. For example, in a "
        "switch with port-based VLANs, if there are 16 VLANs to which "
        "ports can be assigned (VLAN 1 through VLAN 16), there should "
        "be an instance of CIM_VLAN for each of VLAN 1 through "
        "VLAN 16."
        "\n\n"
        "VLAN inherits Name from ServiceAccessPoint. Use this for "
        "the textual name of the VLAN, if there is one. Otherwise, "
        "synthesize a textual name, e.g., VLAN 0003. (Consider "
        "leading zero fill, as shown, to ensure that if the textual "
        "VLAN names are extracted and presented by a management "
        "applictions, the VLAN names will sort in the expected order. "
        "It's irritating to see a list sorted"
        "'VLAN 1, VLAN 10, VLAN 11, VLAN 2, VLAN 3...'"
        "when it could have been"
        "'VLAN 0001, VLAN 0002, ..., VLAN 0010, VLAN 0011, ....')"
        "The numeric part of the name should be at least four "
        "digits wide since 802.1Q specifies 4095 VLANs."
        "\n\n"
        "It is intended that VLAN be subclassed only if necessary "
        "to add attributes. The type of the VLAN can be inferred from "
        "the VLANService(s) with which the VLAN is associated "
        "in the VLANFor association."
        "\n\n"
        "An instance of VLAN may be associated with more than one "
        "VLANService. For example, there are switches that "
        "support both 802.1Q VLANs and the vendor's proprietary "
        "VLANs. In some such switches if a broadcast packet received "
        "on a port in 802.1Q VLAN 5 will be transmitted from a port "
        "in proprietary VLAN 5. In effect, there is only one VLAN 5, "
        "and the type of port only determines the packet format for "
        "tagged packets. In the case just described, only one "
        "instance of CIM_VLAN should be instantiated for VLAN 5, and "
        "it should be associated both with the 802.1Q VLANService "
        "and the proprietary VLANService. "
        "\n\n"
        "In typical VLAN-aware switches, packets can be assigned to "
        "a VLAN based on the port on which they are received " 
        "(port-based VLANS), based on the source MAC address " 
        "(MAC-based VLANs), or based on the value of a set of bits in "
        "the packet (protocol-based VLANs). If it is desirable to "
        "represent the VLAN assignment predicate for some MAC-based "
        "VLAN switch, it will be necessary to subclass VLAN. The list "
        "of MAC addresses associated with a VLAN would be an "
        "attribute of the subclass. If it is desirable to represent"
        "the VLAN assignment predicate in a protocol-based VLAN "
        "switch, it will be necessary to subclass VLAN, "
        "InboundVLAN, or both. If the predicate applies to all ports "
        "in the switch, then only VLAN need be subclassed. If the "
        "predicate may vary based on the port, then InboundVLAN must "
        "be subclassed, and CIM_VLAN might have to be subclassed "
        "as well.")
       ]
class CIM_VLAN : CIM_ServiceAccessPoint
{
       [Description (
        "\n\n")
       ]
    uint32 VLANNumber;
};


// ==================================================================
//     RelatedTransparentBridgingService
// ==================================================================
       [Association, Description (
        "The association between a VLAN and the forwarding database"
        "(some use the term filtering database) used to determine"
        "which port a packet should be transmitted on, given that it"
        "is assigned to the VLAN and that it has a particular"
        "destination MAC address. The TransparentBridgingService"
        "represents a forwarding database.")
       ]

class CIM_RelatedTransparentBridgingService : CIM_ServiceSAPDependency
{
       [Override ("Antecedent"), Min(0)]
    CIM_VLAN  REF Antecedent;
       [Override ("Dependent"), Min(1), Max(1)]
    CIM_TransparentBridgingService REF Dependent;
};


// ==================================================================
//     CIM_RelatedSpanningTree
// ==================================================================
       [Association, Description (
        "This association identifies the spanning tree in which"
        "a forwarding database (TransparentBridgingService) is"
        "nested.")
       ]

class CIM_RelatedSpanningTree : CIM_ServiceServiceDependency
{
       [Override ("Antecedent"), Min(0)]
    CIM_TransparentBridgingService REF Antecedent;
       [Override ("Dependent"), Min(0), Max(1)]
    CIM_SpanningTreeService REF Dependent;
};


// ==================================================================
//     InboundVLAN
// ==================================================================
       [Association, Description (
        "This association makes explicit the operational dependencies of "
        "a SwitchPort when operating in a VLAN."
        "\n\n"
        "If there is an association between a particular "
        "SwitchPort and a particular VLAN, then there is the "
        "possibility that a packet received by the port will be "
        "assigned to the VLAN (or if the packet already has a VLAN "
        "tag, that the packet will not be dropped). If there is no "
        "such association, then there is no possibility that a "
        "packet received by the port will progress through the "
        "switch having been assigned to the VLAN in question.")
       ]

class CIM_InboundVLAN : CIM_SAPSAPDependency
{
       [Override ("Antecedent"), Min(0)]
    CIM_VLAN REF Antecedent;
       [Override ("Dependent"), Min(0)]
    CIM_SwitchPort REF Dependent;

       [Description (
        "If true, packets already tagged with this VLAN number will be"
        "accepted when arriving at this port. For example, if there is"
        "an InboundVLAN association between port 12 and VLAN 7 for"
        "which Tagged is true, then if a packet tagged with VLAN 7"
        "arrives at port 12, the packet will be accepted into the"
        "switch for further processing. If there is no such "
        "association, then the packet will be dropped."
        "\n\n"
        "If false, it means that any untagged packets arriving at this"
        "port MIGHT be classified into the associated VLAN. If, for a"
        "particular SwitchPort, there is only one instance of the"
        "association for which Tagged is false, then all incoming"
        "untagged packets will be classified into that VLAN. This is"
        "the typical configuration of a non-trunk port in a switch"
        "implementing port-based VLANs. If there is more than one such"
        "association instance, then the packet MIGHT be classified"
        "into any one of them, based on some criterion other than the"
        "identity of the switch port. For example, in a MAC-based VLAN "
        "switch, the decision would be based on the source MAC "
        "address. In a protocol-based VLAN switch, the decision would "
        "be based on the values of some set of bits in the packet. "
        "\n\n"
        "Note that the MAC address is formatted as twelve "
        "hexadecimal digits (e.g., \"010203040506\"), with each "
        "pair representing one of the six octets of the MAC address "
        "in \"canonical\" bit order according to RFC 2469.") ]
    boolean Tagged;

       [Description (
        "Default should be true if untagged packets received by the "
        "SwitchPort are assigned to the VLAN by default. For "
        "802.1Q-compliant ports, the Default property should be "
        "true on the association instance connecting a SwitchPort to "
        "the CIM_VLAN corresponding to the port's PVID. Default "
        "should never be true if Tagged is true -- it applies only "
        "to untagged packets.")
       ]
    boolean Default;
};


// ==================================================================
//     OutboundVLAN
// ==================================================================
       [Association, Description (
        "This association makes explicit the operational dependencies of "
        "a SwitchPort when operating in a VLAN. "
        "\n\n"
        "If there is no instance of OutboundVLAN between a given "
        "SwitchPort and CIM_VLAN, then any packet that has been "
        "assigned to the VLAN and whose destination address is "
        "associated with the port will be dropped by the switch "
        "without being transmitted. Otherwise, the packet will be "
        "transmitted.")
       ]

class CIM_OutboundVLAN : CIM_SAPSAPDependency 
{
       [Override ("Antecedent"), Min(0)]
    CIM_VLAN REF Antecedent;
       [Override ("Dependent"), Min(0)]
    CIM_SwitchPort REF Dependent;
       [Description (
        "If Tagged is true, then the packet will be transmitted in"
        "encapsulated form, tagged with the associated VLAN tag. If"
        "Tagged is false, the packet will be trasmitted without any"
        "VLAN tag.")
       ]
    boolean Tagged;
};

// ==================================================================
//     VLANService
// ==================================================================
       [Abstract, Description (
        "VLANService represents the VLAN aspects of the function"
        "performed by a switch. Some VLAN-aware devices participate"
        "in protocols where VLAN information is propagated among"
        "switches, e.g., GVRP in 802.1Q switches and VTP in Cisco"
        "Catalyst switches. VLANService also represents the function"
        "performed by the switch as a participant in such a protocol."
        "\n\n"
        "VLANService must be subclassed so that instances can be"
        "distinguished by their class. If there is a name assigned to"
        "a set of VLAN-aware switches, e.g., the VTP domain name in"
        "Cisco Catalyst switches, use the Name attribute inherited"
        "from CIM_Service to store the name."
        "\n\n"
        "A VLANService should be instantiated in a VLAN-aware switch"
        "even if there is no GVRP-like protocol.")
       ]

class CIM_VLANService : CIM_Service
{
};


// ==================================================================
//     802dot1QVLANService
// ==================================================================
       [Description (
        "If a switch supports 802.1Q, an instance of this class should"
        "be instantiated in the switch. If the switch supports GVRP,"
        "this class represents the function that the switch performs"
        "with respect to GVRP.")
       ]

class CIM_802dot1QVLANService : CIM_VLANService
{
};


// ==================================================================
//     SwitchServiceVLAN
// ==================================================================
      [Association, Aggregation, Description (
       "An association linking SwitchService to a component "
       "VLANService.")
      ]

class CIM_SwitchServiceVLAN : CIM_ServiceComponent
{
      [Override ("GroupComponent"), Min(1), Max(1), Aggregate]
   CIM_SwitchService REF GroupComponent;
      [Override ("PartComponent")]
   CIM_VLANService REF PartComponent;
};

// ==================================================================
//     VLANFor
// ==================================================================
        [Association, Description(
         "The VLAN Port used by the VLAN Service.") ]

class CIM_VLANFor : CIM_ServiceSAPDependency
{
       [Override ("Antecedent"), Min(0)]
    CIM_VLAN REF Antecedent;
       [Override ("Dependent"), Min(1)]
    CIM_VLANService REF Dependent;
};


// ===================================================================
//     TransparentBridgingStatistics
// ===================================================================
      [Description(
       "Statistical information regarding the Transparent Bridging "
       "Service.")
      ] 

class CIM_TransparentBridgingStatistics : CIM_ServiceStatisticalInformation
{
      [Description (
       "The total number of Forwarding Database entries, "
       "which have been or would have been learnt, but "
       "have been discarded due to a lack of space to "
       "store them in the Forwarding Database. "),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dTpLearnedEntryDiscards"}
      ] 
   uint32 LearnedEntryDiscards;
};

// ===================================================================
//     SpanningTreeStatistics
// ===================================================================
      [Description(
       "Statistical information regarding the Spanning Tree "
       "Service.")
      ]

class CIM_SpanningTreeStatistics : CIM_ServiceStatisticalInformation
{
      [Description(
       "The time since the last topology change was "
       "detected by the switch."),
       Units ("Hundredths of Seconds"),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpTimeSinceTopologyChange"}
      ]
   uint32 TimeSinceTopologyChange;
      [Description (
       "The total number of topology changes detected by "
       "the switch since the counter was last reset or "
       "initialized."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dStpTopChanges"}
      ] 
   uint32 TopChanges;
};

// ===================================================================
//     SwitchPortStatistics
// ===================================================================
      [Description (
       "Statistical information regarding a generic switch port, "
       "independent of the specific kind of switching done on "
       "frames arriving at the port.")
      ]

class CIM_SwitchPortStatistics : CIM_SAPStatistics
{
      [Description (
       "The number of frames discarded by this port due "
       "to excessive transit delay through the bridge."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dBasePortDelayExceededDiscards"}
      ] 
   uint32 DelayExceededDiscards;
      [Description (
       "The number of frames discarded by this port due "
       "to an excessive size."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dBasePortMtuExceededDiscards"}
      ]
   uint32 MtuExceededDiscards;
};

// ===================================================================
//     SwitchPortTransparentBridgingStatistics
// ===================================================================
      [Description (
       "Statistical information regarding a switch port, "
       "at which transparent bridging is performed.")
      ]

class CIM_SwitchPortTransparentBridgingStatistics : CIM_SAPStatistics
{
      [Description (
       "The number of frames that have been received by "
       "the port from its segment. Note that a frame "
       "is only counted if and only if it is for a "
       "protocol being processed by the local bridging "
       "function, including bridge management frames."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dTpPortInFrames"}
      ] 
   uint32 InFrames;
      [Description (
       "The number of frames that have been transmitted by "
       "the port to its segment. Note that a frame "
       "is only counted if and only if it is for a "
       "protocol being processed by the local bridging "
       "function, including bridge management frames."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dTpPortOutFrames"}
      ]
   uint32 OutFrames;
      [Description (
       "Count of valid frames received which were "
       "discarded (i.e., filtered) by the Forwarding Process."),
       Mappingstrings {"MIB.IETF|RFC1493-MIB.dot1dTpPortInDiscards"}
      ]
   uint32 InDiscards;
};

// ===================================================================
//     SwitchPortSpanningTreeStatistics
// ===================================================================
      [Description (
       "Statistical information regarding a switch port "
       "participating in the spanning tree.")
      ]

class CIM_SwitchPortSpanningTreeStatistics : CIM_SAPStatistics
{
      [Description (
       "The number of times the port has transitioned "
       "from the Learning state to the Forwarding state."),
       Mappingstrings {"MIB.IETF|RFC1493- MIB.dot1dStpPortForwardTransitions"}
      ] 
   uint32 ForwardTransitions;
};


// ===================================================================
//     SwitchPortSourceRoutingStatistics
// ===================================================================
      [Description (
       "Statistical information regarding a switch port "
       "supporting source routing.")
      ]

class CIM_SwitchPortSourceRoutingStatistics : CIM_SAPStatistics
{
      [Counter, Description (
       "The number of Specifically Routed frames, also "
       "referred to as Source Routed Frames, that have "
       "been received from the segment attached to the port."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortSpecInFrames"}
      ]
   uint32 SpecInFrames;
      [Counter, Description (
       "The number of Specifically Routed frames, also "
       "referred to as Source Routed Frames, that the "
       "port has transmitted on its segment."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortSpecOutFrames"}
      ]
   uint32 SpecOutFrames;
      [Counter, Description (
       "The number of All Paths Explorer frames, also "
       "referred to as All Routes Explorer frames, that "
       "have been received by the port from its segment."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortApeInFrames"}
      ]
   uint32 ApeInFrames;
      [Counter, Description (
       "The number of all Paths Explorer Frames, also "
       "referred to as All Routes Explorer frames, that "
       "have been transmitted by the port on its segment."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortApeOutFrames"}
      ]
   uint32 ApeOutFrames;
      [Counter, Description (
       "The number of spanning tree explorer frames that "
       "have been received by the port from its segment."),
       Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortSteInFrames"}
      ]
   uint32 SteInFrames;
      [Counter, Description (
      "The number of spanning tree explorer frames that "
      "have been transmitted by the port on its segment."),
      Mappingstrings {"MIB.IETF|RFC1525-MIB.dot1dSrPortSteOutFrames"}
      ]
   uint32 SteOutFrames;
      [Counter, Description (
       "The number of explorer frames that have been "
       "discarded by the port because the routing "
       "descriptor field contained an invalid adjacent "
       "segment value."),
       Mappingstrings {"MIB.IETF|RFC1525- MIB.dot1dSrPortSegmentMismatchDiscards"}
      ]
   uint32 SegmentMismatchDiscards;
      [Counter, Description (
       "The number of frames that have been discarded by "
       "the port because the routing descriptor field "
       "contained a duplicate segment identifier."),
       Mappingstrings {"MIB.IETF|RFC1525- MIB.dot1dSrPortDuplicateSegmentDiscards"}
      ]
   uint32 DuplicateSegmentDiscards;
      [Counter, Description (
       "The number of explorer frames that have been "
       "discarded by the port because the Routing "
       "Information Field has exceeded the maximum route "
       "descriptor length."),
       Mappingstrings {"MIB.IETF|RFC1525- MIB.dot1dSrPortHopCountExceedsDiscards"}
      ]
   uint32 HopCountExceedsDiscards;
      [Counter, Description (
       "The number of duplicate LAN IDs or Tree errors. "
       "This helps in detection of problems in networks "
       "containing older IBM Source Routing Bridges."),
       Mappingstrings {"MIB.IETF|RFC1525- MIB.dot1dSrPortDupLanIdOrTreeErrors"}
      ]
   uint32 DupLanIdOrTreeErrors;
      [Counter, Description (
       "The number of ARE and STE frames that were "
       "discarded because the last LAN ID in the routing "
       "information field did not equal the LAN-in ID. "
       "This error can occur in implementations which do "
       "only a LAN-in ID and Bridge Number check instead "
       "of a LAN-in ID, Bridge Number, and LAN-out ID "
       "check before they forward broadcast frames."),
       Mappingstrings {"MIB.IETF|RFC1525- MIB.dot1dSrPortLanIdMismatches"}
      ]
   uint32 LanIdMismatches;
};

// ==================================================================
//     BGPStatistics
// ==================================================================
        [Description (
         "This class contains statistical information for a "
         "Group sessions.") ]

class CIM_BGPStatistics : CIM_ServiceStatisticalInformation
{
        [Counter, Description (
         "This is the number of BGP UPDATE messages received on this"
         "router's BGP connection. This is a 32-bit counter."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerInUpdates"} ]
    uint32 InUpdates; 
        [Counter, Description (
         "This is the number of BGP UPDATE messages transmitted on "
         "this router's BGP connection. This is a 32-bit counter."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerOutUpdates"} ]
    uint32 OutUpdates; 
        [Counter, Description (
         "This is the total number of BGP messages received on this"
         "router's BGP connection. This is a 32-bit counter."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerInTotalMessages"} ]
    uint32 InTotalMessages;
        [Counter, Description (
         "This is the total number of BGP messages transmitted on "
         "this router's BGP connection. This is a 32-bit counter."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerOutTotalMessages"} ]
    uint32 OutTotalMessages;
        [Description (
         "This contains the last error code and error subcode for "
         "this router's BGP connection. If no error has occurred, "
         "then each integer in the array is zero."),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerLastError"} ]
    uint8 LastError [2]; 
        [Counter, Description (
         "This contains the total number of times that the BGP Finite "
         "State Machine has transitioned into the established state "
         "for this router's BGP connection. This is a 32-bit "
         "counter."),
        Mappingstrings
         {"MIB.IETF|RFC1657-MIB.bgpPeerFsmEstablishedTransitions"} ]
    uint32 FsmEstablishedTransitions;
        [Gauge, Description (
         "This indicates how long, in seconds, this peer has been in "
         "the established state, or how long since this peer was last "
         "in the established state. It is set to zero when a new peer "
         "is configured or when the router is booted. This has the "
         "semantics of a 32-bit gauge."),
        Units ("Seconds"),
        Mappingstrings {"MIB.IETF|RFC1657-MIB.bgpPeerFsmEstablishedTime"} ]
    uint32 FsmEstablishedTime; 
        [Gauge, Description (
         "This defines the time in seconds since the last BGP UPDATE "
         "message was received from the peer. This has the semantics "
         "of a 32-bit gauge."),
        Units ("Seconds"),
        Mappingstrings
         {"MIB.IETF|RFC1657-MIB.bgpPeerInUpdateElapsedTime"} ]
    uint32 InUpdateElapsedTime;
};

// ==================================================================
//    BGPServiceStatistics
// ================================================================== 
	  [Association, Description ( 
	   "This association defines statistics collected for a BGP " 
	   "session.") ]

class CIM_BGPServiceStatistics : CIM_ServiceStatistics
{ 
	  [Min(1), Max(1), Override("Stats"), Description (
         "The statistics object for the BGP session.") ] 
    CIM_BGPStatistics REF Stats;
	  [Max(1), Override("Element"), Description ( 
	   "The BGPService for which statistics are being gathered.") ] 
    CIM_BGPService REF Element;
};


// ===================================================================
//     CIM_EndpointIdentity (CR308a) - this class stays here!
// ===================================================================
        [Association, Description (
         "CIM_EndpointIdentity indicates that two ProtocolEndpoints "
         "represent different aspects of the same underlying address "
         "or protocol-specific ID. This association refines the "
         "CIM_LogicalIdentity superclass by restricting it to the "
         "Endpoint level and defining its use in well understood "
         "scenarios. One of these scenarios is to represent that an "
         "Endpoint has both 'LAN' and protocol-specific aspects. "
         "For example, an Endpoint could be both a LANEndpoint as "
         "well as a DHCPEndpoint.") ]

class CIM_EndpointIdentity: CIM_LogicalIdentity
{
        [Override ("SystemElement"), Description (
         "SystemElement represents one aspect of the "
         "Endpoint.") ]
    CIM_ProtocolEndpoint ref SystemElement;
        [Override ("SameElement"), Description (
         "SameElement represents an alternate aspect of "
         "the Endpoint.") ]
    CIM_ProtocolEndpoint ref SameElement;
};

// ===================================================================
// end of file
// ===================================================================


