1 /*
2  *  Copyright (c) 2020, The OpenThread Authors.
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *  1. Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  *  2. Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *  3. Neither the name of the copyright holder nor the
13  *     names of its contributors may be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  *  POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /**
30  * @file
31  *   This file includes compile-time configurations for the SRP (Service Registration Protocol) Client.
32  *
33  */
34 
35 #ifndef CONFIG_SRP_CLIENT_H_
36 #define CONFIG_SRP_CLIENT_H_
37 
38 #include "config/misc.h"
39 
40 /**
41  * @def OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
42  *
43  * Define to 1 to enable SRP Client support.
44  *
45  */
46 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
47 #define OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE 0
48 #endif
49 
50 /**
51  * @def OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_API_ENABLE
52  *
53  * Define to 1 to enable SRP Client auto-start feature and its APIs.
54  *
55  * When enabled, the SRP client can be configured to automatically start when it detects the presence of an SRP server
56  * (by monitoring the Thread Network Data for SRP Server Service entries).
57  *
58  */
59 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_API_ENABLE
60 #define OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_API_ENABLE 1
61 #endif
62 
63 /**
64  * @def OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_DEFAULT_MODE
65  *
66  * Define the default mode (enabled or disabled) of auto-start mode.
67  *
68  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_API_ENABLE` is enabled.
69  *
70  */
71 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_DEFAULT_MODE
72 #define OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_DEFAULT_MODE 0
73 #endif
74 
75 /**
76  * @def OPENTHREAD_CONFIG_SRP_CLIENT_SWITCH_SERVER_ON_FAILURE
77  *
78  * Define to 1 to enable SRP client to switch server on failure (when auto-start feature is used).
79  *
80  * This config is only used when `OPENTHREAD_CONFIG_SRP_CLIENT_AUTO_START_API_ENABLE` is enabled.
81  *
82  * When enabled, the client will try to select the next server from entries in Thread Network Data when the current
83  * server rejects an SRP update or there is no response (timeout waiting for response from server).
84  *
85  */
86 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_SWITCH_SERVER_ON_FAILURE
87 #define OPENTHREAD_CONFIG_SRP_CLIENT_SWITCH_SERVER_ON_FAILURE 1
88 #endif
89 
90 /**
91  * @def OPENTHREAD_CONFIG_SRP_CLIENT_DISALLOW_SERVER_SWITCH_WITH_REGISTERED_HOST
92  *
93  * Define to 1 to disallow SRP client to switch server (when auto-start is used) on failure if host (or any services)
94  * were previously successfully registered with the currently selected server.
95  *
96  * This config is only applicable when `OPENTHREAD_CONFIG_SRP_CLIENT_SWITCH_SERVER_ON_FAILURE` is enabled.
97  *
98  * If this is enabled, once SRP client successfully registers with an auto-start selected SRP server, it stays with
99  * the selected SRP server (even if future SRP updates fail or timeout) while the related server entry remains present
100  * in the Thread Network Data. If the entry is removed from Network Data, then SRP client will try to select a new
101  * server.
102  *
103  * Enabling this behavior would be useful allowing more aggressive switch logic (e.g., switch after fewer timeouts
104  * `OPENTHREAD_CONFIG_SRP_CLIENT_MAX_TIMEOUT_FAILURES_TO_SWITCH_SERVER`) while not allowing switch due to temporary
105  * failures on the currently selected server. This can help avoid situation where the old server may still remember the
106  * registered host/service info and client switching to a new server then failing due to name conflict (when new server
107  * probes for the host/service name original server would not allow new registration).
108  *
109  */
110 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_DISALLOW_SERVER_SWITCH_WITH_REGISTERED_HOST
111 #define OPENTHREAD_CONFIG_SRP_CLIENT_DISALLOW_SERVER_SWITCH_WITH_REGISTERED_HOST 1
112 #endif
113 
114 /**
115  * @def OPENTHREAD_CONFIG_SRP_CLIENT_MAX_TIMEOUT_FAILURES_TO_SWITCH_SERVER
116  *
117  * Specifies number of timeout failures to trigger a switch of server.
118  *
119  * This is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_SWITCH_SERVER_ON_FAILURE` is used.
120  *
121  */
122 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_MAX_TIMEOUT_FAILURES_TO_SWITCH_SERVER
123 #define OPENTHREAD_CONFIG_SRP_CLIENT_MAX_TIMEOUT_FAILURES_TO_SWITCH_SERVER 3
124 #endif
125 
126 /**
127  * @def OPENTHREAD_CONFIG_SRP_CLIENT_DOMAIN_NAME_API_ENABLE
128  *
129  * Define to 1 for the SRP client implementation to provide APIs that get/set the domain name.
130  *
131  */
132 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_DOMAIN_NAME_API_ENABLE
133 #define OPENTHREAD_CONFIG_SRP_CLIENT_DOMAIN_NAME_API_ENABLE 0
134 #endif
135 
136 /**
137  * @def OPENTHREAD_CONFIG_SRP_CLIENT_SAVE_SELECTED_SERVER_ENABLE
138  *
139  * Define to 1 to enable SRP client feature to save the selected server in non-volatile settings.
140  *
141  * When enabled, the SRP client will save the selected server info by auto-start feature in the non-volatile settings
142  * and on a client restart (e.g., due to a device reset) it will select the same server when searching to discover and
143  * pick one from the Thread Network Data service entries. The server info is saved only after the host info is
144  * successfully registered with the server and if it is selected by auto-start from a network data SRP *unicast*
145  * service entry.
146  *
147  */
148 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_SAVE_SELECTED_SERVER_ENABLE
149 #define OPENTHREAD_CONFIG_SRP_CLIENT_SAVE_SELECTED_SERVER_ENABLE 1
150 #endif
151 
152 /**
153  * @def OPENTHREAD_CONFIG_SRP_CLIENT_DEFAULT_LEASE
154  *
155  * Specifies the default requested lease interval (in seconds). Set to two hours.
156  *
157  */
158 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_DEFAULT_LEASE
159 #define OPENTHREAD_CONFIG_SRP_CLIENT_DEFAULT_LEASE (2 * 60 * 60)
160 #endif
161 
162 /**
163  * @def OPENTHREAD_CONFIG_SRP_CLIENT_DEFAULT_KEY_LEASE
164  *
165  * Specifies the default requested key lease interval (in seconds). Set to 14 days.
166  *
167  */
168 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_DEFAULT_KEY_LEASE
169 #define OPENTHREAD_CONFIG_SRP_CLIENT_DEFAULT_KEY_LEASE (14 * 24 * 60 * 60)
170 #endif
171 
172 /**
173  * @def OPENTHREAD_CONFIG_SRP_CLIENT_LEASE_RENEW_GUARD_INTERVAL
174  *
175  * Specifies the guard interval (in seconds) for lease renew time. The guard interval determines how much earlier
176  * (relative to the lease expiration time) the SRP client will send an SRP update for lease renewal.
177  *
178  */
179 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_LEASE_RENEW_GUARD_INTERVAL
180 #define OPENTHREAD_CONFIG_SRP_CLIENT_LEASE_RENEW_GUARD_INTERVAL 120 // two minutes in seconds
181 #endif
182 
183 /**
184  * @def OPENTHREAD_CONFIG_SRP_CLIENT_EARLY_LEASE_RENEW_FACTOR_NUMERATOR
185  *
186  * Specifies the numerator of early lease renewal factor.
187  *
188  * This value is used for opportunistic early refresh behave. When sending an SRP update, the services that are not yet
189  * expired but are close, are allowed to refresh early and are included in the SRP update.
190  *
191  * The "early lease renewal interval" is used to determine if a service can renew early. The interval is calculated by
192  * multiplying the accepted lease interval by the "early lease renewal factor" which is given as a fraction (numerator
193  * and denominator).
194  *
195  * If the factor is set to zero (numerator=0, denominator=1), the opportunistic early refresh behavior is disabled.
196  * If  denominator is set to zero (the factor is set to infinity), then all services (including previously registered
197  * ones) are always included in SRP update message.
198  *
199  * Default value is 1/2 (i.e., services that are within half of the lease interval are allowed to refresh early).
200  *
201  */
202 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_EARLY_LEASE_RENEW_FACTOR_NUMERATOR
203 #define OPENTHREAD_CONFIG_SRP_CLIENT_EARLY_LEASE_RENEW_FACTOR_NUMERATOR 1
204 #endif
205 
206 /**
207  * @def OPENTHREAD_CONFIG_SRP_CLIENT_EARLY_LEASE_RENEW_FACTOR_DENOMINATOR
208  *
209  * Specifies the denominator of early lease renewal factor.
210  *
211  * Please see OPENTHREAD_CONFIG_SRP_CLIENT_EARLY_LEASE_RENEW_FACTOR_NUMERATOR for more details.
212  *
213  */
214 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_EARLY_LEASE_RENEW_FACTOR_DENOMINATOR
215 #define OPENTHREAD_CONFIG_SRP_CLIENT_EARLY_LEASE_RENEW_FACTOR_DENOMINATOR 2
216 #endif
217 
218 /**
219  * @def OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MIN_DELAY
220  *
221  * Specifies the minimum value (in msec) for the short random delay wait time before sending an update message.
222  *
223  * The random delay is chosen uniformly from the min up to max value `OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MAX_DELAY`.
224  *
225  * When there is a change (e.g., a new service is added/removed) that requires an update, the SRP client will wait for
226  * a short delay before preparing and sending an SRP update message to server. This allows user to provide more change
227  * that are then all sent in same update message. The delay is only applied on the first change that triggers an
228  * update message transmission. Subsequent changes (API calls) while waiting for the tx to start will not reset the
229  * delay timer.
230  *
231  */
232 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MIN_DELAY
233 #define OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MIN_DELAY 10
234 #endif
235 
236 /**
237  * @def OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MIN_DELAY
238  *
239  * Specifies the maximum value (in msec) for the short random delay wait time before sending an update message.
240  *
241  * The random delay is chosen uniformly from the min `OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MIN_DELAY` up to max value.
242  *
243  * See `OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MIN_DELAY` for more details.
244  *
245  */
246 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MAX_DELAY
247 #define OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MAX_DELAY 700
248 #endif
249 
250 /**
251  * @def OPENTHREAD_CONFIG_SRP_CLIENT_MIN_RETRY_WAIT_INTERVAL
252  *
253  * Specifies the minimum wait interval (in msec) between SRP update message retries.
254  *
255  * The update message is retransmitted if there is no response from server or if server rejects the update. The wait
256  * interval starts from the minimum value and is increased by the growth factor every failure up to the max value.
257  *
258  */
259 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_MIN_RETRY_WAIT_INTERVAL
260 #define OPENTHREAD_CONFIG_SRP_CLIENT_MIN_RETRY_WAIT_INTERVAL 1800
261 #endif
262 
263 /**
264  * @def OPENTHREAD_CONFIG_SRP_CLIENT_MAX_RETRY_WAIT_INTERVAL
265  *
266  * Specifies the maximum wait interval (in msec) between SRP update message retries.
267  *
268  */
269 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_MAX_RETRY_WAIT_INTERVAL
270 #define OPENTHREAD_CONFIG_SRP_CLIENT_MAX_RETRY_WAIT_INTERVAL (1 * 60 * 60 * 1000) // 1 hour in ms.
271 #endif
272 
273 /**
274  * @def OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_WAIT_INTERVAL_JITTER
275  *
276  * Specifies jitter (in msec) for retry wait interval. If the current retry wait interval is smaller than the jitter
277  * then the the wait interval itself is used as jitter (e.g., with jitter 500 msec and if retry interval is 300ms
278  * the retry interval is then randomly selected from [0, 2*300] ms).
279  *
280  */
281 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_WAIT_INTERVAL_JITTER
282 #define OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_WAIT_INTERVAL_JITTER 500
283 #endif
284 
285 /**
286  * @def OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_INTERVAL_GROWTH_FACTOR_NUMERATOR
287  *
288  * Specifies the numerator of the retry wait interval growth factor fraction. The growth factor is represented as
289  * a fraction (e.g., for 1.5, we can use 15 as the numerator and 10 as the denominator).
290  *
291  */
292 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_INTERVAL_GROWTH_FACTOR_NUMERATOR
293 #define OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_INTERVAL_GROWTH_FACTOR_NUMERATOR 17
294 #endif
295 
296 /**
297  * @def OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_INTERVAL_GROWTH_FACTOR_DENOMINATOR
298  *
299  * Specifies the denominator of the retry wait interval growth factor fraction.
300  *
301  */
302 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_INTERVAL_GROWTH_FACTOR_DENOMINATOR
303 #define OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_INTERVAL_GROWTH_FACTOR_DENOMINATOR 10
304 #endif
305 
306 /**
307  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE
308  *
309  * Define to 1 to enable SRP Client buffers and service pool feature.
310  *
311  */
312 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE
313 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
314 #endif
315 
316 /**
317  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_MAX_SERVICES
318  *
319  * Specifies number of service entries in the SRP client service pool.
320  *
321  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE` is enabled.
322  *
323  */
324 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_MAX_SERVICES
325 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_MAX_SERVICES 2
326 #endif
327 
328 /**
329  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_MAX_HOST_ADDRESSES
330  *
331  * Specifies number of host IPv6 address entries in the SRP client buffers and service pool.
332  *
333  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE` is enabled.
334  *
335  */
336 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_MAX_HOST_ADDRESSES
337 #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
338 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_MAX_HOST_ADDRESSES 10
339 #else
340 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_MAX_HOST_ADDRESSES 2
341 #endif
342 #endif
343 
344 /**
345  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_HOST_NAME_SIZE
346  *
347  * Specifies the size (number of chars) of host name string buffer in the SRP client buffers and service pool.
348  *
349  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE` is enabled.
350  *
351  */
352 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_HOST_NAME_SIZE
353 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_HOST_NAME_SIZE 64
354 #endif
355 
356 /**
357  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_NAME_SIZE
358  *
359  * Specifies the size (number of chars) of service name string buffer in the SRP client buffers and service pool.
360  *
361  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE` is enabled.
362  *
363  */
364 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_NAME_SIZE
365 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_NAME_SIZE 96
366 #endif
367 
368 /**
369  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_MAX_SUB_TYPES
370  *
371  * Specifies the maximum number of service subtype labels (array length) in the SRP client buffers and service pool.
372  *
373  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE` is enabled.
374  *
375  */
376 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_MAX_SUB_TYPES
377 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_MAX_SUB_TYPES 6
378 #endif
379 
380 /**
381  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_INSTANCE_NAME_SIZE
382  *
383  * Specifies the size (number of chars) of service instance name string buffer in the SRP client buffers and service
384  * pool.
385  *
386  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE` is enabled.
387  *
388  */
389 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_INSTANCE_NAME_SIZE
390 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_SERVICE_INSTANCE_NAME_SIZE 64
391 #endif
392 
393 /**
394  * @def OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_TXT_BUFFER_SIZE
395  *
396  * Specifies the size (number of bytes) of TXT record value buffer in the SRP client buffers and service pool.
397  *
398  * This config is applicable only when `OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_ENABLE` is enabled.
399  *
400  */
401 #ifndef OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_TXT_BUFFER_SIZE
402 #define OPENTHREAD_CONFIG_SRP_CLIENT_BUFFERS_TXT_BUFFER_SIZE 64
403 #endif
404 
405 #endif // CONFIG_SRP_CLIENT_H_
406