blob: 80649139d3513a6b650b89e196c1634b7f1d1ff0 [file] [log] [blame]
Julian Halle76ade82020-11-25 03:07:21 +01001Service Locator
2===============
3
4The service locator model provides clients of trusted services with a common interface for locating service instances and
5establishing RPC sessions with service endpoints. By using the service locator, application code is decoupled from the details
6of where services are deployed. Use of the service locator is entirely optional for client applications. Different deployments
7of *libts* provide implementations of the service locator API that are suitable for different environments. The trusted
8services project uses *libts* to decouple test code from the services under test. This enables tests to be reused for testing
9on different platforms with different distributions of services. The same flexibility may be exploited when writing
10applications that use trusted services.
11
12Service Locator Model
13---------------------
14
15The following class diagram illustrates the service locator model:
16
17.. uml:: uml/ServiceLocatorClassDiagram.puml
18
19The model takes inspiration from microservices architectures where there is a similar need to decouple clients from service
20location. In the model, classes have the following roles:
21
22Class service_locator
23'''''''''''''''''''''
24
25The service_locator is responsible for locating service provider instances and returning a service_context object to allow a
26client to establish RPC sessions with the located service endpoint. A service instance is requested by a client using a service
27name. The service name uniquely identifies a service instance, independent of where the service provider is located. The
28service_locator is a singleton and forms the common interface for locating trusted services.
29
30Class service_context
31'''''''''''''''''''''
32
33A service_context object represents a located service and enables a service client to establish RPC sessions with the service.
34A concrete service_context will provide open and close methods that manage RPC session setup and teardown.
35
36Class rpc_caller
37''''''''''''''''
38
39An rpc_caller provides methods for making remote calls associated with a service endpoint. An rpc_caller object represents an
40instance of an RPC session.
41
42Locating Service Instances
43--------------------------
44
45The location of service instances is likely to vary between deployments. Many factors influence where a service instance is
46deployed and the method needed to locate it. e.g.:
47
48 - The type of processing environment in which a service instance is deployed. e.g. service could be deployed in a secure
49 partition, as a TA or in a secure enclave.
50 - Whether a service instance is co-located with other services instances in the same processing environment or whether a
51 separate environment instance is used per service instance.
52 - For Linux user-space clients, the kernel driver model used for messaging influences how a service is located and the type
53 of messaging interface used for RPC requests.
54
55Because of the wide variability in service deployment options, the Trusted Services framework supports the following:
56
57 - *Location independent service names* - a naming convention for identifying service instances, wherever they are located.
58 By using a location independent service name, a client is decoupled from the actual location of a service instance
59 (similar to a DNS names). A concrete service locator is responsible for resolving the location independent service name.
60 - *Service location strategies* - to accommodate the likely variability, an extensible framework for alternative service
61 location strategies is provided.
62
63Service Names
64'''''''''''''
65
66Location Independent Service Names
67``````````````````````````````````
68
69Because of the potential variability in where service instances are deployed, a naming convention that allows a service instance
70to be identified, independent of its location, is useful. By using a location independent service name, coupling between a
71client application and any particular service deployment can be avoided. Use of the Service Locator API and location
72independent service names allows client applications to be portable across different platforms.
73
74The service instance naming convention uses a URN type string to uniquely identify a particular instance of a class of service.
75To provide extensibility, a naming authority is included in the name. This allows anyone with a domain name to define their own
76unique service names. Core service names are defined under the *trustedfirmware.org* authority. The general structure of a
77service name is as follows::
78
79 urn:sn:<authority>:<service>.<version>:<instance>
80
81 The 'urn' prefix should be dropped when service names are used in context.
82 The version field is optional.
83
84The naming convention includes a version number, separated from the <service> field by a '.' character. Beyond the '.', any
85version numbering scheme may be used. This will potentially be useful for delegating version compatibility decisions to a
86service locator. It is preferable for a client to specify a service name that includes a version number as this will
87potentially allow a service locator to:
88
89 - Locate a compatible service instance. For example, a service provider may expose multiple RPC call endpoints to handle
90 different protocol versions. A service locator may resolve the name to the compatible RPC endpoint, based on the version
91 string requested by the client.
92 - Fail gracefully if no compatible version is found.
93
94Some example service names::
95
96 sn:trustedfirmware.org:crypto.1.0.4:0
97 sn:trustedfirmware.org:secure-storage.1.3.11:1
98 sn:trustedfirmware.org:tpm.2.0:0
99
100Location Specific Service Names
101```````````````````````````````
102
103To enable a client to be able to specify location specific service names, it should also be possible to use names that express a
104location specific identifier such as a partition UUID. While use of location specific services names creates a coupling between
105the client and details of the service deployment, their use may be important in the following cases:
106
107 - Where there is no well-known mapping between a location independent service name and a location specific identifier.
108 - Where the client needs to be specific e.g. for tests that target a specific service deployment.
109
110Location specific service names use the same structure as location independent services names but with a technology specific
111authority field. The following is an example of a service name that identifies a service instance that is deployed in a secure
112partition::
113
114 sn:ffa:d9df52d5-16a2-4bb2-9aa4-d26d3b84e8c0:0
115
116 The instance field qualified a particular SP instance from the discovered set.
117
118Service Location Strategies
119'''''''''''''''''''''''''''
120
121The method used by the service locator to resolve a service name to a service instance will depend on the environment in which a
122client is running and where service instances are located. Services will need to be located by any client of a trusted service.
123There are typically two classes of trusted service client:
124
125 - A user-space application.
126 - Another trusted service, running in a secure processing environment.
127
128Different methods for locating service instances in different environments are illustrated in the following examples:
129
130Locating a Service from Linux User-space
131````````````````````````````````````````
132
133Depending on the kernel driver model used, the example methods for locating service instances from Linux user-space are:
134
135 1. Service instances are represented by device nodes e.g. /dev/tpm0. The service locator will simply map the <service>
136 portion of the services name to the base device name and the <instance> to the device node instance.
137 2. A service instance is hosted by a TEE as a TA. The TEE will provide a discovery mechanism that will allow a TA type and
138 instance to be identified. The service locator will need to map the service name to the TEE specific naming scheme.
139 3. A special device that provides messaging provides a method for discovery. e.g. an FF-A driver supports partition
140 discovery.
141 4. A device is used for remote messaging to a separate microcontroller. There is a well-known protocol for endpoint
142 discovery using the messaging layer.
143
144Locating a Service from another Trusted Service
145```````````````````````````````````````````````
146
147Where a trusted service uses another trusted service, it is likely that both service instances will be running in the same
148security domain e.g. both running in secure partitions within the secure world. Where a single service instance is deployed per
149secure partition, the client service will use the following strategy to locate the service provider:
150
151 1. The service name is mapped to the well known UUID for the class of SP that hosts the service provider.
152 2. FF-A partition discovery is used to find all SPs that match the requested UUID.
153 3. The service instance portion of the service name is used to match the partition ID when selecting the target SP from the
154 list of discovered SPs.
155
156Extending the Service Locator Model
157```````````````````````````````````
158
159To accommodate the need to support alternative location strategies, the Service Locator model can be extended to use a set of
160concrete strategy objects to implement different methods of locating a service instance. The set of strategies used will be
161different for different client environments. The following class diagram illustrates how the model can be extended.
162
163.. uml:: uml/ServiceLocationStrategyClassDiagram.puml
164
165--------------
166
167*Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.*
168
169SPDX-License-Identifier: BSD-3-Clause