draft-ietf-core-resource-directory-17.txt | draft-ietf-core-resource-directory-18.txt | |||
---|---|---|---|---|
CoRE Z. Shelby | CoRE Z. Shelby | |||
Internet-Draft ARM | Internet-Draft ARM | |||
Intended status: Standards Track M. Koster | Intended status: Standards Track M. Koster | |||
Expires: April 26, 2019 SmartThings | Expires: June 23, 2019 SmartThings | |||
C. Bormann | C. Bormann | |||
Universitaet Bremen TZI | Universitaet Bremen TZI | |||
P. van der Stok | P. van der Stok | |||
consultant | consultant | |||
C. Amsuess, Ed. | C. Amsuess, Ed. | |||
October 23, 2018 | December 20, 2018 | |||
CoRE Resource Directory | CoRE Resource Directory | |||
draft-ietf-core-resource-directory-17 | draft-ietf-core-resource-directory-18 | |||
Abstract | Abstract | |||
In many M2M applications, direct discovery of resources is not | In many M2M applications, direct discovery of resources is not | |||
practical due to sleeping nodes, disperse networks, or networks where | practical due to sleeping nodes, disperse networks, or networks where | |||
multicast traffic is inefficient. These problems can be solved by | multicast traffic is inefficient. These problems can be solved by | |||
employing an entity called a Resource Directory (RD), which hosts | employing an entity called a Resource Directory (RD), which contains | |||
registrations of resources held on other servers, allowing lookups to | information about resources held on other servers, allowing lookups | |||
be performed for those resources. This document specifies the web | to be performed for those resources. The input to an RD is composed | |||
of links and the output is composed of links constructed from the | ||||
information stored in the RD. This document specifies the web | ||||
interfaces that a Resource Directory supports for web servers to | interfaces that a Resource Directory supports for web servers to | |||
discover the RD and to register, maintain, lookup and remove resource | discover the RD and to register, maintain, lookup and remove | |||
descriptions. Furthermore, new link attributes useful in conjunction | information on resources. Furthermore, new target attributes useful | |||
with an RD are defined. | in conjunction with an RD are defined. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on April 26, 2019. | This Internet-Draft will expire on June 23, 2019. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 28 ¶ | skipping to change at page 2, line 28 ¶ | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3. Architecture and Use Cases . . . . . . . . . . . . . . . . . 6 | 3. Architecture and Use Cases . . . . . . . . . . . . . . . . . 6 | |||
3.1. Principles . . . . . . . . . . . . . . . . . . . . . . . 6 | 3.1. Principles . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.2. Architecture . . . . . . . . . . . . . . . . . . . . . . 7 | 3.2. Architecture . . . . . . . . . . . . . . . . . . . . . . 7 | |||
3.3. RD Content Model . . . . . . . . . . . . . . . . . . . . 8 | 3.3. RD Content Model . . . . . . . . . . . . . . . . . . . . 8 | |||
3.4. Use Case: Cellular M2M . . . . . . . . . . . . . . . . . 12 | 3.4. Link-local addresses . . . . . . . . . . . . . . . . . . 12 | |||
3.5. Use Case: Home and Building Automation . . . . . . . . . 13 | 3.5. Use Case: Cellular M2M . . . . . . . . . . . . . . . . . 12 | |||
3.6. Use Case: Link Catalogues . . . . . . . . . . . . . . . . 13 | 3.6. Use Case: Home and Building Automation . . . . . . . . . 13 | |||
3.7. Use Case: Link Catalogues . . . . . . . . . . . . . . . . 13 | ||||
4. Finding a Resource Directory . . . . . . . . . . . . . . . . 14 | 4. Finding a Resource Directory . . . . . . . . . . . . . . . . 14 | |||
4.1. Resource Directory Address Option (RDAO) . . . . . . . . 15 | 4.1. Resource Directory Address Option (RDAO) . . . . . . . . 16 | |||
5. Resource Directory . . . . . . . . . . . . . . . . . . . . . 17 | 5. Resource Directory . . . . . . . . . . . . . . . . . . . . . 17 | |||
5.1. Payload Content Formats . . . . . . . . . . . . . . . . . 17 | 5.1. Payload Content Formats . . . . . . . . . . . . . . . . . 18 | |||
5.2. URI Discovery . . . . . . . . . . . . . . . . . . . . . . 17 | 5.2. URI Discovery . . . . . . . . . . . . . . . . . . . . . . 18 | |||
5.3. Registration . . . . . . . . . . . . . . . . . . . . . . 20 | 5.3. Registration . . . . . . . . . . . . . . . . . . . . . . 21 | |||
5.3.1. Simple Registration . . . . . . . . . . . . . . . . . 25 | 5.3.1. Simple Registration . . . . . . . . . . . . . . . . . 25 | |||
5.3.2. Third-party registration . . . . . . . . . . . . . . 27 | 5.3.2. Third-party registration . . . . . . . . . . . . . . 28 | |||
5.3.3. RD-Groups . . . . . . . . . . . . . . . . . . . . . . 28 | 5.4. Operations on the Registration Resource . . . . . . . . . 28 | |||
6. RD Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 5.4.1. Registration Update . . . . . . . . . . . . . . . . . 29 | |||
6.1. Resource lookup . . . . . . . . . . . . . . . . . . . . . 29 | 5.4.2. Registration Removal . . . . . . . . . . . . . . . . 32 | |||
6.2. Lookup filtering . . . . . . . . . . . . . . . . . . . . 30 | 5.4.3. Further operations . . . . . . . . . . . . . . . . . 33 | |||
6.3. Resource lookup examples . . . . . . . . . . . . . . . . 32 | 6. RD Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
7. Security policies . . . . . . . . . . . . . . . . . . . . . . 35 | 6.1. Resource lookup . . . . . . . . . . . . . . . . . . . . . 34 | |||
7.1. Secure RD discovery . . . . . . . . . . . . . . . . . . . 36 | 6.2. Lookup filtering . . . . . . . . . . . . . . . . . . . . 34 | |||
7.2. Secure RD filtering . . . . . . . . . . . . . . . . . . . 37 | 6.3. Resource lookup examples . . . . . . . . . . . . . . . . 36 | |||
7.3. Secure endpoint Name assignment . . . . . . . . . . . . . 37 | 6.4. Endpoint lookup . . . . . . . . . . . . . . . . . . . . . 39 | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 37 | 7. Security policies . . . . . . . . . . . . . . . . . . . . . . 40 | |||
8.1. Endpoint Identification and Authentication . . . . . . . 38 | 7.1. Secure RD discovery . . . . . . . . . . . . . . . . . . . 41 | |||
8.2. Access Control . . . . . . . . . . . . . . . . . . . . . 38 | 7.2. Secure RD filtering . . . . . . . . . . . . . . . . . . . 41 | |||
8.3. Denial of Service Attacks . . . . . . . . . . . . . . . . 38 | 7.3. Secure endpoint Name assignment . . . . . . . . . . . . . 42 | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 39 | ||||
9.1. Resource Types . . . . . . . . . . . . . . . . . . . . . 39 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 42 | |||
9.2. IPv6 ND Resource Directory Address Option . . . . . . . . 39 | 8.1. Endpoint Identification and Authentication . . . . . . . 42 | |||
9.3. RD Parameter Registry . . . . . . . . . . . . . . . . . . 39 | 8.2. Access Control . . . . . . . . . . . . . . . . . . . . . 43 | |||
8.3. Denial of Service Attacks . . . . . . . . . . . . . . . . 43 | ||||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 43 | ||||
9.1. Resource Types . . . . . . . . . . . . . . . . . . . . . 43 | ||||
9.2. IPv6 ND Resource Directory Address Option . . . . . . . . 44 | ||||
9.3. RD Parameter Registry . . . . . . . . . . . . . . . . . . 44 | ||||
9.3.1. Full description of the "Endpoint Type" Registration | 9.3.1. Full description of the "Endpoint Type" Registration | |||
Parameter . . . . . . . . . . . . . . . . . . . . . . 42 | Parameter . . . . . . . . . . . . . . . . . . . . . . 46 | |||
9.4. "Endpoint Type" (et=) RD Parameter values . . . . . . . . 42 | 9.4. "Endpoint Type" (et=) RD Parameter values . . . . . . . . 46 | |||
9.5. Multicast Address Registration . . . . . . . . . . . . . 43 | 9.5. Multicast Address Registration . . . . . . . . . . . . . 47 | |||
10. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 43 | 10. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
10.1. Lighting Installation . . . . . . . . . . . . . . . . . 43 | 10.1. Lighting Installation . . . . . . . . . . . . . . . . . 47 | |||
10.1.1. Installation Characteristics . . . . . . . . . . . . 43 | 10.1.1. Installation Characteristics . . . . . . . . . . . . 47 | |||
10.1.2. RD entries . . . . . . . . . . . . . . . . . . . . . 44 | 10.1.2. RD entries . . . . . . . . . . . . . . . . . . . . . 49 | |||
10.2. OMA Lightweight M2M (LWM2M) Example . . . . . . . . . . 47 | 10.2. OMA Lightweight M2M (LWM2M) Example . . . . . . . . . . 51 | |||
10.2.1. The LWM2M Object Model . . . . . . . . . . . . . . . 48 | 10.2.1. The LWM2M Object Model . . . . . . . . . . . . . . . 52 | |||
10.2.2. LWM2M Register Endpoint . . . . . . . . . . . . . . 49 | 10.2.2. LWM2M Register Endpoint . . . . . . . . . . . . . . 53 | |||
10.2.3. LWM2M Update Endpoint Registration . . . . . . . . . 51 | 10.2.3. LWM2M Update Endpoint Registration . . . . . . . . . 55 | |||
10.2.4. LWM2M De-Register Endpoint . . . . . . . . . . . . . 51 | 10.2.4. LWM2M De-Register Endpoint . . . . . . . . . . . . . 55 | |||
11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 51 | 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 55 | |||
12. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | 12. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 55 | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . 58 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . 58 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 63 | |||
13.2. Informative References . . . . . . . . . . . . . . . . . 59 | 13.2. Informative References . . . . . . . . . . . . . . . . . 64 | |||
Appendix A. Registration Management . . . . . . . . . . . . . . 61 | Appendix A. Groups Registration and Lookup . . . . . . . . . . . 66 | |||
A.1. Registration Update . . . . . . . . . . . . . . . . . . . 62 | ||||
A.2. Registration Removal . . . . . . . . . . . . . . . . . . 65 | ||||
A.3. Read Endpoint Links . . . . . . . . . . . . . . . . . . . 66 | ||||
A.4. Update Endpoint Links . . . . . . . . . . . . . . . . . . 67 | ||||
A.5. Endpoint lookup . . . . . . . . . . . . . . . . . . . . . 67 | ||||
Appendix B. Web links and the Resource Directory . . . . . . . . 68 | Appendix B. Web links and the Resource Directory . . . . . . . . 68 | |||
B.1. A simple example . . . . . . . . . . . . . . . . . . . . 68 | B.1. A simple example . . . . . . . . . . . . . . . . . . . . 68 | |||
B.1.1. Resolving the URIs . . . . . . . . . . . . . . . . . 69 | B.1.1. Resolving the URIs . . . . . . . . . . . . . . . . . 68 | |||
B.1.2. Interpreting attributes and relations . . . . . . . . 69 | B.1.2. Interpreting attributes and relations . . . . . . . . 69 | |||
B.2. A slightly more complex example . . . . . . . . . . . . . 69 | B.2. A slightly more complex example . . . . . . . . . . . . . 69 | |||
B.3. Enter the Resource Directory . . . . . . . . . . . . . . 70 | B.3. Enter the Resource Directory . . . . . . . . . . . . . . 70 | |||
B.4. A note on differences between link-format and Link | B.4. A note on differences between link-format and Link | |||
headers . . . . . . . . . . . . . . . . . . . . . . . . . 72 | headers . . . . . . . . . . . . . . . . . . . . . . . . . 71 | |||
Appendix C. Syntax examples for Protocol Negotiation . . . . . . 73 | Appendix C. Limited Link Format . . . . . . . . . . . . . . . . 72 | |||
Appendix D. Modernized Link Format parsing . . . . . . . . . . . 74 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 73 | |||
D.1. For endpoint developers . . . . . . . . . . . . . . . . . 74 | ||||
D.2. Examples of links with differing interpretations . . . . 75 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 75 | ||||
1. Introduction | 1. Introduction | |||
The work on Constrained RESTful Environments (CoRE) aims at realizing | The work on Constrained RESTful Environments (CoRE) aims at realizing | |||
the REST architecture in a suitable form for the most constrained | the REST architecture in a suitable form for the most constrained | |||
nodes (e.g., 8-bit microcontrollers with limited RAM and ROM) and | nodes (e.g., 8-bit microcontrollers with limited RAM and ROM) and | |||
networks (e.g. 6LoWPAN). CoRE is aimed at machine-to-machine (M2M) | networks (e.g. 6LoWPAN). CoRE is aimed at machine-to-machine (M2M) | |||
applications such as smart energy and building automation. | applications such as smart energy and building automation. | |||
The discovery of resources offered by a constrained server is very | The discovery of resources offered by a constrained server is very | |||
important in machine-to-machine applications where there are no | important in machine-to-machine applications where there are no | |||
humans in the loop and static interfaces result in fragility. The | humans in the loop and static interfaces result in fragility. The | |||
discovery of resources provided by an HTTP Web Server is typically | discovery of resources provided by an HTTP Web Server is typically | |||
called Web Linking [RFC5988]. The use of Web Linking for the | called Web Linking [RFC8288]. The use of Web Linking for the | |||
description and discovery of resources hosted by constrained web | description and discovery of resources hosted by constrained web | |||
servers is specified by the CoRE Link Format [RFC6690]. However, | servers is specified by the CoRE Link Format [RFC6690]. However, | |||
[RFC6690] only describes how to discover resources from the web | [RFC6690] only describes how to discover resources from the web | |||
server that hosts them by querying "/.well-known/core". In many M2M | server that hosts them by querying "/.well-known/core". In many M2M | |||
scenarios, direct discovery of resources is not practical due to | scenarios, direct discovery of resources is not practical due to | |||
sleeping nodes, disperse networks, or networks where multicast | sleeping nodes, disperse networks, or networks where multicast | |||
traffic is inefficient. These problems can be solved by employing an | traffic is inefficient. These problems can be solved by employing an | |||
entity called a Resource Directory (RD), which hosts registrations of | entity called a Resource Directory (RD), which contains information | |||
resources held on other servers, allowing lookups to be performed for | about resources held on other servers, allowing lookups to be | |||
those resources. | performed for those resources. | |||
This document specifies the web interfaces that a Resource Directory | This document specifies the web interfaces that a Resource Directory | |||
supports for web servers to discover the RD and to register, | supports for web servers to discover the RD and to register, | |||
maintain, lookup and remove resource descriptions. Furthermore, new | maintain, lookup and remove information on resources. Furthermore, | |||
link attributes useful in conjunction with a Resource Directory are | new target attributes useful in conjunction with a Resource Directory | |||
defined. Although the examples in this document show the use of | are defined. Although the examples in this document show the use of | |||
these interfaces with CoAP [RFC7252], they can be applied in an | these interfaces with CoAP [RFC7252], they can be applied in an | |||
equivalent manner to HTTP [RFC7230]. | equivalent manner to HTTP [RFC7230]. | |||
2. Terminology | 2. Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
[RFC2119]. The term "byte" is used in its now customary sense as a | [RFC2119]. The term "byte" is used in its now customary sense as a | |||
synonym for "octet". | synonym for "octet". | |||
This specification requires readers to be familiar with all the terms | This specification requires readers to be familiar with all the terms | |||
and concepts that are discussed in [RFC3986], [RFC5988] and | and concepts that are discussed in [RFC3986], [RFC8288] and | |||
[RFC6690]. Readers should also be familiar with the terms and | [RFC6690]. Readers should also be familiar with the terms and | |||
concepts discussed in [RFC7252]. To describe the REST interfaces | concepts discussed in [RFC7252]. To describe the REST interfaces | |||
defined in this specification, the URI Template format is used | defined in this specification, the URI Template format is used | |||
[RFC6570]. | [RFC6570]. | |||
This specification makes use of the following additional terminology: | This specification makes use of the following additional terminology: | |||
resolve against | resolve against | |||
The expression "a URI-reference is _resolved against_ a base URI" | The expression "a URI-reference is _resolved against_ a base URI" | |||
is used to describe the process of [RFC3986] Section 5.2. | is used to describe the process of [RFC3986] Section 5.2. | |||
skipping to change at page 6, line 23 ¶ | skipping to change at page 6, line 23 ¶ | |||
needs of the applications. | needs of the applications. | |||
Registrant-ep | Registrant-ep | |||
Registrant-ep is the endpoint that is registered into the RD. The | Registrant-ep is the endpoint that is registered into the RD. The | |||
registrant-ep can register itself, or a CT registers the | registrant-ep can register itself, or a CT registers the | |||
registrant-ep. | registrant-ep. | |||
RDAO | RDAO | |||
Resource Directory Address Option. | Resource Directory Address Option. | |||
For several operations, interface descriptions are given in list | For several operations, interface templates are given in list form; | |||
form; those describe the operation participants, request codes, URIs, | those describe the operation participants, request codes, URIs, | |||
content formats and outcomes. Those templates contain normative | content formats and outcomes. Sections of those templates contain | |||
content in their Interaction, Method, URI Template and URI Template | normative content about Interaction, Method, URI Template and URI | |||
Variables sections as well as the details of the Success condition. | Template Variables as well as the details of the Success condition. | |||
The additional sections on options like Content-Format and on Failure | The additional sections on options like Content-Format and on Failure | |||
codes give typical cases that an implementation of the RD should deal | codes give typical cases that an implementation of the RD should deal | |||
with. Those serve to illustrate the typical responses to readers who | with. Those serve to illustrate the typical responses to readers who | |||
are not yet familiar with all the details of CoAP based interfaces; | are not yet familiar with all the details of CoAP based interfaces; | |||
they do not limit what a server may respond under atypical | they do not limit what a server may respond under atypical | |||
circumstances. | circumstances. | |||
3. Architecture and Use Cases | 3. Architecture and Use Cases | |||
3.1. Principles | 3.1. Principles | |||
The Resource Directory is primarily a tool to make discovery | The Resource Directory is primarily a tool to make discovery | |||
operations more efficient than querying /.well-known/core on all | operations more efficient than querying /.well-known/core on all | |||
connected devices, or across boundaries that would be limiting those | connected devices, or across boundaries that would be limiting those | |||
operations. | operations. | |||
It provides a cache (in the high-level sense, not as defined in | It provides information about resources hosted by other devices that | |||
[RFC7252]/[RFC2616]) of data that could otherwise only be obtained by | could otherwise only be obtained by directly querying the /.well- | |||
directly querying the /.well-known/core resource on the target | known/core resource on these other devices, either by a unicast | |||
device, or by accessing those resources with a multicast request. | request or a multicast request. | |||
Only information SHOULD be stored in the resource directory that is | Only information SHOULD be stored in the resource directory that can | |||
discoverable from querying the described device's /.well-known/core | be obtained by querying the described device's /.well-known/core | |||
resource directly. | resource directly. | |||
Data in the resource directory can only be provided by the device | Data in the resource directory can only be provided by the device | |||
which hosts those data or a dedicated Commissioning Tool (CT). These | which hosts those data or a dedicated Commissioning Tool (CT). These | |||
CTs are thought to act on behalf of endpoints too constrained, or | CTs are thought to act on behalf of endpoints too constrained, or | |||
generally unable, to present that information themselves. No other | generally unable, to present that information themselves. No other | |||
client can modify data in the resource directory. Changes in the | client can modify data in the resource directory. Changes to the | |||
Resource Directory do not propagate automatically back to the web | information in the Resource Directory do not propagate automatically | |||
server from where the links originated. | back to the web servers from where the information originated. | |||
3.2. Architecture | 3.2. Architecture | |||
The resource directory architecture is illustrated in Figure 1. A | The resource directory architecture is illustrated in Figure 1. A | |||
Resource Directory (RD) is used as a repository for Web Links | Resource Directory (RD) is used as a repository of registrations | |||
[RFC5988] describing resources hosted on other web servers, also | describing resources hosted on other web servers, also called | |||
called endpoints (EP). An endpoint is a web server associated with a | endpoints (EP). An endpoint is a web server associated with a | |||
scheme, IP address and port. A physical node may host one or more | scheme, IP address and port. A physical node may host one or more | |||
endpoints. The RD implements a set of REST interfaces for endpoints | endpoints. The RD implements a set of REST interfaces for endpoints | |||
to register and maintain sets of Web Links (called resource directory | to register and maintain resource directory registrations, and for | |||
registration entries), and for endpoints to lookup resources from the | endpoints to lookup resources from the RD. An RD can be logically | |||
RD. An RD can be logically segmented by the use of Sectors. This | segmented by the use of Sectors. | |||
information hierarchy is shown in Figure 2. | ||||
A mechanism to discover an RD using CoRE Link Format [RFC6690] is | A mechanism to discover an RD using CoRE Link Format [RFC6690] is | |||
defined. | defined. | |||
Registration entries in the RD are soft state and need to be | Registrations in the RD are soft state and need to be periodically | |||
periodically refreshed. | refreshed. | |||
An endpoint uses specific interfaces to register, update and remove a | An endpoint uses specific interfaces to register, update and remove a | |||
resource directory registration entry. It is also possible for an RD | registration. It is also possible for an RD to fetch Web Links from | |||
to fetch Web Links from endpoints and add them as resource directory | endpoints and add their contents to resource directory registrations. | |||
registration entries. | ||||
At the first registration of a set of entries, a "registration | At the first registration of an endpoint, a "registration resource" | |||
resource" is created, the location of which is returned to the | is created, the location of which is returned to the registering | |||
registering endpoint. The registering endpoint uses this | endpoint. The registering endpoint uses this registration resource | |||
registration resource to manage the contents of registration entries. | to manage the contents of registrations. | |||
A lookup interface for discovering any of the Web Links held in the | A lookup interface for discovering any of the Web Links stored in the | |||
RD is provided using the CoRE Link Format. | RD is provided using the CoRE Link Format. | |||
Registration Lookup | Registration Lookup | |||
Interface Interface | Interface Interface | |||
+----+ | | | +----+ | | | |||
| EP |---- | | | | EP |---- | | | |||
+----+ ---- | | | +----+ ---- | | | |||
--|- +------+ | | --|- +------+ | | |||
+----+ | ----| | | +--------+ | +----+ | ----| | | +--------+ | |||
| EP | ---------|-----| RD |----|-----| Client | | | EP | ---------|-----| RD |----|-----| Client | | |||
+----+ | ----| | | +--------+ | +----+ | ----| | | +--------+ | |||
--|- +------+ | | --|- +------+ | | |||
+----+ ---- | | | +----+ ---- | | | |||
| EP |---- | | | | EP |---- | | | |||
+----+ | +----+ | |||
Figure 1: The resource directory architecture. | Figure 1: The resource directory architecture. | |||
+------------+ | ||||
| Endpoint | <-- Name, Scheme, IP, Port | ||||
+------------+ | ||||
| | ||||
| | ||||
+------------+ | ||||
| Resource | <-- Target, Parameters | ||||
+------------+ | ||||
Figure 2: The resource directory information hierarchy. | ||||
A Registrant-EP MAY keep concurrent registrations to more than one RD | A Registrant-EP MAY keep concurrent registrations to more than one RD | |||
at the same time if explicitly configured to do so, but that is not | at the same time if explicitly configured to do so, but that is not | |||
expected to be supported by typical EP implementations. Any such | expected to be supported by typical EP implementations. Any such | |||
registrations are independent of each other. The usual expectation | registrations are independent of each other. The usual expectation | |||
when multiple discovery mechanisms or addresses are configured is | when multiple discovery mechanisms or addresses are configured is | |||
that they constitute a fallback path for a single registration. | that they constitute a fall-back path for a single registration. | |||
3.3. RD Content Model | 3.3. RD Content Model | |||
The Entity-Relationship (ER) models shown in Figure 3 and Figure 4 | The Entity-Relationship (ER) models shown in Figure 2 and Figure 3 | |||
model the contents of /.well-known/core and the resource directory | model the contents of /.well-known/core and the resource directory | |||
respectively, with entity-relationship diagrams [ER]. Entities | respectively, with entity-relationship diagrams [ER]. Entities | |||
(rectangles) are used for concepts that exist independently. | (rectangles) are used for concepts that exist independently. | |||
Attributes (ovals) are used for concepts that exist only in | Attributes (ovals) are used for concepts that exist only in | |||
connection with a related entity. Relations (diamonds) give a | connection with a related entity. Relations (diamonds) give a | |||
semantic meaning to the relation between entities. Numbers specify | semantic meaning to the relation between entities. Numbers specify | |||
the cardinality of the relations. | the cardinality of the relations. | |||
Some of the attribute values are URIs. Those values are always full | Some of the attribute values are URIs. Those values are always full | |||
URIs and never relative references in the information model. They | URIs and never relative references in the information model. They | |||
skipping to change at page 9, line 43 ¶ | skipping to change at page 9, line 32 ¶ | |||
oooooooooooo 0+ | | oooooooooooo 0+ | | |||
o target o--------+ | o target o--------+ | |||
o attribute o | 0+ oooooo | o attribute o | 0+ oooooo | |||
oooooooooooo +-----o rel o | oooooooooooo +-----o rel o | |||
| oooooo | | oooooo | |||
| | | | |||
| 1 ooooooooo | | 1 ooooooooo | |||
+-----o context o | +-----o context o | |||
ooooooooo | ooooooooo | |||
Figure 3: E-R Model of the content of /.well-known/core | Figure 2: E-R Model of the content of /.well-known/core | |||
The model shown in Figure 3 models the contents of /.well-known/core | The model shown in Figure 2 models the contents of /.well-known/core | |||
which contains: | which contains: | |||
o a set of links belonging to the hosting web server | o a set of links belonging to the hosting web server | |||
The web server is free to choose links it deems appropriate to be | The web server is free to choose links it deems appropriate to be | |||
exposed in its ".well-known/core". Typically, the links describe | exposed in its ".well-known/core". Typically, the links describe | |||
resources that are served by the host, but the set can also contain | resources that are served by the host, but the set can also contain | |||
links to resources on other servers (see examples in [RFC6690] page | links to resources on other servers (see examples in [RFC6690] page | |||
14). The set does not necessarily contain links to all resources | 14). The set does not necessarily contain links to all resources | |||
served by the host. | served by the host. | |||
A link has the following attributes (see [RFC5988]): | A link has the following attributes (see [RFC8288]): | |||
o Zero or more link relations: They describe relations between the | o Zero or more link relations: They describe relations between the | |||
link context and the link target. | link context and the link target. | |||
In link-format serialization, they are expressed as space- | In link-format serialization, they are expressed as space- | |||
separated values in the "rel" attribute, and default to "hosts". | separated values in the "rel" attribute, and default to "hosts". | |||
o A link context URI: It defines the source of the relation, e.g. | o A link context URI: It defines the source of the relation, e.g. | |||
_who_ "hosts" something. | _who_ "hosts" something. | |||
skipping to change at page 11, line 46 ¶ | skipping to change at page 11, line 46 ¶ | |||
o lt o----+ ooooooooooo 0+ | | o lt o----+ ooooooooooo 0+ | | |||
oooooooo | o target o-----+ | oooooooo | o target o-----+ | |||
| o attribute o | 0+ oooooo | | o attribute o | 0+ oooooo | |||
ooooooooooo 0+ | ooooooooooo +-----o rel o | ooooooooooo 0+ | ooooooooooo +-----o rel o | |||
o endpoint o----+ | oooooo | o endpoint o----+ | oooooo | |||
o attribute o | | o attribute o | | |||
ooooooooooo | 1 ooooooooo | ooooooooooo | 1 ooooooooo | |||
+----o context o | +----o context o | |||
ooooooooo | ooooooooo | |||
Figure 4: E-R Model of the content of the Resource Directory | Figure 3: E-R Model of the content of the Resource Directory | |||
The model shown in Figure 4 models the contents of the resource | The model shown in Figure 3 models the contents of the resource | |||
directory which contains in addition to /.well-known/core: | directory which contains in addition to /.well-known/core: | |||
o 0 to n Registration (entries) of endpoints, | o 0 to n Registrations of endpoints, | |||
A registration is associated with one endpoint. A registration | A registration is associated with one endpoint. A registration | |||
defines a set of links as defined for /.well-known/core. A | defines a set of links as defined for /.well-known/core. A | |||
Registration has six types of attributes: | Registration has six types of attributes: | |||
o a unique endpoint name ("ep") within a sector | o a unique endpoint name ("ep") within a sector | |||
o a Registration Base URI ("base", a URI typically describing the | o a Registration Base URI ("base", a URI typically describing the | |||
scheme://authority part) | scheme://authority part) | |||
o a lifetime ("lt"), | o a lifetime ("lt"), | |||
skipping to change at page 12, line 27 ¶ | skipping to change at page 12, line 27 ¶ | |||
o optionally a sector ("d") | o optionally a sector ("d") | |||
o optional additional endpoint attributes (from Section 9.3) | o optional additional endpoint attributes (from Section 9.3) | |||
The cardinality of "base" is currently 1; future documents are | The cardinality of "base" is currently 1; future documents are | |||
invited to extend the RD specification to support multiple values | invited to extend the RD specification to support multiple values | |||
(e.g. [I-D.silverajan-core-coap-protocol-negotiation]). Its value | (e.g. [I-D.silverajan-core-coap-protocol-negotiation]). Its value | |||
is used as a Base URI when resolving URIs in the links contained in | is used as a Base URI when resolving URIs in the links contained in | |||
the endpoint. | the endpoint. | |||
Links are modelled as they are in Figure 3. | Links are modelled as they are in Figure 2. | |||
3.4. Use Case: Cellular M2M | 3.4. Link-local addresses | |||
Registration requests to the RD may arrive from link-local IP | ||||
addresses. When building a Registration Base URI from that source IP | ||||
address (which would become part of the resolved URIs in resource | ||||
lookup), its link-local IP literal typically contains a zone | ||||
identifier of the RD, and is not usable across hosts (see [RFC6874] | ||||
Section 1). | ||||
Therefore, RD servers SHOULD reject registrations which use of URIs | ||||
containing link-local IP addresses. | ||||
3.5. Use Case: Cellular M2M | ||||
Over the last few years, mobile operators around the world have | Over the last few years, mobile operators around the world have | |||
focused on development of M2M solutions in order to expand the | focused on development of M2M solutions in order to expand the | |||
business to the new type of users: machines. The machines are | business to the new type of users: machines. The machines are | |||
connected directly to a mobile network using an appropriate embedded | connected directly to a mobile network using an appropriate embedded | |||
wireless interface (GSM/GPRS, WCDMA, LTE) or via a gateway providing | wireless interface (GSM/GPRS, WCDMA, LTE) or via a gateway providing | |||
short and wide range wireless interfaces. From the system design | short and wide range wireless interfaces. From the system design | |||
point of view, the ambition is to design horizontal solutions that | point of view, the ambition is to design horizontal solutions that | |||
can enable utilization of machines in different applications | can enable utilization of machines in different applications | |||
depending on their current availability and capabilities as well as | depending on their current availability and capabilities as well as | |||
skipping to change at page 13, line 20 ¶ | skipping to change at page 13, line 30 ¶ | |||
access to the endpoints. Mobile apps or web applications for | access to the endpoints. Mobile apps or web applications for | |||
environment monitoring contact the RD, look up the endpoints capable | environment monitoring contact the RD, look up the endpoints capable | |||
of providing information about the environment using an appropriate | of providing information about the environment using an appropriate | |||
set of link parameters, obtain information on how to contact them | set of link parameters, obtain information on how to contact them | |||
(URLs of the proxy server), and then initiate interaction to obtain | (URLs of the proxy server), and then initiate interaction to obtain | |||
information that is finally processed, displayed on the screen and | information that is finally processed, displayed on the screen and | |||
usually stored in a database. Similarly, fleet management systems | usually stored in a database. Similarly, fleet management systems | |||
provide the appropriate link parameters to the RD to look up for EPs | provide the appropriate link parameters to the RD to look up for EPs | |||
deployed on the vehicles the application is responsible for. | deployed on the vehicles the application is responsible for. | |||
3.5. Use Case: Home and Building Automation | 3.6. Use Case: Home and Building Automation | |||
Home and commercial building automation systems can benefit from the | Home and commercial building automation systems can benefit from the | |||
use of M2M web services. The discovery requirements of these | use of M2M web services. The discovery requirements of these | |||
applications are demanding. Home automation usually relies on run- | applications are demanding. Home automation usually relies on run- | |||
time discovery to commission the system, whereas in building | time discovery to commission the system, whereas in building | |||
automation a combination of professional commissioning and run-time | automation a combination of professional commissioning and run-time | |||
discovery is used. Both home and building automation involve peer- | discovery is used. Both home and building automation involve peer- | |||
to-peer interactions between endpoints, and involve battery-powered | to-peer interactions between endpoints, and involve battery-powered | |||
sleeping devices. | sleeping devices. | |||
3.6. Use Case: Link Catalogues | 3.7. Use Case: Link Catalogues | |||
Resources may be shared through data brokers that have no knowledge | Resources may be shared through data brokers that have no knowledge | |||
beforehand of who is going to consume the data. Resource Directory | beforehand of who is going to consume the data. Resource Directory | |||
can be used to hold links about resources and services hosted | can be used to hold links about resources and services hosted | |||
anywhere to make them discoverable by a general class of | anywhere to make them discoverable by a general class of | |||
applications. | applications. | |||
For example, environmental and weather sensors that generate data for | For example, environmental and weather sensors that generate data for | |||
public consumption may provide data to an intermediary server, or | public consumption may provide data to an intermediary server, or | |||
broker. Sensor data are published to the intermediary upon changes | broker. Sensor data are published to the intermediary upon changes | |||
skipping to change at page 15, line 27 ¶ | skipping to change at page 15, line 39 ¶ | |||
resource directory (using the ABRO option to find that | resource directory (using the ABRO option to find that | |||
[RFC6775]). Confirmation can be obtained by sending a Unicast to | [RFC6775]). Confirmation can be obtained by sending a Unicast to | |||
"coap://[6LBR]/.well-known/core?rt=core.rd*". | "coap://[6LBR]/.well-known/core?rt=core.rd*". | |||
2. In a network that supports multicast well, discovering the RD | 2. In a network that supports multicast well, discovering the RD | |||
using a multicast query for /.well-known/core as specified in | using a multicast query for /.well-known/core as specified in | |||
CoRE Link Format [RFC6690]: Sending a Multicast GET to | CoRE Link Format [RFC6690]: Sending a Multicast GET to | |||
"coap://[MCD1]/.well-known/core?rt=core.rd*". RDs within the | "coap://[MCD1]/.well-known/core?rt=core.rd*". RDs within the | |||
multicast scope will answer the query. | multicast scope will answer the query. | |||
When answering a link-local multicast request, the RD SHOULD NOT | ||||
respond with their link-local addresses but use a routable one; | ||||
otherwise the registrant-ep would later need to pick an explicit base | ||||
address to avoid the issue of Section 3.4. | ||||
As some of the RD addresses obtained by the methods listed here are | As some of the RD addresses obtained by the methods listed here are | |||
just (more or less educated) guesses, endpoints MUST make use of any | just (more or less educated) guesses, endpoints MUST make use of any | |||
error messages to very strictly rate-limit requests to candidate IP | error messages to very strictly rate-limit requests to candidate IP | |||
addresses that don't work out. For example, an ICMP Destination | addresses that don't work out. For example, an ICMP Destination | |||
Unreachable message (and, in particular, the port unreachable code | Unreachable message (and, in particular, the port unreachable code | |||
for this message) may indicate the lack of a CoAP server on the | for this message) may indicate the lack of a CoAP server on the | |||
candidate host, or a CoAP error response code such as 4.05 "Method | candidate host, or a CoAP error response code such as 4.05 "Method | |||
Not Allowed" may indicate unwillingness of a CoAP server to act as a | Not Allowed" may indicate unwillingness of a CoAP server to act as a | |||
directory server. | directory server. | |||
skipping to change at page 16, line 48 ¶ | skipping to change at page 17, line 43 ¶ | |||
A value of all zero bits (0x0) indicates | A value of all zero bits (0x0) indicates | |||
that this Resource Directory address | that this Resource Directory address | |||
is not valid anymore. | is not valid anymore. | |||
Reserved: This field is unused. It MUST be | Reserved: This field is unused. It MUST be | |||
initialized to zero by the sender and | initialized to zero by the sender and | |||
MUST be ignored by the receiver. | MUST be ignored by the receiver. | |||
RD Address: IPv6 address of the RD. | RD Address: IPv6 address of the RD. | |||
Figure 5: Resource Directory Address Option | Figure 4: Resource Directory Address Option | |||
5. Resource Directory | 5. Resource Directory | |||
This section defines the required set of REST interfaces between a | This section defines the required set of REST interfaces between a | |||
Resource Directory (RD) and endpoints. Although the examples | Resource Directory (RD) and endpoints. Although the examples | |||
throughout this section assume the use of CoAP [RFC7252], these REST | throughout this section assume the use of CoAP [RFC7252], these REST | |||
interfaces can also be realized using HTTP [RFC7230]. In all | interfaces can also be realized using HTTP [RFC7230]. In all | |||
definitions in this section, both CoAP response codes (with dot | definitions in this section, both CoAP response codes (with dot | |||
notation) and HTTP response codes (without dot notation) are shown. | notation) and HTTP response codes (without dot notation) are shown. | |||
An RD implementing this specification MUST support the discovery, | An RD implementing this specification MUST support the discovery, | |||
registration, update, lookup, and removal interfaces defined in this | registration, update, lookup, and removal interfaces defined in this | |||
section. | section. | |||
All operations on the contents of the Resource Directory MUST be | All operations on the contents of the Resource Directory MUST be | |||
atomic and idempotent. | atomic and idempotent. | |||
A resource directory MAY make the information submitted to it | A resource directory MAY make the information submitted to it | |||
available to further directories, if it can ensure that a loop does | available to further directories, if it can ensure that a loop does | |||
not form. The protocol used between directories to ensure loop-free | not form. The protocol used between directories to ensure loop-free | |||
skipping to change at page 17, line 34 ¶ | skipping to change at page 18, line 26 ¶ | |||
5.1. Payload Content Formats | 5.1. Payload Content Formats | |||
Resource Directory implementations using this specification MUST | Resource Directory implementations using this specification MUST | |||
support the application/link-format content format (ct=40). | support the application/link-format content format (ct=40). | |||
Resource Directories implementing this specification MAY support | Resource Directories implementing this specification MAY support | |||
additional content formats. | additional content formats. | |||
Any additional content format supported by a Resource Directory | Any additional content format supported by a Resource Directory | |||
implementing this specification MUST have an equivalent serialization | implementing this specification SHOULD be able to express all the | |||
in the application/link-format content format. | information expressible in link-format. It MAY be able to express | |||
information that is inexpressible in link-format, but those | ||||
expressions SHOULD be avoided where possible. | ||||
5.2. URI Discovery | 5.2. URI Discovery | |||
Before an endpoint can make use of an RD, it must first know the RD's | Before an endpoint can make use of an RD, it must first know the RD's | |||
address and port, and the URI path information for its REST APIs. | address and port, and the URI path information for its REST APIs. | |||
This section defines discovery of the RD and its URIs using the well- | This section defines discovery of the RD and its URIs using the well- | |||
known interface of the CoRE Link Format [RFC6690]. A complete set of | known interface of the CoRE Link Format [RFC6690]. A complete set of | |||
RD discovery methods is described in Section 4. | RD discovery methods is described in Section 4. | |||
Discovery of the RD registration URI path is performed by sending | Discovery of the RD registration URI path is performed by sending | |||
either a multicast or unicast GET request to "/.well-known/core" and | either a multicast or unicast GET request to "/.well-known/core" and | |||
including a Resource Type (rt) parameter [RFC6690] with the value | including a Resource Type (rt) parameter [RFC6690] with the value | |||
"core.rd" in the query string. Likewise, a Resource Type parameter | "core.rd" in the query string. Likewise, a Resource Type parameter | |||
value of "core.rd-lookup*" is used to discover the URIs for RD Lookup | value of "core.rd-lookup*" is used to discover the URIs for RD Lookup | |||
operations, core.rd* is used to discover all URI paths for RD | operations, core.rd* is used to discover all URI paths for RD | |||
operations. Upon success, the response will contain a payload with a | operations. Upon success, the response will contain a payload with a | |||
link format entry for each RD function discovered, indicating the URI | link format entry for each RD function discovered, indicating the URI | |||
of the RD function returned and the corresponding Resource Type. | of the RD function returned and the corresponding Resource Type. | |||
When performing multicast discovery, the multicast IP address used | When performing multicast discovery, the multicast IP address used | |||
will depend on the scope required and the multicast capabilities of | will depend on the scope required and the multicast capabilities of | |||
the network (see Section 9.5. | the network (see Section 9.5). | |||
A Resource Directory MAY provide hints about the content-formats it | A Resource Directory MAY provide hints about the content-formats it | |||
supports in the links it exposes or registers, using the "ct" link | supports in the links it exposes or registers, using the "ct" target | |||
attribute, as shown in the example below. Clients MAY use these | attribute, as shown in the example below. Clients MAY use these | |||
hints to select alternate content-formats for interaction with the | hints to select alternate content-formats for interaction with the | |||
Resource Directory. | Resource Directory. | |||
HTTP does not support multicast and consequently only unicast | HTTP does not support multicast and consequently only unicast | |||
discovery can be supported using HTTP. The well-known entry points | discovery can be supported using HTTP. The well-known entry points | |||
SHOULD be provided to enable unicast discovery. | SHOULD be provided to enable unicast discovery. | |||
An implementation of this resource directory specification MUST | An implementation of this resource directory specification MUST | |||
support query filtering for the rt parameter as defined in [RFC6690]. | support query filtering for the rt parameter as defined in [RFC6690]. | |||
skipping to change at page 18, line 48 ¶ | skipping to change at page 19, line 44 ¶ | |||
Method: GET | Method: GET | |||
URI Template: /.well-known/core{?rt} | URI Template: /.well-known/core{?rt} | |||
URI Template Variables: | URI Template Variables: | |||
rt := Resource Type. SHOULD contain one of the values "core.rd", | rt := Resource Type. SHOULD contain one of the values "core.rd", | |||
"core.rd-lookup*", "core.rd-lookup-res", "core.rd-lookup-ep", | "core.rd-lookup*", "core.rd-lookup-res", "core.rd-lookup-ep", | |||
or "core.rd*" | or "core.rd*" | |||
Content-Format: application/link-format (if any) | Accept: absent, application/link-format or any other media type | |||
representing web links | ||||
Content-Format: application/link-format+json (if any) | ||||
Content-Format: application/link-format+cbor (if any) | ||||
The following response codes are defined for this interface: | The following response codes are defined for this interface: | |||
Success: 2.05 "Content" or 200 "OK" with an application/link-format, | Success: 2.05 "Content" or 200 "OK" with an application/link-format | |||
application/link-format+json, or application/link-format+cbor | or other web link payload containing one or more matching entries | |||
payload containing one or more matching entries for the RD | for the RD resource. | |||
resource. | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request" is returned in case | Failure: 4.00 "Bad Request" or 400 "Bad Request" is returned in case | |||
of a malformed request for a unicast request. | of a malformed request for a unicast request. | |||
Failure: No error response to a multicast request. | Failure: No error response to a multicast request. | |||
HTTP support : YES (Unicast only) | HTTP support : YES (Unicast only) | |||
The following example shows an endpoint discovering an RD using this | The following example shows an endpoint discovering an RD using this | |||
interface, thus learning that the directory resource location, in | interface, thus learning that the directory resource location, in | |||
skipping to change at page 19, line 33 ¶ | skipping to change at page 20, line 25 ¶ | |||
server hosting the resource is application/link-format (ct=40). Note | server hosting the resource is application/link-format (ct=40). Note | |||
that it is up to the RD to choose its RD locations. | that it is up to the RD to choose its RD locations. | |||
Req: GET coap://[MCD1]/.well-known/core?rt=core.rd* | Req: GET coap://[MCD1]/.well-known/core?rt=core.rd* | |||
Res: 2.05 Content | Res: 2.05 Content | |||
</rd>;rt="core.rd";ct=40, | </rd>;rt="core.rd";ct=40, | |||
</rd-lookup/ep>;rt="core.rd-lookup-ep";ct=40, | </rd-lookup/ep>;rt="core.rd-lookup-ep";ct=40, | |||
</rd-lookup/res>;rt="core.rd-lookup-res";ct=40, | </rd-lookup/res>;rt="core.rd-lookup-res";ct=40, | |||
Figure 6: Example discovery exchange | Figure 5: Example discovery exchange | |||
The following example shows the way of indicating that a client may | The following example shows the way of indicating that a client may | |||
request alternate content-formats. The Content-Format code attribute | request alternate content-formats. The Content-Format code attribute | |||
"ct" MAY include a space-separated sequence of Content-Format codes | "ct" MAY include a space-separated sequence of Content-Format codes | |||
as specified in Section 7.2.1 of [RFC7252], indicating that multiple | as specified in Section 7.2.1 of [RFC7252], indicating that multiple | |||
content-formats are available. The example below shows the required | content-formats are available. The example below shows the required | |||
Content-Format 40 (application/link-format) indicated as well as the | Content-Format 40 (application/link-format) indicated as well as a | |||
CBOR and JSON representation of link format. The RD resource | CBOR and JSON representation from [I-D.ietf-core-links-json] (which | |||
locations /rd, and /rd-lookup are example values. The server in this | have no numeric values assigned yet, so they are shown as TBD64 and | |||
example also indicates that it is capable of providing observation on | TBD504 as in that draft). The RD resource locations /rd, and /rd- | |||
resource lookups. | lookup are example values. The server in this example also indicates | |||
that it is capable of providing observation on resource lookups. | ||||
[ The RFC editor is asked to replace this and later occurrences of | ||||
MCD1 with the assigned IPv6 site-local address for "all CoRE Resource | ||||
Directories". ] | ||||
[ The RFC editor is asked to replace these and later occurrences of | ||||
MCD1, TBD64 and TBD504 with the assigned IPv6 site-local address for | ||||
"all CoRE Resource Directories" and the numeric ID values assigned by | ||||
IANA to application/link-format+cbor and application/link- | ||||
format+json, respectively, as they are defined in I-D.ietf-core- | ||||
links-json. ] | ||||
Req: GET coap://[MCD1]/.well-known/core?rt=core.rd* | Req: GET coap://[MCD1]/.well-known/core?rt=core.rd* | |||
Res: 2.05 Content | Res: 2.05 Content | |||
</rd>;rt="core.rd";ct="40 65225", | </rd>;rt="core.rd";ct="40 65225", | |||
</rd-lookup/res>;rt="core.rd-lookup-res";ct="40 TBD64 TBD504";obs, | </rd-lookup/res>;rt="core.rd-lookup-res";ct="40 TBD64 TBD504";obs, | |||
</rd-lookup/ep>;rt="core.rd-lookup-ep";ct="40 TBD64 TBD504", | </rd-lookup/ep>;rt="core.rd-lookup-ep";ct="40 TBD64 TBD504", | |||
From a management and maintenance perspective, it is necessary to | From a management and maintenance perspective, it is necessary to | |||
identify the components that constitute the RD server. The | identify the components that constitute the RD server. The | |||
identification refers to information about for example client-server | identification refers to information about for example client-server | |||
skipping to change at page 20, line 39 ¶ | skipping to change at page 21, line 29 ¶ | |||
(as in this example) or at individual RD components. The latter is | (as in this example) or at individual RD components. The latter is | |||
to be expected when different applications are run on the same | to be expected when different applications are run on the same | |||
server. | server. | |||
5.3. Registration | 5.3. Registration | |||
After discovering the location of an RD, a registrant-ep or CT MAY | After discovering the location of an RD, a registrant-ep or CT MAY | |||
register the resources of the registrant-ep using the registration | register the resources of the registrant-ep using the registration | |||
interface. This interface accepts a POST from an endpoint containing | interface. This interface accepts a POST from an endpoint containing | |||
the list of resources to be added to the directory as the message | the list of resources to be added to the directory as the message | |||
payload in the CoRE Link Format [RFC6690], JSON CoRE Link Format | payload in the CoRE Link Format [RFC6690] or other representations of | |||
(application/link-format+json), or CBOR CoRE Link Format | web links, along with query parameters indicating the name of the | |||
(application/link-format+cbor) [I-D.ietf-core-links-json], along with | endpoint, and optionally the sector, lifetime and base URI of the | |||
query parameters indicating the name of the endpoint, and optionally | registration. It is expected that other specifications will define | |||
the sector, lifetime and base URI of the registration. It is | further parameters (see Section 9.3). The RD then creates a new | |||
expected that other specifications will define further parameters | registration resource in the RD and returns its location. The | |||
(see Section 9.3). The RD then creates a new registration resource | receiving endpoint MUST use that location when refreshing | |||
in the RD and returns its location. The receiving endpoint MUST use | registrations using this interface. Registration resources in the RD | |||
that location when refreshing registrations using this interface. | are kept active for the period indicated by the lifetime parameter. | |||
Registration resources in the RD are kept active for the period | The creating endpoint is responsible for refreshing the registration | |||
indicated by the lifetime parameter. The creating endpoint is | resource within this period using either the registration or update | |||
responsible for refreshing the registration resource within this | interface. The registration interface MUST be implemented to be | |||
period using either the registration or update interface. The | idempotent, so that registering twice with the same endpoint | |||
registration interface MUST be implemented to be idempotent, so that | parameters ep and d (sector) does not create multiple registration | |||
registering twice with the same endpoint parameters ep and d (sector) | resources. | |||
does not create multiple registration resources. | ||||
The following rules apply for an update identified by a given (ep, d) | ||||
value pair: | ||||
o when the parameter values of the Update generate the same | The following rules apply for a registration request targeting a | |||
attribute values as already present, the location of the already | given (ep, d) value pair: | |||
existing registration is returned. | ||||
o when for a given (ep, d) value pair the update generates attribute | o When the (ep, d) value pair of the registration-request is | |||
values which are different from the existing one, the existing | different from any existing registration, a new registration is | |||
registration is removed and a new registration with a new location | generated. | |||
is created. | ||||
o when the (ep, d) value pair of the update is different from any | o When the (ep, d) value pair of the registration-request is equal | |||
existing registration, a new registration is generated. | to an existing registration, the content and parameters of the | |||
existing registration are replaced with the content of the | ||||
registration request. | ||||
The posted link-format document can (and typically does) contain | The posted link-format document can (and typically does) contain | |||
relative references both in its link targets and in its anchors, or | relative references both in its link targets and in its anchors, or | |||
contain empty anchors. The RD server needs to resolve these | contain empty anchors. The RD server needs to resolve these | |||
references in order to faithfully represent them in lookups. They | references in order to faithfully represent them in lookups. They | |||
are resolved against the base URI of the registration, which is | are resolved against the base URI of the registration, which is | |||
provided either explicitly in the "base" parameter or constructed | provided either explicitly in the "base" parameter or constructed | |||
implicitly from the requester's URI as constructed from its network | implicitly from the requester's URI as constructed from its network | |||
address and scheme. | address and scheme. | |||
Link format documents submitted to the resource directory are | For media types to which Appendix C applies (i.e. documents in | |||
interpreted as Modernized Link Format (see Appendix D) by the RD. A | application/link-format), the RD only needs to accept representations | |||
registrant-ep SHOULD NOT submit documents whose interpretations | in Limited Link Format as described there. Its behavior with | |||
according to [RFC6690] and Appendix D differ to avoid the ambiguities | representations outside that subset is implementation defined. | |||
described in Appendix B.4. | ||||
In practice, most links (precisely listed in Appendix D.1) can be | ||||
submitted without consideration for those details. | ||||
The registration request interface is specified as follows: | The registration request interface is specified as follows: | |||
Interaction: EP -> RD | Interaction: EP -> RD | |||
Method: POST | Method: POST | |||
URI Template: {+rd}{?ep,d,lt,base,extra-attrs*} | URI Template: {+rd}{?ep,d,lt,base,extra-attrs*} | |||
URI Template Variables: | URI Template Variables: | |||
rd := RD registration URI (mandatory). This is the location of | rd := RD registration URI (mandatory). This is the location of | |||
the RD, as obtained from discovery. | the RD, as obtained from discovery. | |||
ep := Endpoint name (mostly mandatory). The endpoint name is an | ep := Endpoint name (mostly mandatory). The endpoint name is an | |||
identifier that MUST be unique within a sector. The maximum | identifier that MUST be unique within a sector. The maximum | |||
length of this parameter is 63 bytes. If the RD is configured | length of this parameter is 63 bytes. If the RD is configured | |||
to recognize the endpoint (e.g. based on its security context), | to recognize the endpoint (e.g. based on its security context), | |||
the endpoint sets no endpoint name, and the RD assigns one | the RD assigns an endpoint name based on a set of configuration | |||
based on a set of configuration parameter values. | parameter values. | |||
d := Sector (optional). The sector to which this endpoint | d := Sector (optional). The sector to which this endpoint | |||
belongs. The maximum length of this parameter is 63 bytes. | belongs. The maximum length of this parameter is 63 bytes. | |||
When this parameter is not present, the RD MAY associate the | When this parameter is not present, the RD MAY associate the | |||
endpoint with a configured default sector or leave it empty. | endpoint with a configured default sector or leave it empty. | |||
The endpoint name and sector name are not set when one or both | The endpoint name and sector name are not set when one or both | |||
are set in an accompanying authorization token. | are set in an accompanying authorization token. | |||
lt := Lifetime (optional). Lifetime of the registration in | lt := Lifetime (optional). Lifetime of the registration in | |||
seconds. Range of 60-4294967295. If no lifetime is included | seconds. Range of 60-4294967295. If no lifetime is included | |||
skipping to change at page 22, line 40 ¶ | skipping to change at page 23, line 20 ¶ | |||
have a path component of its own, and MUST be suitable as a | have a path component of its own, and MUST be suitable as a | |||
base URI to resolve any relative references given in the | base URI to resolve any relative references given in the | |||
registration. The parameter is therefore usually of the shape | registration. The parameter is therefore usually of the shape | |||
"scheme://authority" for HTTP and CoAP URIs. The URI SHOULD | "scheme://authority" for HTTP and CoAP URIs. The URI SHOULD | |||
NOT have a query or fragment component as any non-empty | NOT have a query or fragment component as any non-empty | |||
relative part in a reference would remove those parts from the | relative part in a reference would remove those parts from the | |||
resulting URI. | resulting URI. | |||
In the absence of this parameter the scheme of the protocol, | In the absence of this parameter the scheme of the protocol, | |||
source address and source port of the registration request are | source address and source port of the registration request are | |||
assumed. That Base URI is constructed by concatenating the | assumed. The Base URI is consecutively constructed by | |||
used protcol's scheme with the characters "://", the | concatenating the used protocol's scheme with the characters | |||
requester's source address as an address literal and ":" | "://", the requester's source address as an address literal and | |||
followed by its port (if it was not the protocol's default one) | ":" followed by its port (if it was not the protocol's default | |||
in analogy to [RFC7252] Section 6.5. | one) in analogy to [RFC7252] Section 6.5. | |||
This parameter is mandatory when the directory is filled by a | This parameter is mandatory when the directory is filled by a | |||
third party such as an commissioning tool. | third party such as an commissioning tool. | |||
If the registrant-ep uses an ephemeral port to register with, | If the registrant-ep uses an ephemeral port to register with, | |||
it MUST include the base parameter in the registration to | it MUST include the base parameter in the registration to | |||
provide a valid network path. | provide a valid network path. | |||
If the registrant-ep, located behind a NAT gateway, is | If the registrant-ep, located behind a NAT gateway, is | |||
registering with a Resource Directory which is on the network | registering with a Resource Directory which is on the network | |||
service side of the NAT gateway, the endpoint MUST use a | service side of the NAT gateway, the endpoint MUST use a | |||
persistent port for the outgoing registration in order to | persistent port for the outgoing registration in order to | |||
provide the NAT gateway with a valid network address for | provide the NAT gateway with a valid network address for | |||
replies and incoming requests. | replies and incoming requests. | |||
If the registrant-ep uses a link-local address to register, it | ||||
MUST give an explicit routable base address unless configured | ||||
otherwise as per Section 3.4 (or just register from that | ||||
address in the first place). | ||||
Endpoints that register with a base that contains a path | Endpoints that register with a base that contains a path | |||
component can not meaningfully use [RFC6690] Link Format due to | component can not meaningfully use [RFC6690] Link Format due to | |||
its prevalence of the Origin concept in relative reference | its prevalence of the Origin concept in relative reference | |||
resolution; they can submit payloads for interpretation as | resolution. Those applications should use different | |||
Modernized Link Format. Typically, links submitted by such an | representations of links to which Appendix C is not applicable | |||
endpoint are of the "path-noscheme" (starts with a path not | (e.g. [I-D.hartke-t2trg-coral]). | |||
preceded by a slash, precisely defined in [RFC3986] | ||||
Section 3.3) form. | ||||
extra-attrs := Additional registration attributes (optional). | extra-attrs := Additional registration attributes (optional). | |||
The endpoint can pass any parameter registered at Section 9.3 | The endpoint can pass any parameter registered at Section 9.3 | |||
to the directory. If the RD is aware of the parameter's | to the directory. If the RD is aware of the parameter's | |||
specified semantics, it processes it accordingly. Otherwise, | specified semantics, it processes it accordingly. Otherwise, | |||
it MUST store the unknown key and its value(s) as an endpoint | it MUST store the unknown key and its value(s) as an endpoint | |||
attribute for further lookup. | attribute for further lookup. | |||
Content-Format: application/link-format | Content-Format: application/link-format or any other indicated media | |||
type representing web links | ||||
Content-Format: application/link-format+json | ||||
Content-Format: application/link-format+cbor | ||||
The following response codes are defined for this interface: | The following response codes are defined for this interface: | |||
Success: 2.01 "Created" or 201 "Created". The Location-Path option | Success: 2.01 "Created" or 201 "Created". The Location-Path option | |||
or Location header MUST be included in the response. This | or Location header MUST be included in the response. This | |||
location MUST be a stable identifier generated by the RD as it is | location MUST be a stable identifier generated by the RD as it is | |||
used for all subsequent operations on this registration resource. | used for all subsequent operations on this registration resource. | |||
The registration resource location thus returned is for the | The registration resource location thus returned is for the | |||
purpose of updating the lifetime of the registration and for | purpose of updating the lifetime of the registration and for | |||
maintaining the content of the registered links, including | maintaining the content of the registered links, including | |||
skipping to change at page 24, line 33 ¶ | skipping to change at page 25, line 13 ¶ | |||
"Finding a Resource Directory" step. Care has to be taken to | "Finding a Resource Directory" step. Care has to be taken to | |||
consider the freshness of results obtained earlier, e.g. of the | consider the freshness of results obtained earlier, e.g. of the | |||
result of a "/.well-known/core" response, the lifetime of an RDAO | result of a "/.well-known/core" response, the lifetime of an RDAO | |||
option and of DNS responses. Any rate limits and persistent errors | option and of DNS responses. Any rate limits and persistent errors | |||
from the "Finding a Resource Directory" step must be considered for | from the "Finding a Resource Directory" step must be considered for | |||
the whole registration time, not only for a single operation. | the whole registration time, not only for a single operation. | |||
The following example shows a registrant-ep with the name "node1" | The following example shows a registrant-ep with the name "node1" | |||
registering two resources to an RD using this interface. The | registering two resources to an RD using this interface. The | |||
location "/rd" is an example RD location discovered in a request | location "/rd" is an example RD location discovered in a request | |||
similar to Figure 6. | similar to Figure 5. | |||
Req: POST coap://rd.example.com/rd?ep=node1 | Req: POST coap://rd.example.com/rd?ep=node1 | |||
Content-Format: 40 | Content-Format: 40 | |||
Payload: | Payload: | |||
</sensors/temp>;ct=41;rt="temperature-c";if="sensor"; | </sensors/temp>;ct=41;rt="temperature-c";if="sensor"; | |||
anchor="coap://spurious.example.com:5683", | anchor="coap://spurious.example.com:5683", | |||
</sensors/light>;ct=41;rt="light-lux";if="sensor" | </sensors/light>;ct=41;rt="light-lux";if="sensor" | |||
Res: 2.01 Created | Res: 2.01 Created | |||
Location-Path: /rd/4521 | Location-Path: /rd/4521 | |||
Figure 7: Example registration payload | Figure 6: Example registration payload | |||
A Resource Directory may optionally support HTTP. Here is an example | A Resource Directory may optionally support HTTP. Here is an example | |||
of almost the same registration operation above, when done using HTTP | of almost the same registration operation above, when done using | |||
and the JSON Link Format. | HTTP. | |||
Req: POST /rd?ep=node1&base=http://[2001:db8:1::1] HTTP/1.1 | Req: POST /rd?ep=node1&base=http://[2001:db8:1::1] HTTP/1.1 | |||
Host: example.com | Host: example.com | |||
Content-Type: application/link-format+json | Content-Type: application/link-format | |||
Payload: | Payload: | |||
[ | </sensors/temp>;ct=41;rt="temperature-c";if="sensor"; | |||
{"href": "/sensors/temp", "ct": "41", "rt": "temperature-c", | anchor="coap://spurious.example.com:5683", | |||
"if": "sensor", "anchor": "coap://spurious.example.com:5683"}, | </sensors/light>;ct=41;rt="light-lux";if="sensor" | |||
{"href": "/sensors/light", "ct": "41", "rt": "light-lux", | ||||
"if": "sensor"} | ||||
] | ||||
Res: 201 Created | Res: 201 Created | |||
Location: /rd/4521 | Location: /rd/4521 | |||
5.3.1. Simple Registration | 5.3.1. Simple Registration | |||
Not all endpoints hosting resources are expected to know how to | Not all endpoints hosting resources are expected to know how to | |||
upload links to an RD as described in Section 5.3. Instead, simple | upload links to an RD as described in Section 5.3. Instead, simple | |||
endpoints can implement the Simple Registration approach described in | endpoints can implement the Simple Registration approach described in | |||
this section. An RD implementing this specification MUST implement | this section. An RD implementing this specification MUST implement | |||
Simple Registration. However, there may be security reasons why this | Simple Registration. However, there may be security reasons why this | |||
form of directory discovery would be disabled. | form of directory discovery would be disabled. | |||
This approach requires that the registrant-ep makes available the | This approach requires that the registrant-ep makes available the | |||
hosted resources that it wants to be discovered, as links on its | hosted resources that it wants to be discovered, as links on its | |||
"/.well-known/core" interface as specified in [RFC6690]. The links | "/.well-known/core" interface as specified in [RFC6690]. The links | |||
in that document are subject to the same limitations as the payload | in that document are subject to the same limitations as the payload | |||
of a registration (with respect to Appendix D). | of a registration (with respect to Appendix C). | |||
The registrant-ep finds one or more addresses of the directory server | The registrant-ep finds one or more addresses of the directory server | |||
as described in Section 4. | as described in Section 4. | |||
The registrant-ep asks the selected directory server to probe its | The registrant-ep asks the selected directory server to probe its | |||
/.well-known/core and publish the links as follows: | /.well-known/core and publish the links as follows: | |||
The registrant-ep sends (and regularly refreshes with) a POST request | The registrant-ep sends (and regularly refreshes with) a POST request | |||
to the "/.well-known/core" URI of the directory server of choice. | to the "/.well-known/core" URI of the directory server of choice. | |||
The body of the POST request is empty, and triggers the resource | The body of the POST request is empty, and triggers the resource | |||
directory server to perform GET requests at the requesting | directory server to perform GET requests at the requesting | |||
registrant-ep's /.well-known/core to obtain the link-format payload | registrant-ep's /.well-known/core to obtain the link-format payload | |||
to register. | to register. | |||
The registrant-ep includes the same registration parameters in the | The registrant-ep includes the same registration parameters in the | |||
POST request as it would per Section 5.3. The registration base URI | POST request as it would per Section 5.3. The registration base URI | |||
of the registration is taken from the requesting server's URI. | of the registration is taken from the registrant-ep's network address | |||
(as is default with regular registrations). | ||||
The Resource Directory MUST NOT query the registrant-ep's data before | The Resource Directory needs to query the registrant-ep's discovery | |||
sending the response; this is to accommodate very limited endpoints. | resource to determine the success of the operation. It SHOULD keep a | |||
cache of the discovery resource and not query it again as long as it | ||||
is fresh. | ||||
The success condition only indicates that the request was valid (i.e. | (This is to accomodate constrained registrant devices that can not | |||
the passed parameters are valid per se), not that the link data could | process an incoming and outgoing request at the same time. | |||
be obtained or parsed or was successfully registered into the RD. | Registrants MUST be able to serve a GET request to "/.well-known/ | |||
core" after having requested registration. Constrained devices MAY | ||||
regard the initial request as temporarily failed when they need RAM | ||||
occupied by their own request to serve the RD's GET, and retry later | ||||
when the RD already has a cached representation of their discovery | ||||
resources. Then, the RD can reply immediately and the registrant can | ||||
receive the response.) | ||||
The simple registration request interface is specified as follows: | The simple registration request interface is specified as follows: | |||
Interaction: EP -> RD | Interaction: EP -> RD | |||
Method: POST | Method: POST | |||
URI Template: /.well-known/core{?ep,d,lt,extra-attrs*} | URI Template: /.well-known/core{?ep,d,lt,extra-attrs*} | |||
URI Template Variables are as they are for registration in | URI Template Variables are as they are for registration in | |||
Section 5.3. The base attribute is not accepted to keep the | Section 5.3. The base attribute is not accepted to keep the | |||
registration interface simple; that rules out registration over CoAP- | registration interface simple; that rules out registration over CoAP- | |||
over-TCP or HTTP that would need to specify one. | over-TCP or HTTP that would need to specify one. | |||
The following response codes are defined for this interface: | The following response codes are defined for this interface: | |||
Success: 2.04 "Changed". | Success: 2.04 "Changed". | |||
Failure: 4.00 "Bad Request". Malformed request. | Failure: 4.00 "Bad Request". Malformed request. | |||
skipping to change at page 26, line 49 ¶ | skipping to change at page 27, line 36 ¶ | |||
Method: GET | Method: GET | |||
URI Template: /.well-known/core | URI Template: /.well-known/core | |||
The following response codes are defined for this interface: | The following response codes are defined for this interface: | |||
Success: 2.05 "Content". | Success: 2.05 "Content". | |||
Failure: 4.00 "Bad Request". Malformed request. | Failure: 4.00 "Bad Request". Malformed request. | |||
Failure: 4.04 "Not Found". /.well-known/core does not exist or is | Failure: 4.04 "Not Found". /.well-known/core does not exist. | |||
empty. | ||||
Failure: 5.03 "Service Unavailable". Service could not perform the | Failure: 5.03 "Service Unavailable". Service could not perform the | |||
operation. | operation. | |||
HTTP support: NO | HTTP support: NO | |||
The registration resources MUST be deleted after the expiration of | The registration resources MUST be deleted after the expiration of | |||
their lifetime. Additional operations on the registration resource | their lifetime. Additional operations on the registration resource | |||
cannot be executed because no registration location is returned. | cannot be executed because no registration location is returned. | |||
The following example shows a registrant-ep using Simple | The following example shows a registrant-ep using Simple | |||
Registration, by simply sending an empty POST to a resource | Registration, by simply sending an empty POST to a resource | |||
directory. | directory. | |||
Req:(to RD server from [2001:db8:2::1]) | Req: (to RD server from [2001:db8:2::1]) | |||
POST /.well-known/core?lt=6000&ep=node1 | POST /.well-known/core?lt=6000&ep=node1 | |||
No payload | No payload | |||
Res: 2.04 Changed | ||||
(later) | ||||
Req: (from RD server to [2001:db8:2::1]) | Req: (from RD server to [2001:db8:2::1]) | |||
GET /.well-known/core | GET /.well-known/core | |||
Accept: 40 | Accept: 40 | |||
Res: 2.05 Content | Res: (to the RD from [2001:db8:2::1] ) 2.05 Content | |||
Content-Format: 40 | Content-Format: 40 | |||
Payload: | Payload: | |||
</sen/temp> | </sen/temp> | |||
Res: (from the RD to [2001:db8:2::1]) 2.04 Changed | ||||
5.3.2. Third-party registration | 5.3.2. Third-party registration | |||
For some applications, even Simple Registration may be too taxing for | For some applications, even Simple Registration may be too taxing for | |||
some very constrained devices, in particular if the security | some very constrained devices, in particular if the security | |||
requirements become too onerous. | requirements become too onerous. | |||
In a controlled environment (e.g. building control), the Resource | In a controlled environment (e.g. building control), the Resource | |||
Directory can be filled by a third party device, called a | Directory can be filled by a third party device, called a | |||
Commissioning Tool (CT). The commissioning tool can fill the | Commissioning Tool (CT). The commissioning tool can fill the | |||
Resource Directory from a database or other means. For that purpose | Resource Directory from a database or other means. For that purpose | |||
scheme, IP address and port of the URI of the registered device is | scheme, IP address and port of the URI of the registered device is | |||
the value of the "base" parameter of the registration described in | the value of the "base" parameter of the registration described in | |||
Section 5.3. | Section 5.3. | |||
It should be noted that the value of the "base" parameter applies to | It should be noted that the value of the "base" parameter applies to | |||
all the links of the registration and has consequences for the anchor | all the links of the registration and has consequences for the anchor | |||
value of the individual links as exemplified in Appendix B. An | value of the individual links as exemplified in Appendix B. An | |||
eventual (currently non-existing) "base" attribute of the link is not | eventual (currently non-existing) "base" attribute of the link is not | |||
affected by the value of "base" parameter in the registration. | affected by the value of "base" parameter in the registration. | |||
5.3.3. RD-Groups | 5.4. Operations on the Registration Resource | |||
The RD-Groups usage pattern allows announcing application groups | This section describes how the registering endpoint can maintain the | |||
inside a Resource Directory. | registrations that it created. The registering endpoint can be the | |||
registrant-ep or the CT. An endpoint SHOULD NOT use this interface | ||||
for registrations that it did not create. The registrations are | ||||
resources of the RD. | ||||
Groups are represented by endpoint registrations. Their base address | After the initial registration, the registering endpoint retains the | |||
is a multicast address, and they SHOULD be entered with the endpoint | returned location of the Registration Resource for further | |||
type "core.rd-group". The endpoint name can also be referred to as a | operations, including refreshing the registration in order to extend | |||
group name in this context. | the lifetime and "keep-alive" the registration. When the lifetime of | |||
the registration has expired, the RD SHOULD NOT respond to discovery | ||||
queries concerning this endpoint. The RD SHOULD continue to provide | ||||
access to the Registration Resource after a registration time-out | ||||
occurs in order to enable the registering endpoint to eventually | ||||
refresh the registration. The RD MAY eventually remove the | ||||
registration resource for the purpose of garbage collection. If the | ||||
Registration Resource is removed, the corresponding endpoint will | ||||
need to be re-registered. | ||||
The registration is inserted into the RD by a Commissioning Tool, | The Registration Resource may also be used cancel the registration | |||
which might also be known as a group manager here. It performs third | using DELETE, and to perform further operations beyond the scope of | |||
party registration and registration updates. | this specification. | |||
The links it registers SHOULD be available on all members that join | These operations are described below. | |||
the group. Depending on the application, members that lack some | ||||
resource MAY be permissible if requests to them fail gracefully. | ||||
The following example shows a CT registering a group with the name | 5.4.1. Registration Update | |||
"lights" which provides two resources. The directory resource path | ||||
/rd is an example RD location discovered in a request similar to | ||||
Figure 6. | ||||
Req: POST coap://rd.example.com/rd?ep=lights&et=core.rd-group | The update interface is used by the registering endpoint to refresh | |||
&base=coap://[ff35:30:2001:db8::1] | or update its registration with an RD. To use the interface, the | |||
Content-Format: 40 | registering endpoint sends a POST request to the registration | |||
resource returned by the initial registration operation. | ||||
An update MAY update the lifetime- or the context- registration | ||||
parameters "lt", "base" as in Section 5.3. Parameters that are not | ||||
being changed SHOULD NOT be included in an update. Adding parameters | ||||
that have not changed increases the size of the message but does not | ||||
have any other implications. Parameters MUST be included as query | ||||
parameters in an update operation as in Section 5.3. | ||||
A registration update resets the timeout of the registration to the | ||||
(possibly updated) lifetime of the registration, independent of | ||||
whether a "lt" parameter was given. | ||||
If the context of the registration is changed in an update, relative | ||||
references submitted in the original registration or later updates | ||||
are resolved anew against the new context. | ||||
The registration update operation only describes the use of POST with | ||||
an empty payload. Future standards might describe the semantics of | ||||
using content formats and payloads with the POST method to update the | ||||
links of a registration (see Section 5.4.3). | ||||
The update registration request interface is specified as follows: | ||||
Interaction: EP -> RD | ||||
Method: POST | ||||
URI Template: {+location}{?lt,base,extra-attrs*} | ||||
URI Template Variables: | ||||
location := This is the Location returned by the RD as a result | ||||
of a successful earlier registration. | ||||
lt := Lifetime (optional). Lifetime of the registration in | ||||
seconds. Range of 60-4294967295. If no lifetime is included, | ||||
the previous last lifetime set on a previous update or the | ||||
original registration (falling back to 90000) SHOULD be used. | ||||
base := Base URI (optional). This parameter updates the Base URI | ||||
established in the original registration to a new value. If | ||||
the parameter is set in an update, it is stored by the RD as | ||||
the new Base URI under which to interpret the relative links | ||||
present in the payload of the original registration, following | ||||
the same restrictions as in the registration. If the parameter | ||||
is not set in the request but was set before, the previous Base | ||||
URI value is kept unmodified. If the parameter is not set in | ||||
the request and was not set before either, the source address | ||||
and source port of the update request are stored as the Base | ||||
URI. | ||||
extra-attrs := Additional registration attributes (optional). As | ||||
with the registration, the RD processes them if it knows their | ||||
semantics. Otherwise, unknown attributes are stored as | ||||
endpoint attributes, overriding any previously stored endpoint | ||||
attributes of the same key. | ||||
Content-Format: none (no payload) | ||||
The following response codes are defined for this interface: | ||||
Success: 2.04 "Changed" or 204 "No Content" if the update was | ||||
successfully processed. | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | ||||
request. | ||||
Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | ||||
exist (e.g. may have been removed). | ||||
Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | ||||
Service could not perform the operation. | ||||
HTTP support: YES | ||||
If the registration update fails with a "Service Unavailable" | ||||
response and a Max-Age option or Retry-After header, the registering | ||||
endpoint SHOULD retry the operation after the time indicated. If the | ||||
registration fails in another way, including request timeouts, or if | ||||
the time indicated exceeds the remaining lifetime, the registering | ||||
endpoint SHOULD attempt registration again. | ||||
The following example shows how the registering endpoint updates its | ||||
registration resource at an RD using this interface with the example | ||||
location value: /rd/4521. | ||||
Req: POST /rd/4521 | ||||
Res: 2.04 Changed | ||||
The following example shows the registering endpoint updating its | ||||
registration resource at an RD using this interface with the example | ||||
location value: /rd/4521. The initial registration by the | ||||
registering endpoint set the following values: | ||||
o endpoint name (ep)=endpoint1 | ||||
o lifetime (lt)=500 | ||||
o Base URI (base)=coap://local-proxy-old.example.com:5683 | ||||
o payload of Figure 6 | ||||
The initial state of the Resource Directory is reflected in the | ||||
following request: | ||||
Req: GET /rd-lookup/res?ep=endpoint1 | ||||
Res: 2.01 Content | ||||
Payload: | Payload: | |||
</light>;rt="light";if="core.a", | <coap://local-proxy-old.example.com:5683/sensors/temp>;ct=41; | |||
</color-temperature>;if="core.p";u="K" | rt="temperature"; anchor="coap://spurious.example.com:5683", | |||
<coap://local-proxy-old.example.com:5683/sensors/light>;ct=41; | ||||
rt="light-lux"; if="sensor"; | ||||
anchor="coap://local-proxy-old.example.com:5683" | ||||
Res: 2.01 Created | The following example shows the registering endpoint changing the | |||
Location-Path: /rd/12 | Base URI to "coaps://new.example.com:5684": | |||
In this example, the group manager can easily permit devices that | Req: POST /rd/4521?base=coaps://new.example.com:5684 | |||
have no writable color-temperature to join, as they would still | ||||
respond to brightness changing commands. Had the group instead | ||||
contained a single resource that sets brightness and color | ||||
temperature atomically, endpoints would need to support both | ||||
properties. | ||||
The resources of a group can be looked up like any other resource, | Res: 2.04 Changed | |||
and the group registrations (along with any additional registration | ||||
parameters) can be looked up using the endpoint lookup interface. | The consecutive query returns: | |||
Req: GET /rd-lookup/res?ep=endpoint1 | ||||
Res: 2.01 Content | ||||
Payload: | ||||
<coaps://new.example.com:5684/sensors/temp>;ct=41;rt="temperature"; | ||||
anchor="coap://spurious.example.com:5683", | ||||
<coaps://new.example.com:5684/sensors/light>;ct=41;rt="light-lux"; | ||||
if="sensor"; anchor="coaps://new.example.com:5684", | ||||
5.4.2. Registration Removal | ||||
Although RD registrations have soft state and will eventually timeout | ||||
after their lifetime, the registering endpoint SHOULD explicitly | ||||
remove an entry from the RD if it knows it will no longer be | ||||
available (for example on shut-down). This is accomplished using a | ||||
removal interface on the RD by performing a DELETE on the endpoint | ||||
resource. | ||||
The removal request interface is specified as follows: | ||||
Interaction: EP -> RD | ||||
Method: DELETE | ||||
URI Template: {+location} | ||||
URI Template Variables: | ||||
location := This is the Location returned by the RD as a result | ||||
of a successful earlier registration. | ||||
The following response codes are defined for this interface: | ||||
Success: 2.02 "Deleted" or 204 "No Content" upon successful deletion | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | ||||
request. | ||||
Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | ||||
exist (e.g. may already have been removed). | ||||
Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | ||||
Service could not perform the operation. | ||||
HTTP support: YES | ||||
The following examples shows successful removal of the endpoint from | ||||
the RD with example location value /rd/4521. | ||||
Req: DELETE /rd/4521 | ||||
Res: 2.02 Deleted | ||||
5.4.3. Further operations | ||||
Additional operations on the registration can be specified in future | ||||
documents, for example: | ||||
o Send iPATCH (or PATCH) updates ([RFC8132]) to add, remove or | ||||
change the links of a registration. | ||||
o Use GET to read the currently stored set of links in a | ||||
registration resource. | ||||
Those operations are out of scope of this document, and will require | ||||
media types suitable for modifying sets of links. | ||||
6. RD Lookup | 6. RD Lookup | |||
To discover the resources registered with the RD, a lookup interface | To discover the resources registered with the RD, a lookup interface | |||
must be provided. This lookup interface is defined as a default, and | must be provided. This lookup interface is defined as a default, and | |||
it is assumed that RDs may also support lookups to return resource | it is assumed that RDs may also support lookups to return resource | |||
descriptions in alternative formats (e.g. Atom or HTML Link) or | descriptions in alternative formats (e.g. JSON or CBOR link format | |||
using more advanced interfaces (e.g. supporting context or semantic | [I-D.ietf-core-links-json]) or using more advanced interfaces (e.g. | |||
based lookup). | supporting context or semantic based lookup) on different resources | |||
that are discovered independently. | ||||
RD Lookup allows lookups for endpoints and resources using attributes | RD Lookup allows lookups for endpoints and resources using attributes | |||
defined in this document and for use with the CoRE Link Format. The | defined in this document and for use with the CoRE Link Format. The | |||
result of a lookup request is the list of links (if any) | result of a lookup request is the list of links (if any) | |||
corresponding to the type of lookup. Thus, an endpoint lookup MUST | corresponding to the type of lookup. Thus, an endpoint lookup MUST | |||
return a list of endpoints and a resource lookup MUST return a list | return a list of endpoints and a resource lookup MUST return a list | |||
of links to resources. | of links to resources. | |||
The lookup type is selected by a URI endpoint, which is indicated by | The lookup type is selected by a URI endpoint, which is indicated by | |||
a Resource Type as per Table 1 below: | a Resource Type as per Table 1 below: | |||
skipping to change at page 30, line 9 ¶ | skipping to change at page 34, line 27 ¶ | |||
Above rules allow the client to interpret the response as links | Above rules allow the client to interpret the response as links | |||
without any further knowledge of the storage conventions of the RD. | without any further knowledge of the storage conventions of the RD. | |||
The Resource Directory MAY replace the registration base URIs with a | The Resource Directory MAY replace the registration base URIs with a | |||
configured intermediate proxy, e.g. in the case of an HTTP lookup | configured intermediate proxy, e.g. in the case of an HTTP lookup | |||
interface for CoAP endpoints. | interface for CoAP endpoints. | |||
6.2. Lookup filtering | 6.2. Lookup filtering | |||
Using the Accept Option, the requester can control whether the | Using the Accept Option, the requester can control whether the | |||
returned list is returned in CoRE Link Format ("application/link- | returned list is returned in CoRE Link Format ("application/link- | |||
format", default) or its alternate content-formats ("application/ | format", default) or in alternate content-formats (e.g. from | |||
link-format+json" or "application/link-format+cbor"). | [I-D.ietf-core-links-json]). | |||
The page and count parameters are used to obtain lookup results in | The page and count parameters are used to obtain lookup results in | |||
specified increments using pagination, where count specifies how many | specified increments using pagination, where count specifies how many | |||
links to return and page specifies which subset of links organized in | links to return and page specifies which subset of links organized in | |||
sequential pages, each containing 'count' links, starting with link | sequential pages, each containing 'count' links, starting with link | |||
zero and page zero. Thus, specifying count of 10 and page of 0 will | zero and page zero. Thus, specifying count of 10 and page of 0 will | |||
return the first 10 links in the result set (links 0-9). Count = 10 | return the first 10 links in the result set (links 0-9). Count = 10 | |||
and page = 1 will return the next 'page' containing links 10-19, and | and page = 1 will return the next 'page' containing links 10-19, and | |||
so on. | so on. | |||
skipping to change at page 31, line 39 ¶ | skipping to change at page 36, line 10 ¶ | |||
Page numbering starts with zero. | Page numbering starts with zero. | |||
count := Count (optional). Number of results is limited to this | count := Count (optional). Number of results is limited to this | |||
parameter value. If the page parameter is also present, the | parameter value. If the page parameter is also present, the | |||
response MUST only include 'count' links starting with the | response MUST only include 'count' links starting with the | |||
(page * count) link in the result set from the query. If the | (page * count) link in the result set from the query. If the | |||
count parameter is not present, then the response MUST return | count parameter is not present, then the response MUST return | |||
all matching links in the result set. Link numbering starts | all matching links in the result set. Link numbering starts | |||
with zero. | with zero. | |||
Content-Format: application/link-format (optional) | Accept: absent, application/link-format or any other indicated | |||
media type representing web links | ||||
Content-Format: application/link-format+json (optional) | ||||
Content-Format: application/link-format+cbor (optional) | ||||
The following responses codes are defined for this interface: | The following responses codes are defined for this interface: | |||
Success: 2.05 "Content" or 200 "OK" with an "application/link- | Success: 2.05 "Content" or 200 "OK" with an "application/link- | |||
format", "application/link-format+cbor", or "application/link- | format" or other web link payload containing matching entries for | |||
format+json" payload containing matching entries for the lookup. | the lookup. The payload can contain zero links (which is an empty | |||
The payload can contain zero links (which is an empty payload, | payload in [RFC6690] link format, but could also be "[]" in JSON | |||
"80" (hex) or "[]" in the respective content format), indicating | based formats), indicating that no entities matched the request. | |||
that no entities matched the request. | ||||
Failure: No error response to a multicast request. | Failure: No error response to a multicast request. | |||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | |||
request. | request. | |||
Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | |||
Service could not perform the operation. | Service could not perform the operation. | |||
HTTP support: YES | HTTP support: YES | |||
The endpoint lookup returns registration resources which can only be | ||||
manipulated by the registering endpoint. Examples of endpoint lookup | ||||
belong to the management aspects of the RD and are shown in | ||||
Appendix A.5. The resource lookup examples are shown in this | ||||
section. | ||||
6.3. Resource lookup examples | 6.3. Resource lookup examples | |||
The examples in this section assume the existence of CoAP hosts with | The examples in this section assume the existence of CoAP hosts with | |||
a default CoAP port 61616. HTTP hosts are possible and do not change | a default CoAP port 61616. HTTP hosts are possible and do not change | |||
the nature of the examples. | the nature of the examples. | |||
The following example shows a client performing a resource lookup | The following example shows a client performing a resource lookup | |||
with the example resource look-up locations discovered in Figure 6: | with the example resource look-up locations discovered in Figure 5: | |||
Req: GET /rd-lookup/res?rt=temperature | Req: GET /rd-lookup/res?rt=temperature | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[2001:db8:3::123]:61616/temp>;rt="temperature"; | <coap://[2001:db8:3::123]:61616/temp>;rt="temperature"; | |||
anchor="coap://[2001:db8:3::123]:61616" | anchor="coap://[2001:db8:3::123]:61616" | |||
The same lookup using the CBOR Link Format media type: | ||||
Req: GET /rd-lookup/res?rt=temperature | ||||
Accept: TBD64 | ||||
Res: 2.05 Content | ||||
Content-Format: TBD64 | ||||
Payload in Hex notation: | ||||
81A3017823636F61703A2F2F5B323030313A6462383A333A3A3132335D3A363136313 | ||||
62F74656D7003781E636F61703A2F2F5B323030313A6462383A333A3A3132335D3A36 | ||||
31363136096B74656D7065726174757265 | ||||
Decoded payload: | ||||
[{1: "coap://[2001:db8:3::123]:61616/temp", 9: "temperature", | ||||
3: "coap://[2001:db8:3::123]:61616"}] | ||||
A client that wants to be notified of new resources as they show up | A client that wants to be notified of new resources as they show up | |||
can use observation: | can use observation: | |||
Req: GET /rd-lookup/res?rt=light | Req: GET /rd-lookup/res?rt=light | |||
Observe: 0 | Observe: 0 | |||
Res: 2.05 Content | Res: 2.05 Content | |||
Observe: 23 | Observe: 23 | |||
Payload: empty | Payload: empty | |||
skipping to change at page 35, line 28 ¶ | skipping to change at page 39, line 28 ¶ | |||
anchor="coap://sensor2.example.com", | anchor="coap://sensor2.example.com", | |||
<coap://sensor2.example.com/sensors/temp>;rt="temperature-c"; | <coap://sensor2.example.com/sensors/temp>;rt="temperature-c"; | |||
if="sensor"; anchor="coap://sensor2.example.com", | if="sensor"; anchor="coap://sensor2.example.com", | |||
<coap://sensor2.example.com/sensors/light>;rt="light-lux"; | <coap://sensor2.example.com/sensors/light>;rt="light-lux"; | |||
if="sensor"; anchor="coap://sensor2.example.com", | if="sensor"; anchor="coap://sensor2.example.com", | |||
<http://www.example.com/sensors/t123>;rel="describedby"; | <http://www.example.com/sensors/t123>;rel="describedby"; | |||
anchor="coap://sensor2.example.com/sensors/temp", | anchor="coap://sensor2.example.com/sensors/temp", | |||
<coap://sensor2.example.com/t>;rel="alternate"; | <coap://sensor2.example.com/t>;rel="alternate"; | |||
anchor="coap://sensor2.example.com/sensors/temp" | anchor="coap://sensor2.example.com/sensors/temp" | |||
The following example shows a client performing a lookup of all | 6.4. Endpoint lookup | |||
resources of all endpoints (groups) with et=core.rd-group. | ||||
Req: GET /rd-lookup/res?et=core.rd-group | The endpoint lookup returns registration resources which can only be | |||
manipulated by the registering endpoint. | ||||
<coap://[ff35:30:2001:db8::1]/light>;rt="light";if="core.a"; | Endpoint registration resources are annotated with their endpoint | |||
et="core.rd-group";anchor="coap://[ff35:30:2001:db8::1]", | names (ep), sectors (d, if present) and registration base URI (base; | |||
<coap://[ff35:30:2001:db8::1]/color-temperature>;if="core.p";u="K"; | reports the registrant-ep's address if no explicit base was given) as | |||
et="core.rd-group"; | well as a constant resource type (rt="core.rd-ep"); the lifetime (lt) | |||
anchor="coap://[ff35:30:2001:db8::1]" | is not reported. Additional endpoint attributes are added as target | |||
attributes to their endpoint link unless their specification says | ||||
otherwise. | ||||
Links to endpoints SHOULD be presented in path-absolute form or, if | ||||
required, as absolute references. (This avoids the RFC6690 | ||||
ambiguities.) | ||||
While Endpoint Lookup does expose the registration resources, the RD | ||||
does not need to make them accessible to clients. Clients SHOULD NOT | ||||
attempt to dereference or manipulate them. | ||||
A Resource Directory can report endpoints in lookup that are not | ||||
hosted at the same address. Lookup clients MUST be prepared to see | ||||
arbitrary URIs as registration resources in the results and treat | ||||
them as opaque identifiers; the precise semantics of such links are | ||||
left to future specifications. | ||||
The following example shows a client performing an endpoint type (et) | ||||
lookup with the value oic.d.sensor (which is currently a registered | ||||
rt value): | ||||
Req: GET /rd-lookup/ep?et=oic.d.sensor | ||||
Res: 2.05 Content | ||||
</rd/1234>;base="coap://[2001:db8:3::127]:61616";ep="node5"; | ||||
et="oic.d.sensor";ct="40";rt="core.rd-ep", | ||||
</rd/4521>;base="coap://[2001:db8:3::129]:61616";ep="node7"; | ||||
et="oic.d.sensor";ct="40";d="floor-3";rt="core.rd-ep" | ||||
7. Security policies | 7. Security policies | |||
The Resource Directory (RD) provides assistance to applications | The Resource Directory (RD) provides assistance to applications | |||
situated on a selection of nodes to discover endpoints on connected | situated on a selection of nodes to discover endpoints on connected | |||
nodes. This section discusses different security aspects of | nodes. This section discusses different security aspects of | |||
accessing the RD. | accessing the RD. | |||
The contents of the RD are inserted in two ways: | The contents of the RD are inserted in two ways: | |||
skipping to change at page 36, line 31 ¶ | skipping to change at page 41, line 12 ¶ | |||
authorized to learn the contents of a given RD. Within a region, for | authorized to learn the contents of a given RD. Within a region, for | |||
a given RD, a more fine-grained security division is possible based | a given RD, a more fine-grained security division is possible based | |||
on the values of the endpoint registration parameters. Authorization | on the values of the endpoint registration parameters. Authorization | |||
to discover endpoints with a given set of filter values is | to discover endpoints with a given set of filter values is | |||
recommended for those cases. | recommended for those cases. | |||
When a node registers its endpoints, criteria are needed to authorize | When a node registers its endpoints, criteria are needed to authorize | |||
the node to enter them. An important aspect is the uniqueness of the | the node to enter them. An important aspect is the uniqueness of the | |||
(endpoint name, and optional sector) pair within the RD. Consider | (endpoint name, and optional sector) pair within the RD. Consider | |||
the two cases separately: (1) CT registers endpoints, and (2) the | the two cases separately: (1) CT registers endpoints, and (2) the | |||
registering node registers its own endpoint(s). * A CT needs | registering node registers its own endpoint(s). | |||
authorization to register a set of endpoints. This authorization can | ||||
be based on the region, i.e. a given CT is authorized to register any | o A CT needs authorization to register a set of endpoints. This | |||
endpoint (endpoint name, sector) into a given RD, or to register an | authorization can be based on the region, i.e. a given CT is | |||
endpoint with (endpoint name, sector) value pairs assigned by the AS, | authorized to register any endpoint (endpoint name, sector) into a | |||
or can be more fine-grained, including a subset of registration | given RD, or to register an endpoint with (endpoint name, sector) | |||
parameter values. * A given endpoint that registers itself, needs to | value pairs assigned by the AS, or can be more fine-grained, | |||
proof its possession of its unique (endpoint name, sector) value | including a subset of registration parameter values. | |||
pair. Alternatively, the AS can authorize the endpoint to register | ||||
with an (endpoint name, sector) value pair assigned by the AS. * A | o A given endpoint that registers itself, needs to proof its | |||
separate document needs to specify these aspects to ensure | possession of its unique (endpoint name, sector) value pair. | |||
Alternatively, the AS can authorize the endpoint to register with | ||||
an (endpoint name, sector) value pair assigned by the AS. | ||||
A separate document needs to specify these aspects to ensure | ||||
interoperability between registering nodes and RD. The subsections | interoperability between registering nodes and RD. The subsections | |||
below give some hints how to handle a subset of the different | below give some hints how to handle a subset of the different | |||
aspects. | aspects. | |||
7.1. Secure RD discovery | 7.1. Secure RD discovery | |||
The Resource Server (RS) discussed in [I-D.ietf-ace-oauth-authz] is | The Resource Server (RS) discussed in [I-D.ietf-ace-oauth-authz] is | |||
equated to the RD. The client (C) needs to discover the RD as | equated to the RD. The client (C) needs to discover the RD as | |||
discussed in Section 4. C can discover the related AS by sending a | discussed in Section 4. C can discover the related AS by sending a | |||
request to the RD. The RD denies the request by sending the address | request to the RD. The RD denies the request by sending the address | |||
skipping to change at page 37, line 43 ¶ | skipping to change at page 42, line 29 ¶ | |||
checked by encrypting the certificate identifier with the private key | checked by encrypting the certificate identifier with the private key | |||
of the registering endpoint, which the RD can decrypt with the public | of the registering endpoint, which the RD can decrypt with the public | |||
key stored in the certificate. Even simpler, the authorized | key stored in the certificate. Even simpler, the authorized | |||
registering endpoint can generate a random number (or string) that | registering endpoint can generate a random number (or string) that | |||
identifies the endpoint. The RD can check for the improbable | identifies the endpoint. The RD can check for the improbable | |||
replication of the random value. The RD MUST check that registering | replication of the random value. The RD MUST check that registering | |||
endpoint uses only one random value for each authorized endpoint. | endpoint uses only one random value for each authorized endpoint. | |||
8. Security Considerations | 8. Security Considerations | |||
The security considerations as described in Section 7 of [RFC5988] | The security considerations as described in Section 5 of [RFC8288] | |||
and Section 6 of [RFC6690] apply. The "/.well-known/core" resource | and Section 6 of [RFC6690] apply. The "/.well-known/core" resource | |||
may be protected e.g. using DTLS when hosted on a CoAP server as | may be protected e.g. using DTLS when hosted on a CoAP server as | |||
described in [RFC7252]. DTLS or TLS based security SHOULD be used on | described in [RFC7252]. DTLS or TLS based security SHOULD be used on | |||
all resource directory interfaces defined in this document. | all resource directory interfaces defined in this document. | |||
8.1. Endpoint Identification and Authentication | 8.1. Endpoint Identification and Authentication | |||
An Endpoint (name, sector) pair is unique within the et of endpoints | An Endpoint (name, sector) pair is unique within the et of endpoints | |||
regsitered by the RD. An Endpoint MUST NOT be identified by its | registered by the RD. An Endpoint MUST NOT be identified by its | |||
protocol, port or IP address as these may change over the lifetime of | protocol, port or IP address as these may change over the lifetime of | |||
an Endpoint. | an Endpoint. | |||
Every operation performed by an Endpoint on a resource directory | Every operation performed by an Endpoint on a resource directory | |||
SHOULD be mutually authenticated using Pre-Shared Key, Raw Public Key | SHOULD be mutually authenticated using Pre-Shared Key, Raw Public Key | |||
or Certificate based security. | or Certificate based security. | |||
Consider the following threat: two devices A and B are registered at | Consider the following threat: two devices A and B are registered at | |||
a single server. Both devices have unique, per-device credentials | a single server. Both devices have unique, per-device credentials | |||
for use with DTLS to make sure that only parties with authorization | for use with DTLS to make sure that only parties with authorization | |||
skipping to change at page 40, line 4 ¶ | skipping to change at page 44, line 34 ¶ | |||
9.3. RD Parameter Registry | 9.3. RD Parameter Registry | |||
This specification defines a new sub-registry for registration and | This specification defines a new sub-registry for registration and | |||
lookup parameters called "RD Parameters" under "CoRE Parameters". | lookup parameters called "RD Parameters" under "CoRE Parameters". | |||
Although this specification defines a basic set of parameters, it is | Although this specification defines a basic set of parameters, it is | |||
expected that other standards that make use of this interface will | expected that other standards that make use of this interface will | |||
define new ones. | define new ones. | |||
Each entry in the registry must include | Each entry in the registry must include | |||
o the human readable name of the parameter, | o the human readable name of the parameter, | |||
o the short name as used in query parameters or link attributes, | o the short name as used in query parameters or target attributes, | |||
o indication of whether it can be passed as a query parameter at | o indication of whether it can be passed as a query parameter at | |||
registration of endpoints, as a query parameter in lookups, or be | registration of endpoints, as a query parameter in lookups, or be | |||
expressed as a link attribute, | expressed as a target attribute, | |||
o validity requirements if any, and | o validity requirements if any, and | |||
o a description. | o a description. | |||
The query parameter MUST be both a valid URI query key [RFC3986] and | The query parameter MUST be both a valid URI query key [RFC3986] and | |||
a parmname as used in [RFC5988]. | a token as used in [RFC8288]. | |||
The description must give details on whether the parameter can be | The description must give details on whether the parameter can be | |||
updated, and how it is to be processed in lookups. | updated, and how it is to be processed in lookups. | |||
The mechanisms around new RD parameters should be designed in such a | The mechanisms around new RD parameters should be designed in such a | |||
way that they tolerate RD implementations that are unaware of the | way that they tolerate RD implementations that are unaware of the | |||
parameter and expose any parameter passed at registration or updates | parameter and expose any parameter passed at registration or updates | |||
on in endpoint lookups. (For example, if a parameter used at | on in endpoint lookups. (For example, if a parameter used at | |||
registration were to be confidential, the registering endpoint should | registration were to be confidential, the registering endpoint should | |||
be instructed to only set that parameter if the RD advertises support | be instructed to only set that parameter if the RD advertises support | |||
skipping to change at page 41, line 29 ¶ | skipping to change at page 45, line 39 ¶ | |||
| | | | | available | | | | | | | available | | |||
| Page | page | Integer | L | Used for pagination | | | Page | page | Integer | L | Used for pagination | | |||
| Count | count | Integer | L | Used for pagination | | | Count | count | Integer | L | Used for pagination | | |||
| Endpoint | et | | RLA | Semantic name of the | | | Endpoint | et | | RLA | Semantic name of the | | |||
| Type | | | | endpoint (see | | | Type | | | | endpoint (see | | |||
| | | | | Section 9.4) | | | | | | | Section 9.4) | | |||
+--------------+-------+---------------+-----+----------------------+ | +--------------+-------+---------------+-----+----------------------+ | |||
Table 2: RD Parameters | Table 2: RD Parameters | |||
(Short: Short name used in query parameters or link attributes. Use: | (Short: Short name used in query parameters or target attributes. | |||
R = used at registration, L = used at lookup, A = expressed in link | Use: R = used at registration, L = used at lookup, A = expressed in | |||
attribute | target attribute | |||
The descriptions for the options defined in this document are only | The descriptions for the options defined in this document are only | |||
summarized here. To which registrations they apply and when they are | summarized here. To which registrations they apply and when they are | |||
to be shown is described in the respective sections of this document. | to be shown is described in the respective sections of this document. | |||
The IANA policy for future additions to the sub-registry is "Expert | The IANA policy for future additions to the sub-registry is "Expert | |||
Review" as described in [RFC8126]. The evaluation should consider | Review" as described in [RFC8126]. The evaluation should consider | |||
formal criteria, duplication of functionality (Is the new entry | formal criteria, duplication of functionality (Is the new entry | |||
redundant with an existing one?), topical suitability (E.g. is the | redundant with an existing one?), topical suitability (E.g. is the | |||
described property actually a property of the endpoint and not a | described property actually a property of the endpoint and not a | |||
property of a particular resource, in which case it should go into | property of a particular resource, in which case it should go into | |||
the payload of the registration and need not be registered?), and the | the payload of the registration and need not be registered?), and the | |||
potential for conflict with commonly used link attributes (For | potential for conflict with commonly used target attributes (For | |||
example, "if" could be used as a parameter for conditional | example, "if" could be used as a parameter for conditional | |||
registration if it were not to be used in lookup or attributes, but | registration if it were not to be used in lookup or attributes, but | |||
would make a bad parameter for lookup, because a resource lookup with | would make a bad parameter for lookup, because a resource lookup with | |||
an "if" query parameter could ambiguously filter by the registered | an "if" query parameter could ambiguously filter by the registered | |||
endpoint property or the [RFC6690] link attribute). It is expected | endpoint property or the [RFC6690] target attribute). It is expected | |||
that the registry will receive between 5 and 50 registrations in | that the registry will receive between 5 and 50 registrations in | |||
total over the next years. | total over the next years. | |||
9.3.1. Full description of the "Endpoint Type" Registration Parameter | 9.3.1. Full description of the "Endpoint Type" Registration Parameter | |||
An endpoint registering at an RD can describe itself with endpoint | An endpoint registering at an RD can describe itself with endpoint | |||
types, similar to how resources are described with Resource Types in | types, similar to how resources are described with Resource Types in | |||
[RFC6690]. An endpoint type is expressed as a string, which can be | [RFC6690]. An endpoint type is expressed as a string, which can be | |||
either a URI or one of the values defined in the Endpoint Type sub- | either a URI or one of the values defined in the Endpoint Type sub- | |||
registry. Endpoint types can be passed in the "et" query parameter | registry. Endpoint types can be passed in the "et" query parameter | |||
skipping to change at page 42, line 48 ¶ | skipping to change at page 47, line 10 ¶ | |||
Section 9.3.1. | Section 9.3.1. | |||
o The registered values MUST conform to the ABNF reg-rel-type | o The registered values MUST conform to the ABNF reg-rel-type | |||
definition of [RFC6690] and MUST NOT be a URI. | definition of [RFC6690] and MUST NOT be a URI. | |||
o It is recommended to use the period "." character for | o It is recommended to use the period "." character for | |||
segmentation. | segmentation. | |||
The registry initially contains one value: | The registry initially contains one value: | |||
o "core.rd-group": An application group as described in | o "core.rd-group": An application group as described in Appendix A. | |||
Section 5.3.3. | ||||
9.5. Multicast Address Registration | 9.5. Multicast Address Registration | |||
IANA has assigned the following multicast addresses for use by CoAP | IANA has assigned the following multicast addresses for use by CoAP | |||
nodes: | nodes: | |||
IPv4 - "all CoRE resource directories" address, from the "IPv4 | IPv4 - "all CoRE resource directories" address, from the "IPv4 | |||
Multicast Address Space Registry" equal to "All CoAP Nodes", | Multicast Address Space Registry" equal to "All CoAP Nodes", | |||
224.0.1.187. As the address is used for discovery that may span | 224.0.1.187. As the address is used for discovery that may span | |||
beyond a single network, it has come from the Internetwork Control | beyond a single network, it has come from the Internetwork Control | |||
skipping to change at page 43, line 32 ¶ | skipping to change at page 47, line 39 ¶ | |||
10. Examples | 10. Examples | |||
Two examples are presented: a Lighting Installation example in | Two examples are presented: a Lighting Installation example in | |||
Section 10.1 and a LWM2M example in Section 10.2. | Section 10.1 and a LWM2M example in Section 10.2. | |||
10.1. Lighting Installation | 10.1. Lighting Installation | |||
This example shows a simplified lighting installation which makes use | This example shows a simplified lighting installation which makes use | |||
of the Resource Directory (RD) with a CoAP interface to facilitate | of the Resource Directory (RD) with a CoAP interface to facilitate | |||
the installation and start up of the application code in the lights | the installation and start-up of the application code in the lights | |||
and sensors. In particular, the example leads to the definition of a | and sensors. In particular, the example leads to the definition of a | |||
group and the enabling of the corresponding multicast address as | group and the enabling of the corresponding multicast address as | |||
described in Section 5.3.3. No conclusions must be drawn on the | described in Appendix A. No conclusions must be drawn on the | |||
realization of actual installation or naming procedures, because the | realization of actual installation or naming procedures, because the | |||
example only "emphasizes" some of the issues that may influence the | example only "emphasizes" some of the issues that may influence the | |||
use of the RD and does not pretend to be normative. | use of the RD and does not pretend to be normative. | |||
10.1.1. Installation Characteristics | 10.1.1. Installation Characteristics | |||
The example assumes that the installation is managed. That means | The example assumes that the installation is managed. That means | |||
that a Commissioning Tool (CT) is used to authorize the addition of | that a Commissioning Tool (CT) is used to authorize the addition of | |||
nodes, name them, and name their services. The CT can be connected | nodes, name them, and name their services. The CT can be connected | |||
to the installation in many ways: the CT can be part of the | to the installation in many ways: the CT can be part of the | |||
skipping to change at page 47, line 10 ¶ | skipping to change at page 51, line 17 ¶ | |||
The luminary, knowing its sector and being configured to join any | The luminary, knowing its sector and being configured to join any | |||
group containing lights, searches for candidate groups and joins | group containing lights, searches for candidate groups and joins | |||
them: | them: | |||
Req: GET coap://[2001:db8:4::ff]/rd-lookup/ep | Req: GET coap://[2001:db8:4::ff]/rd-lookup/ep | |||
?d=R2-4-015&et=core.rd-group&rt=light | ?d=R2-4-015&et=core.rd-group&rt=light | |||
Res: 2.05 Content | Res: 2.05 Content | |||
</rd/501>;ep="grp_R2-4-015";et="core.rd-group"; | </rd/501>;ep="grp_R2-4-015";et="core.rd-group"; | |||
base="coap://[ff05::1]" | base="coap://[ff05::1]";rt="core.rd-ep" | |||
From the returned base parameter value, the luminary learns the | From the returned base parameter value, the luminary learns the | |||
multicast address of the multicast group. | multicast address of the multicast group. | |||
Alternatively, the CT can communicate the multicast address directly | Alternatively, the CT can communicate the multicast address directly | |||
to the luminaries by using the "coap-group" resource specified in | to the luminaries by using the "coap-group" resource specified in | |||
[RFC7390]. | [RFC7390]. | |||
Req: POST coap://[2001:db8:4::1]/coap-group | Req: POST coap://[2001:db8:4::1]/coap-group | |||
Content-Format: application/coap-group+json | Content-Format: application/coap-group+json | |||
skipping to change at page 50, line 45 ¶ | skipping to change at page 55, line 4 ¶ | |||
et - Endpoint Type | et - Endpoint Type | |||
base - Registration Base URI | base - Registration Base URI | |||
The endpoint registration must include a payload containing links to | The endpoint registration must include a payload containing links to | |||
all supported objects and existing object instances, optionally | all supported objects and existing object instances, optionally | |||
including the appropriate link-format relations. | including the appropriate link-format relations. | |||
Here is an example LWM2M registration payload: | Here is an example LWM2M registration payload: | |||
</1>,</1/0>,</3/0>,</5> | </1>,</1/0>,</3/0>,</5> | |||
This link format payload indicates that object ID 1 (LWM2M Server | This link format payload indicates that object ID 1 (LWM2M Server | |||
Object) is supported, with a single instance 0 existing, object ID 3 | Object) is supported, with a single instance 0 existing, object ID 3 | |||
(LWM2M Device object) is supported, with a single instance 0 | (LWM2M Device object) is supported, with a single instance 0 | |||
existing, and object 5 (LWM2M Firmware Object) is supported, with no | existing, and object 5 (LWM2M Firmware Object) is supported, with no | |||
existing instances. | existing instances. | |||
10.2.3. LWM2M Update Endpoint Registration | 10.2.3. LWM2M Update Endpoint Registration | |||
The LwM2M update is really very similar to the registration update as | The LwM2M update is really very similar to the registration update as | |||
described in Appendix A.1, with the only difference that there are | described in Section 5.4.1, with the only difference that there are | |||
more parameters defined and available. All the parameters listed in | more parameters defined and available. All the parameters listed in | |||
that section are also available with the initial registration but are | that section are also available with the initial registration but are | |||
all optional: | all optional: | |||
lt - Registration Lifetime | lt - Registration Lifetime | |||
b - Protocol Binding | b - Protocol Binding | |||
sms - MSISDN | sms - MSISDN | |||
link payload - new or modified links | link payload - new or modified links | |||
A Registration update is also specified to be used to update the | A Registration update is also specified to be used to update the | |||
LWM2M server whenever the endpoint's UDP port or IP address are | LWM2M server whenever the endpoint's UDP port or IP address are | |||
changed. | changed. | |||
10.2.4. LWM2M De-Register Endpoint | 10.2.4. LWM2M De-Register Endpoint | |||
LWM2M allows for de-registration using the delete method on the | LWM2M allows for de-registration using the delete method on the | |||
returned location from the initial registration operation. LWM2M de- | returned location from the initial registration operation. LWM2M de- | |||
registration proceeds as described in Appendix A.2. | registration proceeds as described in Section 5.4.2. | |||
11. Acknowledgments | 11. Acknowledgments | |||
Oscar Novo, Srdjan Krco, Szymon Sasin, Kerry Lynn, Esko Dijk, Anders | Oscar Novo, Srdjan Krco, Szymon Sasin, Kerry Lynn, Esko Dijk, Anders | |||
Brandt, Matthieu Vial, Jim Schaad, Mohit Sethi, Hauke Petersen, | Brandt, Matthieu Vial, Jim Schaad, Mohit Sethi, Hauke Petersen, | |||
Hannes Tschofenig, Sampo Ukkola, Linyi Tian, and Jan Newmarch have | Hannes Tschofenig, Sampo Ukkola, Linyi Tian, and Jan Newmarch have | |||
provided helpful comments, discussions and ideas to improve and shape | provided helpful comments, discussions and ideas to improve and shape | |||
this document. Zach would also like to thank his colleagues from the | this document. Zach would also like to thank his colleagues from the | |||
EU FP7 SENSEI project, where many of the resource directory concepts | EU FP7 SENSEI project, where many of the resource directory concepts | |||
were originally developed. | were originally developed. | |||
12. Changelog | 12. Changelog | |||
changes from -17 to -18 | ||||
o Rather than re-specifying link format (Modernized Link Format), | ||||
describe a Limited Link Format that's the uncontested subset of | ||||
Link Format | ||||
o Acknowledging the -17 version as part of the draft | ||||
o Move "Read endpoint links" operation to future specification like | ||||
PATCH | ||||
o Demote links-json to an informative reference, and removed them | ||||
from exchange examples | ||||
o Add note on unusability of link-local IP addresses, and describe | ||||
mitigation. | ||||
o Reshuffling of sections: Move additional operations and endpoint | ||||
lookup back from appendix, and groups into one | ||||
o Lookup interface tightened to not imply applicability for non | ||||
link-format lookups (as those can have vastly different views on | ||||
link cardinality) | ||||
o Simple registration: Change sequence of GET and POST-response, | ||||
ensuring unsuccessful registrations are reported as such, and | ||||
suggest how devices that would have required the inverse behavior | ||||
can still cope with it. | ||||
o Abstract and introduction reworded to avoid the impression that | ||||
resources are stored in full in the RD | ||||
o Simplify the rules governing when a registration resource can or | ||||
must be changed. | ||||
o Drop a figure that has become useless due to the changes of and | ||||
-13 and -17 | ||||
o Wording consistency fixes: Use "Registrations" and "target | ||||
attributes" | ||||
o Fix incorrect use of content negotiation in discovery interface | ||||
description (Content-Format -> Accept) | ||||
o State that the base attribute value is part of endpoint lookup | ||||
even when implicit in the registration | ||||
o Update references from RFC5988 to its update RFC8288 | ||||
o Remove appendix on protocol-negotiation (which had a note to be | ||||
removed before publication) | ||||
changes from -16 to -17 | changes from -16 to -17 | |||
(Note that -17 is published as a direct follow-up to -16, containing | (Note that -17 is published as a direct follow-up to -16, containing | |||
a single change to be discussed at IETF103) | a single change to be discussed at IETF103) | |||
o Removed groups that are enumerations of registrations and have | o Removed groups that are enumerations of registrations and have | |||
dedicated mechanism | dedicated mechanism | |||
o Add groups that are enumerations of shared resources and are a | o Add groups that are enumerations of shared resources and are a | |||
special case of endpoint registrations | special case of endpoint registrations | |||
changes from -15 to -16 | changes from -15 to -16 | |||
o Recommend a common set of resources for members of a group | o Recommend a common set of resources for members of a group | |||
o Clarified use of multicast group in lighting example | o Clarified use of multicast group in lighting example | |||
o Add note on concurrent registrations from one EP being possible | o Add note on concurrent registrations from one EP being possible | |||
but not expected | but not expected | |||
o Refresh web examples appendix to reflect current use of Modernized | o Refresh web examples appendix to reflect current use of Modernized | |||
Link Format | Link Format | |||
skipping to change at page 58, line 39 ¶ | skipping to change at page 63, line 49 ¶ | |||
stable, allowing for endpoint and Domain information to be changed | stable, allowing for endpoint and Domain information to be changed | |||
during updates. | during updates. | |||
o Changed the lookup interface to accept endpoint and Domain as | o Changed the lookup interface to accept endpoint and Domain as | |||
query string parameters to control the scope of a lookup. | query string parameters to control the scope of a lookup. | |||
13. References | 13. References | |||
13.1. Normative References | 13.1. Normative References | |||
[I-D.ietf-core-links-json] | ||||
Li, K., Rahman, A., and C. Bormann, "Representing | ||||
Constrained RESTful Environments (CoRE) Link Format in | ||||
JSON and CBOR", draft-ietf-core-links-json-10 (work in | ||||
progress), February 2018. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
<https://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
[RFC5988] Nottingham, M., "Web Linking", RFC 5988, | ||||
DOI 10.17487/RFC5988, October 2010, | ||||
<https://www.rfc-editor.org/info/rfc5988>. | ||||
[RFC6570] Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., | [RFC6570] Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., | |||
and D. Orchard, "URI Template", RFC 6570, | and D. Orchard, "URI Template", RFC 6570, | |||
DOI 10.17487/RFC6570, March 2012, | DOI 10.17487/RFC6570, March 2012, | |||
<https://www.rfc-editor.org/info/rfc6570>. | <https://www.rfc-editor.org/info/rfc6570>. | |||
[RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link | [RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link | |||
Format", RFC 6690, DOI 10.17487/RFC6690, August 2012, | Format", RFC 6690, DOI 10.17487/RFC6690, August 2012, | |||
<https://www.rfc-editor.org/info/rfc6690>. | <https://www.rfc-editor.org/info/rfc6690>. | |||
[RFC6763] Cheshire, S. and M. Krochmal, "DNS-Based Service | [RFC6763] Cheshire, S. and M. Krochmal, "DNS-Based Service | |||
skipping to change at page 60, line 5 ¶ | skipping to change at page 64, line 45 ¶ | |||
[I-D.arkko-core-dev-urn] | [I-D.arkko-core-dev-urn] | |||
Arkko, J., Jennings, C., and Z. Shelby, "Uniform Resource | Arkko, J., Jennings, C., and Z. Shelby, "Uniform Resource | |||
Names for Device Identifiers", draft-arkko-core-dev-urn-05 | Names for Device Identifiers", draft-arkko-core-dev-urn-05 | |||
(work in progress), October 2017. | (work in progress), October 2017. | |||
[I-D.bormann-t2trg-rel-impl] | [I-D.bormann-t2trg-rel-impl] | |||
Bormann, C., "impl-info: A link relation type for | Bormann, C., "impl-info: A link relation type for | |||
disclosing implementation information", draft-bormann- | disclosing implementation information", draft-bormann- | |||
t2trg-rel-impl-00 (work in progress), January 2018. | t2trg-rel-impl-00 (work in progress), January 2018. | |||
[I-D.hartke-t2trg-coral] | ||||
Hartke, K., "The Constrained RESTful Application Language | ||||
(CoRAL)", draft-hartke-t2trg-coral-06 (work in progress), | ||||
October 2018. | ||||
[I-D.ietf-ace-oauth-authz] | [I-D.ietf-ace-oauth-authz] | |||
Seitz, L., Selander, G., Wahlstroem, E., Erdtman, S., and | Seitz, L., Selander, G., Wahlstroem, E., Erdtman, S., and | |||
H. Tschofenig, "Authentication and Authorization for | H. Tschofenig, "Authentication and Authorization for | |||
Constrained Environments (ACE) using the OAuth 2.0 | Constrained Environments (ACE) using the OAuth 2.0 | |||
Framework (ACE-OAuth)", draft-ietf-ace-oauth-authz-16 | Framework (ACE-OAuth)", draft-ietf-ace-oauth-authz-17 | |||
(work in progress), October 2018. | (work in progress), November 2018. | |||
[I-D.ietf-anima-bootstrapping-keyinfra] | [I-D.ietf-anima-bootstrapping-keyinfra] | |||
Pritikin, M., Richardson, M., Behringer, M., Bjarnason, | Pritikin, M., Richardson, M., Behringer, M., Bjarnason, | |||
S., and K. Watsen, "Bootstrapping Remote Secure Key | S., and K. Watsen, "Bootstrapping Remote Secure Key | |||
Infrastructures (BRSKI)", draft-ietf-anima-bootstrapping- | Infrastructures (BRSKI)", draft-ietf-anima-bootstrapping- | |||
keyinfra-16 (work in progress), June 2018. | keyinfra-17 (work in progress), November 2018. | |||
[I-D.ietf-core-links-json] | ||||
Li, K., Rahman, A., and C. Bormann, "Representing | ||||
Constrained RESTful Environments (CoRE) Link Format in | ||||
JSON and CBOR", draft-ietf-core-links-json-10 (work in | ||||
progress), February 2018. | ||||
[I-D.silverajan-core-coap-protocol-negotiation] | [I-D.silverajan-core-coap-protocol-negotiation] | |||
Silverajan, B. and M. Ocak, "CoAP Protocol Negotiation", | Silverajan, B. and M. Ocak, "CoAP Protocol Negotiation", | |||
draft-silverajan-core-coap-protocol-negotiation-09 (work | draft-silverajan-core-coap-protocol-negotiation-09 (work | |||
in progress), July 2018. | in progress), July 2018. | |||
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | ||||
Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | ||||
Transfer Protocol -- HTTP/1.1", RFC 2616, | ||||
DOI 10.17487/RFC2616, June 1999, | ||||
<https://www.rfc-editor.org/info/rfc2616>. | ||||
[RFC6775] Shelby, Z., Ed., Chakrabarti, S., Nordmark, E., and C. | [RFC6775] Shelby, Z., Ed., Chakrabarti, S., Nordmark, E., and C. | |||
Bormann, "Neighbor Discovery Optimization for IPv6 over | Bormann, "Neighbor Discovery Optimization for IPv6 over | |||
Low-Power Wireless Personal Area Networks (6LoWPANs)", | Low-Power Wireless Personal Area Networks (6LoWPANs)", | |||
RFC 6775, DOI 10.17487/RFC6775, November 2012, | RFC 6775, DOI 10.17487/RFC6775, November 2012, | |||
<https://www.rfc-editor.org/info/rfc6775>. | <https://www.rfc-editor.org/info/rfc6775>. | |||
[RFC6874] Carpenter, B., Cheshire, S., and R. Hinden, "Representing | ||||
IPv6 Zone Identifiers in Address Literals and Uniform | ||||
Resource Identifiers", RFC 6874, DOI 10.17487/RFC6874, | ||||
February 2013, <https://www.rfc-editor.org/info/rfc6874>. | ||||
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7230>. | <https://www.rfc-editor.org/info/rfc7230>. | |||
[RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | |||
Application Protocol (CoAP)", RFC 7252, | Application Protocol (CoAP)", RFC 7252, | |||
DOI 10.17487/RFC7252, June 2014, | DOI 10.17487/RFC7252, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7252>. | <https://www.rfc-editor.org/info/rfc7252>. | |||
skipping to change at page 61, line 23 ¶ | skipping to change at page 66, line 28 ¶ | |||
<https://www.rfc-editor.org/info/rfc8132>. | <https://www.rfc-editor.org/info/rfc8132>. | |||
[RFC8288] Nottingham, M., "Web Linking", RFC 8288, | [RFC8288] Nottingham, M., "Web Linking", RFC 8288, | |||
DOI 10.17487/RFC8288, October 2017, | DOI 10.17487/RFC8288, October 2017, | |||
<https://www.rfc-editor.org/info/rfc8288>. | <https://www.rfc-editor.org/info/rfc8288>. | |||
[RFC8392] Jones, M., Wahlstroem, E., Erdtman, S., and H. Tschofenig, | [RFC8392] Jones, M., Wahlstroem, E., Erdtman, S., and H. Tschofenig, | |||
"CBOR Web Token (CWT)", RFC 8392, DOI 10.17487/RFC8392, | "CBOR Web Token (CWT)", RFC 8392, DOI 10.17487/RFC8392, | |||
May 2018, <https://www.rfc-editor.org/info/rfc8392>. | May 2018, <https://www.rfc-editor.org/info/rfc8392>. | |||
Appendix A. Registration Management | Appendix A. Groups Registration and Lookup | |||
This section describes how the registering endpoint can maintain the | ||||
registries that it created. The registering endpoint can be the | ||||
registrant-ep or the CT. An endpoint SHOULD NOT use this interface | ||||
for registries that it did not create. The registries are resources | ||||
of the RD. | ||||
After the initial registration, the registering endpoint retains the | ||||
returned location of the Registration Resource for further | ||||
operations, including refreshing the registration in order to extend | ||||
the lifetime and "keep-alive" the registration. When the lifetime of | ||||
the registration has expired, the RD SHOULD NOT respond to discovery | ||||
queries concerning this endpoint. The RD SHOULD continue to provide | ||||
access to the Registration Resource after a registration time-out | ||||
occurs in order to enable the registering endpoint to eventually | ||||
refresh the registration. The RD MAY eventually remove the | ||||
registration resource for the purpose of garbage collection. If the | ||||
Registration Resource is removed, the corresponding endpoint will | ||||
need to be re-registered. | ||||
The Registration Resource may also be used to inspect the | ||||
registration resource using GET, update the registration, cancel the | ||||
registration using DELETE, or do an endpoint lookup. | ||||
These operations are described below. | ||||
A.1. Registration Update | ||||
The update interface is used by the registering endpoint to refresh | ||||
or update its registration with an RD. To use the interface, the | ||||
registering endpoint sends a POST request to the registration | ||||
resource returned by the initial registration operation. | ||||
An update MAY update the lifetime- or the context- registration | ||||
parameters "lt", "base" as in Section 5.3. Parameters that are not | ||||
being changed SHOULD NOT be included in an update. Adding parameters | ||||
that have not changed increases the size of the message but does not | ||||
have any other implications. Parameters MUST be included as query | ||||
parameters in an update operation as in Section 5.3. | ||||
A registration update resets the timeout of the registration to the | ||||
(possibly updated) lifetime of the registration, independent of | ||||
whether a "lt" parameter was given. | ||||
If the context of the registration is changed in an update, relative | ||||
references submitted in the original registration or later updates | ||||
are resolved anew against the new context. | ||||
The registration update operation only describes the use of POST with | ||||
an empty payload. Future standards might describe the semantics of | ||||
using content formats and payloads with the POST method to update the | ||||
links of a registration (see Appendix A.4). | ||||
The update registration request interface is specified as follows: | ||||
Interaction: EP -> RD | ||||
Method: POST | ||||
URI Template: {+location}{?lt,con,extra-attrs*} | ||||
URI Template Variables: | ||||
location := This is the Location returned by the RD as a result | ||||
of a successful earlier registration. | ||||
lt := Lifetime (optional). Lifetime of the registration in | ||||
seconds. Range of 60-4294967295. If no lifetime is included, | ||||
the previous last lifetime set on a previous update or the | ||||
original registration (falling back to 90000) SHOULD be used. | ||||
base := Base URI (optional). This parameter updates the Base URI | ||||
established in the original registration to a new value. If | ||||
the parameter is set in an update, it is stored by the RD as | ||||
the new Base URI under which to interpret the relative links | ||||
present in the payload of the original registration, following | ||||
the same restrictions as in the registration. If the parameter | ||||
is not set in the request but was set before, the previous Base | ||||
URI value is kept unmodified. If the parameter is not set in | ||||
the request and was not set before either, the source address | ||||
and source port of the update request are stored as the Base | ||||
URI. | ||||
extra-attrs := Additional registration attributes (optional). As | ||||
with the registration, the RD processes them if it knows their | ||||
semantics. Otherwise, unknown attributes are stored as | ||||
endpoint attributes, overriding any previously stored endpoint | ||||
attributes of the same key. | ||||
Content-Format: none (no payload) | ||||
The following response codes are defined for this interface: | ||||
Success: 2.04 "Changed" or 204 "No Content" if the update was | ||||
successfully processed. | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | ||||
request. | ||||
Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | ||||
exist (e.g. may have expired). | ||||
Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | ||||
Service could not perform the operation. | ||||
HTTP support: YES | ||||
If the registration update fails with a "Service Unavailable" | ||||
response and a Max-Age option or Retry-After header, the registering | ||||
endpoint SHOULD retry the operation after the time indicated. If the | ||||
registration fails in another way, including request timeouts, or if | ||||
the time indicated exceeds the remaining lifetime, the registering | ||||
endpoint SHOULD attempt registration again. | ||||
The following example shows how the registering endpoint updates its | ||||
registration resource at an RD using this interface with the example | ||||
location value: /rd/4521. | ||||
Req: POST /rd/4521 | ||||
Res: 2.04 Changed | ||||
The following example shows the registering endpoint updating its | ||||
registration resource at an RD using this interface with the example | ||||
location value: /rd/4521. The initial registration by the | ||||
registering endpoint set the following values: | ||||
o endpoint name (ep)=endpoint1 | ||||
o lifetime (lt)=500 | The RD-Groups usage pattern allows announcing application groups | |||
inside a Resource Directory. | ||||
o Base URI (base)=coap://local-proxy-old.example.com:5683 | Groups are represented by endpoint registrations. Their base address | |||
is a multicast address, and they SHOULD be entered with the endpoint | ||||
type "core.rd-group". The endpoint name can also be referred to as a | ||||
group name in this context. | ||||
o payload of Figure 7 | The registration is inserted into the RD by a Commissioning Tool, | |||
which might also be known as a group manager here. It performs third | ||||
party registration and registration updates. | ||||
The initial state of the Resource Directory is reflected in the | The links it registers SHOULD be available on all members that join | |||
following request: | the group. Depending on the application, members that lack some | |||
resource MAY be permissible if requests to them fail gracefully. | ||||
Req: GET /rd-lookup/res?ep=endpoint1 | The following example shows a CT registering a group with the name | |||
"lights" which provides two resources. The directory resource path | ||||
/rd is an example RD location discovered in a request similar to | ||||
Figure 5. | ||||
Res: 2.01 Content | Req: POST coap://rd.example.com/rd?ep=lights&et=core.rd-group | |||
&base=coap://[ff35:30:2001:db8::1] | ||||
Content-Format: 40 | ||||
Payload: | Payload: | |||
<coap://local-proxy-old.example.com:5683/sensors/temp>;ct=41; | </light>;rt="light";if="core.a", | |||
rt="temperature"; anchor="coap://spurious.example.com:5683", | </color-temperature>;if="core.p";u="K" | |||
<coap://local-proxy-old.example.com:5683/sensors/light>;ct=41; | ||||
rt="light-lux"; if="sensor"; | ||||
anchor="coap://local-proxy-old.example.com:5683" | ||||
The following example shows the registering endpoint changing the | ||||
Base URI to "coaps://new.example.com:5684": | ||||
Req: POST /rd/4521?base=coaps://new.example.com:5684 | ||||
Res: 2.04 Changed | ||||
The consecutive query returns: | Res: 2.01 Created | |||
Location-Path: /rd/12 | ||||
Req: GET /rd-lookup/res?ep=endpoint1 | In this example, the group manager can easily permit devices that | |||
have no writable color-temperature to join, as they would still | ||||
respond to brightness changing commands. Had the group instead | ||||
contained a single resource that sets brightness and color | ||||
temperature atomically, endpoints would need to support both | ||||
properties. | ||||
Res: 2.01 Content | The resources of a group can be looked up like any other resource, | |||
Payload: | and the group registrations (along with any additional registration | |||
<coaps://new.example.com:5684/sensors/temp>;ct=41;rt="temperature"; | parameters) can be looked up using the endpoint lookup interface. | |||
anchor="coap://spurious.example.com:5683", | ||||
<coaps://new.example.com:5684/sensors/light>;ct=41;rt="light-lux"; | ||||
if="sensor"; anchor="coaps://new.example.com:5684", | ||||
The following example shows a client performing and enpoint lookup | The following example shows a client performing and endpoint lookup | |||
for all groups. | for all groups. | |||
Req: GET /rd-lookup/ep?et=core.rd-group | Req: GET /rd-lookup/ep?et=core.rd-group | |||
Res: 2.01 Content | Res: 2.01 Content | |||
Payload: | Payload: | |||
</rd/501>;ep="GRP_R2-4-015";et="core.rd-group"; | </rd/501>;ep="GRP_R2-4-015";et="core.rd-group"; | |||
base="coap://[ff05:;1]", | base="coap://[ff05::1]", | |||
<rd/12>;ep=lights&et=core.rd-group; | </rd/12>;ep=lights&et=core.rd-group; | |||
base="coap://[ff35:30:2001:db8::1]" | base="coap://[ff35:30:2001:db8::1]";rt="core.rd-ep" | |||
A.2. Registration Removal | ||||
Although RD entries have soft state and will eventually timeout after | ||||
their lifetime, the registering endpoint SHOULD explicitly remove an | ||||
entry from the RD if it knows it will no longer be available (for | ||||
example on shut-down). This is accomplished using a removal | ||||
interface on the RD by performing a DELETE on the endpoint resource. | ||||
The removal request interface is specified as follows: | ||||
Interaction: EP -> RD | ||||
Method: DELETE | ||||
URI Template: {+location} | ||||
URI Template Variables: | ||||
location := This is the Location returned by the RD as a result | ||||
of a successful earlier registration. | ||||
The following response codes are defined for this interface: | ||||
Success: 2.02 "Deleted" or 204 "No Content" upon successful deletion | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | ||||
request. | ||||
Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | ||||
exist (e.g. may have expired). | ||||
Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | ||||
Service could not perform the operation. | ||||
HTTP support: YES | ||||
The following examples shows successful removal of the endpoint from | ||||
the RD with example location value /rd/4521. | ||||
Req: DELETE /rd/4521 | ||||
Res: 2.02 Deleted | ||||
A.3. Read Endpoint Links | ||||
Some registering endpoints may wish to manage their links as a | ||||
collection, and may need to read the current set of links stored in | ||||
the registration resource, in order to determine link maintenance | ||||
operations. | ||||
One or more links MAY be selected by using query filtering as | ||||
specified in [RFC6690] Section 4.1 | ||||
If no links are selected, the Resource Directory SHOULD return an | ||||
empty payload. | ||||
The read request interface is specified as follows: | ||||
Interaction: EP -> RD | ||||
Method: GET | ||||
URI Template: {+location}{?href,rel,rt,if,ct} | ||||
URI Template Variables: | ||||
location := This is the Location returned by the RD as a result | ||||
of a successful earlier registration. | ||||
href,rel,rt,if,ct := link relations and attributes specified in | ||||
the query in order to select particular links based on their | ||||
relations and attributes. "href" denotes the URI target of the | ||||
link. See [RFC6690] Sec. 4.1 | ||||
The following response codes are defined for this interface: | ||||
Success: 2.05 "Content" or 200 "OK" upon success with an | ||||
"application/link-format", "application/link-format+cbor", or | ||||
"application/link-format+json" payload. | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | ||||
request. | ||||
Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | ||||
exist (e.g. may have expired). | ||||
Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | ||||
Service could not perform the operation. | ||||
HTTP support: YES | ||||
The following examples show successful read of the endpoint links | ||||
from the RD, with example location value /rd/4521 and example | ||||
registration payload of Figure 7. | ||||
Req: GET /rd/4521 | ||||
Res: 2.01 Content | ||||
Payload: | ||||
</sensors/temp>;ct=41;rt="temperature-c";if="sensor"; | ||||
anchor="coap://spurious.example.com:5683", | ||||
</sensors/light>;ct=41;rt="light-lux";if="sensor" | ||||
A.4. Update Endpoint Links | ||||
An iPATCH (or PATCH) update ([RFC8132]) can add, remove or change the | ||||
links of a registration. | ||||
Those operations are out of scope of this document, and will require | ||||
media types suitable for modifying sets of links. | ||||
A.5. Endpoint lookup | ||||
Endpoint lookups result in links to registration resources. Endpoint | ||||
registration resources are annotated with their endpoint names (ep), | ||||
sectors (d, if present) and registration base URI (base) as well as a | ||||
constant resource type (rt="core.rd-ep"); the lifetime (lt) is not | ||||
reported. Additional endpoint attributes are added as link | ||||
attributes to their endpoint link unless their specification says | ||||
otherwise. | ||||
Serializations derived from Link Format, SHOULD present links to | ||||
endpoints in path-absolute form or, if required, as absolute | ||||
references. (This approach avoids the RFC6690 ambiguities.) | ||||
While Endpoint Lookup does expose the registration resources, the RD | ||||
does not need to make them accessible to clients. Clients SHOULD NOT | ||||
attempt to dereference or manipulate them. | ||||
A Resource Directory can report endpoints in lookup that are not | ||||
hosted at the same address. Lookup clients MUST be prepared to see | ||||
arbitrary URIs as registration resources in the results and treat | ||||
them as opaque identifiers; the precise semantics of such links are | ||||
left to future specifications. | ||||
The following example shows a client performing an endpoint type (et) | The following example shows a client performing a lookup of all | |||
lookup with the value oic.d.sensor (which is currently a registered | resources of all endpoints (groups) with et=core.rd-group. | |||
rt value): | ||||
Req: GET /rd-lookup/ep?et=oic.d.sensor | Req: GET /rd-lookup/res?et=core.rd-group | |||
Res: 2.05 Content | <coap://[ff35:30:2001:db8::1]/light>;rt="light";if="core.a"; | |||
</rd/1234>;base="coap://[2001:db8:3::127]:61616";ep="node5"; | et="core.rd-group";anchor="coap://[ff35:30:2001:db8::1]", | |||
et="oic.d.sensor";ct="40", | <coap://[ff35:30:2001:db8::1]/color-temperature>;if="core.p";u="K"; | |||
</rd/4521>;base="coap://[2001:db8:3::129]:61616";ep="node7"; | et="core.rd-group"; | |||
et="oic.d.sensor";ct="40";d="floor-3" | anchor="coap://[ff35:30:2001:db8::1]" | |||
Appendix B. Web links and the Resource Directory | Appendix B. Web links and the Resource Directory | |||
Understanding the semantics of a link-format document and its URI | Understanding the semantics of a link-format document and its URI | |||
references is a journey through different documents ([RFC3986] | references is a journey through different documents ([RFC3986] | |||
defining URIs, [RFC6690] defining link-format documents based on | defining URIs, [RFC6690] defining link-format documents based on | |||
[RFC8288] which defines link headers, and [RFC7252] providing the | [RFC8288] which defines link headers, and [RFC7252] providing the | |||
transport). This appendix summarizes the mechanisms and semantics at | transport). This appendix summarizes the mechanisms and semantics at | |||
play from an entry in ".well-known/core" to a resource lookup. | play from an entry in ".well-known/core" to a resource lookup. | |||
This text is primarily aimed at people entering the field of | This text is primarily aimed at people entering the field of | |||
Constrained Restful Environments from applications that previously | Constrained Restful Environments from applications that previously | |||
did not use web mechanisms. | did not use web mechanisms. | |||
At all examples in this section give compatible results for both | The explanation of the steps makes some shortcuts in the more | |||
Modernized and RFC6690 Link Format; the explanation of the steps | confusing details of [RFC6690], which are justified as all examples | |||
follow Modernized Link Format. | being in Limited Link Format. | |||
B.1. A simple example | B.1. A simple example | |||
Let's start this example with a very simple host, "2001:db8:f0::1". | Let's start this example with a very simple host, "2001:db8:f0::1". | |||
A client that follows classical CoAP Discovery ([RFC7252] Section 7), | A client that follows classical CoAP Discovery ([RFC7252] Section 7), | |||
sends the following multicast request to learn about neighbours | sends the following multicast request to learn about neighbours | |||
supporting resources with resource-type "temperature". | supporting resources with resource-type "temperature". | |||
The client sends a link-local multicast: | The client sends a link-local multicast: | |||
skipping to change at page 69, line 33 ¶ | skipping to change at page 69, line 22 ¶ | |||
B.1.2. Interpreting attributes and relations | B.1.2. Interpreting attributes and relations | |||
Some more information but the record's target can be obtained from | Some more information but the record's target can be obtained from | |||
the payload: the resource type of the target is "temperature", and | the payload: the resource type of the target is "temperature", and | |||
its content type is text/plain (ct=0). | its content type is text/plain (ct=0). | |||
A relation in a web link is a three-part statement that specifies a | A relation in a web link is a three-part statement that specifies a | |||
named relation between the so-called "context resource" and the | named relation between the so-called "context resource" and the | |||
target resource, like "_This page_ has _its table of contents_ at _/ | target resource, like "_This page_ has _its table of contents_ at _/ | |||
toc.html_". In [RFC6690] and modernized link-format documents, there | toc.html_". In link format documents, there is an implicit "host | |||
is an implicit "host relation" specified with default parameter: | relation" specified with default parameter: rel="hosts". | |||
rel="hosts". | ||||
In our example, the context resource of the link is the URI specified | In our example, the context resource of the link is the URI specified | |||
in the GET request "coap:://[2001:db8:f0::1]/.well-known/core". A | in the GET request "coap:://[2001:db8:f0::1]/.well-known/core". A | |||
full English expression of the "host relation" is: | full English expression of the "host relation" is: | |||
'"coap://[2001:db8:f0::1]/.well-known/core" is hosting the resource | '"coap://[2001:db8:f0::1]/.well-known/core" is hosting the resource | |||
"coap://[2001:db8:f0::1]/temp", which is of the resource type | "coap://[2001:db8:f0::1]/temp", which is of the resource type | |||
"temperature" and can be accessed using the text/plain content | "temperature" and can be accessed using the text/plain content | |||
format.' | format.' | |||
skipping to change at page 71, line 18 ¶ | skipping to change at page 71, line 4 ¶ | |||
<coap://[2001:db8:f0::1]/temp>;rt=temperature;ct=0; | <coap://[2001:db8:f0::1]/temp>;rt=temperature;ct=0; | |||
anchor="coap://[2001:db8:f0::1]" | anchor="coap://[2001:db8:f0::1]" | |||
This is not _literally_ the same response that it would have received | This is not _literally_ the same response that it would have received | |||
from a multicast request, but it contains the equivalent statement: | from a multicast request, but it contains the equivalent statement: | |||
'"coap://[2001:db8:f0::1]" is hosting the resource | '"coap://[2001:db8:f0::1]" is hosting the resource | |||
"coap://[2001:db8:f0::1]/temp", which is of the resource type | "coap://[2001:db8:f0::1]/temp", which is of the resource type | |||
"temperature" and can be accessed using the text/plain content | "temperature" and can be accessed using the text/plain content | |||
format.' | format.' | |||
(The difference is whether "/" or "/.well-known/core" hosts the | (The difference is whether "/" or "/.well-known/core" hosts the | |||
resources, which is one of the often misunderstood subtleties | resources, which does not matter in this application; if it did, the | |||
Modernized Link Format addresses. Actually, /.well-known/core does | endpoint would have been more explicit. Actually, /.well-known/core | |||
NOT host the resource but stores a URI reference to the resource.) | does NOT host the resource but stores a URI reference to the | |||
resource.) | ||||
To complete the examples, the client could also query all resources | To complete the examples, the client could also query all resources | |||
hosted at the endpoint with the known endpoint name "simple-host1". | hosted at the endpoint with the known endpoint name "simple-host1". | |||
A request to "coap://[2001:db8:f0::ff]/rd-lookup/res?ep=simple-host1" | A request to "coap://[2001:db8:f0::ff]/rd-lookup/res?ep=simple-host1" | |||
would return | would return | |||
<coap://[2001:db8:f0::1]/temp>;rt=temperature;ct=0; | <coap://[2001:db8:f0::1]/temp>;rt=temperature;ct=0; | |||
anchor="coap://[2001:db8:f0::1]", | anchor="coap://[2001:db8:f0::1]", | |||
<coap://[2001:db8:f0::1]/light>;rt=light-lux;ct=0; | <coap://[2001:db8:f0::1]/light>;rt=light-lux;ct=0; | |||
anchor="coap://[2001:db8:f0::1]", | anchor="coap://[2001:db8:f0::1]", | |||
skipping to change at page 72, line 9 ¶ | skipping to change at page 71, line 41 ¶ | |||
<coap+tcp://simple-host1.example.com/temp>;rt=temperature;ct=0; | <coap+tcp://simple-host1.example.com/temp>;rt=temperature;ct=0; | |||
anchor="coap+tcp://simple-host1.example.com" | anchor="coap+tcp://simple-host1.example.com" | |||
and analogous records. | and analogous records. | |||
B.4. A note on differences between link-format and Link headers | B.4. A note on differences between link-format and Link headers | |||
While link-format and Link headers look very similar and are based on | While link-format and Link headers look very similar and are based on | |||
the same model of typed links, there are some differences between | the same model of typed links, there are some differences between | |||
[RFC6690] and [RFC5988], which are dealt with differently: | [RFC6690] and [RFC8288], which are dealt with differently: | |||
o "Resolving the target against the anchor": [RFC6690] Section 2.1 | o "Resolving the target against the anchor": [RFC6690] Section 2.1 | |||
states that the anchor of a link is used as the Base URI against | states that the anchor of a link is used as the Base URI against | |||
which the term inside the angle brackets (the target) is resolved, | which the term inside the angle brackets (the target) is resolved, | |||
falling back to the resource's URI with paths stripped off (its | falling back to the resource's URI with paths stripped off (its | |||
"Origin"). In contrast to that, [RFC8288] Section B.2 describes | "Origin"). In contrast to that, [RFC8288] Section B.2 describes | |||
that the anchor is immaterial to the resolution of the target | that the anchor is immaterial to the resolution of the target | |||
reference. | reference. | |||
RFC6690, in the same section, also states that absent anchors set | RFC6690, in the same section, also states that absent anchors set | |||
the context of the link to the target's URI with its path stripped | the context of the link to the target's URI with its path stripped | |||
off, while according to [RFC8288] Section 3.2, the context is the | off, while according to [RFC8288] Section 3.2, the context is the | |||
resource's base URI. | resource's base URI. | |||
In the context of a Resource Directory, the authors decided to not | The rules introduced in Appendix C ensure that an RD does not need | |||
let this become an issue by recommending that links in the | to deal with those differences when processing input data. Lookup | |||
Resource Directory be _deserializable_ by either rule set to give | results are required to be absolute references for the same | |||
the same results. Note that all examples of [RFC6690], [RFC8288] | reason. | |||
and this document comply with that rule. | ||||
The Modernized Link Format is introduced in Appendix D to | ||||
formalize what it means to apply the ruleset of RFC8288 to Link | ||||
Format documents. | ||||
o There is no percent encoding in link-format documents. | o There is no percent encoding in link-format documents. | |||
A link-format document is a UTF-8 encoded string of Unicode | A link-format document is a UTF-8 encoded string of Unicode | |||
characters and does not have percent encoding, while Link headers | characters and does not have percent encoding, while Link headers | |||
are practically ASCII strings that use percent encoding for non- | are practically ASCII strings that use percent encoding for non- | |||
ASCII characters, stating the encoding explicitly when required. | ASCII characters, stating the encoding explicitly when required. | |||
For example, while a Link header in a page about a Swedish city | For example, while a Link header in a page about a Swedish city | |||
might read | might read | |||
skipping to change at page 73, line 5 ¶ | skipping to change at page 72, line 35 ¶ | |||
"Link: </temperature/Malm%C3%B6>;rel="live-environment-data"" | "Link: </temperature/Malm%C3%B6>;rel="live-environment-data"" | |||
a link-format document from the same source might describe the | a link-format document from the same source might describe the | |||
link as | link as | |||
"</temperature/Malmoe>;rel="live-environment-data"" | "</temperature/Malmoe>;rel="live-environment-data"" | |||
Parsers and producers of link-format and header data need to be | Parsers and producers of link-format and header data need to be | |||
aware of this difference. | aware of this difference. | |||
Appendix C. Syntax examples for Protocol Negotiation | Appendix C. Limited Link Format | |||
[ This appendix should not show up in a published version of this | ||||
document. ] | ||||
The protocol negotiation that is being worked on in | ||||
[I-D.silverajan-core-coap-protocol-negotiation] makes use of the | ||||
Resource Directory. | ||||
Until that document is update to use the latest resource-directory | ||||
specification, here are some examples of protocol negotiation with | ||||
the current Resource Directory: | ||||
An endpoint could register as follows from its address | ||||
[2001:db8:f1::2]:5683: | ||||
Req: POST coap://rd.example.com/rd?ep=node1 | ||||
&at=coap+tcp://[2001:db8:f1::2] | ||||
Content-Format: 40 | ||||
Payload: | ||||
</temperature>;ct=0;rt="temperature";if="core.s" | ||||
Res: 2.01 Created | ||||
Location-Path: /rd/1234 | ||||
An endpoint lookup would just reflect the registered attributes: | ||||
Req: GET /rd-lookup/ep | ||||
Res: 2.05 Content | ||||
</rd/1234>;ep="node1";base="coap://[2001:db8:f1::2]:5683"; | ||||
at="coap+tcp://[2001:db8:f1::2]" | ||||
A UDP client would then see the following in a resource lookup: | ||||
Req: GET /rd-lookup/res?rt=temperature | ||||
Res: 2.05 Content | ||||
<coap://[2001:db8:f1::2]/temperature>;ct=0;rt="temperature"; | ||||
if="core.s"; anchor="coap://[2001:db8:f1::2]" | ||||
while a TCP capable client could say: | ||||
Req: GET /rd-lookup/res?rt=temperature&tt=tcp | ||||
Res: 2.05 Content | ||||
<coap+tcp://[2001:db8:f1::2]/temperature>;ct=0;rt="temperature"; | ||||
if="core.s";anchor="coap+tcp://[2001:db8:f1::2]" | ||||
Appendix D. Modernized Link Format parsing | ||||
The CoRE Link Format as described in [RFC6690] is unsuitable for some | ||||
use cases of the Resource Directory, and their resolution scheme is | ||||
often misunderstood by developers familiar with [RFC8288]. | ||||
For the correct application of base URIs, we describe the | ||||
interpretation of a Link Format document as a Modernized Link Format. | ||||
In Modernized Link Format, the document is processed as in Link | ||||
Format, with the exception of Section 2.1 of [RFC6690]: | ||||
o The URI-reference inside angle brackets ("<>") describes the | ||||
target URI of the link. | ||||
o The context of the link is expressed by the "anchor" parameter. | ||||
If the anchor attribute is absent, it defaults to the empty | ||||
reference (""). | ||||
o Both these references are resolved according to Section 5 of | ||||
[RFC3986]. | ||||
Content formats derived from [RFC6690] which inherit its resolution | ||||
rules, like JSON and CBOR link format of [I-D.ietf-core-links-json], | ||||
can be interpreted in analogy to that. | ||||
For where the Resource Directory is concerned, all common forms of | ||||
links (e.g. all the examples of RFC6690) yield identical results. | ||||
When interpreting data read from ".well-known/core", differences in | ||||
interpretation only affect links where the absent anchor attribute | ||||
means "coap://host/" according to RFC6690 and "coap://host/.well- | ||||
known/core" according to Modernized Link format; those typically only | ||||
occur in conjunction with the vaguely defined implicit "hosts" | ||||
relationship. | ||||
D.1. For endpoint developers | ||||
When developing endpoints, i.e. when generating documents that will | ||||
be submitted to a Resource Directory, the differences between | ||||
Modernized Link Format and RFC6690 can be ignored as long as | ||||
o all relative references start with a slash, | ||||
and any of the following applies: | ||||
o There is no anchor attribute, and the context of the link does not | ||||
matter to the application. | ||||
Example: "</sensors>;ct=40" | ||||
o The anchor is a relative reference. | ||||
Example: "</t>;anchor="/sensors/temp";rel="alternate"" | ||||
o The target is an absolute reference. | ||||
Example: "<http://www.example.com/sensors/t123>;anchor="/sensors/ | ||||
temp";rel="describedby"" | ||||
D.2. Examples of links with differing interpretations | ||||
Examples of links with different interpretations from either applying | The CoRE Link Format as described in [RFC6690] has been interpreted | |||
RFC6690 or Modernized Link Format are shown here. The example is | differently by implementers, and a strict implementation rules out | |||
assumed to be obtained from a </device/index> document. | some use cases of a Resource Directory (e.g. base values with path | |||
components). | ||||
o "<sensors>": The target is "/sensors" in RFC6690 and "/device/ | This appendix describes a subset of link format documents called | |||
sensors" in Modernized Link Format (whereas "</sensors>" would be | Limited Link Format. The rules herein are not very limiting in | |||
unambiguous). | practice - all examples in RFC6690, and all deployments the authors | |||
are aware of already stick to them - but ease the implementation of | ||||
resource directory servers. | ||||
o "<?which=these>": The target is "/?which=these" in RFC6690 and | It is applicable to representations in the application/link-format | |||
"/device/index?which=these" in Modernized Link Format. | media type, and any other media types that inherit [RFC6690] | |||
Section 2.1. | ||||
o "<sensors>;anchor="http://example.com/calib- | A link format representation is in Limited Link format if, for each | |||
proto/1234";rel="topic"" is about "http://example.com/sensors" in | link in it, the following applies: | |||
RFC6690 and about "/device/sensors" in Modernized Link Format. | ||||
This link can not be expressed in RFC6690 link format without the | o All URI references either follow the URI or the path-absolute ABNF | |||
server explicitly expressing most of its own URI (which is | rule of RFC3986 (i.e. target and anchor each either start with a | |||
problematic in reverse proxy scenarios or when the Uri-Host option | scheme or with a single slash), | |||
is not sent). | ||||
o "</i>;rel="alternate";anchor=""": According to RFC6690, this | o if the anchor reference starts with a scheme, the target reference | |||
states that the "/" resource has an alternative representation at | starts with a scheme as well (i.e. relative references in target | |||
"/i", whereas Modernized Link Format says that "/devices/index" | cannot be used when the anchor is a full URI), and | |||
has an alternative representation at "/i". | ||||
The "anchor" attribute is usually left out; the link | o the application does not care whether links without an explicitly | |||
"</i>;rel="alternate"" is equivalent to the above and results in | given anchor have the origin's "/" or "/.well-known/core" resource | |||
the same interpretations. | as their link context. | |||
Authors' Addresses | Authors' Addresses | |||
Zach Shelby | Zach Shelby | |||
ARM | ARM | |||
150 Rose Orchard | 150 Rose Orchard | |||
San Jose 95134 | San Jose 95134 | |||
USA | USA | |||
Phone: +1-408-203-9434 | Phone: +1-408-203-9434 | |||
Email: zach.shelby@arm.com | Email: zach.shelby@arm.com | |||
Michael Koster | Michael Koster | |||
End of changes. 156 change blocks. | ||||
811 lines changed or deleted | 679 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |