SPRING Working Group F. Duchene Internet-Draft O. Bonaventure Intended status: Informational UCLouvain Expires: September 6, 2018 March 05, 2018 A socket API to control IPv6 Segment Routing draft-duchene-spring-srv6-socket-00 Abstract This document proposes a socket API to allow applications to control the utilisation of IPv6 Segment Routing (SRv6). 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 September 6, 2018. Copyright Notice Copyright (c) 2018 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 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. Duchene & Bonaventure Expires September 6, 2018 [Page 1] Internet-Draft SRV6 socket API March 2018 Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 2. SRv6 Socket API . . . . . . . . . . . . . . . . . . . . . . . 2 2.1. Inserting an Segment Routing Header . . . . . . . . . . . 2 3. IANA considerations . . . . . . . . . . . . . . . . . . . . . 5 4. Security considerations . . . . . . . . . . . . . . . . . . . 5 5. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 5 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 5 6.1. Normative References . . . . . . . . . . . . . . . . . . 5 6.2. Informative References . . . . . . . . . . . . . . . . . 5 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 6 1. Introduction Segment Routing [I-D.ietf-spring-segment-routing] was initially defined as a technique to enable network operators to better control the flow of packets inside their network. Most use cases [I-D.ietf-spring-ipv6-use-cases] [I-D.ietf-spring-resiliency-use-cases] [I-D.filsfils-spring-srv6-network-programming] [I-D.ietf-spring-oam-usecase] leverage Segment Routing on routers only. In contrast with the MPLS data plane that is traditionally only supported on routers, the IPv6 Segment Routing Header [I-D.ietf-6man-segment-routing-header] is supported on both routers [SR6Demo] and on endhosts [SR6Linux]. The ability of setting and processing the IPv6 Segment Routing Header on endhosts opens new "end-to-end" use cases for Segment Routing. We can envision networks where clients set the IPv6 Segment Routing Header in all the packets they send to reach a given server along a specific path that depends on the client's or the network policies. In this document, we propose a socket option that enables applications to use the IPv6 Segment Routing Header on a per UDP datagram basis or a per TCP connection basis. 2. SRv6 Socket API From an application viewpoint, the interaction with the underlying stack is performed using a socket option. The socket option is set by using "setsockopt()". 2.1. Inserting an Segment Routing Header A SRv6 routing header [I-D.ietf-6man-segment-routing-header] can be attached to a socket by calling "setsockopt()" with the option "IPV6_RTHDR". The structure of a SRH is presented in figure Figure 1. Duchene & Bonaventure Expires September 6, 2018 [Page 2] Internet-Draft SRV6 socket API March 2018 struct ipv6_sr_hdr { uint8_t nexthdr; uint8_t hdrlen; uint8_t type; uint8_t segments_left; uint8_t first_segment; uint8_t flags; uint16_t reserved; struct in6_addr segments[0]; }; Figure 1: The SRv6 routing header structure Once the SRH has been attached to the socket, the packets will use the path described in the segments list of the SRH. An example using a TCP connection from 2001:DB8:1111::1 to 2001:DB8:3333::1 and passing through 2001:DB8:2222::1 is shown in figure Figure 2. Duchene & Bonaventure Expires September 6, 2018 [Page 3] Internet-Draft SRV6 socket API March 2018 int fd, err, srh_len, n; struct ipv6_sr_hdr *srh; struct sockaddr_in6 sin6, sin6_bind; srh_len = sizeof(*srh) + 2 * sizeof(struct in6_addr); srh = malloc(srh_len); srh->nexthdr = 0; srh->hdrlen = 4; srh->type = 4; srh->segments_left = 1; srh->first_segment = 1; srh->flags = 0; srh->reserved = 0; /* Space for the destination segment */ memset(&srh->segments[0], 0, sizeof(struct in6_addr)); /* Adding the segment 2001:DB8:2222::1 to the segments list of the SRH */ inet_pton(AF_INET6, "2001:DB8:2222::1", &srh->segments[1]); fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); err = setsockopt(fd, IPPROTO_IPV6, IPV6_RTHDR, srh, srh_len); memset(&sin6_bind, 0, sizeof(sin6_bind)); sin6_bind.sin6_family = AF_INET6; inet_pton(AF_INET6, "2001:DB8:1111::1", &sin6_bind.sin6_addr); err = bind(fd, (struct sockaddr *)&sin6_bind, sizeof(sin6_bind)); memset(&sin6, 0, sizeof(sin6)); sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(1234); inet_pton(AF_INET6, "2001:DB8:3333::1", &sin6.sin6_addr); err = connect(fd, (struct sockaddr *)&sin6, sizeof(sin6)); Figure 2: Sample code to establish a TCP connection While figure Figure 2 shows a TCP connection, the same socket option can be applied to UDP sockets. Duchene & Bonaventure Expires September 6, 2018 [Page 4] Internet-Draft SRV6 socket API March 2018 3. IANA considerations There are no IANA considerations in this document. 4. Security considerations There are no security considerations in this document. 5. Acknowledgements The initial implementation of the socket option was written by David Lebrun [LEBRUN17] 6. References 6.1. Normative References [I-D.ietf-6man-segment-routing-header] Previdi, S., Filsfils, C., Raza, K., Dukes, D., Leddy, J., Field, B., daniel.voyer@bell.ca, d., daniel.bernier@bell.ca, d., Matsushima, S., Leung, I., Linkova, J., Aries, E., Kosugi, T., Vyncke, E., Lebrun, D., Steinberg, D., and R. Raszuk, "IPv6 Segment Routing Header (SRH)", draft-ietf-6man-segment-routing-header-08 (work in progress), January 2018. [I-D.ietf-spring-segment-routing] Filsfils, C., Previdi, S., Ginsberg, L., Decraene, B., Litkowski, S., and R. Shakir, "Segment Routing Architecture", draft-ietf-spring-segment-routing-15 (work in progress), January 2018. [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, . [RFC8200] Deering, S. and R. Hinden, "Internet Protocol, Version 6 (IPv6) Specification", STD 86, RFC 8200, DOI 10.17487/RFC8200, July 2017, . 6.2. Informative References Duchene & Bonaventure Expires September 6, 2018 [Page 5] Internet-Draft SRV6 socket API March 2018 [I-D.filsfils-spring-srv6-network-programming] Filsfils, C., Li, Z., Leddy, J., daniel.voyer@bell.ca, d., daniel.bernier@bell.ca, d., Steinberg, D., Raszuk, R., Matsushima, S., Lebrun, D., Decraene, B., Peirens, B., Salsano, S., Naik, G., Elmalky, H., Jonnalagadda, P., and M. Sharif, "SRv6 Network Programming", draft-filsfils- spring-srv6-network-programming-04 (work in progress), March 2018. [I-D.ietf-spring-ipv6-use-cases] Brzozowski, J., Leddy, J., Filsfils, C., Maglione, R., and M. Townsley, "IPv6 SPRING Use Cases", draft-ietf-spring- ipv6-use-cases-12 (work in progress), December 2017. [I-D.ietf-spring-oam-usecase] Geib, R., Filsfils, C., Pignataro, C., and N. Kumar, "A Scalable and Topology-Aware MPLS Dataplane Monitoring System", draft-ietf-spring-oam-usecase-10 (work in progress), December 2017. [I-D.ietf-spring-resiliency-use-cases] Filsfils, C., Previdi, S., Decraene, B., and R. Shakir, "Resiliency use cases in SPRING networks", draft-ietf- spring-resiliency-use-cases-12 (work in progress), December 2017. [LEBRUN17] Lebrun, D., "Reaping the Benefits of IPv6 Segment Routing", 2017, . [SR6Demo] Filsfils, C., Clad, F., Camarillo, P., Liste, J., Jonnalagadda, P., Sharif, M., Salsano, S., and A. AbdelSalam, "IPv6 Segment Routing", SIGCOMM'17, Industrial demo , August 2017. [SR6Linux] Lebrun, D. and O. Bonaventure, "Implementing IPv6 Segment Routing in the Linux Kernel.", Applied Networking Research Workshop 2017 , July 2017, . Authors' Addresses Fabien Duchene UCLouvain Email: Fabien.Duchene@uclouvain.be Duchene & Bonaventure Expires September 6, 2018 [Page 6] Internet-Draft SRV6 socket API March 2018 Olivier Bonaventure UCLouvain Email: Olivier.Bonaventure@uclouvain.be Duchene & Bonaventure Expires September 6, 2018 [Page 7]