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>
<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>
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>
</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.