One document matched: draft-zheng-mpls-lsp-ping-yang-cfg-00.txt
Network Working Group L. Zheng
Internet-Draft S. Aldrin
Intended status: Standards Track Y. Zhang
Expires: August 16, 2015 Huawei Technologies
G. Mirsky
Ericsson
February 12, 2015
Yang Data Model for LSP-PING
draft-zheng-mpls-lsp-ping-yang-cfg-00.txt
Abstract
This document defines a YANG data model that can be used to configure
and manage LSP-Ping.
Requirements Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [RFC2119].
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on August 16, 2015.
Copyright Notice
Copyright (c) 2015 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
Zheng, et al. Expires August 16, 2015 [Page 1]
Internet-Draft LSP-Ping Yang February 2015
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Support of Long Running Command with NETCONF . . . . . . 3
1.2. Contributors . . . . . . . . . . . . . . . . . . . . . . 3
2. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3. Design of the Data Model . . . . . . . . . . . . . . . . . . 3
3.1. Configuration of Control Information . . . . . . . . . . 4
3.2. Configuration of Schedule Parameters . . . . . . . . . . 5
3.3. Display of Result Information . . . . . . . . . . . . . . 5
4. Data Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 6
5. Interaction with other MPLS OAM Tools Models . . . . . . . . 8
6. LSP-Ping Yang Module . . . . . . . . . . . . . . . . . . . . 8
7. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8. Security Considerations . . . . . . . . . . . . . . . . . . . 17
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 17
10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 17
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 18
11.1. Normative References . . . . . . . . . . . . . . . . . . 18
11.2. Informative References . . . . . . . . . . . . . . . . . 18
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 19
1. Introduction
When an LSP fails to deliver user traffic, the failure cannot always
be detected by the MPLS control plane. [RFC4379] defines a mechanism
that would enable users to detect such failure and to isolate faults.
YANG [RFC6020] is a data definition language that was introduced to
define the contents of a conceptual data store that allows networked
devices to be managed using NETCONF [RFC6241]. This document defines
a YANG data model that can be used to configure and manage LSP-Ping
[RFC4379].
The rest of this document is organized as follows. Section 2
presents the scope of this document. Section 3 provides the design
of the LSP-Ping configuration data model in details by containers.
Section 4 presents the complete data hierarchy of LSP-Ping YANG
model. Section 5 discusses the interaction between LSP-Ping data
model and other MPLS tools data models. Section 6 specifies the YANG
module and section 7 lists examples which conform to the YANG module
Zheng, et al. Expires August 16, 2015 [Page 2]
Internet-Draft LSP-Ping Yang February 2015
specified in this document. Finally, security considerations are
discussed in Section 8.
1.1. Support of Long Running Command with NETCONF
LSP Ping is one of examples of what can described as "long-running
operation". Unlike most of configuration operations that result in
single response execution of an LSP Ping triggers multiple responses
from a node under control. The question of implementing long-running
operation in NETCONF is still open and possible solutions being
discussed:
1, Consequitive Remote Processing Calls (RPC) to poll for results;
2, Model presented in[RFC4560] ;
3, The one outlined in [I-D.mahesh-netconf-persistent].
The problem of long-running operation as well can be considered as a
case of controlling and obtaining results from a Measurement Agent
(MA) as defined in [I-D.ietf-lmap-framework].
1.2. Contributors
The following made vital contributions to this document:
Guangying Zheng, Huawei Technologies
2. Scope
The fundemantel mechanism of LSP-Ping is defined in [RFC4379].
Extentions of LSP-Ping has been developed over the years. Examples
are performing LSP ping over P2MP MPLS LSPs [RFC6425] and traceroute
over MPLS tunnels [RFC6424] etc. These extentions will be considered
in update of this document.
3. Design of the Data Model
The LSP-Ping Yang model defined in this document provides the
following features:
1, Configuration of control information of a LSP-Ping test;
2, Configuration of schedule parameters of a LSP-Ping test;
3, Display of result information of a LSP-Ping test.
Zheng, et al. Expires August 16, 2015 [Page 3]
Internet-Draft LSP-Ping Yang February 2015
3.1. Configuration of Control Information
Container lspPings:lspPing:ctrlInfo defines the config ture
parametres control a LSP-Ping test. Examples are the Target FEC
address type/address and the reply mode of the echo reply packet.
Some node may be auto-assigned by the system, but there may be
requirement of configuration. Examples are source address and
interface.
The data hierarchy for control information configuration is presented
below:
module: mpls-lsp-ping
+--rw lspPings
+--rw lspPing* [lsp-ping-name]
+--rw lsp-ping-name string
+--rw ctrlInfo
| +--rw TargetAddType? enumeration
| +--rw (TargetAdd)?
| | +--:(ipv4)
| | | +--rw ipv4add? inet:ip-address
| | +--:(ipv6)
| | | +--rw ipv6add? inet:ip-address
| | +--:(bgp)
| | | +--rw bgp? inet:ip-address
| | +--:(l3vpn)
| | | +--rw l3vpnid? uint32
| | | +--rw l3vpn-ipadd? inet:ip-address
| | +--:(tunnel-if)
| | | +--rw tunnel-if? uint32
| | +--:(vc)
| | | +--rw vc? uint32
| | +--:(vpls)
| | +--rw vpls? string
| +--rw ReplyMode? enumeration
| +--rw TimeOut? uint32
| +--rw Frequency? uint32
| +--rw AdminStatus? enumeration
| +--rw ProbeCount? uint32
| +--rw DataSize? uint32
| +--rw DataFill? string
| +--rw Descr? string
| +--rw SourceAddressType? enumeration
| +--rw SourceAddress? inet:ip-address
| +--rw IfIndex? uint32
Zheng, et al. Expires August 16, 2015 [Page 4]
Internet-Draft LSP-Ping Yang February 2015
3.2. Configuration of Schedule Parameters
Container lspPings:lspPing:schedulePara defines the test schedule
parameters of a LSP-Ping test, which basically describes when to
start and when to end the test. Four start modes and three end modes
are defined respectively.
The data hierarchy for schedule information configuration is
presented below:
module: mpls-lsp-ping
+--rw lspPings
+--rw lspPing* [lsp-ping-name]
+--rw lsp-ping-name string
+--rw ctrlInfo
...
+--rw schedulePara
| +--rw (startTest)?
| | +--:(now)
| | | +--rw startTestNow? empty
| | +--:(at)
| | | +--rw startTestAt? yang:date-and-time
| | +--:(delay)
| | | +--rw startTestDelay? uint32
| | +--:(daily)
| | +--rw startTestDaily? yang:date-and-time
| +--rw (endTest)?
| +--:(at)
| | +--rw endTestAt? yang:date-and-time
| +--:(delay)
| | +--rw endTestDelay? uint32
| +--:(daily)
| +--rw endTestLifetime? uint32
3.3. Display of Result Information
Container lspPings:lspPing:resultInfo shows the result of the current
LSP-Ping test. The data hierarchy for display of result information
is presented below:
Zheng, et al. Expires August 16, 2015 [Page 5]
Internet-Draft LSP-Ping Yang February 2015
module: mpls-lsp-ping
+--rw lspPings
+--rw lspPing* [lsp-ping-name]
+--rw lsp-ping-name string
+--rw ctrlInfo
...
+--rw schedulePara
...
+--ro resultInfo
+--ro OperStatus? enumeration
+--ro TargetAddType? enumeration
+--ro (TargetAdd)?
| +--:(ipv4)
| | +--ro ipv4add? inet:ip-address
| +--:(ipv6)
| | +--ro ipv6add? inet:ip-address
| +--:(bgp)
| | +--ro bgp? inet:ip-address
| +--:(l3vpn)
| | +--ro l3vpnid? uint32
| | +--ro l3vpn-ipadd? inet:ip-address
| +--:(tunnel-if)
| | +--ro tunnel-if? uint32
| +--:(vc)
| | +--ro vc? uint32
| +--:(vpls)
| +--ro vpls? string
+--ro MinRtt? uint32
+--ro MaxRtt? uint32
+--ro AverageRtt? uint32
+--ro ProbeResponses? uint32
+--ro SentProbes? uint32
+--ro SumOfSquares? uint32
+--ro LastGoodProbe? yang:date-and-time
4. Data Hierarchy
The complete data hierarchy of LSP-Ping YANG model is presented
below.
module: mpls-lsp-ping
+--rw lspPings
+--rw lspPing* [lsp-ping-name]
+--rw lsp-ping-name string
+--rw ctrlInfo
| +--rw TargetAddType? enumeration
| +--rw (TargetAdd)?
| | +--:(ipv4)
Zheng, et al. Expires August 16, 2015 [Page 6]
Internet-Draft LSP-Ping Yang February 2015
| | | +--rw ipv4add? inet:ip-address
| | +--:(ipv6)
| | | +--rw ipv6add? inet:ip-address
| | +--:(bgp)
| | | +--rw bgp? inet:ip-address
| | +--:(l3vpn)
| | | +--rw l3vpnid? uint32
| | | +--rw l3vpn-ipadd? inet:ip-address
| | +--:(tunnel-if)
| | | +--rw tunnel-if? uint32
| | +--:(vc)
| | | +--rw vc? uint32
| | +--:(vpls)
| | +--rw vpls? string
| +--rw ReplyMode? enumeration
| +--rw TimeOut? uint32
| +--rw Frequency? uint32
| +--rw AdminStatus? enumeration
| +--rw ProbeCount? uint32
| +--rw DataSize? uint32
| +--rw DataFill? string
| +--rw Descr? string
| +--rw SourceAddressType? enumeration
| +--rw SourceAddress? inet:ip-address
| +--rw IfIndex? uint32
+--rw schedulePara
| +--rw (startTest)?
| | +--:(now)
| | | +--rw startTestNow? empty
| | +--:(at)
| | | +--rw startTestAt? yang:date-and-time
| | +--:(delay)
| | | +--rw startTestDelay? uint32
| | +--:(daily)
| | +--rw startTestDaily? yang:date-and-time
| +--rw (endTest)?
| +--:(at)
| | +--rw endTestAt? yang:date-and-time
| +--:(delay)
| | +--rw endTestDelay? uint32
| +--:(daily)
| +--rw endTestLifetime? uint32
+--ro resultInfo
+--ro OperStatus? enumeration
+--ro TargetAddType? enumeration
+--ro (TargetAdd)?
| +--:(ipv4)
| | +--ro ipv4add? inet:ip-address
Zheng, et al. Expires August 16, 2015 [Page 7]
Internet-Draft LSP-Ping Yang February 2015
| +--:(ipv6)
| | +--ro ipv6add? inet:ip-address
| +--:(bgp)
| | +--ro bgp? inet:ip-address
| +--:(l3vpn)
| | +--ro l3vpnid? uint32
| | +--ro l3vpn-ipadd? inet:ip-address
| +--:(tunnel-if)
| | +--ro tunnel-if? uint32
| +--:(vc)
| | +--ro vc? uint32
| +--:(vpls)
| +--ro vpls? string
+--ro MinRtt? uint32
+--ro MaxRtt? uint32
+--ro AverageRtt? uint32
+--ro ProbeResponses? uint32
+--ro SentProbes? uint32
+--ro SumOfSquares? uint32
+--ro LastGoodProbe? yang:date-and-time
5. Interaction with other MPLS OAM Tools Models
TBA
6. LSP-Ping Yang Module
module mpls-lsp-ping {
namespace "urn:ietf:params:xml:ns:yang:mpls-lsp-ping";
//namespace need to be assigned by IANA
prefix "lspping";
import ietf-inet-types {
prefix inet;
}
import ietf-yang-types{
prefix yang;
}
organization "IETF MPLS (Multiprotocl Label_Switching) Working Group";
contact "vero.zheng@huawei.com
zhangyanfeng@huawei.com";
description "MPLS LSP-PING Yang Module";
revision "2015-01-21" {
description
"Initial version";
}
Zheng, et al. Expires August 16, 2015 [Page 8]
Internet-Draft LSP-Ping Yang February 2015
container lspPings {
list lspPing {
key "lsp-ping-name";
leaf lsp-ping-name {
description
"lsp ping name";
mandatory "true";
type string {
length "1..31";
}
}
container ctrlInfo {
leaf TargetAddType {
description
"Specifies the address type of Target FEC.";
type enumeration {
enum ipv4 {
value "0";
description "IPv4 LSP's destination";
}
enum ipv6 {
value "1";
description "IPv6 LSP's destination";
}
enum bgp {
value "2";
description "BGP LSP's destination";
}
enum tunnel-if {
value "3";
description "tunnel interface";
}
enum l3vpn {
value "4";
description "l3vpn-instance and remote address";
}
enum pwid {
value "5";
description "pwid";
}
enum vsi-name {
value "6";
description "name of VSI";
}
}
}
Zheng, et al. Expires August 16, 2015 [Page 9]
Internet-Draft LSP-Ping Yang February 2015
choice TargetAdd{
description
"Specifies the address of Target FEC";
case ipv4 {
leaf ipv4add{
type inet:ip-address;
}
}
case ipv6 {
leaf ipv6add{
type inet:ip-address;
}
}
case bgp {
leaf bgp{
type inet:ip-address;
}
}
case l3vpn {
leaf l3vpnid{
type uint32;
}
leaf l3vpn-ipadd{
type inet:ip-address;
}
}
case tunnel-if {
leaf tunnel-if{
type uint32;
}
}
case vc {
leaf vc{
type uint32;
}
}
case vpls {
leaf vpls{
type string;
}
}
}
leaf ReplyMode {
description
"Specifies the reply mode.";
type enumeration {
enum 1 {
Zheng, et al. Expires August 16, 2015 [Page 10]
Internet-Draft LSP-Ping Yang February 2015
value "1";
description "Do not reply";
}
enum 2 {
value "2";
description "Reply via an IPv4/IPv6 UDP packet";
}
enum 3 {
value "3";
description "Reply via an IPv4/IPv6 UDP packet with Router Alert";
}
enum 4 {
value "4";
description "Reply via application level control channel";
}
}
}
leaf TimeOut {
description
"Specifies the time-out value, in seconds, for a lsp ping operation.";
type uint32;
}
leaf Frequency {
description
"Specifies the frequency to perform a lsp ping operation as part of one ping test.";
type uint32;
}
leaf AdminStatus {
description
"Specifies the desired state is enabled(1) or disabled(2)";
type enumeration {
enum enabled {
value "1";
description "The desired state is enabled";
}
enum disabled {
value "2";
description "The desired state is disabled";
}
}
}
leaf ProbeCount {
description
"Specifies the number of probe sent of one lsp ping test.";
Zheng, et al. Expires August 16, 2015 [Page 11]
Internet-Draft LSP-Ping Yang February 2015
type uint32;
}
leaf DataSize {
description
"Specifies the size of the data portion to be transmitted in a lsp ping operation, in octets.";
type uint32;
}
leaf DataFill {
description
"The content of this object is used together with the corresponding DataSize value to determine how to fill the data portion of a probe packet.";
type string{
length "0..1564";
}
}
leaf Descr {
description
"a descriptive name of the lsp ping test.";
type string{
length "1..31";
}
}
leaf SourceAddressType {
description
"Specifies the type of the source address.";
type enumeration {
enum ipv4 {
value "0";
description "IPv4 address";
}
enum ipv6 {
value "1";
description "IPv6 address";
}
}
}
leaf SourceAddress {
description
"Specifies the source address.";
type inet:ip-address;
}
leaf IfIndex {
description
Zheng, et al. Expires August 16, 2015 [Page 12]
Internet-Draft LSP-Ping Yang February 2015
"Setting this object to an interface's ifIndex prior to starting a remote ping operation directs the ping probes to be transmitted over the specified interface.";
type uint32;
}
}
container schedulePara {
description
"LSP ping schedule parameter";
choice startTest{
description
"Specifies when the test begins to start, include 4 schedule method: start now(1), start at(2), start delay(3), start daily(4).";
case now {
leaf startTestNow{
description "Start test now.";
type empty;
}
}
case at {
leaf startTestAt{
description "Start test at a time.";
type yang:date-and-time;
}
}
case delay {
leaf startTestDelay{
description "Start delay time.";
type uint32;
}
}
case daily {
leaf startTestDaily{
description "Start test daily.";
type yang:date-and-time;
}
}
}
choice endTest{
description
"Specifies when the test ends, include 3 schedule method: end at(1), end delay(2), end lifetime(3).";
case at {
leaf endTestAt{
description "End test at a time.";
type yang:date-and-time;
}
}
case delay {
Zheng, et al. Expires August 16, 2015 [Page 13]
Internet-Draft LSP-Ping Yang February 2015
leaf endTestDelay{
description "End delay some time.";
type uint32;
}
}
case daily {
leaf endTestLifetime{
description "Set the test lifetime.";
type uint32;
}
}
}
}
container resultInfo {
config "false";
leaf OperStatus {
description
"Reflects the operational state of a lsp Ping test";
type enumeration {
enum enabled {
value "1";
description "The Test is active";
}
enum disabled {
value "2";
description "The test has stopped";
}
enum completed {
value "3";
description "The test is completed";
}
}
}
leaf TargetAddType {
description
"Specifies the address type of Target FEC.";
type enumeration {
enum ipv4 {
value "0";
description "IPv4 LSP's destination";
}
enum ipv6 {
value "1";
description "IPv6 LSP's destination";
}
enum bgp {
Zheng, et al. Expires August 16, 2015 [Page 14]
Internet-Draft LSP-Ping Yang February 2015
value "2";
description "BGP LSP's destination";
}
enum tunnel-if {
value "3";
description "tunnel interface";
}
enum l3vpn {
value "4";
description "l3vpn-instance and remote address";
}
enum pwid {
value "5";
description "pwid";
}
enum vsi-name {
value "6";
description "name of VSI";
}
}
}
choice TargetAdd{
case ipv4 {
leaf ipv4add{
type inet:ip-address;
}
}
case ipv6 {
leaf ipv6add{
type inet:ip-address;
}
}
case bgp {
leaf bgp{
type inet:ip-address;
}
}
case l3vpn {
leaf l3vpnid{
type uint32;
}
leaf l3vpn-ipadd{
type inet:ip-address;
}
}
case tunnel-if {
leaf tunnel-if{
Zheng, et al. Expires August 16, 2015 [Page 15]
Internet-Draft LSP-Ping Yang February 2015
type uint32;
}
}
case vc {
leaf vc{
type uint32;
}
}
case vpls {
leaf vpls{
type string;
}
}
}
leaf MinRtt {
description
"The minimum lsp ping round-trip-time (RTT) received.";
type uint32;
}
leaf MaxRtt {
description
"The maximum lsp ping round-trip-time (RTT) received.";
type uint32;
}
leaf AverageRtt {
description
"The current average lsp ping round-trip-time (RTT).";
type uint32;
}
leaf ProbeResponses {
description
"Number of responses received for the corresponding lsp ping test.";
type uint32;
}
leaf SentProbes {
description
"number of probes sent for the corresponding lsp ping test.";
type uint32;
}
leaf SumOfSquares {
description
"This object contains the sum of the squares for all replys received.";
Zheng, et al. Expires August 16, 2015 [Page 16]
Internet-Draft LSP-Ping Yang February 2015
type uint32;
}
leaf LastGoodProbe {
description
"Date and time when the last response was received for a probe.";
type yang:date-and-time;
}
}
}
}
}
7. Examples
Examples of using Yang module to configure and manage LSP-Ping will
be given here in the update when the Yang module is stable.
8. Security Considerations
The configuration and state data defined in this document is designed
to be accessed via the NETCONF protocol [RFC6241]. The lowest
NETCONF layer is the secure transport layer and the mandatory-to-
implement secure transport is SSH [RFC6242]. The authors recommend
to implement the NETCONF access control model [RFC6536] to restrict
access for particular NETCONF users to a pre-configured subset of all
available NETCONF protocol operations and content.
There are a number of config true nodes defined in the YANG module
which are writable/creatable/deletable. These data nodes may be
considered sensitive or vulnerable in some network environments.
Write operations to these data nodes without proper protection can
have a negative effect on network operations.
9. IANA Considerations
The IANA is requested to as assign a new new namespace URI from the
IETF XML registry.
URI:TBD
10. Acknowledgements
We would also like to thank XXX.
Zheng, et al. Expires August 16, 2015 [Page 17]
Internet-Draft LSP-Ping Yang February 2015
11. References
11.1. Normative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC4379] Kompella, K. and G. Swallow, "Detecting Multi-Protocol
Label Switched (MPLS) Data Plane Failures", RFC 4379,
February 2006.
[RFC6020] Bjorklund, M., "YANG - A Data Modeling Language for the
Network Configuration Protocol (NETCONF)", RFC 6020,
October 2010.
11.2. Informative References
[I-D.ietf-lmap-framework]
Eardley, P., Morton, A., Bagnulo, M., Burbridge, T.,
Aitken, P., and A. Akhter, "A framework for large-scale
measurement platforms (LMAP)", draft-ietf-lmap-
framework-10 (work in progress), January 2015.
[I-D.mahesh-netconf-persistent]
Jethanandani, M., "NETCONF and persistent responses",
draft-mahesh-netconf-persistent-00 (work in progress),
October 2014.
[RFC4560] Quittek, J. and K. White, "Definitions of Managed Objects
for Remote Ping, Traceroute, and Lookup Operations", RFC
4560, June 2006.
[RFC6241] Enns, R., Bjorklund, M., Schoenwaelder, J., and A.
Bierman, "Network Configuration Protocol (NETCONF)", RFC
6241, June 2011.
[RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure
Shell (SSH)", RFC 6242, June 2011.
[RFC6424] Bahadur, N., Kompella, K., and G. Swallow, "Mechanism for
Performing Label Switched Path Ping (LSP Ping) over MPLS
Tunnels", RFC 6424, November 2011.
[RFC6425] Saxena, S., Swallow, G., Ali, Z., Farrel, A., Yasukawa,
S., and T. Nadeau, "Detecting Data-Plane Failures in
Point-to-Multipoint MPLS - Extensions to LSP Ping", RFC
6425, November 2011.
Zheng, et al. Expires August 16, 2015 [Page 18]
Internet-Draft LSP-Ping Yang February 2015
[RFC6536] Bierman, A. and M. Bjorklund, "Network Configuration
Protocol (NETCONF) Access Control Model", RFC 6536, March
2012.
Authors' Addresses
Lianshu Zheng
Huawei Technologies
China
Email: vero.zheng@huawei.com
Sam K. Aldrin
Huawei Technologies
USA
Email: aldrin.ietf@gmail.com
Yanfeng Zhang
Huawei Technologies
China
Email: zhangyanfeng@huawei.com
Greg Mirsky
Ericsson
USA
Email: gregory.mirsky@ericsson.com
Zheng, et al. Expires August 16, 2015 [Page 19]
| PAFTECH AB 2003-2026 | 2026-04-24 06:08:37 |