4.8. Properties
Components of LFBs have properties that are important to the CE. The most important property is the existence / readability / writeability of the element. Depending on the type of the component, other information may be of importance. The model provides the definition of the structure of property information. There is a base class of property information. For the array, alias, and event components, there are subclasses of property information providing additional fields. This information is accessed by the CE (and updated where applicable) via the ForCES protocol. While some property information is writeable, there is no mechanism currently provided for checking the properties of a property element. Writeability can only be checked by attempting to modify the value.4.8.1. Basic Properties
The basic property definition, along with the scalar dataTypeDef for accessibility, is below. Note that this access permission information is generally read-only.
<dataTypeDef> <name>accessPermissionValues</name> <synopsis> The possible values of component access permission </synopsis> <atomic> <baseType>uchar</baseType> <specialValues> <specialValue value="0"> <name>None</name> <synopsis>Access is prohibited</synopsis> </specialValue> <specialValue value="1"> <name> Read-Only </name> <synopsis> Access to the component is read only </synopsis> </specialValue> <specialValue value="2"> <name>Write-Only</name> <synopsis> The component MAY be written, but not read </synopsis> </specialValue> <specialValue value="3"> <name>Read-Write</name> <synopsis> The component MAY be read or written </synopsis> </specialValue> </specialValues> </atomic> </dataTypeDef> <dataTypeDef> <name>baseElementProperties</name> <synopsis>basic properties, accessibility</synopsis> <struct> <component componentID="1"> <name>accessibility</name> <synopsis> does the component exist, and can it be read or written </synopsis> <typeRef>accessPermissionValues</typeRef> </component> </struct> </dataTypeDef>
4.8.2. Array Properties
The properties for an array add a number of important pieces of information. These properties are also read-only. <dataTypeDef> <name>arrayElementProperties</name> <synopsis>Array Element Properties definition</synopsis> <struct> <derivedFrom>baseElementProperties</derivedFrom> <component componentID="2"> <name>entryCount</name> <synopsis>the number of entries in the array</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="3"> <name>highestUsedSubscript</name> <synopsis>the last used subscript in the array</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="4"> <name>firstUnusedSubscript</name> <synopsis> The subscript of the first unused array element </synopsis> <typeRef>uint32</typeRef> </component> </struct> </dataTypeDef>4.8.3. String Properties
The properties of a string specify the actual octet length and the maximum octet length for the element. The maximum length is included because an FE implementation MAY limit a string to be shorter than the limit in the LFB class definition.
<dataTypeDef> <name>stringElementProperties</name> <synopsis>string Element Properties definition </synopsis> <struct> <derivedFrom>baseElementProperties</derivedFrom> <component componentID="2"> <name>stringLength</name> <synopsis>the number of octets in the string</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="3"> <name>maxStringLength</name> <synopsis> the maximum number of octets in the string </synopsis> <typeRef>uint32</typeRef> </component> </struct> </dataTypeDef>4.8.4. Octetstring Properties
The properties of an octetstring specify the actual length and the maximum length, since the FE implementation MAY limit an octetstring to be shorter than the LFB class definition. <dataTypeDef> <name>octetstringElementProperties</name> <synopsis>octetstring Element Properties definition </synopsis> <struct> <derivedFrom>baseElementProperties</derivedFrom> <component componentID="2"> <name>octetstringLength</name> <synopsis> the number of octets in the octetstring </synopsis> <typeRef>uint32</typeRef> </component> <component componentID="3"> <name>maxOctetstringLength</name> <synopsis> the maximum number of octets in the octetstring </synopsis> <typeRef>uint32</typeRef> </component> </struct> </dataTypeDef>
4.8.5. Event Properties
The properties for an event add three (usually) writeable fields. One is the subscription field. 0 means no notification is generated. Any non-zero value (typically 1 is used) means that a notification is generated. The hysteresis field is used to suppress generation of notifications for oscillations around a condition value, and is described below (Section 4.8.5.2). The threshold field is used for the <eventGreaterThan/> and <eventLessThan/> conditions. It indicates the value to compare the event target against. Using the properties allows the CE to set the level of interest. FEs that do not support setting the threshold for events will make this field read-only.
<dataTypeDef> <name>eventElementProperties</name> <synopsis>event Element Properties definition</synopsis> <struct> <derivedFrom>baseElementProperties</derivedFrom> <component componentID="2"> <name>registration</name> <synopsis> has the CE registered to be notified of this event </synopsis> <typeRef>uint32</typeRef> </component> <component componentID="3"> <name>threshold</name> <synopsis> comparison value for level crossing events </synopsis> <optional/> <typeRef>uint32</typeRef> </component> <component componentID="4"> <name>eventHysteresis</name> <synopsis> region to suppress event recurrence notices </synopsis> <optional/> <typeRef>uint32</typeRef> </component> <component componentID="5"> <name>eventCount</name> <synopsis> number of occurrences to suppress </synopsis> <optional/> <typeRef>uint32</typeRef> </component> <component componentID="6"> <name>eventInterval</name> <synopsis> time interval in ms between notifications </synopsis> <optional/> <typeRef>uint32</typeRef> </component> </struct> </dataTypeDef>
4.8.5.1. Common Event Filtering
The event properties have values for controlling several filter conditions. Support of these conditions is optional, but all conditions SHOULD be supported. Events that are reliably known not to be subject to rapid occurrence or other concerns MAY not support all filter conditions. Currently, three different filter condition variables are defined. These are eventCount, eventInterval, and eventHysteresis. Setting the condition variables to 0 (their default value) means that the condition is not checked. Conceptually, when an event is triggered, all configured conditions are checked. If no filter conditions are triggered, or if any trigger conditions are met, the event notification is generated. If there are filter conditions, and no condition is met, then no event notification is generated. Event filter conditions have reset behavior when an event notification is generated. If any condition is passed, and the notification is generated, the notification reset behavior is performed on all conditions, even those that had not passed. This provides a clean definition of the interaction of the various event conditions. An example of the interaction of conditions is an event with an eventCount property set to 5 and an eventInterval property set to 500 milliseconds. Suppose that a burst of occurrences of this event is detected by the FE. The first occurrence will cause a notification to be sent to the CE. Then, if four more occurrences are detected rapidly (less than 0.5 seconds) they will not result in notifications. If two more occurrences are detected, then the second of those will result in a notification. Alternatively, if more than 500 milliseconds has passed since the notification and an occurrence is detected, that will result in a notification. In either case, the count and time interval suppression is reset no matter which condition actually caused the notification.4.8.5.2. Event Hysteresis Filtering
Events with numeric conditions can have hysteresis filters applied to them. The hysteresis level is defined by a property of the event. This allows the FE to notify the CE of the hysteresis applied, and if it chooses, the FE can allow the CE to modify the hysteresis. This applies to <eventChanged/> for a numeric field, and to <eventGreaterThan/> and <eventLessThan/>. The content of a
<variance> element is a numeric value. When supporting hysteresis, the FE MUST track the value of the element and make sure that the condition has become untrue by at least the hysteresis from the event property. To be specific, if the hysteresis is V, then: o For an <eventChanged/> condition, if the last notification was for value X, then the <changed/> notification MUST NOT be generated until the value reaches X +/- V. o For an <eventGreaterThan/> condition with threshold T, once the event has been generated at least once it MUST NOT be generated again until the field first becomes less than or equal to T - V, and then exceeds T. o For an <eventLessThan/> condition with threshold T, once the event has been generate at least once it MUST NOT be generated again until the field first becomes greater than or equal to T + V, and then becomes less than T.4.8.5.3. Event Count Filtering
Events MAY have a count filtering condition. This property, if set to a non-zero value, indicates the number of occurrences of the event that should be considered redundant and not result in a notification. Thus, if this property is set to 1, and no other conditions apply, then every other detected occurrence of the event will result in a notification. This particular meaning is chosen so that the value 1 has a distinct meaning from the value 0. A conceptual implementation (not required) for this might be an internal suppression counter. Whenever an event is triggered, the counter is checked. If the counter is 0, a notification is generated. Whether or not a notification is generated, the counter is incremented. If the counter exceeds the configured value, it is set to 0.4.8.5.4. Event Time Filtering
Events MAY have a time filtering condition. This property represents the minimum time interval (in the absence of some other filtering condition being passed) between generating notifications of detected events. This condition MUST only be passed if the time since the last notification of the event is longer than the configured interval in milliseconds.
Conceptually, this can be thought of as a stored timestamp that is compared with the detection time, or as a timer that is running that resets a suppression flag. In either case, if a notification is generated due to passing any condition then the time interval detection MUST be restarted.4.8.6. Alias Properties
The properties for an alias add three (usually) writeable fields. These combine to identify the target component to which the subject alias refers. <dataTypeDef> <name>aliasElementProperties</name> <synopsis>alias Element Properties definition</synopsis> <struct> <derivedFrom>baseElementProperties</derivedFrom> <component componentID="2"> <name>targetLFBClass</name> <synopsis>the class ID of the alias target</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="3"> <name>targetLFBInstance</name> <synopsis>the instance ID of the alias target</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="4"> <name>targetComponentPath</name> <synopsis> the path to the component target each 4 octets is read as one path element, using the path construction in the ForCES protocol, [2]. </synopsis> <typeRef>octetstring[128]</typeRef> </component> </struct> </dataTypeDef>
4.9. XML Schema for LFB Class Library Documents
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:ietf:params:xml:ns:forces:lfbmodel:1.0" xmlns:lfb="urn:ietf:params:xml:ns:forces:lfbmodel:1.0" targetNamespace="urn:ietf:params:xml:ns:forces:lfbmodel:1.0" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xsd:annotation> <xsd:documentation xml:lang="en"> Schema for Defining LFB Classes and associated types (frames, data types for LFB attributes, and metadata). </xsd:documentation> </xsd:annotation> <xsd:element name="description" type="xsd:string"/> <xsd:element name="synopsis" type="xsd:string"/> <!-- Document root element: LFBLibrary --> <xsd:element name="LFBLibrary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="description" minOccurs="0"/> <xsd:element name="load" type="loadType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="frameDefs" type="frameDefsType" minOccurs="0"/> <xsd:element name="dataTypeDefs" type="dataTypeDefsType" minOccurs="0"/> <xsd:element name="metadataDefs" type="metadataDefsType" minOccurs="0"/> <xsd:element name="LFBClassDefs" type="LFBClassDefsType" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="provides" type="xsd:Name" use="required"/> </xsd:complexType> <!-- Uniqueness constraints --> <xsd:key name="frame"> <xsd:selector xpath="lfb:frameDefs/lfb:frameDef"/> <xsd:field xpath="lfb:name"/> </xsd:key> <xsd:key name="dataType"> <xsd:selector xpath="lfb:dataTypeDefs/lfb:dataTypeDef"/> <xsd:field xpath="lfb:name"/> </xsd:key> <xsd:key name="metadataDef"> <xsd:selector xpath="lfb:metadataDefs/lfb:metadataDef"/> <xsd:field xpath="lfb:name"/> </xsd:key>
<xsd:key name="LFBClassDef"> <xsd:selector xpath="lfb:LFBClassDefs/lfb:LFBClassDef"/> <xsd:field xpath="lfb:name"/> </xsd:key> </xsd:element> <xsd:complexType name="loadType"> <xsd:attribute name="library" type="xsd:Name" use="required"/> <xsd:attribute name="location" type="xsd:anyURI" use="optional"/> </xsd:complexType> <xsd:complexType name="frameDefsType"> <xsd:sequence> <xsd:element name="frameDef" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element ref="description" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="dataTypeDefsType"> <xsd:sequence> <xsd:element name="dataTypeDef" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element ref="description" minOccurs="0"/> <xsd:group ref="typeDeclarationGroup"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <!-- Predefined (built-in) atomic data-types are: char, uchar, int16, uint16, int32, uint32, int64, uint64, string[N], string, byte[N], boolean, octetstring[N], float32, float64 --> <xsd:group name="typeDeclarationGroup"> <xsd:choice> <xsd:element name="typeRef" type="typeRefNMTOKEN"/> <xsd:element name="atomic" type="atomicType"/> <xsd:element name="array" type="arrayType"/> <xsd:element name="struct" type="structType"/>
<xsd:element name="union" type="structType"/> <xsd:element name="alias" type="typeRefNMTOKEN"/> </xsd:choice> </xsd:group> <xsd:simpleType name="typeRefNMTOKEN"> <xsd:restriction base="xsd:token"> <xsd:pattern value="\c+"/> <xsd:pattern value="string\[\d+\]"/> <xsd:pattern value="byte\[\d+\]"/> <xsd:pattern value="octetstring\[\d+\]"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="atomicType"> <xsd:sequence> <xsd:element name="baseType" type="typeRefNMTOKEN"/> <xsd:element name="rangeRestriction" type="rangeRestrictionType" minOccurs="0"/> <xsd:element name="specialValues" type="specialValuesType" minOccurs="0"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="rangeRestrictionType"> <xsd:sequence> <xsd:element name="allowedRange" maxOccurs="unbounded"> <xsd:complexType> <xsd:attribute name="min" type="xsd:integer" use="required"/> <xsd:attribute name="max" type="xsd:integer" use="required"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="specialValuesType"> <xsd:sequence> <xsd:element name="specialValue" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> </xsd:sequence> <xsd:attribute name="value" type="xsd:token"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="arrayType"> <xsd:sequence>
<xsd:group ref="typeDeclarationGroup"/> <xsd:element name="contentKey" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="contentKeyField" maxOccurs="unbounded" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="contentKeyID" use="required" type="xsd:integer"/> </xsd:complexType> <!--declare keys to have unique IDs --> <xsd:key name="contentKeyID"> <xsd:selector xpath="lfb:contentKey"/> <xsd:field xpath="@contentKeyID"/> </xsd:key> </xsd:element> </xsd:sequence> <xsd:attribute name="type" use="optional" default="variable-size"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="fixed-size"/> <xsd:enumeration value="variable-size"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name="length" type="xsd:integer" use="optional"/> <xsd:attribute name="maxLength" type="xsd:integer" use="optional"/> </xsd:complexType> <xsd:complexType name="structType"> <xsd:sequence> <xsd:element name="derivedFrom" type="typeRefNMTOKEN" minOccurs="0"/> <xsd:element name="component" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element ref="description" minOccurs="0"/> <xsd:element name="optional" minOccurs="0"/> <xsd:group ref="typeDeclarationGroup"/> </xsd:sequence> <xsd:attribute name="componentID" use="required" type="xsd:unsignedInt"/> </xsd:complexType> <!-- key declaration to make componentIDs unique in a struct
--> <xsd:key name="structComponentID"> <xsd:selector xpath="lfb:component"/> <xsd:field xpath="@componentID"/> </xsd:key> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="metadataDefsType"> <xsd:sequence> <xsd:element name="metadataDef" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element name="metadataID" type="xsd:integer"/> <xsd:element ref="description" minOccurs="0"/> <xsd:choice> <xsd:element name="typeRef" type="typeRefNMTOKEN"/> <xsd:element name="atomic" type="atomicType"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="LFBClassDefsType"> <xsd:sequence> <xsd:element name="LFBClassDef" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element name="version" type="versionType"/> <xsd:element name="derivedFrom" type="xsd:NMTOKEN" minOccurs="0"/> <xsd:element name="inputPorts" type="inputPortsType" minOccurs="0"/> <xsd:element name="outputPorts" type="outputPortsType" minOccurs="0"/> <xsd:element name="components" type="LFBComponentsType" minOccurs="0"/> <xsd:element name="capabilities" type="LFBCapabilitiesType" minOccurs="0"/> <xsd:element name="events" type="eventsType" minOccurs="0"/> <xsd:element ref="description" minOccurs="0"/> </xsd:sequence>
<xsd:attribute name="LFBClassID" use="required" type="xsd:unsignedInt"/> </xsd:complexType> <!-- Key constraint to ensure unique attribute names within a class: --> <xsd:key name="components"> <xsd:selector xpath="lfb:components/lfb:component"/> <xsd:field xpath="lfb:name"/> </xsd:key> <xsd:key name="capabilities"> <xsd:selector xpath="lfb:capabilities/lfb:capability"/> <xsd:field xpath="lfb:name"/> </xsd:key> <xsd:key name="componentIDs"> <xsd:selector xpath="lfb:components/lfb:component"/> <xsd:field xpath="@componentID"/> </xsd:key> <xsd:key name="capabilityIDs"> <xsd:selector xpath="lfb:capabilities/lfb:capability"/> <xsd:field xpath="@componentID"/> </xsd:key> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="versionType"> <xsd:restriction base="xsd:NMTOKEN"> <xsd:pattern value="[1-9][0-9]*\.([1-9][0-9]*|0)"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="inputPortsType"> <xsd:sequence> <xsd:element name="inputPort" type="inputPortType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="inputPortType"> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element name="expectation" type="portExpectationType"/> <xsd:element ref="description" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="group" type="xsd:boolean" use="optional" default="0"/> </xsd:complexType> <xsd:complexType name="portExpectationType"> <xsd:sequence>
<xsd:element name="frameExpected" minOccurs="0"> <xsd:complexType> <xsd:sequence> <!-- ref must refer to a name of a defined frame type --> <xsd:element name="ref" type="xsd:string" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="metadataExpected" minOccurs="0"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <!-- ref must refer to a name of a defined metadata --> <xsd:element name="ref" type="metadataInputRefType"/> <xsd:element name="one-of" type="metadataInputChoiceType"/> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="metadataInputChoiceType"> <xsd:choice minOccurs="2" maxOccurs="unbounded"> <!-- ref must refer to a name of a defined metadata --> <xsd:element name="ref" type="xsd:NMTOKEN"/> <xsd:element name="one-of" type="metadataInputChoiceType"/> <xsd:element name="metadataSet" type="metadataInputSetType"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="metadataInputSetType"> <xsd:choice minOccurs="2" maxOccurs="unbounded"> <!-- ref must refer to a name of a defined metadata --> <xsd:element name="ref" type="metadataInputRefType"/> <xsd:element name="one-of" type="metadataInputChoiceType"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="metadataInputRefType"> <xsd:simpleContent> <xsd:extension base="xsd:NMTOKEN"> <xsd:attribute name="dependency" use="optional" default="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="required"/> <xsd:enumeration value="optional"/> </xsd:restriction> </xsd:simpleType>
</xsd:attribute> <xsd:attribute name="defaultValue" type="xsd:token" use="optional"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:complexType name="outputPortsType"> <xsd:sequence> <xsd:element name="outputPort" type="outputPortType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="outputPortType"> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element name="product" type="portProductType"/> <xsd:element ref="description" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="group" type="xsd:boolean" use="optional" default="0"/> </xsd:complexType> <xsd:complexType name="portProductType"> <xsd:sequence> <xsd:element name="frameProduced"> <xsd:complexType> <xsd:sequence> <!-- ref must refer to a name of a defined frame type --> <xsd:element name="ref" type="xsd:NMTOKEN" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="metadataProduced" minOccurs="0"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <!-- ref must refer to a name of a defined metadata --> <xsd:element name="ref" type="metadataOutputRefType"/> <xsd:element name="one-of" type="metadataOutputChoiceType"/> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="metadataOutputChoiceType">
<xsd:choice minOccurs="2" maxOccurs="unbounded"> <!-- ref must refer to a name of a defined metadata --> <xsd:element name="ref" type="xsd:NMTOKEN"/> <xsd:element name="one-of" type="metadataOutputChoiceType"/> <xsd:element name="metadataSet" type="metadataOutputSetType"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="metadataOutputSetType"> <xsd:choice minOccurs="2" maxOccurs="unbounded"> <!-- ref must refer to a name of a defined metadata --> <xsd:element name="ref" type="metadataOutputRefType"/> <xsd:element name="one-of" type="metadataOutputChoiceType"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="metadataOutputRefType"> <xsd:simpleContent> <xsd:extension base="xsd:NMTOKEN"> <xsd:attribute name="availability" use="optional" default="unconditional"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="unconditional"/> <xsd:enumeration value="conditional"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:complexType name="LFBComponentsType"> <xsd:sequence> <xsd:element name="component" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element ref="description" minOccurs="0"/> <xsd:element name="optional" minOccurs="0"/> <xsd:group ref="typeDeclarationGroup"/> <xsd:element name="defaultValue" type="xsd:token" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="access" use="optional" default="read-write"> <xsd:simpleType> <xsd:list itemType="accessModeType"/> </xsd:simpleType> </xsd:attribute>
<xsd:attribute name="componentID" use="required" type="xsd:unsignedInt"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="accessModeType"> <xsd:restriction base="xsd:NMTOKEN"> <xsd:enumeration value="read-only"/> <xsd:enumeration value="read-write"/> <xsd:enumeration value="write-only"/> <xsd:enumeration value="read-reset"/> <xsd:enumeration value="trigger-only"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="LFBCapabilitiesType"> <xsd:sequence> <xsd:element name="capability" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element ref="description" minOccurs="0"/> <xsd:element name="optional" minOccurs="0"/> <xsd:group ref="typeDeclarationGroup"/> </xsd:sequence> <xsd:attribute name="componentID" use="required" type="xsd:integer"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="eventsType"> <xsd:sequence> <xsd:element name="event" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:NMTOKEN"/> <xsd:element ref="synopsis"/> <xsd:element name="eventTarget" type="eventPathType"/> <xsd:element ref="eventCondition"/> <xsd:element name="eventReports" type="eventReportsType" minOccurs="0"/> <xsd:element ref="description" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="eventID" use="required" type="xsd:integer"/> </xsd:complexType>
</xsd:element> </xsd:sequence> <xsd:attribute name="baseID" type="xsd:integer" use="optional"/> </xsd:complexType> <!-- the substitution group for the event conditions --> <xsd:element name="eventCondition" abstract="true"/> <xsd:element name="eventCreated" substitutionGroup="eventCondition"/> <xsd:element name="eventDeleted" substitutionGroup="eventCondition"/> <xsd:element name="eventChanged" substitutionGroup="eventCondition"/> <xsd:element name="eventGreaterThan" substitutionGroup="eventCondition"/> <xsd:element name="eventLessThan" substitutionGroup="eventCondition"/> <xsd:complexType name="eventPathType"> <xsd:sequence> <xsd:element ref="eventPathPart" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- the substitution group for the event path parts --> <xsd:element name="eventPathPart" type="xsd:string" abstract="true"/> <xsd:element name="eventField" type="xsd:string" substitutionGroup="eventPathPart"/> <xsd:element name="eventSubscript" type="xsd:string" substitutionGroup="eventPathPart"/> <xsd:complexType name="eventReportsType"> <xsd:sequence> <xsd:element name="eventReport" type="eventPathType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="booleanType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="0"/> <xsd:enumeration value="1"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>
5. FE Components and Capabilities
A ForCES forwarding element handles traffic on behalf of a ForCES control element. While the standards will describe the protocol and mechanisms for this control, different implementations and different instances will have different capabilities. The CE MUST be able to determine what each instance it is responsible for is actually capable of doing. As stated previously, this is an approximation. The CE is expected to be prepared to cope with errors in requests and variations in detail not captured by the capabilities information about an FE. In addition to its capabilities, an FE will have information that can be used in understanding and controlling the forwarding operations. Some of this information will be read-only, while others parts may also be writeable. In order to make the FE information easily accessible, the information is represented in an LFB. This LFB has a class, FEObject. The LFBClassID for this class is 1. Only one instance of this class will ever be present in an FE, and the instance ID of that instance in the protocol is 1. Thus, by referencing the components of class:1, instance:1 a CE can get the general information about the FE. The FEObject LFB class is described in this section. There will also be an FEProtocol LFB class. LFBClassID 2 is reserved for that class. There will be only one instance of that class as well. Details of that class are defined in the ForCES protocol [RFC5810] document.5.1. XML for FEObject Class Definition
<?xml version="1.0" encoding="UTF-8"?> <LFBLibrary xmlns="urn:ietf:params:xml:ns:forces:lfbmodel:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" provides="FEObject"> <dataTypeDefs> <dataTypeDef> <name>LFBAdjacencyLimitType</name> <synopsis>Describing the Adjacent LFB</synopsis> <struct> <component componentID="1"> <name>NeighborLFB</name> <synopsis>ID for that LFB class</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="2"> <name>ViaPorts</name>
<synopsis> the ports on which we can connect </synopsis> <array type="variable-size"> <typeRef>string</typeRef> </array> </component> </struct> </dataTypeDef> <dataTypeDef> <name>PortGroupLimitType</name> <synopsis> Limits on the number of ports in a given group </synopsis> <struct> <component componentID="1"> <name>PortGroupName</name> <synopsis>Group Name</synopsis> <typeRef>string</typeRef> </component> <component componentID="2"> <name>MinPortCount</name> <synopsis>Minimum Port Count</synopsis> <optional/> <typeRef>uint32</typeRef> </component> <component componentID="3"> <name>MaxPortCount</name> <synopsis>Max Port Count</synopsis> <optional/> <typeRef>uint32</typeRef> </component> </struct> </dataTypeDef> <dataTypeDef> <name>SupportedLFBType</name> <synopsis>table entry for supported LFB</synopsis> <struct> <component componentID="1"> <name>LFBName</name> <synopsis> The name of a supported LFB class </synopsis> <typeRef>string</typeRef> </component> <component componentID="2"> <name>LFBClassID</name> <synopsis>the id of a supported LFB class</synopsis>
<typeRef>uint32</typeRef> </component> <component componentID="3"> <name>LFBVersion</name> <synopsis> The version of the LFB class used by this FE. </synopsis> <typeRef>string</typeRef> </component> <component componentID="4"> <name>LFBOccurrenceLimit</name> <synopsis> the upper limit of instances of LFBs of this class </synopsis> <optional/> <typeRef>uint32</typeRef> </component> <!-- For each port group, how many ports can exist --> <component componentID="5"> <name>PortGroupLimits</name> <synopsis>Table of Port Group Limits</synopsis> <optional/> <array type="variable-size"> <typeRef>PortGroupLimitType</typeRef> </array> </component> <!-- for the named LFB Class, the LFB Classes it may follow --> <component componentID="6"> <name>CanOccurAfters</name> <synopsis> List of LFB classes that this LFB class can follow </synopsis> <optional/> <array type="variable-size"> <typeRef>LFBAdjacencyLimitType</typeRef> </array> </component> <!-- for the named LFB Class, the LFB Classes that may follow it --> <component componentID="7"> <name>CanOccurBefores</name> <synopsis> List of LFB classes that can follow this LFB class </synopsis> <optional/> <array type="variable-size">
<typeRef>LFBAdjacencyLimitType</typeRef> </array> </component> <component componentID="8"> <name>UseableParentLFBClasses</name> <synopsis> List of LFB classes from which this class has inherited, and which the FE is willing to allow for references to instances of this class. </synopsis> <optional/> <array type="variable-size"> <typeRef>uint32</typeRef> </array> </component> </struct> </dataTypeDef> <dataTypeDef> <name>FEStateValues</name> <synopsis>The possible values of status</synopsis> <atomic> <baseType>uchar</baseType> <specialValues> <specialValue value="0"> <name>AdminDisable</name> <synopsis> FE is administratively disabled </synopsis> </specialValue> <specialValue value="1"> <name>OperDisable</name> <synopsis>FE is operatively disabled</synopsis> </specialValue> <specialValue value="2"> <name>OperEnable</name> <synopsis>FE is operating</synopsis> </specialValue> </specialValues> </atomic> </dataTypeDef> <dataTypeDef> <name>FEConfiguredNeighborType</name> <synopsis>Details of the FE's Neighbor</synopsis> <struct> <component componentID="1"> <name>NeighborID</name> <synopsis>Neighbors FEID</synopsis> <typeRef>uint32</typeRef>
</component> <component componentID="2"> <name>InterfaceToNeighbor</name> <synopsis> FE's interface that connects to this neighbor </synopsis> <optional/> <typeRef>string</typeRef> </component> <component componentID="3"> <name>NeighborInterface</name> <synopsis> The name of the interface on the neighbor to which this FE is adjacent. This is required in case two FEs are adjacent on more than one interface. </synopsis> <optional/> <typeRef>string</typeRef> </component> </struct> </dataTypeDef> <dataTypeDef> <name>LFBSelectorType</name> <synopsis> Unique identification of an LFB class-instance </synopsis> <struct> <component componentID="1"> <name>LFBClassID</name> <synopsis>LFB Class Identifier</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="2"> <name>LFBInstanceID</name> <synopsis>LFB Instance ID</synopsis> <typeRef>uint32</typeRef> </component> </struct> </dataTypeDef> <dataTypeDef> <name>LFBLinkType</name> <synopsis> Link between two LFB instances of topology </synopsis> <struct> <component componentID="1"> <name>FromLFBID</name>
<synopsis>LFB src</synopsis> <typeRef>LFBSelectorType</typeRef> </component> <component componentID="2"> <name>FromPortGroup</name> <synopsis>src port group</synopsis> <typeRef>string</typeRef> </component> <component componentID="3"> <name>FromPortIndex</name> <synopsis>src port index</synopsis> <typeRef>uint32</typeRef> </component> <component componentID="4"> <name>ToLFBID</name> <synopsis>dst LFBID</synopsis> <typeRef>LFBSelectorType</typeRef> </component> <component componentID="5"> <name>ToPortGroup</name> <synopsis>dst port group</synopsis> <typeRef>string</typeRef> </component> <component componentID="6"> <name>ToPortIndex</name> <synopsis>dst port index</synopsis> <typeRef>uint32</typeRef> </component> </struct> </dataTypeDef> </dataTypeDefs> <LFBClassDefs> <LFBClassDef LFBClassID="1"> <name>FEObject</name> <synopsis>Core LFB: FE Object</synopsis> <version>1.0</version> <components> <component access="read-write" componentID="1"> <name>LFBTopology</name> <synopsis>the table of known Topologies</synopsis> <array type="variable-size"> <typeRef>LFBLinkType</typeRef> </array> </component> <component access="read-write" componentID="2"> <name>LFBSelectors</name> <synopsis> table of known active LFB classes and
instances </synopsis> <array type="variable-size"> <typeRef>LFBSelectorType</typeRef> </array> </component> <component access="read-write" componentID="3"> <name>FEName</name> <synopsis>name of this FE</synopsis> <typeRef>string[40]</typeRef> </component> <component access="read-write" componentID="4"> <name>FEID</name> <synopsis>ID of this FE</synopsis> <typeRef>uint32</typeRef> </component> <component access="read-only" componentID="5"> <name>FEVendor</name> <synopsis>vendor of this FE</synopsis> <typeRef>string[40]</typeRef> </component> <component access="read-only" componentID="6"> <name>FEModel</name> <synopsis>model of this FE</synopsis> <typeRef>string[40]</typeRef> </component> <component access="read-only" componentID="7"> <name>FEState</name> <synopsis>State of this FE</synopsis> <typeRef>FEStateValues</typeRef> </component> <component access="read-write" componentID="8"> <name>FENeighbors</name> <synopsis>table of known neighbors</synopsis> <optional/> <array type="variable-size"> <typeRef>FEConfiguredNeighborType</typeRef> </array> </component> </components> <capabilities> <capability componentID="30"> <name>ModifiableLFBTopology</name> <synopsis> Whether Modifiable LFB is supported </synopsis> <optional/> <typeRef>boolean</typeRef>
</capability> <capability componentID="31"> <name>SupportedLFBs</name> <synopsis>List of all supported LFBs</synopsis> <optional/> <array type="variable-size"> <typeRef>SupportedLFBType</typeRef> </array> </capability> </capabilities> </LFBClassDef> </LFBClassDefs> </LFBLibrary>5.2. FE Capabilities
The FE capability information is contained in the capabilities element of the class definition. As described elsewhere, capability information is always considered to be read-only. The currently defined capabilities are ModifiableLFBTopology and SupportedLFBs. Information as to which components of the FEObject LFB are supported is accessed by the properties information for those components.5.2.1. ModifiableLFBTopology
This component has a boolean value that indicates whether the LFB topology of the FE may be changed by the CE. If the component is absent, the default value is assumed to be true, and the CE presumes that the LFB topology may be changed. If the value is present and set to false, the LFB topology of the FE is fixed. If the topology is fixed, the SupportedLFBs element may be omitted, and the list of supported LFBs is inferred by the CE from the LFB topology information. If the list of supported LFBs is provided when ModifiableLFBTopology is false, the CanOccurBefore and CanOccurAfter information should be omitted.5.2.2. SupportedLFBs and SupportedLFBType
One capability that the FE should include is the list of supported LFB classes. The SupportedLFBs component, is an array that contains the information about each supported LFB class. The array structure type is defined as the SupportedLFBType dataTypeDef. Each entry in the SupportedLFBs array describes an LFB class that the FE supports. In addition to indicating that the FE supports the class, FEs with modifiable LFB topology SHOULD include information
about how LFBs of the specified class may be connected to other LFBs. This information SHOULD describe which LFB classes the specified LFB class may succeed or precede in the LFB topology. The FE SHOULD include information as to which port groups may be connected to the given adjacent LFB class. If port group information is omitted, it is assumed that all port groups may be used. This capability information on the acceptable ordering and connection of LFBs MAY be omitted if the implementor concludes that the actual constraints are such that the information would be misleading for the CE.5.2.2.1. LFBName
This component has as its value the name of the LFB class being described.5.2.2.2. LFBClassID
LFBClassID is the numeric ID of the LFB class being described. While conceptually redundant with the LFB name, both are included for clarity and to allow consistency checking.5.2.2.3. LFBVersion
LFBVersion is the version string specifying the LFB class version supported by this FE. As described above in versioning, an FE can support only a single version of a given LFB class.5.2.2.4. LFBOccurrenceLimit
This component, if present, indicates the largest number of instances of this LFB class the FE can support. For FEs that do not have the capability to create or destroy LFB instances, this can either be omitted or be the same as the number of LFB instances of this class contained in the LFB list attribute.5.2.2.5. PortGroupLimits and PortGroupLimitType
The PortGroupLimits component is an array of information about the port groups supported by the LFB class. The structure of the port group limit information is defined by the PortGroupLimitType dataTypeDef. Each PortGroupLimits array entry contains information describing a single port group of the LFB class. Each array entry contains the name of the port group in the PortGroupName component, the fewest number of ports that can exist in the group in the MinPortCount component, and the largest number of ports that can exist in the group in the MaxPortCount component.
5.2.2.6. CanOccurAfters and LFBAdjacencyLimitType
The CanOccurAfters component is an array that contains the list of LFBs the described class can occur after. The array entries are defined in the LFBAdjacencyLimitType dataTypeDef. The array entries describe a permissible positioning of the described LFB class, referred to here as the SupportedLFB. Specifically, each array entry names an LFB that can topologically precede that LFB class. That is, the SupportedLFB can have an input port connected to an output port of an LFB that appears in the CanOccurAfters array. The LFB class that the SupportedLFB can follow is identified by the NeighborLFB component (of the LFBAdjacencyLimitType dataTypeDef) of the CanOccurAfters array entry. If this neighbor can only be connected to a specific set of input port groups, then the viaPort component is included. This component is an array, with one entry for each input port group of the SupportedLFB that can be connected to an output port of the NeighborLFB. (For example, within a SupportedLFBs entry, each array entry of the CanOccurAfters array must have a unique NeighborLFB, and within each such array entry each viaPort must represent a distinct and valid input port group of the SupportedLFB. The LFB class definition schema does not include these uniqueness constraints.)5.2.2.7. CanOccurBefores and LFBAdjacencyLimitType
The CanOccurBefores array holds the information about which LFB classes can follow the described class. Structurally, this element parallels CanOccurAfters, and uses the same type definition for the array entries. The array entries list those LFB classes that the SupportedLFB may precede in the topology. In this component, the entries in the viaPort component of the array value represent the output port groups of the SupportedLFB that may be connected to the NeighborLFB. As with CanOccurAfters, viaPort may have multiple entries if multiple output ports may legitimately connect to the given NeighborLFB class. (And a similar set of uniqueness constraints applies to the CanOccurBefore clauses, even though an LFB may occur both in CanOccurAfter and CanOccurBefore.)5.2.2.8. UseableParentLFBClasses
The UseableParentLFBClasses array, if present, is used to hold a list of parent LFB class IDs. All the entries in the list must be IDs of classes from which the SupportedLFB class being described has
inherited (either directly or through an intermediate parent.) (If an FE includes improper values in this list, improper manipulations by the CE are likely, and operational failures are likely.) In addition, the FE, by including a given class in the last, is indicating to the CE that a given parent class may be used to manipulate an instance of this supported LFB class. By allowing such substitution, the FE allows for the case where an instantiated LFB may be of a class not known to the CE, but could still be manipulated. While it is hoped that such situations are rare, it is desirable for this to be supported. This can occur if an FE locally defines certain LFB instances, or if an earlier CE had configured some LFB instances. It can also occur if the FE would prefer to instantiate a more recent, more specific and suitable LFB class rather than a common parent. In order to permit this, the FE MUST be more restrained in assigning LFB instance IDs. Normally, instance IDs are qualified by the LFB class. However, if two LFB classes share a parent, and if that parent is listed in the UseableParentLFBClasses for both specific LFB classes, then all the instances of both (or any, if multiple classes are listing the common parent) MUST use distinct instances. This permits the FE to determine which LFB instance is intended by CE manipulation operations even when a parent class is used.5.2.2.9. LFBClassCapabilities
While it would be desirable to include class-capability-level information, this is not included in the model. While such information belongs in the FE Object in the supported class table, the contents of that information would be class specific. The currently expected encoding structures for transferring information between the CE and FE are such that allowing completely unspecified information would be likely to induce parse errors. We could specify that the information be encoded in an octetstring, but then we would have to define the internal format of that octet string. As there also are not currently any defined LFB class-level capabilities that the FE needs to report, this information is not present now, but may be added in a future version of the FE object. (This is an example of a case where versioning, rather than inheritance, would be needed, since the FE object must have class ID 1 and instance ID 1 so that the protocol behavior can start by finding this object.)
5.3. FE Components
The <components> element is included if the class definition contains the definition of the components of the FE object that are not considered "capabilities". Some of these components are writeable and some are read-only, which is determinable by examining the property information of the components.5.3.1. FEState
This component carries the overall state of the FE. The possible values are the strings AdminDisable, OperDisable, and OperEnable. The starting state is OperDisable, and the transition to OperEnable is controlled by the FE. The CE controls the transition from OperEnable to/from AdminDisable. For details, refer to the ForCES protocol document [RFC5810].5.3.2. LFBSelectors and LFBSelectorType
The LFBSelectors component is an array of information about the LFBs currently accessible via ForCES in the FE. The structure of the LFB information is defined by the LFBSelectorType dataTypeDef. Each entry in the array describes a single LFB instance in the FE. The array entry contains the numeric class ID of the class of the LFB instance and the numeric instance ID for this instance.5.3.3. LFBTopology and LFBLinkType
The optional LFBTopology component contains information about each inter-LFB link inside the FE, where each link is described in an LFBLinkType dataTypeDef. The LFBLinkType component contains sufficient information to identify precisely the end points of a link. The FromLFBID and ToLFBID components specify the LFB instances at each end of the link, and MUST reference LFBs in the LFB instance table. The FromPortGroup and ToPortGroup MUST identify output and input port groups defined in the LFB classes of the LFB instances identified by FromLFBID and ToLFBID. The FromPortIndex and ToPortIndex components select the entries from the port groups that this link connects. All links are uniquely identified by the FromLFBID, FromPortGroup, and FromPortIndex fields. Multiple links may have the same ToLFBID, ToPortGroup, and ToPortIndex as this model supports fan-in of inter-LFB links but not fan-out.
5.3.4. FENeighbors and FEConfiguredNeighborType
The FENeighbors component is an array of information about manually configured adjacencies between this FE and other FEs. The content of the array is defined by the FEConfiguredNeighborType dataTypeDef. This array is intended to capture information that may be configured on the FE and is needed by the CE, where one array entry corresponds to each configured neighbor. Note that this array is not intended to represent the results of any discovery protocols, as those will have their own LFBs. This component is optional. While there may be many ways to configure neighbors, the FE-ID is the best way for the CE to correlate entities. And the interface identifier (name string) is the best correlator. The CE will be able to determine the IP address and media-level information about the neighbor from the neighbor directly. Omitting that information from this table avoids the risk of incorrect double configuration. Information about the intended forms of exchange with a given neighbor is not captured here; only the adjacency information is included.5.3.4.1. NeighborID
This is the ID in some space meaningful to the CE for the neighbor.5.3.4.2. InterfaceToNeighbor
This identifies the interface through which the neighbor is reached.5.3.4.3. NeighborInterface
This identifies the interface on the neighbor through which the neighbor is reached. The interface identification is needed when either only one side of the adjacency has configuration information or the two FEs are adjacent on more than one interface.6. Satisfying the Requirements on the FE Model
This section describes how the proposed FE model meets the requirements outlined in Section 5 of RFC 3654 [RFC3654]. The requirements can be separated into general requirements (Section 5, 5.1 - 5.4) and the specification of the minimal set of logical functions that the FE model must support (Section 5.5).
The general requirement on the FE model is that it be able to express the logical packet processing capability of the FE, through both a capability and a state model. In addition, the FE model is expected to allow flexible implementations and be extensible to allow defining new logical functions. A major component of the proposed FE model is the Logical Functional Block (LFB) model. Each distinct logical function in an FE is modeled as an LFB. Operational parameters of the LFB that must be visible to the CE are conceptualized as LFB components. These components express the capability of the FE and support flexible implementations by allowing an FE to specify which optional features are supported. The components also indicate whether they are configurable by the CE for an LFB class. Configurable components provide the CE some flexibility in specifying the behavior of an LFB. When multiple LFBs belonging to the same LFB class are instantiated on an FE, each of those LFBs could be configured with different component settings. By querying the settings of the components for an instantiated LFB, the CE can determine the state of that LFB. Instantiated LFBs are interconnected in a directed graph that describes the ordering of the functions within an FE. This directed graph is described by the topology model. The combination of the components of the instantiated LFBs and the topology describe the packet processing functions available on the FE (current state). Another key component of the FE model is the FE components. The FE components are used mainly to describe the capabilities of the FE, but they also convey information about the FE state. The FE model includes only the definition of the FE Object LFB itself. Meeting the full set of working group requirements requires other LFBs. The class definitions for those LFBs will be provided in other documents.