Network Working Group X. Geng Internet-Draft Z. Li Intended status: Experimental J. Xie Expires: 15 August 2022 Huawei Technologies 11 February 2022 RLB (Replication through Local Bitstring) Segment for Multicast Source Routing over IPv6 draft-geng-msr6-rlb-segment-00 Abstract This document defines 2 new types of segment: End.RLB.X and End.RLB, and the corresponding packet processing procedures over the IPv6 data plane for the MSR6(Multicast Source Routing over IPv6) TE solutions. 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 https://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 15 August 2022. Copyright Notice Copyright (c) 2022 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 (https://trustee.ietf.org/ license-info) in effect on the date of publication of this document. Geng, et al. Expires 15 August 2022 [Page 1] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 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 Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License. Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 2. Terminologies . . . . . . . . . . . . . . . . . . . . . . . . 3 3. Local Bitstring . . . . . . . . . . . . . . . . . . . . . . . 4 4. RLB.X Segment Definition . . . . . . . . . . . . . . . . . . 4 5. End.RLB.X Behavior . . . . . . . . . . . . . . . . . . . . . 5 6. RLB Segment and LB Segment Definition . . . . . . . . . . . . 5 7. End.RLB Behavior . . . . . . . . . . . . . . . . . . . . . . 6 8. Illustration . . . . . . . . . . . . . . . . . . . . . . . . 7 8.1. End.RLB.X . . . . . . . . . . . . . . . . . . . . . . . . 8 8.1.1. MRH Encapsulation . . . . . . . . . . . . . . . . . . 8 8.1.2. Forwarding Process . . . . . . . . . . . . . . . . . 9 8.2. End.RLB . . . . . . . . . . . . . . . . . . . . . . . . . 11 8.2.1. MRH Encapsulation . . . . . . . . . . . . . . . . . . 11 8.2.2. Forwarding Process . . . . . . . . . . . . . . . . . 11 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 14 10. Security Considerations . . . . . . . . . . . . . . . . . . . 14 11. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 14 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 14 12.1. Normative References . . . . . . . . . . . . . . . . . . 14 12.2. Informative References . . . . . . . . . . . . . . . . . 15 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 15 1. Introduction MSR6(Multicast Source Routing over IPv6) is an IPv6 based multicast source routing (MSR6) solution, defined in [I-D.cheng-spring-ipv6-msr-design-consideration], which leverages the benefits of source routing over IPv6 data plane to provide simplified multicast TE and BE service in an IPv6 network without unnecessary multicast tree status and complex control plane protocols. MSR6 needs to reuse the advantages of SRv6 and BIER to implement source routing. Geng, et al. Expires 15 August 2022 [Page 2] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 MSR6 has two basic modes of forwarding: one is based on Shortest Path First(SPF), which is called MSR6 BE mode; the other is based on traffic engineered, which is called MSR6 TE mode. [I-D.geng-msr6-traffic-engineering] and [I-D.chen-pim-srv6-p2mp-path] have introduced structured segment list by defining arguments in each segment. Based on these existing work, this document defines 3 new types of segment with local bitstring, which could reduce encapsulation overhead and enhance scalability. 2. Terminologies MSR6: Multicast Source Routing over IPv6, defined in [I-D.cheng-spring-ipv6-msr-design-consideration]. MRH: Multicast Routing Header, a new type of Routing Header which is used for MSR6. Multicast domain: A set of network device which could provide P2MP multicast transport. In this document, the multicast domain is an MSR domain, where every nodes support the capability of MSR6. Root Node: Root node is the beginning point of a multicast tree and also the initiation node of a multicast tunnel. It encapsulates the packet with a multicast header. The type of the encapsulation depends on the routing protocol used in the multicast domain. For MSR6 TE, the encapsulation is MSR6 TE header, which is an IPv6 header with MRH. Replication Endpoint: the intermediate node of a multicast tree, which replicates packet and forwards the packet to the downstream nodes. For MSR6, the Replication Node is called Replication Endpoint which can be indicated by the MSR6 Segment and replicate packets according to the multicast source routing information encapsulation in the MSR6 header of the packet. Leaf Node: Leaf node is the end point of a multicast tree and also the decapsulation node of a multicast tunnel. It decapsulates the multicast header in the packet and forwards the packet based on overlay encapsulation. Parent Node: The parent node is the node that does the packet replication, corresponding to the concept of a child node. Child Node: The child node is the downstream node that will receive the packet which has been replicated ,corresponding to the concept of a parent node. Geng, et al. Expires 15 August 2022 [Page 3] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 End.RLB(Replication through Local Bitstring): Endpoint with the function of Replication through Local Bitstring End.RLB(Replication through Local Bitstring).X: Endpoint with the function of Replication through Local Bitstring and defining output port. LB(Local Bitstring)Segment: Segment with Local Bitstring. 3. Local Bitstring For a specific node, the downstream port can be represented by a specific bit in the local bitstring of the node. If the packet needs to be replicated through the downstream port, the bit MUST be set. Or else, the bit MUST be set as 0. 4. RLB.X Segment Definition The segment defined in [RFC8402] can represent instruction, topological or service based on the requirement. This document specifies RLB.X segment for multicast path encoding. End.RLB.X is a new type of segment which is used to identify the Replication Endpoint, which is able to replicate the packet based on the local bitstring in the segment. RLB.X segment is used as an IPv6 address, which is 128 bits and follows the SID format defined in [RFC8986], consisting of LOC:FUNCT:ARG. RLB.X segment is advertised by the RLB.X replication endpoint. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Locator | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Function | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Local Bitstring | Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Local Bitstring indicates a set of adjacency links that the packet are supposed to be replicated to and Pointer is used to locate the segment the packet will parse in the next replication endpoint. Each replication node maintains the mapping relationship of the bit position and adjacency link in the Local Bitstring Forwarding Table(LBFT). Geng, et al. Expires 15 August 2022 [Page 4] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 5. End.RLB.X Behavior The replication node does the following when the DA of the packet is a local End.RLB.X SID. S01. When an MRH is processed { S02. If (Segments Left == 0 or Local Bitstring==Pointer==0) { S03. Stop processing the MRH, and proceed to process the next header in the packet, whose type is identified by the Next Header field in the routing header. S04. } S05. If (IPv6 Hop Limit <= 1) { S06. Send an ICMP Time Exceeded message to the Source Address with Code 0 (Hop limit exceeded in transit), interrupt packet processing, and discard the packet. S07. } S08. max_LE = (Hdr Ext Len / 2) - 1 S09. If ((Last Entry > max_LE) or (Segments Left > Last Entry+1)) { S10. Send an ICMP Parameter Problem to the Source Address with Code 0 (Erroneous header field encountered) and Pointer set to the Segments Left field, interrupt packet processing, and discard the packet. S11. } S12. Decrement IPv6 Hop Limit by 1 S13. Replicate the packet based on the local bitstring in the End.RLB.X and look up LBFT S14. Set the Segment Left of the 1st replicated packet to "Pointer" in the argument of the SID S15. Update IPv6 DA with Segment List[Segment Left] S16. Forward the packet through the adjacency link indicated by local bitstring S17. Repeat S14-S17 with "Pointer+n"(n=the number of packets which have been updated) untill all the packets are transmitted through the indicated link R18. } 6. RLB Segment and LB Segment Definition End.RLB is a new type of segment which is used to identify the Replication Endpoint, which is able to replicate the packet based on the local bitstring in the correponding LB segment. RLB segment is used as an IPv6 address, which is 128 bits and follows the SID format defined in [RFC8986], consisting of LOC:FUNCT:ARG. RLB segment is advertised by the RLB replication endpoint. Geng, et al. Expires 15 August 2022 [Page 5] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Locator | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Function | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ When RLB Segment is used, there MUST be a corresponding LB Segment in the segment list. LB Segment is a special segment which is 128-bits containing the local bitstring. That is, LB segment does not take the format of LOC:FUNCT:ARG and need not to define the behavior. There is an argument in End.LB to indicate the next LB segments for the downstream nodes, for example "pointer " defined in [I-D.geng-msr6-traffic-engineering]. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Local Bitstring | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ End.RLB segment and LB segment are used together. Each replication node maintains the mapping relationship of the bit position with the adjacency link and the next hop End.RLB SID in the Local Bitstring Forwarding Table(LBFT). 7. End.RLB Behavior The replication node does the following when the DA of the packet is a local End.RLB SID. Geng, et al. Expires 15 August 2022 [Page 6] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 S01. When an MRH is processed { S02. If (Segments Left == 0 or Local Bitstring==Pointer==0) { S03. Stop processing the MRH, and proceed to process the next header in the packet, whose type is identified by the Next Header field in the routing header. S04. } S05. If (IPv6 Hop Limit <= 1) { S06. Send an ICMP Time Exceeded message to the Source Address with Code 0 (Hop limit exceeded in transit), interrupt packet processing, and discard the packet. S07. } S08. max_LE = (Hdr Ext Len / 2) - 1 S09. If ((Last Entry > max_LE) or (Segments Left > Last Entry+1)) { S10. Send an ICMP Parameter Problem to the Source Address with Code 0 (Erroneous header field encountered) and Pointer set to the Segments Left field, interrupt packet processing, and discard the packet. S11. } S12. Decrement IPv6 Hop Limit by 1 S13. Replicate the packet based on the local bitstring in the SID[Segment Left] and look up LBFT S14. Set the Segment Left of the 1st replicated packet to "Pointer" in the argument of the SID S15. Update IPv6 DA with End.RLB indicated by the first bit set in the LBFT S16. Forward the packet through the adjacency link indicated by the first bit set in the LBFT S17. Repeat S14-S17 with "Pointer+n"(n=the number of packets which have been updated) untill all the packets are transmitted through the indicated link R18. } 8. Illustration Geng, et al. Expires 15 August 2022 [Page 7] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 +---+ +--| D | +---+ B2 +---+ +--| B |----| | +---+ B4 +---+ +---+ A1 +--| E | | A |----| +---+ +---+ | +--| F | A2 +---+ C4 +---+ +--| C |----| +---+ C7 +---+ +--| G | +---+ |-->MSR-R<--|->MSR End<-|-->MSR-L<--| MSR-R: MSR6 Root Node, including Node A; MSR End: MSR6 Replication Endpoint, including Node B and C; MSR-L: MSR6 Leaf Nodes, including Node D, E, F, G; Take End.RLB and End.LB as an example. Acording to the requirement of the service, a multicast tree is calculated as showed in the above figure. 8.1. End.RLB.X 8.1.1. MRH Encapsulation In node A, the packet is encapsulated with an IPv6 header with MRH as an extension header. The segment list in the MRH is as follows, which is composed of LB SID. +----------------------------------------+ | Loc:A|Fun:End.RLB.X| LB:11000000| P:2 | +----------------------------------------+ | Loc:B|Fun:End.RLB.X| LB:01010000| P:0 | +----------------------------------------+ | Loc:C|Fun:End.RLB.X| LB:00010010| P:0 | +----------------------------------------+ Geng, et al. Expires 15 August 2022 [Page 8] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 8.1.2. Forwarding Process Node A will receive the packet with the destination address of the IPv6 header is a local SID for node A and the function is End.RLB.X. Local Bitstring in the segment will be used as an entry to look up LBFT in node A. So the packet will be replicated into 2 packets and sent out through A1 and A2. The destination address of the replicated packet will be set to SID[2] and SID[3] based on the value of the pointer. (preamble) +----------------------------+ |BitPosition | Adjacency Link| +----------------------------+ | 1 | A1 | +----------------------------+ | 2 | A2 | +----------------------------+ | 3 | A3 | +----------------------------+ | 4 | A4 | +----------------------------+ | 5 | A5 | +----------------------------+ | 6 | A6 | +----------------------------+ | 7 | A7 | +----------------------------+ | 8 | A8 | +----------------------------+ Node B will receive the packet with the destination address of the IPv6 header is a local SID for node B and the function is End.RLB.X. Local Bitstring in the segment will be used as an entry to look up LBFT in node B. So the packet will be replicated into 2 packets and sent out through B2 and B4. The destination address of the replicated packet will be set to address-D and address-E based on the LBFT. (preamble) Geng, et al. Expires 15 August 2022 [Page 9] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 +--------------------------------------+ |BitPosition | Adjacency Link| Address | +--------------------------------------+ | 1 | B1 | Add-B1 | +--------------------------------------+ | 2 | B2 | Add-D | +--------------------------------------+ | 3 | B3 | Add-B3 | +--------------------------------------+ | 4 | B4 | Add-E | +--------------------------------------+ | 5 | B5 | Add-B5 | +--------------------------------------+ | 6 | B6 | Add-B6 | +--------------------------------------+ | 7 | B7 | Add-B7 | +--------------------------------------+ | 8 | B8 | Add-B8 | +--------------------------------------+ Local Bitstring Forwarding Table(LBFT) in Node B Node C will receive the packet with the destination address of the IPv6 header is a local SID for node C and the function is End.RLB.X. Local Bitstring in the segment will be used as an entry to look up LBFT in node C. So the packet will be replicated into 2 packets and sent out through C4 and C7. The destination address of the replicated packet will be set to address-F and address-G based on the LBFT. Geng, et al. Expires 15 August 2022 [Page 10] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 +--------------------------------------+ |BitPosition | Adjacency Link| Address| +--------------------------------------+ | 1 | C1 | Add-C1 | +--------------------------------------+ | 2 | C2 | Add-C2 | +--------------------------------------+ | 3 | C3 | Add-C3 | +--------------------------------------+ | 4 | C4 | Add-F | +--------------------------------------+ | 5 | C5 | Add-C5 | +--------------------------------------+ | 6 | C6 | Add-C6 | +--------------------------------------+ | 7 | C7 | Add-G | +--------------------------------------+ | 8 | C8 | Add-C8 | +--------------------------------------+ Local Bitstring Forwarding Table(LBFT) in Node C 8.2. End.RLB 8.2.1. MRH Encapsulation In node A, the packet is encapsulated with an IPv6 header with MRH as an extension header. The segment list in the MRH is as follows, which is composed of LB SID. +----------------------------------------+ | LB:11000000 | P:2 | +----------------------------------------+ | LB:01010000 | P:0 | +----------------------------------------+ | LB:00010010 | P:0 | +----------------------------------------+ 8.2.2. Forwarding Process Node A will receive the packet with the destination address of the IPv6 header is a local End.RLB for node A, which is SID A. Based on the End.RLB behavior defined in section 4, node A will parse SID[Segment Left] in MRH, which is SID[1]. Geng, et al. Expires 15 August 2022 [Page 11] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 SID[1] will be used as an entry to look up LBFT in node A. So the packet will be replicated into 2 packets. For the 1st packet, the destination address of the IPv6 header will be set to SID B, the Segment Left will be set to 2 based on the pointer and the packet will be sent out through A1. For the 2nd packet, the destination address of the IPv6 header will be set to SID C, the Segment Left will be set to 2+1 based on the pointer and the packet will be sent out through A2. +--------------------------------------+ |BitPosition | Adjacency Link| RLB SID | +--------------------------------------+ | 1 | A1 | SID-B | +--------------------------------------+ | 2 | A2 | SID-C | +--------------------------------------+ | 3 | A3 | SID-A3 | +--------------------------------------+ | 4 | A4 | SID-A4 | +--------------------------------------+ | 5 | A5 | SID-A5 | +--------------------------------------+ | 6 | A6 | SID-A6 | +--------------------------------------+ | 7 | A7 | SID-A7 | +--------------------------------------+ | 8 | A8 | SID-A8 | +--------------------------------------+ Local Bitstring Forwarding Table(LBFT) in Node A Node B will receive the packet with the destination address of the IPv6 header is a local End.RLB for node B, which is SID B. Based on the End.RLB behavior defined in section 4, the node will parse SID[Segment Left] in MRH, which is SID[2]. SID[2] will be used as an entry to look up LBFT in node B. So the packet will be replicated into 2 packets. For the 1st packet, the destination address of the IPv6 header will be set to SID D, the Segment Left will be set to 0 based on the pointer and the packet will be sent out through B2. For the 2nd packet, the destination address of the IPv6 header will be set to SID E, the Segment Left will be set to 0 based on the pointer and the packet will be sent out through B4. Geng, et al. Expires 15 August 2022 [Page 12] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 +--------------------------------------+ |BitPosition | Adjacency Link| RLB SID | +--------------------------------------+ | 1 | B1 | SID-B1 | +--------------------------------------+ | 2 | B2 | SID-D | +--------------------------------------+ | 3 | B3 | SID-B3 | +--------------------------------------+ | 4 | B4 | SID-E | +--------------------------------------+ | 5 | B5 | SID-B5 | +--------------------------------------+ | 6 | B6 | SID-B6 | +--------------------------------------+ | 7 | B7 | SID-B7 | +--------------------------------------+ | 8 | B8 | SID-B8 | +--------------------------------------+ Local Bitstring Forwarding Table(LBFT) in Node B Node C will receive the packet with the destination address of the IPv6 header is a local End.RLB for node C, which is SID C. Based on the End.RLB behavior defined in section 4, the node will parse SID[Segment Left] in MRH, which is SID[3]. SID[3] will be used as an entry to look up LBFT in node C. So the packet will be replicated into 2 packets. For the 1st packet, the destination address of the IPv6 header will be set to SID F, the Segment Left will be set to 0 based on the pointer and the packet will be sent out through C4. For the 2nd packet, the destination address of the IPv6 header will be set to SID G, the Segment Left will be set to 0 based on the pointer and the packet will be sent out through C7. Geng, et al. Expires 15 August 2022 [Page 13] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 +--------------------------------------+ |BitPosition | Adjacency Link| RLB SID | +--------------------------------------+ | 1 | C1 | SID-C1 | +--------------------------------------+ | 2 | C2 | SID-C2 | +--------------------------------------+ | 3 | C3 | SID-C3 | +--------------------------------------+ | 4 | C4 | SID-F | +--------------------------------------+ | 5 | C5 | SID-C5 | +--------------------------------------+ | 6 | C6 | SID-C6 | +--------------------------------------+ | 7 | C7 | SID-G | +--------------------------------------+ | 8 | C8 | SID-C8 | +--------------------------------------+ Local Bitstring Forwarding Table(LBFT) in Node C Node D will receive the packet with the destination address of the IPv6 header is a local End.RLB for node D, which is SID D. Because the Segment Left is 0, the packet will decapsulate the IPv6 header with the MRH. Node E,F,G will do the same. 9. IANA Considerations This document makes no request of IANA. Note to RFC Editor: this section may be removed on publication as an RFC. 10. Security Considerations 11. Acknowledgements 12. References 12.1. Normative References Geng, et al. Expires 15 August 2022 [Page 14] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 [I-D.chen-pim-srv6-p2mp-path] Chen, H., McBride, M., Fan, Y., Li, Z., Geng, X., Toy, M., Mishra, G. S., Wang, A., Liu, L., and X. Liu, "Stateless SRv6 Point-to-Multipoint Path", Work in Progress, Internet-Draft, draft-chen-pim-srv6-p2mp-path-05, 11 November 2021, . [I-D.cheng-spring-ipv6-msr-design-consideration] Cheng, W., Mishra, G., Li, Z., Wang, A., Qin, Z., and C. Fan, "Design Consideration of IPv6 Multicast Source Routing (MSR6)", Work in Progress, Internet-Draft, draft- cheng-spring-ipv6-msr-design-consideration-01, 25 October 2021, . [I-D.geng-msr6-traffic-engineering] Geng, X., Li, Z., and J. Xie, "IPv6 Multicast Source Routing Traffic Engineering", Work in Progress, Internet- Draft, draft-geng-msr6-traffic-engineering-00, 25 October 2021, . [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, . [RFC8402] Filsfils, C., Ed., Previdi, S., Ed., Ginsberg, L., Decraene, B., Litkowski, S., and R. Shakir, "Segment Routing Architecture", RFC 8402, DOI 10.17487/RFC8402, July 2018, . [RFC8986] Filsfils, C., Ed., Camarillo, P., Ed., Leddy, J., Voyer, D., Matsushima, S., and Z. Li, "Segment Routing over IPv6 (SRv6) Network Programming", RFC 8986, DOI 10.17487/RFC8986, February 2021, . 12.2. Informative References [InfRef] "", 2004. Authors' Addresses Xuesong Geng Huawei Technologies Geng, et al. Expires 15 August 2022 [Page 15] Internet-Draft draft-geng-msr6-rlb-segment-00 February 2022 Email: gengxuesong@huawei.com Zhenbin Li Huawei Technologies Email: lizhenbin@huawei.com Jingrong Xie Huawei Technologies Email: xiejingrong@huawei.com Geng, et al. Expires 15 August 2022 [Page 16]