draft-ietf-core-resource-directory-11.txt | draft-ietf-core-resource-directory-12.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: January 4, 2018 SmartThings | Expires: May 3, 2018 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. | |||
Energy Harvesting Solutions | Energy Harvesting Solutions | |||
July 03, 2017 | October 30, 2017 | |||
CoRE Resource Directory | CoRE Resource Directory | |||
draft-ietf-core-resource-directory-11 | draft-ietf-core-resource-directory-12 | |||
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 hosts | |||
descriptions of resources held on other servers, allowing lookups to | descriptions of resources held on other servers, allowing lookups to | |||
be performed for those resources. This document specifies the web | be performed for those resources. This document specifies the web | |||
interfaces that a Resource Directory supports in order for web | interfaces that a Resource Directory supports in order for web | |||
skipping to change at page 1, line 46 ¶ | skipping to change at page 1, line 46 ¶ | |||
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 http://datatracker.ietf.org/drafts/current/. | Drafts is at http://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 January 4, 2018. | This Internet-Draft will expire on May 3, 2018. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2017 IETF Trust and the persons identified as the | Copyright (c) 2017 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 | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://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 26 ¶ | skipping to change at page 2, line 26 ¶ | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
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 . . . . . . . . . . . . . . . . . 5 | 3. Architecture and Use Cases . . . . . . . . . . . . . . . . . 5 | |||
3.1. Principles . . . . . . . . . . . . . . . . . . . . . . . 5 | 3.1. Principles . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
3.2. Architecture . . . . . . . . . . . . . . . . . . . . . . 5 | 3.2. Architecture . . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.3. Use Case: Cellular M2M . . . . . . . . . . . . . . . . . 7 | 3.3. Content model . . . . . . . . . . . . . . . . . . . . . . 7 | |||
3.4. Use Case: Home and Building Automation . . . . . . . . . 8 | 3.4. Use Case: Cellular M2M . . . . . . . . . . . . . . . . . 11 | |||
3.5. Use Case: Link Catalogues . . . . . . . . . . . . . . . . 8 | 3.5. Use Case: Home and Building Automation . . . . . . . . . 12 | |||
4. Finding a Resource Directory . . . . . . . . . . . . . . . . 9 | 3.6. Use Case: Link Catalogues . . . . . . . . . . . . . . . . 12 | |||
4.1. Resource Directory Address Option (RDAO) . . . . . . . . 10 | 4. Finding a Resource Directory . . . . . . . . . . . . . . . . 13 | |||
5. Resource Directory . . . . . . . . . . . . . . . . . . . . . 11 | 4.1. Resource Directory Address Option (RDAO) . . . . . . . . 14 | |||
5.1. Content Formats . . . . . . . . . . . . . . . . . . . . . 12 | 5. Resource Directory . . . . . . . . . . . . . . . . . . . . . 15 | |||
5.2. URI Discovery . . . . . . . . . . . . . . . . . . . . . . 12 | 5.1. Content Formats . . . . . . . . . . . . . . . . . . . . . 16 | |||
5.3. Registration . . . . . . . . . . . . . . . . . . . . . . 14 | 5.2. URI Discovery . . . . . . . . . . . . . . . . . . . . . . 16 | |||
5.3.1. Simple Registration . . . . . . . . . . . . . . . . . 17 | 5.3. Registration . . . . . . . . . . . . . . . . . . . . . . 18 | |||
5.3.2. Simple publishing to Resource Directory Server . . . 18 | 5.3.1. Simple Registration . . . . . . . . . . . . . . . . . 22 | |||
5.3.3. Third-party registration . . . . . . . . . . . . . . 18 | 5.3.2. Third-party registration . . . . . . . . . . . . . . 23 | |||
5.3.4. Plurality of link references in a Registration . . . 19 | 5.4. Operations on the Registration Resource . . . . . . . . . 23 | |||
5.4. Operations on the Registration Resource . . . . . . . . . 19 | 5.4.1. Registration Update . . . . . . . . . . . . . . . . . 24 | |||
5.4.1. Registration Update . . . . . . . . . . . . . . . . . 20 | 5.4.2. Registration Removal . . . . . . . . . . . . . . . . 26 | |||
5.4.2. Registration Removal . . . . . . . . . . . . . . . . 22 | 5.4.3. Read Endpoint Links . . . . . . . . . . . . . . . . . 27 | |||
5.4.3. Read Endpoint Links . . . . . . . . . . . . . . . . . 23 | 5.4.4. Update Endpoint Links . . . . . . . . . . . . . . . . 28 | |||
5.4.4. Update Endpoint Links . . . . . . . . . . . . . . . . 24 | 6. RD Groups . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
6. RD Groups . . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 6.1. Register a Group . . . . . . . . . . . . . . . . . . . . 29 | |||
6.1. Register a Group . . . . . . . . . . . . . . . . . . . . 28 | 6.2. Group Removal . . . . . . . . . . . . . . . . . . . . . . 31 | |||
6.2. Group Removal . . . . . . . . . . . . . . . . . . . . . . 30 | ||||
7. RD Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | 7. RD Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 36 | 7.1. Resource lookup . . . . . . . . . . . . . . . . . . . . . 32 | |||
8.1. Endpoint Identification and Authentication . . . . . . . 36 | 7.2. Endpoint and group lookup . . . . . . . . . . . . . . . . 33 | |||
8.2. Access Control . . . . . . . . . . . . . . . . . . . . . 36 | 7.3. Lookup filtering . . . . . . . . . . . . . . . . . . . . 33 | |||
8.3. Denial of Service Attacks . . . . . . . . . . . . . . . . 37 | 7.4. Lookup examples . . . . . . . . . . . . . . . . . . . . . 35 | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 38 | ||||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | 8.1. Endpoint Identification and Authentication . . . . . . . 38 | |||
9.1. Resource Types . . . . . . . . . . . . . . . . . . . . . 37 | 8.2. Access Control . . . . . . . . . . . . . . . . . . . . . 39 | |||
9.2. IPv6 ND Resource Directory Address Option . . . . . . . . 37 | 8.3. Denial of Service Attacks . . . . . . . . . . . . . . . . 39 | |||
9.3. RD Parameter Registry . . . . . . . . . . . . . . . . . . 37 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 39 | |||
10. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 38 | 9.1. Resource Types . . . . . . . . . . . . . . . . . . . . . 40 | |||
10.1. Lighting Installation . . . . . . . . . . . . . . . . . 38 | 9.2. IPv6 ND Resource Directory Address Option . . . . . . . . 40 | |||
10.1.1. Installation Characteristics . . . . . . . . . . . . 39 | 9.3. RD Parameter Registry . . . . . . . . . . . . . . . . . . 40 | |||
10.1.2. RD entries . . . . . . . . . . . . . . . . . . . . . 40 | 9.3.1. Full description of the "Endpoint Type" Registration | |||
10.2. OMA Lightweight M2M (LWM2M) Example . . . . . . . . . . 43 | Parameter . . . . . . . . . . . . . . . . . . . . . . 42 | |||
10.2.1. The LWM2M Object Model . . . . . . . . . . . . . . . 43 | 9.4. "Endpoint Type" (et=) RD Parameter values . . . . . . . . 42 | |||
10.2.2. LWM2M Register Endpoint . . . . . . . . . . . . . . 45 | 10. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
10.2.3. LWM2M Update Endpoint Registration . . . . . . . . . 46 | 10.1. Lighting Installation . . . . . . . . . . . . . . . . . 43 | |||
10.2.4. LWM2M De-Register Endpoint . . . . . . . . . . . . . 47 | 10.1.1. Installation Characteristics . . . . . . . . . . . . 43 | |||
11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 47 | 10.1.2. RD entries . . . . . . . . . . . . . . . . . . . . . 44 | |||
12. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 47 | 10.2. OMA Lightweight M2M (LWM2M) Example . . . . . . . . . . 47 | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . 51 | 10.2.1. The LWM2M Object Model . . . . . . . . . . . . . . . 47 | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . 51 | 10.2.2. LWM2M Register Endpoint . . . . . . . . . . . . . . 49 | |||
13.2. Informative References . . . . . . . . . . . . . . . . . 52 | 10.2.3. LWM2M Update Endpoint Registration . . . . . . . . . 50 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 53 | 10.2.4. LWM2M De-Register Endpoint . . . . . . . . . . . . . 51 | |||
11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
12. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . 56 | ||||
13.1. Normative References . . . . . . . . . . . . . . . . . . 56 | ||||
13.2. Informative References . . . . . . . . . . . . . . . . . 57 | ||||
Appendix A. Web links and the Resource Directory . . . . . . . . 58 | ||||
A.1. A simple example . . . . . . . . . . . . . . . . . . . . 58 | ||||
A.1.1. Resolving the URIs . . . . . . . . . . . . . . . . . 59 | ||||
A.1.2. Interpreting attributes and relations . . . . . . . . 59 | ||||
A.2. A slightly more complex example . . . . . . . . . . . . . 59 | ||||
A.3. Enter the Resource Directory . . . . . . . . . . . . . . 60 | ||||
A.4. A note on differences between link-format and Link | ||||
headers . . . . . . . . . . . . . . . . . . . . . . . . . 62 | ||||
Appendix B. Syntax examples for Protocol Negotiation . . . . . . 62 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 63 | ||||
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 [RFC5988]. 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 requesting "/.well-known/core". In many | server that hosts them by querying "/.well-known/core". In many M2M | |||
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 descriptions of | entity called a Resource Directory (RD), which hosts descriptions of | |||
resources held on other servers, allowing lookups to be performed for | resources held on other servers, allowing lookups to be performed for | |||
those resources. | those resources. | |||
This document specifies the web interfaces that a Resource Directory | This document specifies the web interfaces that a Resource Directory | |||
supports in order for web servers to discover the RD and to register, | supports in order for web servers to discover the RD and to register, | |||
maintain, lookup and remove resource descriptions. Furthermore, new | maintain, lookup and remove resource descriptions. Furthermore, new | |||
link attributes useful in conjunction with a Resource Directory are | link attributes useful in conjunction with a Resource Directory are | |||
skipping to change at page 4, line 31 ¶ | skipping to change at page 4, line 46 ¶ | |||
This specification makes use of the following additional terminology: | This specification makes use of the following additional terminology: | |||
Resource Directory | Resource Directory | |||
A web entity that stores information about web resources and | A web entity that stores information about web resources and | |||
implements the REST interfaces defined in this specification for | implements the REST interfaces defined in this specification for | |||
registration and lookup of those resources. | registration and lookup of those resources. | |||
Domain | Domain | |||
In the context of a Resource Directory, a domain is a logical | In the context of a Resource Directory, a domain is a logical | |||
grouping of endpoints. This specification assumes that the list | grouping of endpoints. | |||
of Domains supported by an RD is pre-configured by that RD. When | ||||
a domain is exported to DNS, the domain value equates to the DNS | ||||
domain name. | ||||
Group | Group | |||
In the context of a Resource Directory, a group is a logical | In the context of a Resource Directory, a group is a logical | |||
grouping of endpoints for the purpose of group communications. | grouping of endpoints for the purpose of group communications. | |||
All groups within a domain are unique. | All groups within a domain have unique names. | |||
Endpoint | Endpoint | |||
Endpoint (EP) is a term used to describe a web server or client in | Endpoint (EP) is a term used to describe a web server or client in | |||
[RFC7252]. In the context of this specification an endpoint is | [RFC7252]. In the context of this specification an endpoint is | |||
used to describe a web server that registers resources to the | used to describe a web server that registers resources to the | |||
Resource Directory. An endpoint is identified by its endpoint | Resource Directory. An endpoint is identified by its endpoint | |||
name, which is included during registration, and is unique within | name, which is included during registration, and has a unique name | |||
the associated domain of the registration. | within the associated domain of the registration. | |||
Context | Context | |||
When registering links to a Resource Directory, the Context refers | A Context is a base URL that gives scheme and (typically) | |||
to the scheme, address, port, and base path for all the links | authority information about an Endpoint. The Context of an | |||
registered on behalf of an endpoint, of the general form | Endpoint is provided at registration time, and is used by the | |||
scheme://host:port/path/ where the client may explicitly set the | Resource Directory to resolve relative references inside the | |||
scheme and host, and may supply the port and path as optional | registration into absolute URIs. | |||
parameters. When the context of a registration is explicitly set, | ||||
the URI resolution rules in [RFC3986] MUST be applied. | Directory Resource | |||
A resource in the Resource Directory (RD) containing registration | ||||
resources. | ||||
Group Resource | ||||
A resource in the RD containing registration resources of the | ||||
Endpoints that form a group. | ||||
Registration Resource | ||||
A resource in the RD that contains information about an Endpoint | ||||
and its links. | ||||
Commissioning Tool | Commissioning Tool | |||
Commissioning Tool (CT) is a device that assists during the | Commissioning Tool (CT) is a device that assists during the | |||
installation of the network by assigning values to parameters, | installation of the network by assigning values to parameters, | |||
naming endpoints and groups, or adapting the installation to the | naming endpoints and groups, or adapting the installation to the | |||
needs of the applications. | needs of the applications. | |||
RDAO | RDAO | |||
Resource Directory Address Option. | Resource Directory Address Option. | |||
skipping to change at page 5, line 51 ¶ | skipping to change at page 6, line 25 ¶ | |||
information themselves. No other client can modify data in the | information themselves. No other client can modify data in the | |||
resource directory or even expect those changes to propagate back to | resource directory or even expect those changes to propagate back to | |||
its source. | its source. | |||
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 for Web Links | |||
[RFC5988] about resources hosted on other web servers, which are | [RFC5988] about resources hosted on other web servers, which are | |||
called endpoints (EP). An endpoint is a web server associated with a | called endpoints (EP). An endpoint is a web server associated with a | |||
scheme, IP address and port (called Context), thus a physical node | scheme, IP address and port, thus a physical node may host one or | |||
may host one or more endpoints. The RD implements a set of REST | more endpoints. The RD implements a set of REST interfaces for | |||
interfaces for endpoints to register and maintain sets of Web Links | endpoints to register and maintain sets of Web Links (called resource | |||
(called resource directory registration entries), and for clients to | directory registration entries), and for clients to lookup resources | |||
lookup resources from the RD or maintain groups. Endpoints | from the RD or maintain groups. Endpoints themselves can also act as | |||
themselves can also act as clients. An RD can be logically segmented | clients. An RD can be logically segmented by the use of Domains. | |||
by the use of Domains. The domain an endpoint is associated with can | The domain an endpoint is associated with can be defined by the RD or | |||
be defined by the RD or configured by an outside entity. This | configured by an outside entity. This information hierarchy is shown | |||
information hierarchy is shown in Figure 2. | 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. | |||
Endpoints proactively register and maintain resource directory | Endpoints proactively register and maintain resource directory | |||
registration entries on the RD, which are soft state and need to be | registration entries on the RD, which are soft state and need to be | |||
periodically refreshed. | periodically refreshed. | |||
An endpoint is provided with interfaces to register, update and | An endpoint is provided with interfaces to register, update and | |||
remove a resource directory registration entry. It is also possible | remove a resource directory registration entry. It is also possible | |||
for an RD to fetch Web Links from endpoints and add them as resource | for an RD to fetch Web Links from endpoints and add them as resource | |||
directory entries. | directory registration entries. | |||
At the first registration of a set of entries, a "registration | At the first registration of a set of entries, a "registration | |||
resource" is created, the location of which is returned to the | resource" is created, the location of which is returned to the | |||
registering endpoint. The registering endpoint uses this | registering endpoint. The registering endpoint uses this | |||
registration resource to manage the contents of the registration | registration resource to manage the contents of the registration | |||
entry. | entry. | |||
A lookup interface for discovering any of the Web Links held in the | A lookup interface for discovering any of the Web Links held in the | |||
RD is provided using the CoRE Link Format. | RD is provided using the CoRE Link Format. | |||
skipping to change at page 7, line 24 ¶ | skipping to change at page 7, line 43 ¶ | |||
| Endpoint | <-- Name, Scheme, IP, Port | | Endpoint | <-- Name, Scheme, IP, Port | |||
+------------+ | +------------+ | |||
| | | | |||
| | | | |||
+------------+ | +------------+ | |||
| Resource | <-- Target, Parameters | | Resource | <-- Target, Parameters | |||
+------------+ | +------------+ | |||
Figure 2: The resource directory information hierarchy. | Figure 2: The resource directory information hierarchy. | |||
3.3. Use Case: Cellular M2M | 3.3. Content model | |||
The Entity-Relationship (ER) models shown in Figure 3 and Figure 4 | ||||
model the contents of /.well-known/core and the resource directory | ||||
respectively, with entity-relationship diagrams [ER]. Entities | ||||
(rectangles) are used for concepts that exist independently. | ||||
Attributes (ovals) are used for concepts that exist only in | ||||
connection with a related entity. Relations (diamonds) give a | ||||
semantic meaning to the relation between entities. Numbers specify | ||||
the cardinality of the relations. | ||||
Some of the attribute values are URIs. Those values are always full | ||||
URIs and never relative references in the information model. They | ||||
can, however, be expressed as relative references in serializations, | ||||
and often are. | ||||
These models provide an abstract view of the information expressed in | ||||
link-format documents and a Resource Directory. They cover the | ||||
concepts, but not necessarily all details of an RD's operation; they | ||||
are meant to give an overview, and not be a template for | ||||
implementations. | ||||
+----------------------+ | ||||
| /.well-known/core | | ||||
+----------------------+ | ||||
| | ||||
| 1 | ||||
////////\\\\\\\ | ||||
< contains > | ||||
\\\\\\\\/////// | ||||
| | ||||
| 0+ | ||||
+--------------------+ | ||||
| link | | ||||
+--------------------+ | ||||
| | ||||
| 1 oooooooo | ||||
+-----o target o | ||||
0+ | oooooooo | ||||
oooooooooooo | | ||||
o target o--------+ | ||||
o attribute o | 0+ oooooo | ||||
oooooooooooo +-----o rel o | ||||
| oooooo | ||||
| | ||||
| 1 ooooooooo | ||||
+-----o context o | ||||
ooooooooo | ||||
Figure 3: E-R Model of the content of /.well-known/core | ||||
The model shown in Figure 3 models the contents of /.well-known/core | ||||
which contains: | ||||
o a set of links belonging to the host | ||||
The host is free to choose links it deems appropriate to be exposed | ||||
in its ".well-known/core". Typically, the links describe resources | ||||
that are served by the host, but the set can also contain links to | ||||
resources on other servers (see examples in [RFC6690] page 14). The | ||||
set does not necessarily contain links to all resources served by the | ||||
host. | ||||
A link has the following attributes: | ||||
o Zero or more link relations: They describe a relations between the | ||||
link context and the link target. | ||||
In link-format serialization, they are expressed as space- | ||||
separated values in the "rel" attribute, and default to "hosts". | ||||
o A link context URI: It defines the source of the relation, eg. | ||||
_who_ "hosts" something. | ||||
In link-format serialization, it is expressed in the "anchor" | ||||
attribute. There, it can be a relative reference, in which case | ||||
it gets resolved against the URI of the ".well-known/core" | ||||
document it was obtained from . It defaults to that document's | ||||
URI. | ||||
In the serialization, the context also serves as the Base URI for | ||||
resolving the target reference. | ||||
o A link target URI: It defines the destination of the relation (eg. | ||||
_what_ is hosted), and is the topic of all target attributes. | ||||
In link-format serialization, it is expressed between angular | ||||
brackets, and sometimes called the "href". If it is a relative URI, | ||||
it gets resolved against the link context URI. | ||||
o Other target attributes (eg. resource type (rt), interface (if), | ||||
cor content-type (ct)). These provide additional information | ||||
about the target URI. | ||||
+----------------------+ | ||||
| resource-directory | | ||||
+----------------------+ | ||||
| | ||||
| oooooooooooo 0-1 | ||||
| o MC address o---+ | ||||
| oooooooooooo | | ||||
| | | ||||
//////\\\\ 0+ +--------+ | ||||
< contains >----------------| group | | ||||
\\\\\///// +--------+ | ||||
| | | ||||
0-n | | 1+ | ||||
ooooooo 1 +---------------+ ///////\\\\\\ | ||||
o con o-------| registration |---------< composed of > | ||||
ooooooo +---------------+ \\\\\\\////// | ||||
| | | ||||
| +--------------+ | ||||
oooooooo 1 | | | ||||
o loc o----+ /////\\\\ | ||||
oooooooo | < contains > | ||||
| \\\\\///// | ||||
oooooooo 1 | | | ||||
o ep o----+ | 0+ | ||||
oooooooo | +------------------+ | ||||
| | link | | ||||
oooooooo 0-1 | +------------------+ | ||||
o d o----+ | | ||||
oooooooo | | 1 oooooooo | ||||
| +-----o target o | ||||
oooooooo 0-1 | | oooooooo | ||||
o lt o----+ ooooooooooo 0+ | | ||||
oooooooo | o target o-----+ | ||||
| o attribute o | 0+ oooooo | ||||
ooooooooooo 0+ | ooooooooooo +-----o rel o | ||||
o endpoint o----+ | oooooo | ||||
o attribute o | | ||||
ooooooooooo | 1 ooooooooo | ||||
+----o context o | ||||
ooooooooo | ||||
Figure 4: E-R Model of the content of the Resource Directory | ||||
The model shown in Figure 4 models the contents of the resource | ||||
directory which contains in addition to /.well-known/core: | ||||
o 0 to n Registration (entries), | ||||
o 0 or more Groups | ||||
A Group has no or one Multicast address attribute and is composed of | ||||
0 or more endpoints. A registration is associated with one endpoint | ||||
(ep). An endpoint can be part of 0 or more Groups . A registration | ||||
defines a set of links as defined for /.well-known/core. A | ||||
Registration has six attributes: | ||||
o one ep (endpoint with a unique name) | ||||
o one con (a string describing the scheme://authority part) | ||||
o one lt (lifetime), | ||||
o one loc (location in the RD) | ||||
o optional one d (domain for query filtering), | ||||
o optional additional endpoint attributes (from Section 9.3) | ||||
The cardinality of con is currently 1. Its value is used as a Base | ||||
URI when resolving URIs in the links contained in the endpoint. | ||||
Links are modelled as they are in Figure 3. | ||||
3.4. 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 | |||
air interface (GSM/GPRS, WCDMA, LTE) or via a gateway providing short | wireless interface (GSM/GPRS, WCDMA, LTE) or via a gateway providing | |||
and wide range wireless interfaces. From the system design point of | short and wide range wireless interfaces. From the system design | |||
view, the ambition is to design horizontal solutions that can enable | point of view, the ambition is to design horizontal solutions that | |||
utilization of machines in different applications depending on their | can enable utilization of machines in different applications | |||
current availability and capabilities as well as application | depending on their current availability and capabilities as well as | |||
requirements, thus avoiding silo like solutions. One of the crucial | application requirements, thus avoiding silo like solutions. One of | |||
enablers of such design is the ability to discover resources | the crucial enablers of such design is the ability to discover | |||
(machines -- endpoints) capable of providing required information at | resources (machines -- endpoints) capable of providing required | |||
a given time or acting on instructions from the end users. | information at a given time or acting on instructions from the end | |||
users. | ||||
In a typical scenario, during a boot-up procedure (and periodically | Imagine a scenario where endpoints installed on vehicles enable | |||
afterwards), the machines (endpoints) register with a Resource | tracking of the position of these vehicles for fleet management | |||
Directory (for example EPs installed on vehicles enabling tracking of | purposes and allow monitoring of environment parameters. During the | |||
their position for fleet management purposes and monitoring | boot-up process endpoints register with a Resource Directory, which | |||
environment parameters) hosted by the mobile operator or somewhere | is hosted by the mobile operator or somewhere in the cloud. | |||
else in the network, periodically a description of its own | ||||
capabilities. Due to the usual network configuration of mobile | Periodically, these endpoints update their registration and may | |||
networks, the EPs attached to the mobile network may not always be | modify resources they offer. | |||
efficiently reachable. Therefore, a remote server is usually used to | ||||
provide proxy access to the EPs. The address of each (proxy) | When endpoints are not always connected, for example because they | |||
endpoint on this server is included in the resource description | enter a sleep mode, a remote server is usually used to provide proxy | |||
stored in the RD. The users, for example mobile 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 appropriate set | of providing information about the environment using appropriate set | |||
of link parameters, obtain information on how to contact them (URLs | of link parameters, obtain information on how to contact them (URLs | |||
of the proxy server) and then initiate interaction to obtain | 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.4. Use Case: Home and Building Automation | 3.5. 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.5. Use Case: Link Catalogues | 3.6. 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 the data to an intermediary server, or | public consumption may provide the 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 9, line 13 ¶ | skipping to change at page 13, line 18 ¶ | |||
be sufficient to store external metadata in Resource Directories. | be sufficient to store external metadata in Resource Directories. | |||
The additional features of Resource Directory allow domains to be | The additional features of Resource Directory allow domains to be | |||
defined to enable access to a particular set of resources from | defined to enable access to a particular set of resources from | |||
particular applications. This provides isolation and protection of | particular applications. This provides isolation and protection of | |||
sensitive data when needed. Resource groups may defined to allow | sensitive data when needed. Resource groups may defined to allow | |||
batched reads from multiple resources. | batched reads from multiple resources. | |||
4. Finding a Resource Directory | 4. Finding a Resource Directory | |||
Several mechanisms can be employed for discovering the RD, including | A device coming up may want to find one or more resource directories | |||
assuming a default location (e.g. on an Edge Router in a LoWPAN), | to make itself known with. | |||
assigning an anycast address to the RD, using DHCP, or discovering | ||||
the RD using .well-known/core and hyperlinks as specified in CoRE | ||||
Link Format [RFC6690]. Endpoints that want to contact a Resource | ||||
Directory can obtain candidate IP addresses for such servers in a | ||||
number of ways. | ||||
In a 6LoWPAN, good candidates can be taken from: | The device may be pre-configured to exercise specific mechanisms for | |||
finding the resource directory: | ||||
o specific static configuration (e.g., anycast addresses), if any, | o It may be configured with a specific IP address for the RD. That | |||
IP address may also be an anycast address, allowing the network to | ||||
forward RD requests to an RD that is topologically close; each | ||||
target network environment in which some of these preconfigured | ||||
nodes are to be brought up is then configured with a route for | ||||
this anycast address that leads to an appropriate RD. (Instead of | ||||
using an anycast address, a multicast address can also be | ||||
preconfigured. The RD directory servers then need to configure | ||||
one of their interfaces with this multicast address.) | ||||
o the ABRO option of 6LoWPAN-ND [RFC6775], | o It may be configured with a DNS name for the RD and a resource- | |||
record type to look up under this name; it can find a DNS server | ||||
to perform the lookup using the usual mechanisms for finding DNS | ||||
servers. | ||||
o other ND options that happen to point to servers (such as RDNSS), | o It may be configured to use a service discovery mechanism such as | |||
DNS-SD [RFC6763]. The present specification suggests configuring | ||||
the service with name rd._sub._coap._udp, preferably within the | ||||
domain of the querying nodes. | ||||
o DHCPv6 options that might be defined later. | For cases where the device is not specifically configured with a way | |||
to find a resource directory, the network may want to provide a | ||||
suitable default. | ||||
o The IPv6 Neighbor Discovery Resource Directory Address Option | o If the address configuration of the network is performed via | |||
described in Section 4.1 | SLAAC, this is provided by the RDAO option Section 4.1. | |||
In networks with more inexpensive use of multicast, the candidate IP | o If the address configuration of the network is performed via DHCP, | |||
address may be a well-known multicast address, i.e. directory servers | this could be provided via a DHCP option (no such option is | |||
are found by simply sending GET requests to that well-known multicast | defined at the time of writing). | |||
address (see Section 5.2). | ||||
Constrained nodes configured in large batches may be configured for | Finally, if neither the device nor the network offer any specific | |||
an anycast address for the RD. Each target network environment in | configuration, the device may want to employ heuristics to find a | |||
which some of these preconfigured nodes are to be brought up is then | suitable resource directory. | |||
configured with a route for this anycast address that leads to an RD | ||||
that is appropriate for the environment. | ||||
As some of these sources are just (more or less educated) guesses, | The present specification does not fully define these heuristics, but | |||
endpoints MUST make use of any error messages to very strictly rate- | suggests a number of candidates: | |||
limit requests to candidate IP addresses that don't work out. For | ||||
example, an ICMP Destination Unreachable message (and, in particular, | o In a 6LoWPAN, just assume the Edge Router (6LBR) can act as a | |||
the port unreachable code for this message) may indicate the lack of | resource directory (using the ABRO option to find that [RFC6775]). | |||
a CoAP server on the candidate host, or a CoAP error response code | Confirmation can be obtained by sending a Unicast to | |||
such as 4.05 "Method Not Allowed" may indicate unwillingness of a | "coap://[6LBR]/.well-known/core?rt=core.rd*". | |||
CoAP server to act as a directory server. | ||||
o In a network that supports multicast well, discovering the RD | ||||
using a multicast query for /.well-known/core as specified in CoRE | ||||
Link Format [RFC6690]: Sending a Multicast GET to | ||||
"coap://[ff02::1]/.well-known/core?rt=core.rd*". RDs within the | ||||
multicast scope will answer the query. | ||||
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 | ||||
error messages to very strictly rate-limit requests to candidate IP | ||||
addresses that don't work out. For example, an ICMP Destination | ||||
Unreachable message (and, in particular, the port unreachable code | ||||
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 | ||||
Not Allowed" may indicate unwillingness of a CoAP server to act as a | ||||
directory server. | ||||
4.1. Resource Directory Address Option (RDAO) | 4.1. Resource Directory Address Option (RDAO) | |||
The Resource Directory Option (RDAO) using IPv6 neighbor Discovery | The Resource Directory Option (RDAO) using IPv6 neighbor Discovery | |||
(ND) carries information about the address of the Resource Directory | (ND) carries information about the address of the Resource Directory | |||
(RD). This information is needed when endpoints cannot discover the | (RD). This information is needed when endpoints cannot discover the | |||
Resource Directory with link-local multicast address because the | Resource Directory with link-local multicast address because the | |||
endpoint and the RD are separated by a border Router (6LBR). In many | endpoint and the RD are separated by a border Router (6LBR). In many | |||
circumstances the availability of DHCP cannot be guaranteed either | circumstances the availability of DHCP cannot be guaranteed either | |||
during commissioning of the network. The presence and the use of the | during commissioning of the network. The presence and the use of the | |||
skipping to change at page 11, line 43 ¶ | skipping to change at page 15, line 45 ¶ | |||
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 3: Resource Directory Address Option | Figure 5: 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 | ||||
atomic and idempotent. | ||||
A resource directory MAY make the information submitted to it | ||||
available to further directories, if it can ensure that a loop does | ||||
not form. The protocol used between directories to ensure loop-free | ||||
operation is outside the scope of this document. | ||||
5.1. Content Formats | 5.1. 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 MUST have an equivalent serialization | |||
in the application/link-format content format. | in the application/link-format content format. | |||
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]. It is however | known interface of the CoRE Link Format [RFC6690]. A complete set of | |||
expected that RDs will also be discoverable via other methods | RD discovery methods is described in Section 4. | |||
depending on the deployment. | ||||
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, and "core.gp" is used to discover the URI path for RD | operations, and "core.rd-group" is used to discover the URI path for | |||
Group operations. Upon success, the response will contain a payload | RD Group operations. Upon success, the response will contain a | |||
with a link format entry for each RD function discovered, indicating | payload with a link format entry for each RD function discovered, | |||
the URI path of the RD function returned and the corresponding | indicating the URI path of the RD function returned and the | |||
Resource Type. When performing multicast discovery, the multicast IP | corresponding Resource Type. When performing multicast discovery, | |||
address used will depend on the scope required and the multicast | the multicast IP address used will depend on the scope required and | |||
capabilities of the network. | the multicast capabilities of the network. | |||
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" link | |||
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. Links to Resource Directories | discovery can be supported using HTTP. Links to Resource Directories | |||
MAY be registered in other Resource Directories, and well-known entry | MAY be registered in other Resource Directories, and well-known entry | |||
skipping to change at page 13, line 21 ¶ | skipping to change at page 17, line 31 ¶ | |||
Interaction: EP -> RD | Interaction: EP -> RD | |||
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 (optional). MAY contain one of the values | rt := Resource Type (optional). MAY contain one of the values | |||
"core.rd", "core.rd-lookup*", "core.rd-lookup-d", "core.rd- | "core.rd", "core.rd-lookup*", "core.rd-lookup-res", "core.rd- | |||
lookup-res", "core.rd-lookup-ep", "core.rd-lookup-gp", | lookup-ep", "core.rd-lookup-gp", "core.rd-group" or "core.rd*" | |||
"core.rd-group" or "core.rd*" | ||||
Content-Format: application/link-format (if any) | Content-Format: application/link-format (if any) | |||
Content-Format: application/link-format+json (if any) | Content-Format: application/link-format+json (if any) | |||
Content-Format: application/link-format+cbor (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 | application/link-format+json, or application/link-format+cbor | |||
payload containing one or more matching entries for the RD | payload containing one or more matching entries for the RD | |||
resource. | resource. | |||
Failure: 4.04 "Not Found" or 404 "Not Found" is returned in case no | ||||
matching entry is found for a unicast request. | ||||
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 RD registration resource is, in | interface, thus learning that the directory resource is, in this | |||
this example, at /rd, and that the content-format delivered by the | example, at /rd, and that the content-format delivered by the server | |||
server hosting the resource is application/link-format (ct=40). Note | hosting the resource is application/link-format (ct=40). Note that | |||
that it is up to the RD to choose its RD resource paths. | it is up to the RD to choose its RD resource paths. | |||
Req: GET coap://[ff02::1]/.well-known/core?rt=core.rd* | Req: GET coap://[ff02::1]/.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, | |||
</rd-lookup/gp>;rt="core.rd-lookup-gp";ct=40, | </rd-lookup/gp>;rt="core.rd-lookup-gp";ct=40, | |||
</rd-lookup/d>;rt="core.rd-lookup-d";ct=40, | ||||
</rd-group>;rt="core.rd-group";ct=40 | </rd-group>;rt="core.rd-group";ct=40 | |||
Figure 4: Example discovery exchange | Figure 6: 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 a | Content-Format 40 (application/link-format) indicated as well as the | |||
more application-specific content format (picked as 65225 in this | the CBOR and JSON representation of link format. The RD resource | |||
example; this is in the experimental space, not an assigned value). | paths /rd, /rd-lookup, and /rd-group are example values. | |||
The RD resource paths /rd, /rd-lookup, and /rd-group are example | ||||
values. This server only implements some of the interfaces described | [ The RFC editor is asked to replace these and later occurrences of | |||
in this document. | TBD64 and TBD504 with 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://[ff02::1]/.well-known/core?rt=core.rd* | Req: GET coap://[ff02::1]/.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 65225", | </rd-lookup/res>;rt="core.rd-lookup-res";ct="40 TBD64 TBD504", | |||
</rd-lookup/ep>;rt="core.rd-lookup-ep";ct="40 65225", | </rd-lookup/ep>;rt="core.rd-lookup-ep";ct="40 TBD64 TBD504", | |||
</rd-group>;rt="core.rd-group";ct="40 65225" | </rd-lookup/gp>;rt="core.rd-lookup-gp";ct=40 TBD64 TBD504", | |||
</rd-group>;rt="core.rd-group";ct="40 TBD64 TBD504" | ||||
5.3. Registration | 5.3. Registration | |||
After discovering the location of an RD, an endpoint MAY register its | After discovering the location of an RD, an endpoint MAY register its | |||
resources using the registration interface. This interface accepts a | resources using the registration interface. This interface accepts a | |||
POST from an endpoint containing the list of resources to be added to | POST from an endpoint containing the list of resources to be added to | |||
the directory as the message payload in the CoRE Link Format | the directory as the message payload in the CoRE Link Format | |||
[RFC6690], JSON CoRE Link Format (application/link-format+json), or | [RFC6690], JSON CoRE Link Format (application/link-format+json), or | |||
CBOR CoRE Link Format (application/link-format+cbor) | CBOR CoRE Link Format (application/link-format+cbor) | |||
[I-D.ietf-core-links-json], along with query parameters indicating | [I-D.ietf-core-links-json], along with query parameters indicating | |||
the name of the endpoint, and optionally its domain and the lifetime | the name of the endpoint, and optionally its domain and the lifetime | |||
of the registration. It is expected that other specifications will | of the registration. It is expected that other specifications will | |||
define further parameters (see Section 9.3). The RD then creates a | define further parameters (see Section 9.3). The RD then creates a | |||
new registration resource in the RD and returns its location. An | new registration resource in the RD and returns its location. An | |||
endpoint MUST use that location when refreshing registrations using | endpoint MUST use that location when refreshing registrations using | |||
this interface. Endpoint resources in the RD are kept active for the | this interface. Registration resources in the RD are kept active for | |||
period indicated by the lifetime parameter. The endpoint is | the period indicated by the lifetime parameter. The endpoint is | |||
responsible for refreshing the entry within this period using either | responsible for refreshing the registration resource within this | |||
the registration or update interface. The registration interface | period using either the registration or update interface. The | |||
MUST be implemented to be idempotent, so that registering twice with | registration interface MUST be implemented to be idempotent, so that | |||
the same endpoint parameters ep and d does not create multiple RD | registering twice with the same endpoint parameters ep and d does not | |||
entries. A new registration may be created at any time to supersede | create multiple registration resources. A new registration resource | |||
an existing registration, replacing the registration parameters and | may be created at any time to supersede an existing registration, | |||
links. | replacing the registration parameters and links. | |||
An empty payload is considered a malformed request. | ||||
The posted link-format document can (and typically does) contain | ||||
relative references both in its link targets and in its anchors, or | ||||
contain empty anchors. The RD server needs to resolve these | ||||
references in order to faithfully represent them in lookups. The | ||||
Base URI against which they are resolved is the context of the | ||||
registration, which is provided either explicitly in the "con" | ||||
parameter or constructed implicitly from the requester's network | ||||
address. When resolving relative target references, the server first | ||||
resolves the context of that link, and then interprets the target as | ||||
a reference relative to that context (see Appendix A.4). | ||||
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,et,lt,con} | URI Template: {+rd}{?ep,d,lt,con,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 (mandatory). The endpoint name is an | ep := Endpoint name (mostly mandatory). The endpoint name is an | |||
identifier that MUST be unique within a domain. The maximum | identifier that MUST be unique within a domain. The maximum | |||
length of this parameter is 63 bytes. | length of this parameter is 63 bytes. If the RD is configured | |||
to recognize the endpoint (eg. based on its security context), | ||||
the endpoint can elide the endpoint name, and assign one based | ||||
on the configuration. | ||||
d := Domain (optional). The domain to which this endpoint | d := Domain (optional). The domain 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 elided, the RD MAY associate the | When this parameter is elided, the RD MAY associate the | |||
endpoint with a configured default domain. | endpoint with a configured default domain. | |||
et := Endpoint Type (optional). The semantic type of the | ||||
endpoint. This parameter SHOULD be less than 63 bytes. | ||||
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 | |||
in the initial registration, a default value of 86400 (24 | in the initial registration, a default value of 86400 (24 | |||
hours) SHOULD be assumed. If the lt parameter is not included | hours) SHOULD be assumed. | |||
in a registration refresh or update operation, the most | ||||
recently supplied value SHALL be re-used. | ||||
con := Context (optional). This parameter sets the scheme, | con := Context (optional). This parameter sets the Default Base | |||
address, port and path at which this server is available in the | URI under which the request's links are to be interpreted. The | |||
form scheme://host:port/path. In the absence of this parameter | URI MUST NOT have a path component of its own, but MUST be | |||
the scheme of the protocol, source address and source port of | suitable as a base URI to resolve any relative references given | |||
the register request are assumed. This parameter is mandatory | in the registration. The parameter is therefore of the shape | |||
when the directory is filled by a third party such as an | "scheme://authority" for HTTP and CoAP URIs. In the absence of | |||
commissioning tool. When con is used, scheme and host are | this parameter the scheme of the protocol, source address and | |||
mandatory and port and path parameters are optional. If the | source port of the registration request are assumed. This | |||
endpoint uses an ephemeral port to register with, it MUST | parameter is mandatory when the directory is filled by a third | |||
include the con: parameter in the registration to provide a | party such as an commissioning tool. If the endpoint uses an | |||
valid network path. If the endpoint which is located behind a | ephemeral port to register with, it MUST include the con | |||
NAT gateway is registering with a Resource Directory which is | parameter in the registration to provide a valid network path. | |||
on the network service side of the NAT gateway, the endpoint | If the endpoint which is located behind a NAT gateway is | |||
MUST use a persistent port for the outgoing registration in | registering with a Resource Directory which is on the network | |||
order to provide the NAT gateway with a valid network address | service side of the NAT gateway, the endpoint MUST use a | |||
for replies and incoming requests. | persistent port for the outgoing registration in order to | |||
provide the NAT gateway with a valid network address for | ||||
replies and incoming requests. | ||||
extra-attrs := Additional registration attributes (optional). | ||||
The endpoint can pass any parameter registered at Section 9.3 | ||||
to the directory. If the RD is aware of the parameter's | ||||
specified semantics, it processes it accordingly. Otherwise, | ||||
it MUST store the unknown key and its value(s) as an endpoint | ||||
attribute for further lookup. | ||||
Content-Format: application/link-format | Content-Format: application/link-format | |||
Content-Format: application/link-format+json | Content-Format: application/link-format+json | |||
Content-Format: application/link-format+cbor | 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 header | Success: 2.01 "Created" or 201 "Created". The Location header | |||
option MUST be included in the response when a new registration | option MUST be included in the response when a new registration | |||
resource is created. This Location MUST be a stable identifier | resource is created. This Location MUST be a stable identifier | |||
generated by the RD as it is used for all subsequent operations on | generated by the RD as it is used for all subsequent operations on | |||
this registration resource. The registration resource location | this registration resource. The registration resource location | |||
thus returned is for the purpose of updating the lifetime of the | thus returned is for the purpose of updating the lifetime of the | |||
registration and for maintaining the content of the registered | registration and for maintaining the content of the registered | |||
links, including updating and deleting links. | links, including updating and deleting links. A registration with | |||
an already registered ep and d value pair responds with the same | ||||
success code and Location as the original registration; the set of | ||||
links registered with the endpoint is replaced with the links from | ||||
the payload. | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | |||
request. | request. | |||
Failure: 4.09 "Conflict" or 409 "Conflict". Attempt to update the | ||||
registration content with links resulting in plurality of | ||||
references; see Section 5.3.4. | ||||
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 following example shows an endpoint with the name "node1" | The following example shows an endpoint 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 4. | similar to Figure 6. | |||
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", | |||
</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: /rd/4521 | Location: /rd/4521 | |||
A Resource Directory may optionally support HTTP. Here is an example | A Resource Directory may optionally support HTTP. Here is an example | |||
of the same registration operation above, when done using HTTP. | of almost the same registration operation above, when done using HTTP | |||
and the JSON Link Format. | ||||
Req: POST /rd?ep=node1&con=http://[2001:db8::1:1] HTTP/1.1 | ||||
Host : example.com | ||||
Content-Type: application/link-format | ||||
Payload: | ||||
</sensors/temp>;ct=41;rt="temperature-c";if="sensor", | ||||
</sensors/light>;ct=41;rt="light-lux";if="sensor" | ||||
Res: 201 Created | Req: POST /rd?ep=node1&con=http://[2001:db8:1::1] HTTP/1.1 | |||
Location: /rd/4521 | Host : example.com | |||
Content-Type: application/link-format+json | ||||
Payload: | ||||
[ | ||||
{"href": "/sensors/temp", "ct": "41", "rt": "temperature-c", "if": "sensor"}, | ||||
{"href": "/sensors/light", "ct": "41", "rt": "light-lux", "if": "sensor"} | ||||
] | ||||
Res: 201 Created | ||||
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 a RD as described in Section 5.3. Instead, simple | upload links to a 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 endpoint makes available the hosted | This approach requires that the endpoint makes available the hosted | |||
resources that it wants to be discovered, as links on its "/.well- | resources that it wants to be discovered, as links on its "/.well- | |||
known/core" interface as specified in [RFC6690]. | known/core" interface as specified in [RFC6690]. | |||
The endpoint then finds one or more addresses of the directory server | The endpoint then finds one or more addresses of the directory server | |||
as described in Section 4. | as described in Section 4. | |||
An endpoint can send (a selection of) hosted resources to a directory | An endpoint finally asks the directory server to probe it for | |||
server for publication as described in Section 5.3.2. | resources and publish them as follows: | |||
The directory server integrates the information it received this way | ||||
into its resource directory. It MAY make the information available | ||||
to further directories, if it can ensure that a loop does not form. | ||||
The protocol used between directories to ensure loop-free operation | ||||
is outside the scope of this document. | ||||
5.3.2. Simple publishing to Resource Directory Server | It sends (and regularly refreshes with) a POST request to the | |||
"/.well-known/core" URI of the directory server of choice. The body | ||||
of the POST request is empty, which triggers the resource directory | ||||
server to perform GET requests at the requesting server's default | ||||
discovery URI to obtain the link-format payload to register. | ||||
An endpoint that wants to make itself discoverable occasionally sends | The endpoint includes the same registration parameters in the POST | |||
a POST request to the "/.well-known/core" URI of any candidate | request as it would per Section 5.3. The context of the registration | |||
directory server that it finds. The body of the POST request is | is taken from the requesting server's URI. | |||
empty, which triggers the resource directory server to perform GET | ||||
requests at the requesting server's default discovery URI to obtain | ||||
the link-format payload to register. | ||||
The endpoint MUST include the endpoint name and MAY include the | The endpoints MUST be deleted after the expiration of their lifetime. | |||
registration parameters d, lt, and et, in the POST request as per | Additional operations cannot be executed because no registration | |||
Section 5.3. | location is returned. | |||
The following example shows an endpoint using simple publishing, by | The following example shows an endpoint using Simple Registration, by | |||
simply sending an empty POST to a resource directory. | simply sending an empty POST to a resource directory. | |||
Req:(to RD server from [ff02::1]) | Req:(to RD server from [2001:db8:2::1]) | |||
POST coap://rd.example.com/.well-known/core?lt=6000;ep=node1 | POST /.well-known/core?lt=6000&ep=node1 | |||
Content-Format: 40 | Content-Format: 40 | |||
No payload | ||||
payload: | ||||
(empty payload) | ||||
Res: 2.04 Changed | Res: 2.04 Changed | |||
(later) | (later) | |||
Req: (from RD server to [ff02::1]) | Req: (from RD server to [2001:db8:2::1]) | |||
GET coap://[ff02::1]/.well-known/core | GET /.well-known/core | |||
Accept: 40 | Accept: 40 | |||
Res: 2.05 Content | Res: 2.05 Content | |||
Payload: | ||||
payload: | ||||
</sen/temp> | </sen/temp> | |||
5.3.3. 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 | |||
certain very constrained devices, in particular if the security | certain 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 device, called a commissioning | Directory can be filled by a third device, called a commissioning | |||
tool. The commissioning tool can fill the Resource Directory from a | tool. The commissioning tool can fill the Resource Directory from a | |||
database or other means. For that purpose the scheme, IP address and | database or other means. For that purpose the scheme, IP address and | |||
port of the registered device is indicated in the Context parameter | port of the registered device is indicated in the Context parameter | |||
of the registration described in Section 5.3. | of the registration described in Section 5.3. | |||
5.3.4. Plurality of link references in a Registration | ||||
Plurality of link references within a Registration (registration | ||||
resource) is an indication of some error condition and should not be | ||||
allowed. | ||||
Plurality of link references exists if, and only if, two or more | ||||
links in a Registration contain identical context, target, and | ||||
relation values. This condition would be likely to arise if there | ||||
were multiple co-ordinators or configuration tools, each with a | ||||
different set of configuration values for the same resource. | ||||
A Resource Directory SHOULD reject a registration, or an operation on | ||||
a registration, which would result in a plurality of link references | ||||
within the the context of the registration. There is no requirement | ||||
in this document for a resource directory to check for plurality of | ||||
reference between different registrations. Resource Directory | ||||
operations which are rejected due to reference plurality SHOULD be | ||||
returned the "Conflict" code, indicating that there is someting wrong | ||||
with the request. | ||||
5.4. Operations on the Registration Resource | 5.4. Operations on the Registration Resource | |||
After the initial registration, an endpoint should retain the | After the initial registration, an endpoint should retain the | |||
returned location of the Registration Resource for further | returned location of the Registration Resource for further | |||
operations, including refreshing the registration in order to extend | operations, including refreshing the registration in order to extend | |||
the lifetime and "keep-alive" the registration. If the lifetime of | the lifetime and "keep-alive" the registration. When the lifetime of | |||
the registration expires, the RD SHOULD NOT respond to discovery | the registration has expired, the RD SHOULD NOT respond to discovery | |||
queries with information from the endpoint. The RD SHOULD continue | queries concerning this endpoint. The RD SHOULD continue to provide | |||
to provide access to the Registration Resource after a registration | access to the Registration Resource after a registration time-out | |||
time-out occurs in order to enable the registering endpoint to | occurs in order to enable the registering endpoint to eventually | |||
eventually refresh the registration. The RD MAY eventually remove | refresh the registration. The RD MAY eventually remove the | |||
the registration resource for the purpose of resource recovery and | registration resource for the purpose of resource recovery and | |||
garbage collection. If the Registration Resource is removed, the | garbage collection. If the Registration Resource is removed, the | |||
endpoint will need to re-register. | endpoint will need to re-register. | |||
The Registration Resource may also be used to inspect the | The Registration Resource may also be used to inspect the | |||
registration resource using GET, update the registration link | registration resource using GET, update the registration link | |||
contents using PATCH (as introduced in [RFC8132]), or cancel the | contents, or cancel the registration using DELETE. | |||
registration using DELETE. | ||||
These operations are described in this section. | These operations are described in this section. | |||
In accordance with Section 5.3.4, operations which would result in | ||||
plural link references within the context of a registration resource | ||||
SHOULD be rejected using the "Conflict" result code. | ||||
5.4.1. Registration Update | 5.4.1. Registration Update | |||
The update interface is used by an endpoint to refresh or update its | The update interface is used by an endpoint to refresh or update its | |||
registration with an RD. To use the interface, the endpoint sends a | registration with an RD. To use the interface, the endpoint sends a | |||
POST request to the registration resource returned in the Location | POST request to the registration resource returned in the Location | |||
header option in the response returned from the intial registration | header option in the response returned from the initial registration | |||
operation. | operation. | |||
An update MAY update the lifetime or context registration parameters | An update MAY update the lifetime- or the context- registration | |||
"lt", "con" as in Section 5.3 ) if the previous settings are to be | parameters "lt", "con" as in Section 5.3. Parameters that are not | |||
retained. Parameters that are not being changed changed SHOULD NOT | being changed SHOULD NOT be included in an update. Adding parameters | |||
be included in an update. Adding parameters that have not changed | that have not changed increases the size of the message but does not | |||
increases the size of the message but does not have any other | have any other implications. Parameters MUST be included as query | |||
implications. Parameters MUST be included as query parameters in an | parameters in an update operation as in Section 5.3. | |||
update operation as in Section 5.3. | ||||
Upon receiving an update request, an RD MUST reset the timeout for | ||||
that endpoint and update the scheme, IP address and port of the | ||||
endpoint, using the source address of the update, or the context | ||||
("con") parameter if present. If the lifetime parameter "lt" is | ||||
included in the received update request, the RD MUST update the | ||||
lifetime of the registration and set the timeout equal to the new | ||||
lifetime. If the lifetime parameter is not included in the | ||||
registration update, the most recent setting is re-used for the next | ||||
registration time-out period. | ||||
An update MAY optionally add or replace links for the endpoint by | A registration update resets the timeout of the registration to the | |||
including those links in the payload of the update as a CoRE Link | (possibly updated) lifetime of the registration, independent of | |||
Format document. A link is replaced only if all of the target URI | whether a "lt" parameter was given. | |||
and relation type (if present) and anchor value (if present) match. | ||||
If the link payload is included, it SHOULD be checked for reference | If the context of the registration is changed in an update explicitly | |||
plurality as described in Section 5.3.4 and rejected with a | or implicitly, relative references submitted in the original | |||
"Conflict" result if there are plural link references detected. | registration or later updates are resolved anew against the new | |||
context (like in the original registration). | ||||
In addition to the use of POST, as described in this section, there | This operation only describes the use of POST with an empty payload. | |||
is an alternate way to add, replace, and delete links using PATCH as | As with modification of individual using iPATCH or PATCH as proposed | |||
described in Section 5.4.4. | in Section 5.4.4, future standards might describe the semantics of | |||
using content formats and payloads with the POST method to update the | ||||
links of a registration. | ||||
The update registration request interface is specified as follows: | The update registration request interface is specified as follows: | |||
Interaction: EP -> RD | Interaction: EP -> RD | |||
Method: POST | Method: POST | |||
URI Template: {+location}{?lt,con} | ||||
URI Template: {+location}{?lt,con,extra-attrs*} | ||||
URI Template Variables: | URI Template Variables: | |||
location := This is the Location returned by the RD as a result | location := This is the Location returned by the RD as a result | |||
of a successful earlier registration. | of a successful earlier registration. | |||
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, | |||
the previous last lifetime set on a previous update or the | the previous last lifetime set on a previous update or the | |||
original registration (falling back to 86400) SHOULD be used. | original registration (falling back to 86400) SHOULD be used. | |||
con := Context (optional). This parameter sets the scheme, | con := Context (optional). This parameter updates the context | |||
address and port at which this server is available in the form | established in the original registration to a new value. If | |||
scheme://host:port/path. In the absence of this parameter the | the parameter is set in an update, it is stored by the RD as | |||
scheme of the protocol, source address and source port of the | the new Base URI under which to interpret the links of the | |||
register request are assumed. This parameter is mandatory when | registration, following the same restrictions as in the | |||
the directory is filled by a third party such as an | registration. If the parameter is not set and was set | |||
commissioning tool. When con is used, scheme and host are | explicitly before, the previous context value is kept | |||
mandatory and port and path parameters are optional. | unmodified. If the parameter is not set and was not set | |||
explicitly before either, the source address and source port of | ||||
Content-Format: application/link-format (mandatory) | the update request are stored as the context. | |||
Content-Format: application/link-format+json (optional) | 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: application/link-format+cbor (optional) | Content-Format: none (no payload) | |||
The following response codes are defined for this interface: | The following response codes are defined for this interface: | |||
Success: 2.04 "Changed" or 204 "No Content" if the update was | Success: 2.04 "Changed" or 204 "No Content" if the update was | |||
successfully processed. | successfully processed. | |||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | |||
request. | request. | |||
Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | |||
exist (e.g. may have expired). | exist (e.g. may have expired). | |||
Failure: 4.09 "Conflict" or 409 "Conflict". Attempt to update the | ||||
registration content with links resulting in plurality of | ||||
references; see Section 5.3.4. | ||||
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 following example shows an endpoint updating its registration at | ||||
an RD using this interface with the example location value: /rd/4521. | The following example shows an endpoint updating its registration | |||
resource at an RD using this interface with the example location | ||||
value: /rd/4521. | ||||
Req: POST /rd/4521 | Req: POST /rd/4521 | |||
Res: 2.04 Changed | Res: 2.04 Changed | |||
The following example shows an endpoint updating its registration | The following example shows an endpoint updating its registration | |||
with a new lifetime and context, changing an existing link, and | resource at an RD using this interface with the example location | |||
adding a new link using this interface with the example location | value: /rd/4521. The initial registration by the client set the | |||
value /rd/4521. With the initial registration the client set the | ||||
following values: | following values: | |||
o endpoint name (ep)=endpoint1 | ||||
o lifetime (lt)=500 | o lifetime (lt)=500 | |||
o context (con)=coap://local-proxy-old.example.com:5683 | o context (con)=coap://local-proxy-old.example.com:5683 | |||
o resource= </sensors/temp>;ct=41;rt="foobar";if="sensor" | The initial state of the Resource Directory is reflected in the | |||
following request: | ||||
Req: POST /rd/4521?lt=600&con="coap://local-proxy.example.com:5683" | Req: GET /rd-lookup/res?ep=endpoint1 | |||
Content-Format: 40 | ||||
Payload: | Res: 2.01 Content | |||
</sensors/temp>;ct=41;rt="temperature-f";if="sensor", | Payload: | |||
</sensors/door>;ct=41;rt="door";if="sensor" | </sensors/temp>;ct=41;rt="temperature";anchor="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 an EP changing the context to | ||||
"coaps://new.example.com:5684": | ||||
Req: POST /rd/4521?con=coaps://new.example.com:5684 | ||||
Res: 2.04 Changed | Res: 2.04 Changed | |||
The consecutive query returns: | ||||
Req: GET /rd-lookup/res?ep=endpoint1 | ||||
Res: 2.01 Content | ||||
Payload: | ||||
</sensors/temp>;ct=41;rt="temperature";anchor="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 | 5.4.2. Registration Removal | |||
Although RD entries have soft state and will eventually timeout after | Although RD entries have soft state and will eventually timeout after | |||
their lifetime, an endpoint SHOULD explicitly remove its entry from | their lifetime, an endpoint SHOULD explicitly remove its entry from | |||
the RD if it knows it will no longer be available (for example on | 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 | shut-down). This is accomplished using a removal interface on the RD | |||
by performing a DELETE on the endpoint resource. | by performing a DELETE on the endpoint resource. | |||
Removed endpoints are implicitly removed from the groups to which | ||||
they belong. | ||||
The removal request interface is specified as follows: | The removal request interface is specified as follows: | |||
Interaction: EP -> RD | Interaction: EP -> RD | |||
Method: DELETE | Method: DELETE | |||
URI Template: {+location} | URI Template: {+location} | |||
URI Template Variables: | URI Template Variables: | |||
skipping to change at page 24, line 39 ¶ | skipping to change at page 28, line 47 ¶ | |||
Req: GET /rd/4521 | Req: GET /rd/4521 | |||
Res: 2.01 Content | Res: 2.01 Content | |||
Payload: | Payload: | |||
</sensors/temp>;ct=41;rt="temperature-c";if="sensor", | </sensors/temp>;ct=41;rt="temperature-c";if="sensor", | |||
</sensors/light>;ct=41;rt="light-lux";if="sensor" | </sensors/light>;ct=41;rt="light-lux";if="sensor" | |||
5.4.4. Update Endpoint Links | 5.4.4. Update Endpoint Links | |||
A PATCH update adds, removes or changes links for the endpoint by | An iPATCH (or PATCH) update [RFC8132] adds, removes or changes links | |||
including link update information in the payload of the update as a | of a registration by including link update information in the payload | |||
merge-patch+json format [RFC7396] document. | of the update with a media type that still needs to be defined. | |||
Other PATCH document formats may be used as appropriate for patching | ||||
the array of objects format of a Registration Resource. In | ||||
particular, a select-merge patch document format could combine the | ||||
function of link selection query and link attribute replacement | ||||
values. | ||||
One or more links are selected for update by using query filtering as | ||||
specified in [RFC6690] Section 4.1 | ||||
The query filter selects the links to be modified or deleted, by | ||||
matching the query parameter values to the values of the link | ||||
attributes. | ||||
When the query parameters are not present in the request, the payload | ||||
specifies links to be added to the target document. When the query | ||||
parameters are present, the attribute names and values in the query | ||||
parameters select one or more links on which to apply the PATCH | ||||
operation. | ||||
If no links are selected by the query parameters, the PATCH operation | ||||
SHOULD NOT update the state of any resource, and SHOULD return a | ||||
reply of "Changed". | ||||
If an attribute name specified in the PATCH document exists in any | ||||
the set of selected links, all occurrences of the attribute value in | ||||
the target document MUST be updated using the value from the PATCH | ||||
payload. If the attribute name is not present in any selected links, | ||||
the attribute MUST be added to the links. | ||||
If the PATCH payload contains plural link references, or processing | ||||
the PATCH payload would result in plural link references, the request | ||||
SHOULD be rejected with a "Conflict" result. | ||||
If the PATCH payload results in the modification of link target, | ||||
context, or relation values, that is "href", "rel", or "anchor", the | ||||
request SHOULD be rejected with a "Conflict" result code. | ||||
The update request interface is specified as follows: | ||||
Interaction: EP -> RD | ||||
Method: PATCH | ||||
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 | ||||
Content-Format: application/merge-patch+json (mandatory) | ||||
The following response codes are defined for this interface: | ||||
Success: 2.04 "Changed" 0r 204 "No Content" in 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 resource | ||||
does not exist (e.g. may have expired). | ||||
Failure: 4.09 "Conflict" or 409 "Conflict". Attempt to update the | ||||
registration content with links resulting in plurality of | ||||
references; see Section 5.3.4. | ||||
Failure: 5.03 "Service Unavailable" or 503 "Service Unavailable". | ||||
Service could not perform the operation. | ||||
HTTP support: YES | ||||
The following examples show an endpoint adding </sensors/humid>, | ||||
modifying </sensors/temp>, and removing </sensors/light> links in RD | ||||
using the Update Endpoint Links function with the example location | ||||
value /rd/4521. | ||||
The Registration Resource initial state is: | ||||
Req: GET /rd/4521 | ||||
Res: 2.01 Content | ||||
Payload: | ||||
</sensors/temp>;ct=41;rt="temperature", | ||||
</sensors/light>;ct=41;rt="light-lux";if="sensor" | ||||
The following example shows an EP adding the link </sensors/ | ||||
humid>;ct=41;rt="humid-s";if="sensor" to the collection of links at | ||||
the location /rd/4521. | ||||
Req: PATCH /rd/4521 | ||||
Payload: | ||||
[{"href":"/sensors/humid","ct": 41, "rt": "humid-s", "if": "sensor"}] | ||||
Content-Format: | ||||
application/merge-patch+json | ||||
Res: 2.04 Changed | ||||
Req: GET /rd/4521 | ||||
Res: 2.01 Content | ||||
Payload: | ||||
</sensors/temp>;ct=41;rt="temperature", | ||||
</sensors/light>;ct=41;rt="light-lux";if="sensor", | ||||
</sensors/humid>;ct=41;rt="humid-s";if="sensor" | ||||
The following example shows an EP modifying all links at the example | ||||
location /rd/4521 which are identified by href="/sensors/temp", from | ||||
the initial link-value of </sensors/temp>;rt="temperature" to the new | ||||
link-value </sensors/temp>;rt="temperature-c";if="sensor" by changing | ||||
the value of the link attribute "rt" and adding the link attribute | ||||
if="sensor" using the PATCH operation with the supplied merge- | ||||
patch+json document payload. | ||||
Req: PATCH /rd/4521?href=/sensors/temp | ||||
Payload: | ||||
{"rt": "temperature-c", "if": "sensor"}, | ||||
Content-Format: | ||||
application/merge-patch+json | ||||
Res: 2.04 Changed | ||||
Req: GET /rd/4521 | ||||
Res: 2.01 Content | ||||
Payload: | ||||
</sensors/temp>;ct=41;rt="temperature-c";if="sensor", | ||||
</sensors/light>;ct=41;rt="light-lux";if="sensor", | ||||
</sensors/humid>;ct=41;rt="humid-s";if="sensor" | ||||
This example shows an EP removing all links at the example location | ||||
/rd/4521 which are identified by href="/sensors/light". | ||||
Req: PATCH /rd/4521?href=/sensors/light | ||||
Payload: | ||||
{} | ||||
Content-Format: | ||||
application/merge-patch+json | ||||
Res: 2.04 Changed | ||||
Req: GET /rd/4521 | ||||
Res: 2.01 Content | ||||
Payload: | ||||
</sensors/temp>;ct=41;rt="temperature-c";if="sensor", | ||||
</sensors/humid>;ct=41;rt="humid-s";if="sensor" | ||||
6. RD Groups | 6. RD Groups | |||
This section defines the REST API for the creation, management, and | This section defines the REST API for the creation, management, and | |||
lookup of endpoints for group operations. Similar to endpoint | lookup of endpoints for group operations. Similar to endpoint | |||
registration entries in the RD, groups may be created or removed. | registration entries in the RD, groups may be created or removed. | |||
However unlike an endpoint entry, a group entry consists of a list of | However unlike an endpoint entry, a group entry consists of a list of | |||
endpoints and does not have a lifetime associated with it. In order | endpoints and does not have a lifetime associated with it. In order | |||
to make use of multicast requests with CoAP, a group MAY have a | to make use of multicast requests with CoAP, a group MAY have a | |||
multicast address associated with it. | multicast address associated with it. | |||
6.1. Register a Group | 6.1. Register a Group | |||
In order to create a group, a commissioning tool (CT) used to | In order to create a group, a commissioning tool (CT) used to | |||
configure groups, makes a request to the RD indicating the name of | configure groups, makes a request to the RD indicating the name of | |||
the group to create (or update), optionally the domain the group | the group to create (or update), optionally the domain the group | |||
belongs to, and optionally the multicast address of the group. The | belongs to, and optionally the multicast address of the group. The | |||
registration message includes the list of endpoints that belong to | registration message is a list of links to registration resources of | |||
that group. | the endpoints that belong to that group. | |||
All the endpoints in the group MUST be registered with the RD before | The commissioning tool SHOULD not send any target attributes with the | |||
registering a group. If an endpoint is not yet registered to the RD | links to the registration resources, and the resource directory | |||
before registering the group, the registration message returns an | SHOULD ignore any attributes that are set. | |||
error. The RD sends a blank target URI for every endpoint link when | ||||
registering the group. | ||||
Configuration of the endpoints themselves is out of scope of this | Configuration of the endpoints themselves is out of scope of this | |||
specification. Such an interface for managing the group membership | specification. Such an interface for managing the group membership | |||
of an endpoint has been defined in [RFC7390]. | of an endpoint has been defined in [RFC7390]. | |||
The registration request interface is specified as follows: | The registration request interface is specified as follows: | |||
Interaction: CT -> RD | Interaction: CT -> RD | |||
Method: POST | Method: POST | |||
skipping to change at page 29, line 15 ¶ | skipping to change at page 30, line 6 ¶ | |||
gp := Group Name (mandatory). The name of the group to be | gp := Group Name (mandatory). The name of the group to be | |||
created or replaced, unique within that domain. The maximum | created or replaced, unique within that domain. The maximum | |||
length of this parameter is 63 bytes. | length of this parameter is 63 bytes. | |||
d := Domain (optional). The domain to which this group belongs. | d := Domain (optional). The domain to which this group belongs. | |||
The maximum length of this parameter is 63 bytes. Optional. | The maximum length of this parameter is 63 bytes. Optional. | |||
When this parameter is elided, the RD MAY associate the | When this parameter is elided, the RD MAY associate the | |||
endpoint with a configured default domain. | endpoint with a configured default domain. | |||
con := Context (optional). This parameter sets the scheme, | con := Context (optional). This parameter sets the scheme, | |||
address and port at which this server is available in the form | address and port of the multicast address associated with the | |||
scheme://host:port/path. In the absence of this parameter the | group. When con is used, scheme and host are mandatory and | |||
scheme of the protocol, source address and source port of the | port parameter is optional. | |||
register request are assumed. This parameter is mandatory when | ||||
the directory is filled by a third party such as an | ||||
commissioning tool. When con is used, scheme and host are | ||||
mandatory and port and path parameters are optional. | ||||
Content-Format: application/link-format | Content-Format: application/link-format | |||
Content-Format: application/link-format+json | Content-Format: application/link-format+json | |||
Content-Format: application/link-format+cbor | 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 header | Success: 2.01 "Created" or 201 "Created". The Location header | |||
option MUST be returned in response to a successful group CREATE | option MUST be returned in response to a successful group CREATE | |||
operation. This Location MUST be a stable identifier generated by | operation. This Location MUST be a stable identifier generated by | |||
the RD as it is used for delete operations of the group | the RD as it is used for delete operations of the group resource. | |||
registration resource. | ||||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | |||
request. | request. | |||
Failure: 4.04 "Not Found" or 404 "Not Found". An Endpoint is not | Failure: 4.04 "Not Found" or 404 "Not Found". An Endpoint is not | |||
registered in the RD (e.g. may have expired). | registered in the RD (e.g. may have expired). | |||
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 following example shows an EP registering a group with the name | The following example shows an EP registering a group with the name | |||
"lights" which has two endpoints to an RD using this interface. The | "lights" which has two endpoints. The RD group path /rd-group is an | |||
RD group path /rd-group is an example RD location discovered in a | example RD location discovered in a request similar to Figure 6. | |||
request similar to Figure 4. | ||||
Req: POST coap://rd.example.com/rd-group?gp=lights | Req: POST coap://rd.example.com/rd-group?gp=lights | |||
&con=coap://[ff35:30:2001:db8::1] | ||||
Content-Format: 40 | Content-Format: 40 | |||
Payload: | Payload: | |||
<>;ep="node1", | </rd/4521>, | |||
<>;ep="node2" | </rd/4522> | |||
Res: 2.01 Created | Res: 2.01 Created | |||
Location: /rd-group/12 | Location: /rd-group/12 | |||
The href value is the path to the registration resource of the | ||||
Endpoint. | ||||
6.2. Group Removal | 6.2. Group Removal | |||
A group can be removed simply by sending a removal message to the | A group can be removed simply by sending a removal message to the | |||
location of the group registration resource which was returned when | location of the group registration resource which was returned when | |||
intially registering the group. Removing a group MUST NOT remove the | initially registering the group. Removing a group MUST NOT remove | |||
endpoints of the group from the RD. | the endpoints of the group from the RD. | |||
The removal request interface is specified as follows: | The removal request interface is specified as follows: | |||
Interaction: CT -> RD | Interaction: CT -> RD | |||
Method: DELETE | Method: DELETE | |||
URI Template: {+location} | URI Template: {+location} | |||
URI Template Variables: | URI Template Variables: | |||
location := This is the Location returned by the RD as a result | location := This is the path of the group resource returned by | |||
of a successful group registration. | the RD as a result of a successful group registration. | |||
The following responses codes are defined for this interface: | The following responses codes are defined for this interface: | |||
Success: 2.02 "Deleted" or 204 "No Content" upon successful deletion | Success: 2.02 "Deleted" or 204 "No Content" upon successful deletion | |||
Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | Failure: 4.00 "Bad Request" or 400 "Bad Request". Malformed | |||
request. | request. | |||
Failure: 4.04 "Not Found" or 404 "Not Found". Group does not exist. | Failure: 4.04 "Not Found" or 404 "Not Found". Group does not exist. | |||
skipping to change at page 31, line 11 ¶ | skipping to change at page 31, line 48 ¶ | |||
The following examples shows successful removal of the group from the | The following examples shows successful removal of the group from the | |||
RD with the example location value /rd-group/12. | RD with the example location value /rd-group/12. | |||
Req: DELETE /rd-group/12 | Req: DELETE /rd-group/12 | |||
Res: 2.02 Deleted | Res: 2.02 Deleted | |||
7. RD Lookup | 7. RD Lookup | |||
In order for an RD to be used for discovering resources registered | To discover the resources registered with the RD, a lookup interface | |||
with it, an optional lookup interface may be provided. This lookup | must be provided. This lookup interface is defined as a default, and | |||
interface is defined as a default, and it is assumed that RDs may | it is assumed that RDs may also support lookups to return resource | |||
also support lookups to return resource descriptions in alternative | descriptions in alternative formats (e.g. Atom or HTML Link) or | |||
formats (e.g. Atom or HTML Link) or using more advanced interfaces | using more advanced interfaces (e.g. supporting context or semantic | |||
(e.g. supporting context or semantic based lookup). | based lookup). | |||
RD Lookup allows lookups for domains, groups, endpoints and resources | ||||
using attributes 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) corresponding to the type of lookup. Thus, a domain lookup MUST | ||||
return a list of domains, a group lookup MUST return a list of | ||||
groups, an endpoint lookup MUST return a list of endpoints and a | ||||
resource lookup MUST return a list of links to resources. | ||||
RD Lookup does not expose registration resources directly, but | RD Lookup allows lookups for groups, endpoints and resources using | |||
returns link content from registration resource entries which satisfy | attributes defined in this document and for use with the CoRE Link | |||
RD Lookup queries. | Format. The result of a lookup request is the list of links (if any) | |||
corresponding to the type of lookup. Thus, a group lookup MUST | ||||
return a list of groups, an endpoint lookup MUST return a list of | ||||
endpoints and a resource lookup MUST return a list 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: | |||
+-------------+--------------------+-----------+ | +-------------+--------------------+-----------+ | |||
| Lookup Type | Resource Type | Mandatory | | | Lookup Type | Resource Type | Mandatory | | |||
+-------------+--------------------+-----------+ | +-------------+--------------------+-----------+ | |||
| Resource | core.rd-lookup-res | Mandatory | | | Resource | core.rd-lookup-res | Mandatory | | |||
| Endpoint | core.rd-lookup-ep | Mandatory | | | Endpoint | core.rd-lookup-ep | Mandatory | | |||
| Domain | core.rd-lookup-d | Optional | | ||||
| Group | core.rd-lookup-gp | Optional | | | Group | core.rd-lookup-gp | Optional | | |||
+-------------+--------------------+-----------+ | +-------------+--------------------+-----------+ | |||
Table 1: Lookup Types | Table 1: Lookup Types | |||
Each endpoint and resource lookup result returns respectively the | 7.1. Resource lookup | |||
scheme (IP address and port) followed by the path part of the URI of | ||||
every endpoint and resource inside angle brackets ("<>") and followed | ||||
by the other parameters. | ||||
The target of these links SHOULD be the actual location of the | Resource lookup results in links that are semantically equivalent to | |||
domain, endpoint or resource, but MAY be an intermediate proxy e.g. | the links submitted to the RD if they were accessed on the endpoint | |||
in the case of an HTTP lookup interface for CoAP endpoints. | itself. The links and link parameters returned are equal to the | |||
submitted ones except for anchor, which was resolved by the server | ||||
against the endpoint's context. | ||||
The domain lookup returns every lookup domain with a base RD resource | Links that did not have an anchor attribute are therefore returned | |||
value (e.g. "/rd") encapsulated within angle brackets. | with the (explicitly or implicitly set) context URI of the | |||
registration as the anchor. Links whose anchor was submitted as an | ||||
absolute URI are returned as they were registered. The hrefs of | ||||
links can always be served as they were submitted; the server MAY | ||||
return relative references in absolute form in to resource lookups, | ||||
but that results in needlessly verbose responses. | ||||
In case that a group does not implement any multicast address, the | Above rules allow the client to interpret the response as links | |||
group lookup returns every group lookup with a group base resource | without any further knowledge of what the RD does. The Resource | |||
value encapsulated within angle brackets (e.g. "/rd/look-up"). | Directory MAY replace the contexts with a configured intermediate | |||
Otherwise, the group lookup returns the multicast address of the | proxy, e.g. in the case of an HTTP lookup interface for CoAP | |||
group inside angle brackets. | endpoints. | |||
7.2. Endpoint and group lookup | ||||
Endpoint and group lookups result in links to registration resources | ||||
and group resources, respectively. Endpoint registration resources | ||||
are annotated with their endpoint names (ep), domains (d, if | ||||
present), context (con) and lifetime (lt, if present). Additional | ||||
endpoint attributes are added as link attributes to their endpoint | ||||
link unless their specification says otherwise. Group resources are | ||||
annotated with their group names (gp), domain (d, if present) and | ||||
multicast address (con, if present). | ||||
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. | ||||
7.3. Lookup filtering | ||||
Using the Accept Option, the requester can control whether this list | Using the Accept Option, the requester can control whether this list | |||
is returned in CoRE Link Format ("application/link-format", default) | is returned in CoRE Link Format ("application/link-format", default) | |||
or its alternate content-formats ("application/link-format+json" or | or its alternate content-formats ("application/link-format+json" or | |||
"application/link-format+cbor"). | "application/link-format+cbor"). | |||
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. | |||
Multiple query parameters MAY be included in a lookup, all included | Multiple search criteria MAY be included in a lookup. All included | |||
parameters MUST match for a resource to be returned. The | criteria MUST match for a link to be returned. | |||
character'*' MAY be included at the end of a parameter value as a | ||||
wildcard operator. | ||||
RD Lookup requests MAY use any set of query parameters to match the | A link matches a search criterion if it has an attribute of the same | |||
registered attributes and relations. In addition, this interface MAY | name and the same value, allowing for a trailing "*" wildcard | |||
be used with queries that specify domains, endpoints, and groups. | operator as in Section 4.1 of [RFC6690]. Attributes that are defined | |||
For example, a domain lookup filtering on groups would return a list | as "link-type" match if the search value matches any of their values | |||
of domains that contain the specified groups. An endpoint lookup | (see Section 4.1 of [RFC6690]; eg. "?if=core.s" matches ";if="abc | |||
filtering on groups would return a list of endpoints that are in the | core.s";"). A link also matches a search criterion if the link that | |||
specified groups. | would be produced for any of its containing entities would match the | |||
criterion: A search criterion matches an endpoint if it matches the | ||||
endpoint itself or any of the groups it is contained in, and one on a | ||||
resource if it matches the resource, the resource's endpoint, or any | ||||
of the endpoint's groups. | ||||
Note that "href" is also a valid search criterion and matches target | ||||
references. Like all search criteria, on a resource lookup it can | ||||
match the target reference of the resource link itself, but also the | ||||
registration resource of the endpoint that registered it, or any | ||||
group resource that endpoint is contained in. | ||||
Clients that are interested in a lookup result repeatedly or | Clients that are interested in a lookup result repeatedly or | |||
continuously can use mechanisms like ETag caching, resource | continuously can use mechanisms like ETag caching, resource | |||
observation ([RFC7641]), or any future mechanism that might allow | observation ([RFC7641]), or any future mechanism that might allow | |||
more efficient observations of collections. These are advertised, | more efficient observations of collections. These are advertised, | |||
detected and used according to their own specifications and can be | detected and used according to their own specifications and can be | |||
used with the lookup interface as with any other resource. | used with the lookup interface as with any other resource. | |||
The lookup interface is specified as follows: | The lookup interface is specified as follows: | |||
Interaction: Client -> RD | Interaction: Client -> RD | |||
Method: GET | Method: GET | |||
URI Template: {+type-lookup- | ||||
location}{?d,res,ep,gp,et,rt,page,count,resource-param} | URI Template: {+type-lookup-location}{?page,count,search*} | |||
URI Template Variables: | URI Template Variables: | |||
type-lookup-location := RD Lookup URI for a given lookup type | type-lookup-location := RD Lookup URI for a given lookup type | |||
(mandatory). The address is discovered as described in | (mandatory). The address is discovered as described in | |||
Section 5.2. | Section 5.2. | |||
ep := Endpoint name (optional). Used for endpoint, group and | search := Search criteria for limiting the number of results | |||
resource lookups. | (optional). | |||
d := Domain (optional). Used for domain, group, endpoint and | ||||
resource lookups. | ||||
res := resource (optional). Used for domain, group, endpoint and | ||||
resource lookups. | ||||
gp := Group name (optional). Used for endpoint, group and | ||||
resource lookups. | ||||
page := Page (optional). Parameter can not be used without the | page := Page (optional). Parameter can not be used without the | |||
count parameter. Results are returned from result set in pages | count parameter. Results are returned from result set in pages | |||
that contain 'count' links starting from index (page * count). | that contain 'count' links starting from index (page * count). | |||
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. | |||
rt := Resource type (optional). Used for group, endpoint and | ||||
resource lookups. | ||||
et := Endpoint type (optional). Used for group, endpoint and | ||||
resource lookups. | ||||
resource-param := Link attribute parameters (optional). Any link | ||||
target attribute as defined in Section 4.1 of [RFC6690], used | ||||
for resource lookups. | ||||
Content-Format: application/link-format (optional) | Content-Format: application/link-format (optional) | |||
Content-Format: application/link-format+json (optional) | Content-Format: application/link-format+json (optional) | |||
Content-Format: application/link-format+cbor (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", "application/link-format+cbor", or "application/link- | |||
format+json" payload containing matching entries for the lookup. | format+json" payload containing matching entries for the lookup. | |||
The payload can contain zero links (which is an empty payload, | ||||
Failure: 4.04 "Not Found" or 404 "Not Found" in case no matching | "80" (hex) or "[]" in the respective content format), indicating | |||
entry is found for a unicast 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 | |||
7.4. Lookup examples | ||||
The examples in this section assume CoAP hosts with a default CoAP | The examples in this section assume CoAP hosts with a default CoAP | |||
port 61616. HTTP hosts are possible and do not change the nature of | port 61616. HTTP hosts are possible and do not change the nature of | |||
the examples. | 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 4: | with the example resource look-up locations discovered in Figure 6: | |||
Req: GET /rd-lookup/res?rt=temperature | Req: GET /rd-lookup/res?rt=temperature | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[FDFD::123]:61616/temp>;rt="temperature" | </temp>;rt="temperature";anchor="coap://[2001:db8:3::123]:61616" | |||
The following example shows a client performing an endpoint type | The same lookup using the CBOR Link Format media type: | |||
lookup: | ||||
Req: GET /rd-lookup/ep?et=power-node | Req: GET /rd-lookup/res?rt=temperature | |||
Accept: TBD64 | ||||
Res: 2.05 Content | ||||
Content-Format: TBD64 | ||||
Payload in Hex notation: | ||||
81A301652F74656D70096B74656D706572617475726503781E636F61703A2F2F5B323030 | ||||
313A6462383A333A3A3132335D3A3631363136 | ||||
Decoded payload: | ||||
[{1: "/temp", 9: "temperature", 3: "coap://[2001:db8:3::123]:61616"}] | ||||
A client that wants to be notified of new resources as they show up | ||||
can use observation: | ||||
Req: GET /rd-lookup/res?rt=light | ||||
Observe: 0 | ||||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[FDFD::127]:61616>;ep="node5", | Observe: 23 | |||
<coap://[FDFD::129]:61616>;ep="node7" | Payload: empty | |||
The following example shows a client performing a domain lookup: | (at a later point in time) | |||
Req: GET /rd-lookup/d | Res: 2.05 Content | |||
Observe: 24 | ||||
Payload: | ||||
</west>;rt="light";anchor="coap://[2001:db8:3::124]", | ||||
</south>;rt="light";anchor="coap://[2001:db8:3::124]", | ||||
</east>;rt="light";anchor="coap://[2001:db8:3::124]" | ||||
The following example shows a client performing an endpoint type | ||||
lookup: | ||||
Req: GET /rd-lookup/ep?et=power-node | ||||
Res: 2.05 Content | Res: 2.05 Content | |||
<>;d="domain1", | </rd/1234>;con="coap://[2001:db8:3::127]:61616";ep="node5"; | |||
<>;d="domain2" | et="power-node";ct="40";lt="600", | |||
</rd/4521>;con="coap://[2001:db8:3::129]:61616";ep="node7"; | ||||
et="power-node";ct="40";lt="600";d="floor-3" | ||||
The following example shows a client performing a group lookup for | The following example shows a client performing a group lookup for | |||
all groups: | all groups: | |||
Req: GET /rd-lookup/gp | Req: GET /rd-lookup/gp | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<>;gp="lights1";d="example.com" | </rd-group/1>;gp="lights1";d="example.com";con="coap://[ff35:30:2001:db8::1]", | |||
<>;gp="lights2";d="ecample.com" | </rd-group/2>;gp="lights2";d="example.com";con="coap://[ff35:30:2001:db8::2]" | |||
The following example shows a client performing a lookup for all | The following example shows a client performing a lookup for all | |||
endpoints in a particular group: | endpoints in a particular group: | |||
Req: GET /rd-lookup/ep?gp=lights1 | Req: GET /rd-lookup/ep?gp=lights1 | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[FDFD::123]:61616>;ep="node1", | </rd/abcd>;con="coap://[2001:db8:3::123]:61616";ep="node1";et="power-node";ct="40";lt="600", | |||
<coap://[FDFD::124]:61616>;ep="node2" | </rd/efgh>;con="coap://[2001:db8:3::124]:61616";ep="node2";et="power-node";ct="40";lt="600" | |||
The following example shows a client performing a lookup for all | The following example shows a client performing a lookup for all | |||
groups an endpoint belongs to: | groups the endpoint "node1" belongs to: | |||
Req: GET /rd-lookup/gp?ep=node1 | Req: GET /rd-lookup/gp?ep=node1 | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<>;gp="lights1" | </rd-group/1>;gp="lights1" | |||
The following example shows a client performing a paginated resource | ||||
lookup | ||||
The following example shows a client performing a paginated lookup | ||||
Req: GET /rd-lookup/res?page=0&count=5 | Req: GET /rd-lookup/res?page=0&count=5 | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[FDFD::123]:61616/res/0>;rt=sensor;ct=60 | </res/0>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/1>;rt=sensor;ct=60 | </res/1>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/2>;rt=sensor;ct=60 | </res/2>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/3>;rt=sensor;ct=60 | </res/3>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/4>;rt=sensor;ct=60 | </res/4>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616" | |||
Req: GET /rd-lookup/res?page=1&count=5 | Req: GET /rd-lookup/res?page=1&count=5 | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[FDFD::123]:61616/res/5>;rt=sensor;ct=60 | </res/5>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/6>;rt=sensor;ct=60 | </res/6>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/7>;rt=sensor;ct=60 | </res/7>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/8>;rt=sensor;ct=60 | </res/8>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616", | |||
<coap://[FDFD::123]:61616/res/9>;rt=sensor;ct=60 | </res/9>;rt=sensor;ct=60;anchor="coap://[2001:db8:3::123]:61616" | |||
The following example shows a client performing a lookup of all | ||||
resources from endpoints of a given endpoint type. It assumes that | ||||
two endpoints (with endpoint names "sensor1" and "sensor2") have | ||||
previously registered with their respective addresses | ||||
"coap://sensor1.example.com" and "coap://sensor2.example.com", and | ||||
posted the very payload of the 6th request of section 5 of [RFC6690]. | ||||
It demonstrates how the link targets stay unmodified, but the anchors | ||||
get constructed by the resource directory: | ||||
Req: GET /rd-lookup/res?et=sensor-node | ||||
</sensors>;ct=40;title="Sensor Index"; | ||||
anchor="coap://sensor1.example.com", | ||||
</sensors/temp>;rt="temperature-c";if="sensor"; | ||||
anchor="coap://sensor1.example.com", | ||||
</sensors/light>;rt="light-lux";if="sensor"; | ||||
anchor="coap://sensor1.example.com", | ||||
<http://www.example.com/sensors/t123>;rel="describedby"; | ||||
anchor="coap://sensor1.example.com/sensors/temp", | ||||
</t>;rel="alternate";anchor="coap://sensor1.example.com/sensors/temp", | ||||
</sensors>;ct=40;title="Sensor Index"; | ||||
anchor="coap://sensor2.example.com", | ||||
</sensors/temp>;rt="temperature-c";if="sensor"; | ||||
anchor="coap://sensor2.example.com", | ||||
</sensors/light>;rt="light-lux";if="sensor"; | ||||
anchor="coap://sensor2.example.com", | ||||
<http://www.example.com/sensors/t123>;rel="describedby"; | ||||
;anchor="coap://sensor2.example.com/sensors/temp", | ||||
</t>;rel="alternate";anchor="coap://sensor2.example.com/sensors/temp" | ||||
8. Security Considerations | 8. Security Considerations | |||
The security considerations as described in Section 7 of [RFC5988] | The security considerations as described in Section 7 of [RFC5988] | |||
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 is determined to be unique by an RD by the Endpoint | An Endpoint is determined to be unique within (the domain of) an RD | |||
identifier parameter included during Registration, and any associated | by the Endpoint identifier parameter included during Registration, | |||
TLS or DTLS security bindings. An Endpoint MUST NOT be identified by | and any associated TLS or DTLS security bindings. An Endpoint MUST | |||
its protocol, port or IP address as these may change over the | NOT be identified by its protocol, port or IP address as these may | |||
lifetime of an Endpoint. | change over the lifetime of an Endpoint. | |||
Every operation performed by an Endpoint or Client on a resource | Every operation performed by an Endpoint or Client on a resource | |||
directory SHOULD be mutually authenticated using Pre-Shared Key, Raw | directory SHOULD be mutually authenticated using Pre-Shared Key, Raw | |||
Public Key or Certificate based security. Endpoints using a | Public Key or Certificate based security. | |||
Certificate MUST include the Endpoint identifier as the Subject of | ||||
the Certificate, and this identifier MUST be checked by a resource | Consider te following threat: two devices A and B are managed by a | |||
directory to match the Endpoint identifier included in the | single server. Both devices have unique, per-device credentials for | |||
Registration message. | use with DTLS to make sure that only parties with authorization to | |||
access A or B can do so. | ||||
Now, imagine that a malicious device A wants to sabotage the device | ||||
B. It uses its credentials during the TLS exchange. Then, it puts | ||||
the endpoint name of device B. If the server does not check whether | ||||
the identifier provided in the DTLS handshake matches the identifier | ||||
used at the CoAP layer then it may be inclined to use the endpoint | ||||
name for looking up what information to provision to the malicious | ||||
device. | ||||
Therfore, Endpoints MUST include the Endpoint identifier in the | ||||
message, and this identifier MUST be checked by a resource directory | ||||
to match the Endpoint identifier included in the Registration | ||||
message. | ||||
8.2. Access Control | 8.2. Access Control | |||
Access control SHOULD be performed separately for the RD | Access control SHOULD be performed separately for the RD | |||
registration, Lookup, and group API paths, as different endpoints may | registration, Lookup, and group API paths, as different endpoints may | |||
be authorized to register with an RD from those authorized to lookup | be authorized to register with an RD from those authorized to lookup | |||
endpoints from the RD. Such access control SHOULD be performed in as | endpoints from the RD. Such access control SHOULD be performed in as | |||
fine-grained a level as possible. For example access control for | fine-grained a level as possible. For example access control for | |||
lookups could be performed either at the domain, endpoint or resource | lookups could be performed either at the domain, endpoint or resource | |||
level. | level. | |||
skipping to change at page 37, line 31 ¶ | skipping to change at page 40, line 4 ¶ | |||
unprotected UDP, there is no return routability check, and they can | unprotected UDP, there is no return routability check, and they can | |||
have a large amplification factor. The responses from the NTP server | have a large amplification factor. The responses from the NTP server | |||
were found to be 19 times larger than the request. A Resource | were found to be 19 times larger than the request. A Resource | |||
Directory (RD) which responds to wild-card lookups is potentially | Directory (RD) which responds to wild-card lookups is potentially | |||
vulnerable if run with CoAP over UDP. Since there is no return | vulnerable if run with CoAP over UDP. Since there is no return | |||
routability check and the responses can be significantly larger than | routability check and the responses can be significantly larger than | |||
requests, RDs can unknowingly become part of a DDoS amplification | requests, RDs can unknowingly become part of a DDoS amplification | |||
attack. | attack. | |||
9. IANA Considerations | 9. IANA Considerations | |||
9.1. Resource Types | 9.1. Resource Types | |||
"core.rd", "core.rd-group", "core.rd-lookup-ep", "core.rd-lookup- | "core.rd", "core.rd-group", "core.rd-lookup-ep", "core.rd-lookup- | |||
res", "core.rd-lookup-d", and "core.rd-lookup-gp" resource types need | res", and "core.rd-lookup-gp" resource types need to be registered | |||
to be registered with the resource type registry defined by | with the resource type registry defined by [RFC6690]. | |||
[RFC6690]. | ||||
9.2. IPv6 ND Resource Directory Address Option | 9.2. IPv6 ND Resource Directory Address Option | |||
This document registers one new ND option type under the subregistry | This document registers one new ND option type under the subregistry | |||
"IPv6 Neighbor Discovery Option Formats": | "IPv6 Neighbor Discovery Option Formats": | |||
o Resource Directory address Option (38) | o Resource Directory address Option (38) | |||
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 the human readable name of | Each entry in the registry must include * the human readable name of | |||
the parameter, the query parameter, validity requirements if any and | the parameter, * the short name as used in query parameters or link | |||
a description. The query parameter MUST be a valid URI query key | attributes, * indication of whether it can be passed as a query | |||
[RFC3986]. | parameter at registration of endpoints or groups, as a query | |||
parameter in lookups, or be expressed as a link attribute, * validity | ||||
requirements if any, and * a description. | ||||
The query parameter MUST be both a valid URI query key [RFC3986] and | ||||
a parmname as used in [RFC5988]. | ||||
The description must give details on which registrations they apply | ||||
to (Endpoint, group registrations or both? Can they be updated?), | ||||
and how they are to be processed in lookups. | ||||
The mechanisms around new RD parameters should be designed in such a | ||||
way that they tolerate RD implementations that are unaware of the | ||||
parameter and expose any parameter passed at registration or updates | ||||
on in endpoint lookups. (For example, if a parameter used at | ||||
registration were to be confidential, the registering endpoint should | ||||
be instructed to only set that parameter if the RD advertises support | ||||
for keeping it confidential at the discovery step.) | ||||
Initial entries in this sub-registry are as follows: | Initial entries in this sub-registry are as follows: | |||
+----------+-------+---------------+--------------------------------+ | +----------+-------+---------------+-----+--------------------------+ | |||
| Name | Query | Validity | Description | | | Full | Short | Validity | Use | Description | | |||
+----------+-------+---------------+--------------------------------+ | | name | | | | | | |||
| Endpoint | ep | | Name of the endpoint, max 63 | | +----------+-------+---------------+-----+--------------------------+ | |||
| Name | | | bytes | | | Endpoint | ep | | RLA | Name of the endpoint, | | |||
| Lifetime | lt | 60-4294967295 | Lifetime of the registration | | | Name | | | | max 63 bytes | | |||
| | | | in seconds | | | Lifetime | lt | 60-4294967295 | RLA | Lifetime of the | | |||
| Domain | d | | Domain to which this endpoint | | | | | | | registration in seconds | | |||
| | | | belongs | | | Domain | d | | RLA | Domain to which this | | |||
| Endpoint | et | | Semantic name of the endpoint | | | | | | | endpoint belongs | | |||
| Type | | | | | | Context | con | URI | RLA | The scheme, address and | | |||
| Context | con | URI | The scheme, address and port | | | | | | | port and path at which | | |||
| | | | and path at which this server | | | | | | | this server is available | | |||
| | | | is available | | | Group | gp | | RLA | Name of a group in the | | |||
| Resource | res | | Name of the resource | | | Name | | | | RD | | |||
| Name | | | | | | Page | page | Integer | L | Used for pagination | | |||
| Group | gp | | Name of a group in the RD | | | Count | count | Integer | L | Used for pagination | | |||
| Name | | | | | | Endpoint | et | | RLA | Semantic name of the | | |||
| Page | page | Integer | Used for pagination | | | Type | | | | endpoint (see Section | | |||
| Count | count | Integer | Used for pagination | | | | | | | 9.4) | | |||
+----------+-------+---------------+--------------------------------+ | +----------+-------+---------------+-----+--------------------------+ | |||
Table 2: RD Parameters | Table 2: RD Parameters | |||
(Short: Short name used in query parameters or link attributes. Use: | ||||
R = used at registration, L = used at lookup, A = expressed in link | ||||
attribute | ||||
The descriptions for the options defined in this document are only | ||||
summarized here. To which registrations they apply and when they are | ||||
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 [RFC5226]. | Review" as described in [RFC8126]. The evaluation should consider | |||
formal criteria, duplication of functionality (Is the new entry | ||||
redundant with an existing one?), topical suitability (Eg. is the | ||||
described property actually a property of the endpoint and not a | ||||
property of a particular resource, in which case it should go into | ||||
the payload of the registration and need not be registered?), and the | ||||
potential for conflict with commonly used link attributes (For | ||||
example, "if" could be used as a parameter for conditional | ||||
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 | ||||
an "if" query parameter could ambiguously filter by the registered | ||||
endpoint property or the [RFC6690] link attribute). It is expected | ||||
that the registry will receive between 5 and 50 registrations in | ||||
total over the next years. | ||||
9.3.1. Full description of the "Endpoint Type" Registration Parameter | ||||
An endpoint registering at an RD can describe itself with endpoint | ||||
types, similar to how resources are described with Resource Types in | ||||
[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 | ||||
subregistry. Endpoint types can be passed in the "et" query | ||||
parameter as part of extra-attrs at the Registration step, are shown | ||||
on endpoint lookups using the "et" target attribute, and can be | ||||
filtered for using "et" as a search criterion in resource and | ||||
endpoint lookup. Multiple endpoint types are given as separate query | ||||
parameters or link attributes. | ||||
Note that Endpoint Type differs from Resource Type in that it uses | ||||
multiple attributes rather than space separated values. As a result, | ||||
Resource Directory implementations automatically support correct | ||||
filtering in the lookup interfaces from the rules for unknown | ||||
endpoint attributes. | ||||
9.4. "Endpoint Type" (et=) RD Parameter values | ||||
This specification establishes a new sub-registry under "CoRE | ||||
Parameters" called '"Endpoint Type" (et=) RD Parameter values'. The | ||||
registry properties (required policy, requirements, template) are | ||||
identical to those of the Resource Type parameters in [RFC6690], in | ||||
short: | ||||
The review policy is IETF Review for values starting with "core", and | ||||
Specification Required for others. | ||||
The requirements to be enforced are: | ||||
o The values MUST be related to the purpose described in | ||||
Section 9.3.1. | ||||
o The registered values MUST conform to the ABNF reg-rel-type | ||||
definition of [RFC6690] and MUST NOT be a URI. | ||||
o It is recommended to use the period "." character for | ||||
segmentation. | ||||
The registry is initially empty. | ||||
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 | |||
skipping to change at page 40, line 5 ¶ | skipping to change at page 44, line 5 ¶ | |||
Before commissioning by the lighting manager, the network is | Before commissioning by the lighting manager, the network is | |||
installed and access to the interfaces is proven to work by the | installed and access to the interfaces is proven to work by the | |||
network manager. | network manager. | |||
At the moment of installation, the network under installation is not | At the moment of installation, the network under installation is not | |||
necessarily connected to the DNS infra structure. Therefore, SLAAC | necessarily connected to the DNS infra structure. Therefore, SLAAC | |||
IPv6 addresses are assigned to CT, RD, luminaries and sensor shown in | IPv6 addresses are assigned to CT, RD, luminaries and sensor shown in | |||
Table 3 below: | Table 3 below: | |||
+--------------------+--------------+ | +--------------------+----------------+ | |||
| Name | IPv6 address | | | Name | IPv6 address | | |||
+--------------------+--------------+ | +--------------------+----------------+ | |||
| luminary1 | FDFD::ABCD:1 | | | luminary1 | 2001:db8:4::1 | | |||
| luminary2 | FDFD::ABCD:2 | | | luminary2 | 2001:db8:4::2 | | |||
| Presence sensor | FDFD::ABCD:3 | | | Presence sensor | 2001:db8:4::3 | | |||
| Resource directory | FDFD::ABCD:0 | | | Resource directory | 2001:db8:4::ff | | |||
+--------------------+--------------+ | +--------------------+----------------+ | |||
Table 3: interface SLAAC addresses | Table 3: interface SLAAC addresses | |||
In Section 10.1.2 the use of resource directory during installation | In Section 10.1.2 the use of resource directory during installation | |||
is presented. | is presented. | |||
10.1.2. RD entries | 10.1.2. RD entries | |||
It is assumed that access to the DNS infrastructure is not always | It is assumed that access to the DNS infrastructure is not always | |||
possible during installation. Therefore, the SLAAC addresses are | possible during installation. Therefore, the SLAAC addresses are | |||
skipping to change at page 41, line 13 ¶ | skipping to change at page 45, line 13 ¶ | |||
Table 4: Resource Directory identifiers | Table 4: Resource Directory identifiers | |||
It is assumed that the CT knows of the RD's address, and has | It is assumed that the CT knows of the RD's address, and has | |||
performed URI discovery on it that gave a response like the one in | performed URI discovery on it that gave a response like the one in | |||
the Section 5.2 example. | the Section 5.2 example. | |||
The CT inserts the endpoints of the luminaries and the sensor in the | The CT inserts the endpoints of the luminaries and the sensor in the | |||
RD using the Context parameter (con) to specify the interface | RD using the Context parameter (con) to specify the interface | |||
address: | address: | |||
Req: POST coap://[FDFD::ABCD:0]/rd | Req: POST coap://[2001:db8:4::ff]/rd | |||
?ep=lm_R2-4-015_wndw&con=coap://[FDFD::ABCD:1]&d=R2-4-015 | ?ep=lm_R2-4-015_wndw&con=coap://[2001:db8:4::1]&d=R2-4-015 | |||
Payload: | Payload: | |||
</light/left>;rt="light", | </light/left>;rt="light", | |||
</light/middle>;rt="light", | </light/middle>;rt="light", | |||
</light/right>;rt="light" | </light/right>;rt="light" | |||
Res: 2.01 Created | Res: 2.01 Created | |||
Location: /rd/4521 | Location: /rd/4521 | |||
Req: POST coap://[FDFD::ABCD:0]/rd | Req: POST coap://[2001:db8:4::ff]/rd | |||
?ep=lm_R2-4-015_door&con=coap://[FDFD::ABCD:2]&d=R2-4-015 | ?ep=lm_R2-4-015_door&con=coap://[2001:db8:4::2]&d=R2-4-015 | |||
Payload: | Payload: | |||
</light/left>;rt="light", | </light/left>;rt="light", | |||
</light/middle>;rt="light", | </light/middle>;rt="light", | |||
</light/right>;rt="light" | </light/right>;rt="light" | |||
Res: 2.01 Created | Res: 2.01 Created | |||
Location: /rd/4522 | Location: /rd/4522 | |||
Req: POST coap://[FDFD::ABCD:0]/rd | Req: POST coap://[2001:db8:4::ff]/rd | |||
?ep=ps_R2-4-015_door&con=coap://[FDFD::ABCD:3]d&d=R2-4-015 | ?ep=ps_R2-4-015_door&con=coap://[2001:db8:4::3]d&d=R2-4-015 | |||
Payload: | Payload: | |||
</ps>;rt="p-sensor" | </ps>;rt="p-sensor" | |||
Res: 2.01 Created | Res: 2.01 Created | |||
Location: /rd/4523 | Location: /rd/4523 | |||
The domain name d=R2-4-015 has been added for an efficient lookup | The domain name d=R2-4-015 has been added for an efficient lookup | |||
because filtering on "ep" name is more awkward. The same domain name | because filtering on "ep" name is more awkward. The same domain name | |||
is communicated to the two luminaries and the presence sensor by the | is communicated to the two luminaries and the presence sensor by the | |||
CT. | CT. | |||
The group is specified in the RD. The Context parameter is set to | The group is specified in the RD. The Context parameter is set to | |||
the site-local multicast address allocated to the group. In the POST | the site-local multicast address allocated to the group. In the POST | |||
in the example below, these two endpoints and the endpoint of the | in the example below, these two endpoints and the endpoint of the | |||
presence sensor are registered as members of the group. | presence sensor are registered as members of the group. | |||
Req: POST coap://[FDFD::ABCD:0]/rd-group | Req: POST coap://[2001:db8:4::ff]/rd-group | |||
?gp=grp_R2-4-015&con=coap://[FF05::1] | ?gp=grp_R2-4-015&con=coap://[ff05::1] | |||
Payload: | Payload: | |||
<>;ep=lm_R2-4-015_wndw, | </rd/4521>, | |||
<>;ep=lm_R2-4-015_door, | </rd/4522>, | |||
<>;ep=ps_R2-4-015_door | </rd/4523> | |||
Res: 2.01 Created | Res: 2.01 Created | |||
Location: /rd-group/501 | Location: /rd-group/501 | |||
After the filling of the RD by the CT, the application in the | After the filling of the RD by the CT, the application in the | |||
luminaries can learn to which groups they belong, and enable their | luminaries can learn to which groups they belong, and enable their | |||
interface for the multicast address. | interface for the multicast address. | |||
The luminary, knowing its domain, queries the RD for the endpoint | The luminary, knowing its domain, queries the RD for the endpoint | |||
with rt=light and d=R2-4-015. The RD returns all endpoints in the | with rt=light and d=R2-4-015. The RD returns all endpoints in the | |||
domain. | domain. | |||
Req: GET coap://[FDFD::ABCD:0]/rd-lookup/ep | Req: GET coap://[2001:db8:4::ff]/rd-lookup/ep | |||
?d=R2-4-015;rt=light | ?d=R2-4-015;rt=light | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[FDFD::ABCD:1]>; | </rd/4521>;con="coap://[2001:db8:4::1]", | |||
ep="lm_R2-4-015_wndw", | ep="lm_R2-4-015_wndw", | |||
<coap://[FDFD::ABCD:2]>; | </rd/4522>;con="coap://[2001:db8:4::2]", | |||
ep="lm_R2-4-015_door" | ep="lm_R2-4-015_door" | |||
Knowing its own IPv6 address, the luminary discovers its endpoint | Knowing its own IPv6 address, the luminary discovers its endpoint | |||
name. With the endpoint name the luminary queries the RD for all | name. With the endpoint name the luminary queries the RD for all | |||
groups to which the endpoint belongs. | groups to which the endpoint belongs. | |||
Req: GET coap://[FDFD::ABCD:0]/rd-lookup/gp | Req: GET coap://[2001:db8:4::ff]/rd-lookup/gp | |||
?ep=lm_R2-4-015_wndw | ?ep=lm_R2-4-015_wndw | |||
Res: 2.05 Content | Res: 2.05 Content | |||
<coap://[FF05::1]>;gp="grp_R2-4-015" | </rd-group/501>;gp="grp_R2-4-015";con="coap://[ff05::1]" | |||
From the context parameter value, the luminary learns the multicast | From the context parameter value, the luminary learns the multicast | |||
address of the multicast group. | 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 //[FDFD::ABCD:1]/coap-group | Req: POST //[2001:db8:4::1]/coap-group | |||
Content-Format: application/coap-group+json | Content-Format: application/coap-group+json | |||
{ "a": "[FF05::1]", | { "a": "[ff05::1]", | |||
"n": "grp_R2-4-015"} | "n": "grp_R2-4-015"} | |||
Res: 2.01 Created | Res: 2.01 Created | |||
Location-Path: /coap-group/1 | Location-Path: /coap-group/1 | |||
Dependent on the situation, only the address, "a", or the name, "n", | Dependent on the situation, only the address, "a", or the name, "n", | |||
is specified in the coap-group resource. | is specified in the coap-group resource. | |||
10.2. OMA Lightweight M2M (LWM2M) Example | 10.2. OMA Lightweight M2M (LWM2M) Example | |||
skipping to change at page 45, line 38 ¶ | skipping to change at page 49, line 38 ¶ | |||
When an LWM2M object or instance is registered, this indicates to the | When an LWM2M object or instance is registered, this indicates to the | |||
LWM2M server that the object and its resources are available for | LWM2M server that the object and its resources are available for | |||
management and service enablement (REST API) operations. | management and service enablement (REST API) operations. | |||
LWM2M endpoints may use the following RD registration parameters as | LWM2M endpoints may use the following RD registration parameters as | |||
defined in Table 2 : | defined in Table 2 : | |||
ep - Endpoint Name | ep - Endpoint Name | |||
lt - registration lifetime | lt - registration lifetime | |||
Endpoint Name is mandatory, all other registration parameters are | Endpoint Name, Lifetime, and LWM2M Version are mandatory parameters | |||
for the register operation, all other registration parameters are | ||||
optional. | optional. | |||
Additional optional LWM2M registration parameters are defined: | Additional optional LWM2M registration parameters are defined: | |||
+------------+-------+-------------------------------+--------------+ | +-----------+-------+-------------------------------+---------------+ | |||
| Name | Query | Validity | Description | | | Name | Query | Validity | Description | | |||
+------------+-------+-------------------------------+--------------+ | +-----------+-------+-------------------------------+---------------+ | |||
| Protocol | b | {"U",UQ","S","SQ","US","UQS"} | Available | | | Binding | b | {"U",UQ","S","SQ","US","UQS"} | Available | | |||
| Binding | | | Protocols | | | Mode | | | Protocols | | |||
| | | | | | | | | | | | |||
| LWM2M | ver | 1.0 | Spec Version | | | LWM2M | ver | 1.0 | Spec Version | | |||
| Version | | | | | | Version | | | | | |||
| | | | | | | | | | | | |||
| SMS Number | sms | | MSISDN | | | SMS | sms | | MSISDN | | |||
+------------+-------+-------------------------------+--------------+ | | Number | | | | | |||
+-----------+-------+-------------------------------+---------------+ | ||||
Table 5: LWM2M Additional Registration Parameters | Table 5: LWM2M Additional Registration Parameters | |||
The following RD registration parameters are not currently specified | The following RD registration parameters are not currently specified | |||
for use in LWM2M: | for use in LWM2M: | |||
et - Endpoint Type | et - Endpoint Type | |||
con - Context | con - Context | |||
The endpoint registration must include a payload containing links to | The endpoint registration must include a payload containing links to | |||
skipping to change at page 46, line 41 ¶ | skipping to change at page 50, line 42 ¶ | |||
</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 | |||
An LWM2M Registration update proceeds as described in Section 5.4.1, | The LwM2M update is really very similar to the registration update as | |||
and adds some optional parameter updates: | described in Section 5.4.1, with the only difference that there are | |||
more parameters defined and available. All the parameters listed in | ||||
that section are also available with the initial registration but are | ||||
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 Section 5.4.2. | registration proceeds as described in Section 5.4.2. | |||
skipping to change at page 47, line 14 ¶ | skipping to change at page 51, line 17 ¶ | |||
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 Section 5.4.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, Mohit Sethi, Sampo Ukkola, Linyi Tian, | Brandt, Matthieu Vial, Jim Schaad, Mohit Sethi, Hauke Petersen, | |||
Chistian Amsuss, and Jan Newmarch have provided helpful comments, | Hannes Tschofenig, Sampo Ukkola, Linyi Tian, and Jan Newmarch have | |||
discussions and ideas to improve and shape this document. Zach would | provided helpful comments, discussions and ideas to improve and shape | |||
also like to thank his colleagues from the EU FP7 SENSEI project, | this document. Zach would also like to thank his colleagues from the | |||
where many of the resource directory concepts were originally | EU FP7 SENSEI project, where many of the resource directory concepts | |||
developed. | were originally developed. | |||
12. Changelog | 12. Changelog | |||
changes from -11 to -12 | ||||
o added Content Model section, including ER diagram | ||||
o removed domain lookup interface; domains are now plain attributes | ||||
of groups and endpoints | ||||
o updated chapter "Finding a Resource Directory"; now distinguishes | ||||
configuration-provided, network-provided and heuristic sources | ||||
o improved text on: atomicity, idempotency, lookup with multiple | ||||
parameters, endpoint removal, simple registration | ||||
o updated LWM2M description | ||||
o clarified where relative references are resolved, and how context | ||||
and anchor interact | ||||
o new appendix on the interaction with RFCs 6690, 5988 and 3986 | ||||
o lookup interface: group and endpoint lookup return group and | ||||
registration resources as link targets | ||||
o lookup interface: search parameters work the same across all | ||||
entities | ||||
o removed all methods that modify links in an existing registration | ||||
(POST with payload, PATCH and iPATCH) | ||||
o removed plurality definition (was only needed for link | ||||
modification) | ||||
o enhanced IANA registry text | ||||
o More examples and improved text | ||||
changes from -09 to -10 | changes from -09 to -10 | |||
o removed "ins" and "exp" link-format extensions. | o removed "ins" and "exp" link-format extensions. | |||
o removed all text concerning DNS-SD. | o removed all text concerning DNS-SD. | |||
o removed inconsistency in RDAO text. | o removed inconsistency in RDAO text. | |||
o suggestions taken over from various sources | o suggestions taken over from various sources | |||
skipping to change at page 51, line 25 ¶ | skipping to change at page 56, line 15 ¶ | |||
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] | [I-D.ietf-core-links-json] | |||
Li, K., Rahman, A., and C. Bormann, "Representing | Li, K., Rahman, A., and C. Bormann, "Representing | |||
Constrained RESTful Environments (CoRE) Link Format in | Constrained RESTful Environments (CoRE) Link Format in | |||
JSON and CBOR", draft-ietf-core-links-json-08 (work in | JSON and CBOR", draft-ietf-core-links-json-09 (work in | |||
progress), April 2017. | progress), July 2017. | |||
[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- | |||
<http://www.rfc-editor.org/info/rfc2119>. | 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, | |||
<http://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | ||||
IANA Considerations Section in RFCs", RFC 5226, | ||||
DOI 10.17487/RFC5226, May 2008, | ||||
<http://www.rfc-editor.org/info/rfc5226>. | ||||
[RFC5988] Nottingham, M., "Web Linking", RFC 5988, | [RFC5988] Nottingham, M., "Web Linking", RFC 5988, | |||
DOI 10.17487/RFC5988, October 2010, | DOI 10.17487/RFC5988, October 2010, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc5988>. | 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- | |||
<http://www.rfc-editor.org/info/rfc6570>. | 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, | |||
<http://www.rfc-editor.org/info/rfc6690>. | <https://www.rfc-editor.org/info/rfc6690>. | |||
[RFC7396] Hoffman, P. and J. Snell, "JSON Merge Patch", RFC 7396, | [RFC6763] Cheshire, S. and M. Krochmal, "DNS-Based Service | |||
DOI 10.17487/RFC7396, October 2014, | Discovery", RFC 6763, DOI 10.17487/RFC6763, February 2013, | |||
<http://www.rfc-editor.org/info/rfc7396>. | <https://www.rfc-editor.org/info/rfc6763>. | |||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | ||||
Writing an IANA Considerations Section in RFCs", BCP 26, | ||||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
<https://www.rfc-editor.org/info/rfc8126>. | ||||
[RFC8132] van der Stok, P., Bormann, C., and A. Sehgal, "PATCH and | [RFC8132] van der Stok, P., Bormann, C., and A. Sehgal, "PATCH and | |||
FETCH Methods for the Constrained Application Protocol | FETCH Methods for the Constrained Application Protocol | |||
(CoAP)", RFC 8132, DOI 10.17487/RFC8132, April 2017, | (CoAP)", RFC 8132, DOI 10.17487/RFC8132, April 2017, | |||
<http://www.rfc-editor.org/info/rfc8132>. | <https://www.rfc-editor.org/info/rfc8132>. | |||
13.2. Informative References | 13.2. Informative References | |||
[ER] Chen, P., "The entity-relationship model---toward a | ||||
unified view of data", ACM Transactions on Database | ||||
Systems Vol. 1, pp. 9-36, DOI 10.1145/320434.320440, March | ||||
1976. | ||||
[I-D.arkko-core-dev-urn] | ||||
Arkko, J., Jennings, C., and Z. Shelby, "Uniform Resource | ||||
Names for Device Identifiers", draft-arkko-core-dev-urn-04 | ||||
(work in progress), July 2017. | ||||
[I-D.nottingham-rfc5988bis] | ||||
Nottingham, M., "Web Linking", draft-nottingham- | ||||
rfc5988bis-08 (work in progress), August 2017. | ||||
[I-D.silverajan-core-coap-protocol-negotiation] | ||||
Silverajan, B. and M. Ocak, "CoAP Protocol Negotiation", | ||||
draft-silverajan-core-coap-protocol-negotiation-07 (work | ||||
in progress), October 2017. | ||||
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
Transfer Protocol -- HTTP/1.1", RFC 2616, | Transfer Protocol -- HTTP/1.1", RFC 2616, | |||
DOI 10.17487/RFC2616, June 1999, | DOI 10.17487/RFC2616, June 1999, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc2616>. | 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, | |||
<http://www.rfc-editor.org/info/rfc6775>. | <https://www.rfc-editor.org/info/rfc6775>. | |||
[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, | |||
<http://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- | |||
<http://www.rfc-editor.org/info/rfc7252>. | editor.org/info/rfc7252>. | |||
[RFC7390] Rahman, A., Ed. and E. Dijk, Ed., "Group Communication for | [RFC7390] Rahman, A., Ed. and E. Dijk, Ed., "Group Communication for | |||
the Constrained Application Protocol (CoAP)", RFC 7390, | the Constrained Application Protocol (CoAP)", RFC 7390, | |||
DOI 10.17487/RFC7390, October 2014, | DOI 10.17487/RFC7390, October 2014, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc7390>. | editor.org/info/rfc7390>. | |||
[RFC7641] Hartke, K., "Observing Resources in the Constrained | [RFC7641] Hartke, K., "Observing Resources in the Constrained | |||
Application Protocol (CoAP)", RFC 7641, | Application Protocol (CoAP)", RFC 7641, | |||
DOI 10.17487/RFC7641, September 2015, | DOI 10.17487/RFC7641, September 2015, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc7641>. | editor.org/info/rfc7641>. | |||
Appendix A. Web links and the Resource Directory | ||||
Understanding the semantics of a link-format document and its URI | ||||
references is a journey through different documents ([RFC3986] | ||||
defining URIs, [RFC6690] defining link-format documents based on | ||||
[RFC5988] which defines link headers, and [RFC7252] providing the | ||||
transport). This appendix summarizes the mechanisms and semantics at | ||||
play from an entry in ".well-known/core" to a resource lookup. | ||||
This text is primarily aimed at people entering the field of | ||||
Constrained Restful Environments from applications that previously | ||||
did not use web mechanisms. | ||||
A.1. A simple example | ||||
Let's start this example with a very simple host, "2001:db8:f0::1". | ||||
A client that follows classical CoAP Discovery ([RFC7252] Section 7), | ||||
sends the following multicast request to learn about neighbours | ||||
supporting resources with resource-type "temperature". | ||||
The client sends a link-local multicast: | ||||
GET coap://[ff02::fd]:5683/.well-known/core?rt=temperature | ||||
RES 2.05 Content | ||||
</temp>;rt=temperature;ct=0 | ||||
where the response is sent by the server, "[2001:db8:f0::1]:5683". | ||||
While the client - on the practical or implementation side - can just | ||||
go ahead and create a new request to "[2001:db8:f0::1]:5683" with | ||||
Uri-Path: "temp", the full resolution steps without any shortcuts | ||||
are: | ||||
A.1.1. Resolving the URIs | ||||
The client parses the single returned record. The link's target | ||||
(sometimes called "href") is ""/temp"", which is a relative URI that | ||||
needs resolving. The Base URI to resolve that against is, in absence | ||||
of an "anchor" parameter, the URI of the requested resource as | ||||
described in [RFC6690] Section 2.1. | ||||
The URI of the requested resource can be composed by following the | ||||
steps of [RFC7252] section 6.5 (with an addition at the end of 8.2) | ||||
into ""coap://[2001:db8:f0::1]/.well-known/core"". | ||||
The record's target is resolved by replacing the path ""/.well-known/ | ||||
core"" from the Base URI (section 5.2 [RFC3986]) with the relative | ||||
target URI ""/temp"" into ""coap://[2001:db8:f0::1]/temp"". | ||||
A.1.2. Interpreting attributes and relations | ||||
Some more information but the record's target can be obtained from | ||||
the payload: the resource type of the target is "temperature", and | ||||
its content type is text/plain (ct=0). | ||||
A relation in a web link is a three-part statement that the context | ||||
resource has a named relation to the target resource, like "_This | ||||
page_ has _its table of contents_ at _/toc.html_". In [RFC6690] | ||||
link-format documents, there is an implicit "host relation" specified | ||||
with default parameter: rel="hosts". | ||||
In our example, the context of the link is the URI of the requested | ||||
document itself. A 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]/temp", which is of the resource type | ||||
"temperature" and can be accessed using the text/plain content | ||||
format.' | ||||
A.2. A slightly more complex example | ||||
Omitting the "rt=temperature" filter, the discovery query would have | ||||
given some more records in the payload: | ||||
</temp>;rt=temperature;ct=0, | ||||
</light>;rt=light-lux;ct=0, | ||||
</t>;anchor="/sensors/temp";rel=alternate, | ||||
<http://www.example.com/sensors/t123>;anchor="/sensors/temp"; | ||||
rel=describedby, | ||||
<t123.pdf>;rel=alternate;ct=65001; | ||||
anchor="http://www.example.com/sensors/t123" | ||||
Parsing the third record, the client encounters the "anchor" | ||||
parameter. It is a URI relative to the document's Base URI and is | ||||
thus resolved to ""coap://[2001:db8:f0::1]/sensors/temp"". That is | ||||
the context resource of the link, so the "rel" statement is not about | ||||
the target and the document Base URI any more, but about the target | ||||
and that address. | ||||
Thus, the third record could be read as | ||||
""coap://[2001:db8:f0::1]/sensors/temp" has an alternate | ||||
representation at "coap://[2001:db8:f0::1]/t"". | ||||
The fourth record can be read as ""coap://[2001:db8:f0::1]/sensors/ | ||||
temp" is described by "http://www.example.com/sensors/t123"" | ||||
In the last example the anchor is absolute, where a ""t123.pdf"" is | ||||
resolved relative to ""http://www.example.com/sensors/t123"", which | ||||
gives a statement that ""http://www.example.com/sensors/t123/ | ||||
t123.pdf" is an alternate representation to | ||||
""http://www.example.com/sensors/t123" of which the content type is | ||||
PDF". | ||||
A.3. Enter the Resource Directory | ||||
The resource directory tries to carry the semantics obtainable by | ||||
classical CoAP discovery over to the resource lookup interface as | ||||
faithfully as possible. | ||||
For the following queries, we will assume that the simple host has | ||||
used Simple Registration to register at the resource directory that | ||||
was announced to it, sending this request from its UDP port | ||||
"[2001:db8:f0::1]:6553": | ||||
POST coap://[2001:db8:f01::ff]/.well-known/core?ep-simple-host1 | ||||
The resource directory would have accepted the registration, and | ||||
queried the simple host's ".well-known/core" by itself. As a result, | ||||
the host is registered as an endpoint in the RD with the name | ||||
"simple-host1". The registration is active for 86400 seconds, and | ||||
the endpoint registration Base URI is ""coap://[2001:db8:f0::1]/"" | ||||
because that is the address the registration was sent from (and no | ||||
explicit "con=" was given). | ||||
If the client now queries the RD as it would previously have issued a | ||||
multicast request, it would go through the RD discovery steps by | ||||
fetching "coap://[2001:db8:f0::ff]/.well-known/core?rt=core.rd- | ||||
lookup-res", obtain "coap://[2001:db8:f0::ff]/rd-lookup/res" as the | ||||
resource lookup endpoint, and issue a request to | ||||
"coap://[2001:db8:f0::ff]/rd-lookup/res?rt=temperature" to receive | ||||
the following data: | ||||
</temp>;rt=temperature;ct=0;anchor="coap://[2001:db8:f0::1]" | ||||
This is not _literally_ the same response that it would have received | ||||
from a multicast request, but it would contain the (almost) same | ||||
statement: | ||||
'"coap://[2001:db8:f0::1]" is hosting the resource | ||||
"coap://[2001:db8:f0::1]/temp", which is of the resource type | ||||
"temperature" and can be accessed using the text/plain content | ||||
format.' | ||||
(The difference is whether "/" or "/.well-known/core" hosts the | ||||
resources, which is subject of ongoing discussion about RFC6690). | ||||
To complete the examples, the client could also query all resources | ||||
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" | ||||
would return | ||||
</temp>;rt=temperature;ct=0;anchor="coap://[2001:db8:f0::1]", | ||||
</light>;rt=light-lux;ct=0;anchor="coap://[2001:db8:f0::1]", | ||||
</t>;anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=alternate, | ||||
<http://www.example.com/sensors/t123>; | ||||
anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=describedby, | ||||
<t123.pdf>;rel=alternate;ct=65001; | ||||
anchor="http://www.example.com/sensors/t123" | ||||
Note that the last link was not modified at all because its anchor | ||||
was already an absolute reference. | ||||
Had the simple host registered with an explicit context (eg. | ||||
"?ep=simple-host1&con=coap+tcp://simple-host1.example.com"), that | ||||
context would have been used to resolve the relative anchor values | ||||
instead, giving | ||||
</temp>;rt=temperature;ct=0;anchor="coap+tcp://simple-host1.example.com" | ||||
and analogous records. | ||||
A.4. A note on differences between link-format and Link headers | ||||
While link-format and Link headers look very similar and are based on | ||||
the same model of typed links, there are some differences between | ||||
[RFC6690] and [RFC5988] that should be kept in mind when using or | ||||
implementing a Resource Directory: | ||||
o There is no percent encoding in link-format documents. | ||||
A link-format document is a UTF-8 encoded string of Unicode | ||||
characters and does not have percent encoding, while Link headers | ||||
are practically ASCII strings that use percent encoding for non- | ||||
ASCII characters, stating the encoding explictly when required. | ||||
For example, while a Link header in a page about a Swedish city | ||||
might read | ||||
"Link: </temperature/Malm%C3%B6>;rel="live-environment-data"" | ||||
a link-format document from the same source might describe the | ||||
link as | ||||
"</temperature/Malmoe>;rel="live-environment-data"" | ||||
o In a link-format document, if the anchor attribute is present, the | ||||
link target reference is resolved by using the the (resolved) | ||||
anchor value as Base URI for that link, while in Link headers, it | ||||
is resolved against the URI of the requested document. | ||||
This is explicit in [RFC6690] section 2.1 for link-format, and | ||||
spelled out in section B.2 of [I-D.nottingham-rfc5988bis] , which | ||||
obsoletes the older [RFC5988]. [RFC6690] is based on [RFC5988] | ||||
and has not been updated with clarifications from | ||||
[I-D.nottingham-rfc5988bis]. | ||||
Appendix B. Syntax examples for Protocol Negotiation | ||||
[ 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: | ||||
Req: POST coap://rd.example.com/rd?ep=node1 | ||||
&at=coap+tcp://[2001:db8:f1::2] | ||||
&at=coap://[2001:db8:f1::2] | ||||
Content-Format: 40 | ||||
Payload: | ||||
</temperature>;ct=0;rt="temperature";if="core.s" | ||||
Res: 2.01 Created | ||||
Location: /rd/1234 | ||||
A UDP client would then query: | ||||
Req: GET /rd-lookup/res?rt=temperature | ||||
Res: 2.05 Content | ||||
</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 | ||||
</temperature>;ct=0;rt="temperature";if="core.s"; | ||||
anchor="coap+tcp://[2001:db8:f1::2]" | ||||
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 | |||
End of changes. 171 change blocks. | ||||
739 lines changed or deleted | 1261 lines changed or added | |||
This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |