xref: /aosp_15_r20/system/chre/chpp/README.md (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker# Context Hub Peripheral Protocol (CHPP)
2*84e33947SAndroid Build Coastguard Worker
3*84e33947SAndroid Build Coastguard WorkerThe Context Hub Runtime Environment (CHRE) is a feature built into Android which can run background applications on a lower power, always-on processor, with lower energy cost than what is possible when using the main applications processor (AP).
4*84e33947SAndroid Build Coastguard Worker
5*84e33947SAndroid Build Coastguard WorkerCHPP is designed to run over a serial link (e.g. UART, SPI) and enables an Android Context Hub (CHRE) running on a dedicated low-power processor to connect to peripherals (e.g. GNSS, WiFi). Using CHPP, CHRE can pull together various sources of information, including sensors, location, and audio, to enable a new generation of context-aware applications.
6*84e33947SAndroid Build Coastguard Worker
7*84e33947SAndroid Build Coastguard WorkerCHPP is a communication protocol that spans from the Transport to the Application layer. The CHPP Transport layer is responsible for correct handling of ARQ, fragmentation, and ordering of datagrams, while the CHPP Application Layer is responsible for the services, including client-service messaging and service discovery.
8*84e33947SAndroid Build Coastguard Worker
9*84e33947SAndroid Build Coastguard WorkerCHPP is designed to be flexible and future-proof while meeting the memory and processing constraints of both the CHRE and the peripherals that are often even-lower-resourced.
10*84e33947SAndroid Build Coastguard Worker
11*84e33947SAndroid Build Coastguard WorkerCHPP provides several basic services that are necessary for debugging and service discovery, defines a number of services for the most commonly used sensors and peripherals, and also allows vendor-specific services as necessary. CHPP allows these services to coexist on a single link with very small overhead.
12*84e33947SAndroid Build Coastguard Worker
13*84e33947SAndroid Build Coastguard Worker## Integration Quick-Start
14*84e33947SAndroid Build Coastguard Worker
15*84e33947SAndroid Build Coastguard WorkerA quick-start guide for integration is provided in QUICKSTART.md
16*84e33947SAndroid Build Coastguard Worker
17*84e33947SAndroid Build Coastguard Worker## Overview
18*84e33947SAndroid Build Coastguard Worker
19*84e33947SAndroid Build Coastguard WorkerWithin the CHPP transport layer, each endpoint is considered a peer, meaning there are no role differences. However, within the application layer, one endpoint exposes a service to the other endpoint, which is considered to be a client of said service. CHPP is point-to-point, therefore multiple clients to the same service over the same link are not supported. In a typical configuration, the endpoint where CHRE runs will be a client of one or more peripherals that each provide one or more services. For example, CHRE may be running on a microcontroller which has a serial connection to a discrete GNSS (Global Navigation Satellite System) chip that exposes the GNSS CHPP service. However, the protocol is designed such that endpoints can both provide services and serve as clients of remote services simultaneously.
20*84e33947SAndroid Build Coastguard Worker
21*84e33947SAndroid Build Coastguard Worker## Error Detection and Correction
22*84e33947SAndroid Build Coastguard Worker
23*84e33947SAndroid Build Coastguard WorkerCHPP supports checksum based ARQ. CHPP supports implicit NACKs, and optionally supports explicit NACKs. The timeout is implementation dependent with a recommended value of 50 msec.
24*84e33947SAndroid Build Coastguard Worker
25*84e33947SAndroid Build Coastguard Worker## Conventions
26*84e33947SAndroid Build Coastguard Worker
27*84e33947SAndroid Build Coastguard Worker- Unless otherwise specified, CHPP follows the Little Endian convention.
28*84e33947SAndroid Build Coastguard Worker- Bit-level diagrams are presented with the most-significant bit occupying the leftmost cell
29*84e33947SAndroid Build Coastguard Worker- Bits are numbered with 0 being the least significant bit and 7 being the most significant bit in a byte.
30*84e33947SAndroid Build Coastguard Worker
31*84e33947SAndroid Build Coastguard Worker# Transport Layer Packetization
32*84e33947SAndroid Build Coastguard Worker
33*84e33947SAndroid Build Coastguard WorkerCHPP packets consist of a 2-byte preamble (packet start delimiter) and 8 bytes of header information. The header is followed by zero or more bytes of application-layer payload, typically starting with a 6-byte app header, and ends with a 4-byte packet footer. Defined as a structure (ChppTransportHeader in transport.h), the CHPP transport header is as follows:
34*84e33947SAndroid Build Coastguard Worker
35*84e33947SAndroid Build Coastguard Worker- Preamble
36*84e33947SAndroid Build Coastguard Worker
37*84e33947SAndroid Build Coastguard Worker  - uint16_t preamble;
38*84e33947SAndroid Build Coastguard Worker
39*84e33947SAndroid Build Coastguard Worker- Transport Header
40*84e33947SAndroid Build Coastguard Worker
41*84e33947SAndroid Build Coastguard Worker  - uint8_t flags;
42*84e33947SAndroid Build Coastguard Worker  - uint8_t packetCode;
43*84e33947SAndroid Build Coastguard Worker  - uint8_t ackSeq;
44*84e33947SAndroid Build Coastguard Worker  - uint8_t seq;
45*84e33947SAndroid Build Coastguard Worker  - uint16_t length;
46*84e33947SAndroid Build Coastguard Worker  - uint16_t reserved;
47*84e33947SAndroid Build Coastguard Worker
48*84e33947SAndroid Build Coastguard Worker## Preamble
49*84e33947SAndroid Build Coastguard Worker
50*84e33947SAndroid Build Coastguard WorkerCHPP packets use a two-byte preamble as the packet start delimiter. If the receiving side is not actively within a packet, it assumes a packet starts whenever it sees the preamble. For the current version of CHPP, the preamble is 0x6843 (“Ch” in ASCII as a little endian 16-bit integer). For future versions, e.g. for a non-point-to-point version of CHPP, we expect only the LSB to change.
51*84e33947SAndroid Build Coastguard Worker
52*84e33947SAndroid Build Coastguard Worker## Packet Flags
53*84e33947SAndroid Build Coastguard Worker
54*84e33947SAndroid Build Coastguard WorkerUp to 8 flags are supported as a bitmap as follows
55*84e33947SAndroid Build Coastguard Worker
56*84e33947SAndroid Build Coastguard Worker### 0x01: Fragmentation
57*84e33947SAndroid Build Coastguard Worker
58*84e33947SAndroid Build Coastguard WorkerThe fragmentation flag allows the transfer of data messages larger than the MTU. In such cases, the data message would be split into multiple fragments. A fragmentation flag of (0) indicates the last/only packet in a datagram. A fragmentation flag set to (1) indicates that the packet is part of an unfinished, fragmented datagram
59*84e33947SAndroid Build Coastguard Worker
60*84e33947SAndroid Build Coastguard Worker### 0x02 - 0x80: Reserved
61*84e33947SAndroid Build Coastguard Worker
62*84e33947SAndroid Build Coastguard WorkerReserved for future use
63*84e33947SAndroid Build Coastguard Worker
64*84e33947SAndroid Build Coastguard Worker## Packet Codes
65*84e33947SAndroid Build Coastguard Worker
66*84e33947SAndroid Build Coastguard WorkerThe packet code field consists of two nibbles. The lower nibble is used for optional error reporting. The higher nibble is used for transport layer configuration.
67*84e33947SAndroid Build Coastguard Worker
68*84e33947SAndroid Build Coastguard Worker### Error Reporting (lower nibble)
69*84e33947SAndroid Build Coastguard Worker
70*84e33947SAndroid Build Coastguard WorkerError reporting is a recommended feature and can help with debugging and potentially help improve performance. A non-zero explicit NACK code indicates an explicit NACK. The code provides the reason as follows:
71*84e33947SAndroid Build Coastguard Worker
72*84e33947SAndroid Build Coastguard Worker- 0x0: No explicit-NACK
73*84e33947SAndroid Build Coastguard Worker- 0x1: Checksum failure
74*84e33947SAndroid Build Coastguard Worker- 0x2: Out of memory
75*84e33947SAndroid Build Coastguard Worker- 0x3: Busy
76*84e33947SAndroid Build Coastguard Worker- 0x4: Invalid header
77*84e33947SAndroid Build Coastguard Worker- 0x5: Out of order packet
78*84e33947SAndroid Build Coastguard Worker
79*84e33947SAndroid Build Coastguard Worker### Attributes (higher nibble)
80*84e33947SAndroid Build Coastguard Worker
81*84e33947SAndroid Build Coastguard Worker- 0x0: Regular Packet
82*84e33947SAndroid Build Coastguard Worker- 0x1: Reset. The reset code is used at bootup to indicate that readiness, as well as to reset the state to post-bootup state in case of irrecoverable errors. If set, this indicates that the sending endpoint is requesting initialization of the CHPP protocol. The first packet sent after bootup always has this flag set, and endpoints may send a packet with this flag to attempt to recover from protocol failures. Upon receipt, the endpoint resets all its state, for example dropping any packets awaiting transmission, and resetting its service state. It then responds with a reset-ack.
83*84e33947SAndroid Build Coastguard Worker  A reset packet may optionally populate the Error Reporting entry with the reason behind the reset.
84*84e33947SAndroid Build Coastguard Worker  A reset packet has an optional configuration payload [TBD].
85*84e33947SAndroid Build Coastguard Worker- 0x2 Reset-ack. Similar to reset, but sent as a response to reset, as described above.
86*84e33947SAndroid Build Coastguard Worker
87*84e33947SAndroid Build Coastguard Worker## ACK Sequence Number
88*84e33947SAndroid Build Coastguard Worker
89*84e33947SAndroid Build Coastguard WorkerThe ack sequence number provides the next expected packets, effectively acknowledging all packets up to (n-1). The 1-byte ack allows for (optional, future) support of group ACKs (up to a window size of 127 packets). Note that fragmented messages have multiple sequence numbers, one for each fragment.
90*84e33947SAndroid Build Coastguard WorkerThe ack may be sent as part of a packet with or without a payload. In the latter case, the payload length would be set to zero.
91*84e33947SAndroid Build Coastguard WorkerIf an ACK is not received after a predetermined timeout, or an implicit NACK is received (through an ACK of a lower sequence number), the unacknowledged packet(s) shall be retransmitted.
92*84e33947SAndroid Build Coastguard Worker
93*84e33947SAndroid Build Coastguard Worker## Sequence Number
94*84e33947SAndroid Build Coastguard Worker
95*84e33947SAndroid Build Coastguard WorkerProvides the 8-bit sequence number of this packet. Note that fragmented messages have multiple sequence numbers, one for each fragment.
96*84e33947SAndroid Build Coastguard Worker
97*84e33947SAndroid Build Coastguard Worker## Length
98*84e33947SAndroid Build Coastguard Worker
99*84e33947SAndroid Build Coastguard WorkerProvides the payload length. Devices may have MTU sizes smaller than this limit. Data messages larger than the MTU size can be fragmented according to the Packet Flags: Fragmentation section above.
100*84e33947SAndroid Build Coastguard WorkerA value of 0 indicates no payload, which is useful in cases where only transport layer data is relevant, for example when transmitting a bare acknowledgement message.
101*84e33947SAndroid Build Coastguard Worker
102*84e33947SAndroid Build Coastguard Worker## Payload
103*84e33947SAndroid Build Coastguard Worker
104*84e33947SAndroid Build Coastguard WorkerThe optional payload immediately follows a non-zero payload length. Its contents are described in the Application Layer section. It typically begins with an app layer header.
105*84e33947SAndroid Build Coastguard Worker
106*84e33947SAndroid Build Coastguard Worker## Checksum
107*84e33947SAndroid Build Coastguard Worker
108*84e33947SAndroid Build Coastguard WorkerProvides an error detection code that is run over of the entire CHPP packet, i.e. anything between the preamble and the checksum fields.
109*84e33947SAndroid Build Coastguard WorkerThe checksum algorithm is IEEE CRC-32 initialized to 0xFFFFFFFF.
110*84e33947SAndroid Build Coastguard Worker
111*84e33947SAndroid Build Coastguard Worker# CHPP Transport - Link Layer API
112*84e33947SAndroid Build Coastguard Worker
113*84e33947SAndroid Build Coastguard WorkerTo allow for a clean C implementation with clear separation of layers while supporting multiple CHPP instances per device, each CHPP layer state is stored in its own context struct.
114*84e33947SAndroid Build Coastguard WorkerTo tie corresponding transport and application layers together, each layer’s context struct includes a pointer to the context struct of the other corresponding layer (i.e. the transport layer’s context has a pointer to the corresponding app layer’s context struct and vice versa).
115*84e33947SAndroid Build Coastguard WorkerInitializing CHPP involves:
116*84e33947SAndroid Build Coastguard Worker
117*84e33947SAndroid Build Coastguard Worker1. Allocating the structs for the application, transport, and link layers (in any order).
118*84e33947SAndroid Build Coastguard Worker2. Calling the application and transport layers’ initialization functions (in any order)
119*84e33947SAndroid Build Coastguard Worker
120*84e33947SAndroid Build Coastguard Worker## void chppTransportInit(\*transportContext, \*appContext, \*linkContext, \*linkApi)
121*84e33947SAndroid Build Coastguard Worker
122*84e33947SAndroid Build Coastguard WorkerThe CHPP Transport Layer state is stored in the ChppTransportState struct transportContext, and passed around between various functions. It is necessary to initialize the transport layer state for each transport layer instance on every platform.
123*84e33947SAndroid Build Coastguard WorkerEach transport layer instance is associated with a single application layer instance. appContext points to the application layer status struct associated with this transport layer instance.
124*84e33947SAndroid Build Coastguard WorkerAfter calling chppTransportInit, it is also necessary to separately initialize the linkContext - note that this can be done in the link layer init function.
125*84e33947SAndroid Build Coastguard Worker
126*84e33947SAndroid Build Coastguard Worker## void chppAppInit(\*transportContext, \*appContext)
127*84e33947SAndroid Build Coastguard Worker
128*84e33947SAndroid Build Coastguard WorkerThe CHPP Application Layer state is stored in the ChppAppState struct appContext, and passed around between various functions. It is necessary to initialize the application layer state for each application layer instance on every platform.
129*84e33947SAndroid Build Coastguard WorkerEach application layer instance is associated with a single transport layer instance. transportContext points to the transport layer status struct associated with this application layer instance.
130*84e33947SAndroid Build Coastguard Worker
131*84e33947SAndroid Build Coastguard Worker## void chppAppInitWithClientServiceSet(\*transportContext, \*appContext, clientServiceSet)
132*84e33947SAndroid Build Coastguard Worker
133*84e33947SAndroid Build Coastguard WorkerIt is also possible to specify the client/service endpoints to be enabled at runtime.
134*84e33947SAndroid Build Coastguard Worker
135*84e33947SAndroid Build Coastguard Worker## bool chppRxDataCb(\*transportContext, \*buf, len)
136*84e33947SAndroid Build Coastguard Worker
137*84e33947SAndroid Build Coastguard WorkerThis function is the interface between the CHPP Transport layer and the communications link’s Rx path (e.g. from the UART driver). This function is called when any data is received at the serial interface. The data is provided through a pointer to *buf, with its length specified as len.
138*84e33947SAndroid Build Coastguard WorkerThe return value from chppRxData(*buf, len) can optionally be used at the communications link driver to improve performance. When the return value is true, the driver may stop sending all-zero payloads (e.g. as might happen when a serial link is idle).
139*84e33947SAndroid Build Coastguard Worker
140*84e33947SAndroid Build Coastguard Worker## bool chppRxPacketCompleteCb(\*transportContext)
141*84e33947SAndroid Build Coastguard Worker
142*84e33947SAndroid Build Coastguard WorkerThis is an optional function that enables the link layer to indicate the end of a packet. For packets with a corrupt length field, this function can enable the link layer to explicitly NACK the bad packet earlier.
143*84e33947SAndroid Build Coastguard WorkerThis function is designed exclusively for link layers that can identify the end of individual packets. The availability of this information depends on the link layer implementation.
144*84e33947SAndroid Build Coastguard Worker
145*84e33947SAndroid Build Coastguard Worker## [Link API] enum ChppLinkErrorCode send(\*linkContext, \*buf, len)
146*84e33947SAndroid Build Coastguard Worker
147*84e33947SAndroid Build Coastguard WorkerThis function is the interface between the CHPP Transport layer and the communications link’s Tx path (e.g. to the UART driver). This function is called when any data should be sent to the serial interface. The data is stored in the link TxBuffer (see getTxBuffer), with its length specified as len. The linkContext should include link details and parameters as initialized by the implementation.
148*84e33947SAndroid Build Coastguard WorkerBoth synchronous and asynchronous implementations of this function are supported. A synchronous implementation refers to one where send() is done with buf and len when it returns (i.e. the caller can free or reuse buf and len). An asynchronous implementation refers to one where send() returns before completely consuming buf and len (e.g. the send is completed at a later time). In this case, it is up to the platform implementation to call chppLinkSendDoneCb() after processing the contents of buf and len.
149*84e33947SAndroid Build Coastguard WorkerThis function returns CHPP_LINK_ERROR_NONE_SENT if the platform implementation for this function is synchronous and CHPP_LINK_ERROR_NONE_QUEUED if it is implemented asynchronously. It can also return an error code from enum ChppLinkErrorCode.
150*84e33947SAndroid Build Coastguard Worker
151*84e33947SAndroid Build Coastguard Worker## void chppLinkSendDoneCb(\*transportContext)
152*84e33947SAndroid Build Coastguard Worker
153*84e33947SAndroid Build Coastguard WorkerNotifies the transport layer that the link layer is done sending the previous payload (as provided to send()) and can accept more data.
154*84e33947SAndroid Build Coastguard WorkerOn systems that implement the link layer Tx asynchronously, where send() returns False before consuming the payload provided to it, the platform implementation must call this function after send() is done with the payload (i.e. buf and len).
155*84e33947SAndroid Build Coastguard Worker
156*84e33947SAndroid Build Coastguard Worker## void chppWorkThreadStart(\*transportContext)
157*84e33947SAndroid Build Coastguard Worker
158*84e33947SAndroid Build Coastguard WorkerStarts the main thread for CHPP's Transport Layer. This thread needs to be started after the Transport Layer is initialized through chppTransportInit() and provided with the transport layer context struct.
159*84e33947SAndroid Build Coastguard Worker
160*84e33947SAndroid Build Coastguard Worker## void chppWorkThreadStop(\*transportContext)
161*84e33947SAndroid Build Coastguard Worker
162*84e33947SAndroid Build Coastguard WorkerStops the main thread for CHPP's Transport Layer that has been started by calling chppWorkThreadStart(). Stopping this thread may be necessary for testing and debugging purposes. The parameter context provides the transport layer context struct.
163*84e33947SAndroid Build Coastguard Worker
164*84e33947SAndroid Build Coastguard Worker# Application Layer Messaging
165*84e33947SAndroid Build Coastguard Worker
166*84e33947SAndroid Build Coastguard WorkerCHPP Application Layer datagrams typically have a 6-byte header. This is followed by zero or more bytes of application-layer payload. Both the header and payload are counted in the transport layer payload length. The transport layer 4-byte packet footer follows. Defined as a structure, the CHPP transport header looks like this:
167*84e33947SAndroid Build Coastguard Worker
168*84e33947SAndroid Build Coastguard Worker- uint8_t handle;
169*84e33947SAndroid Build Coastguard Worker- uint8_t type;
170*84e33947SAndroid Build Coastguard Worker- uint8_t transaction;
171*84e33947SAndroid Build Coastguard Worker- uint8_t reserved
172*84e33947SAndroid Build Coastguard Worker- uint16_t command;
173*84e33947SAndroid Build Coastguard Worker
174*84e33947SAndroid Build Coastguard Worker## Service Handle
175*84e33947SAndroid Build Coastguard Worker
176*84e33947SAndroid Build Coastguard WorkerThe Service Handle provides the capability of running multiple simultaneous clients / services over a single CHPP transport (physical) link. This allows differentiation between traffic destined for different services / applications / sensors on a single link. It also allows both sides to have clients and services simultaneously if necessary. Handles include reserved ones (0x00 - 0x0f) and assignable ones. Assigning a handle is through a handshaking phase on the reserved handle number 0x01. The handshake allows for a wide range of manufacturer IDs, devices, and protocol types/versions to be mapped into an 8-bit handle number to achieve efficiency as well as flexibility.
177*84e33947SAndroid Build Coastguard Worker
178*84e33947SAndroid Build Coastguard Worker### Handle
179*84e33947SAndroid Build Coastguard Worker
180*84e33947SAndroid Build Coastguard Worker- 0x00: Non-handle based P2P communication
181*84e33947SAndroid Build Coastguard Worker- 0x01: Loopback testing
182*84e33947SAndroid Build Coastguard Worker- 0x02 - 0x0e: reserved
183*84e33947SAndroid Build Coastguard Worker- 0x0f: CHPP service discovery handshake
184*84e33947SAndroid Build Coastguard Worker- 0x10 - 0xff: Handles for services negotiated through handshake
185*84e33947SAndroid Build Coastguard Worker
186*84e33947SAndroid Build Coastguard Worker## Message Type
187*84e33947SAndroid Build Coastguard Worker
188*84e33947SAndroid Build Coastguard WorkerThe message type clarifies the direction of the messages (client <-> service) and whether a response is expected
189*84e33947SAndroid Build Coastguard Worker
190*84e33947SAndroid Build Coastguard Worker- 0b00 (0): Request from client. Requires response with same command from service
191*84e33947SAndroid Build Coastguard Worker- 0b01 (1): Response from service (with the same command / transaction ID as the request)
192*84e33947SAndroid Build Coastguard Worker- 0b10 (2): Notification from client. Service shall not respond
193*84e33947SAndroid Build Coastguard Worker- 0b11 (3): Notification from service. Client shall not respond
194*84e33947SAndroid Build Coastguard Worker
195*84e33947SAndroid Build Coastguard Worker## Transaction ID
196*84e33947SAndroid Build Coastguard Worker
197*84e33947SAndroid Build Coastguard WorkerCHPP has an 8-bit transaction ID for out-of-order responses which is optional for clients, and mandatory for services. The Transaction ID allows CHPP to have multiple requests outstanding for not just different commands, but for a single command. To allow multiple outstanding requests, the service shall relay back the Transaction ID of a request in its response. The client shall not issue the same command unless it has either received the response or has changed / incremented the Transaction ID.
198*84e33947SAndroid Build Coastguard Worker
199*84e33947SAndroid Build Coastguard Worker## Commands
200*84e33947SAndroid Build Coastguard Worker
201*84e33947SAndroid Build Coastguard WorkerThe CHPP messaging structure allocates 16 bits for commands. CHPP Service Discovery uses the same messaging structure. Note that each vendor and service (as indicated by the Vendor ID and Service ID) can define their own commands and therefore command codes for different services and vendors can overlap.
202*84e33947SAndroid Build Coastguard Worker
203*84e33947SAndroid Build Coastguard Worker# CHPP Basic Services
204*84e33947SAndroid Build Coastguard Worker
205*84e33947SAndroid Build Coastguard WorkerCHPP’s built-in basic services take advantage of reserved handle numbers, ranging from 0x00 - 0x0f to support debugging and development as well as discovery of other services. These basic services currently are as follows.
206*84e33947SAndroid Build Coastguard Worker
207*84e33947SAndroid Build Coastguard Worker## Handleless Communication Service (0x00)
208*84e33947SAndroid Build Coastguard Worker
209*84e33947SAndroid Build Coastguard WorkerThe handle 0x00 is reserved for use cases that do not need the flexibility provided by handles and avoid the need for discovery.
210*84e33947SAndroid Build Coastguard Worker
211*84e33947SAndroid Build Coastguard Worker## Loopback Testing Service (0x01)
212*84e33947SAndroid Build Coastguard Worker
213*84e33947SAndroid Build Coastguard WorkerLoopback testing is a mandatory service where the loopback service relays the entire received datagram back to the client.
214*84e33947SAndroid Build Coastguard WorkerThe client requesting the loopback must set the handle to 0x01, and the message type to 0 (i.e. request from client). The server responding with the loopback will respond on the same handle but with the message type to 1 (service response). Any (application layer) data following the handle and message type fields will be identically relayed back to the client.
215*84e33947SAndroid Build Coastguard Worker
216*84e33947SAndroid Build Coastguard Worker## Discovery Service (0x0f)
217*84e33947SAndroid Build Coastguard Worker
218*84e33947SAndroid Build Coastguard WorkerService Discovery is mapps a 8-bit handle to a number of coexisting services. In response to a discovery command, the discovery service responds with a list of available services (UUID + name + version) on the device. The first service in the list corresponds to handle 0x10, and so on.
219*84e33947SAndroid Build Coastguard Worker
220*84e33947SAndroid Build Coastguard Worker# CHPP Predefined Service Protocols
221*84e33947SAndroid Build Coastguard Worker
222*84e33947SAndroid Build Coastguard WorkerCHPP supports the following services using the CHRE PAL. The standard UUIDs for these services are defined in common/standard_uuids.h.
223*84e33947SAndroid Build Coastguard Worker
224*84e33947SAndroid Build Coastguard Worker- WWAN
225*84e33947SAndroid Build Coastguard Worker- WiFi
226*84e33947SAndroid Build Coastguard Worker- GNSS
227