Home | History | Annotate | Line # | Download | only in ServiceRegistration
      1  1.1  christos /* cti-services.h
      2  1.1  christos  *
      3  1.1  christos  * Copyright (c) 2020-2024 Apple Inc. All rights reserved.
      4  1.1  christos  *
      5  1.1  christos  * Licensed under the Apache License, Version 2.0 (the "License");
      6  1.1  christos  * you may not use this file except in compliance with the License.
      7  1.1  christos  * You may obtain a copy of the License at
      8  1.1  christos  *
      9  1.1  christos  *     http://www.apache.org/licenses/LICENSE-2.0
     10  1.1  christos  *
     11  1.1  christos  * Unless required by applicable law or agreed to in writing, software
     12  1.1  christos  * distributed under the License is distributed on an "AS IS" BASIS,
     13  1.1  christos  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  1.1  christos  * See the License for the specific language governing permissions and
     15  1.1  christos  * limitations under the License.
     16  1.1  christos  *
     17  1.1  christos  * This code adds border router support to 3rd party HomeKit Routers as part of Apples commitment to the CHIP project.
     18  1.1  christos  *
     19  1.1  christos  * Concise Thread Interface for Thread Border router control.
     20  1.1  christos  */
     21  1.1  christos 
     22  1.1  christos #ifndef __CTI_SERVICES_H__
     23  1.1  christos #define __CTI_SERVICES_H__
     24  1.1  christos 
     25  1.1  christos #include <netinet/in.h>
     26  1.1  christos #include <arpa/inet.h>
     27  1.1  christos typedef void *run_context_t;
     28  1.1  christos #include "srp.h"
     29  1.1  christos 
     30  1.1  christos #if (defined(__GNUC__) && (__GNUC__ >= 4))
     31  1.1  christos #define DNS_SERVICES_EXPORT __attribute__((visibility("default")))
     32  1.1  christos #else
     33  1.1  christos #define DNS_SERVICES_EXPORT
     34  1.1  christos #endif
     35  1.1  christos 
     36  1.1  christos #include "cti-common.h"
     37  1.1  christos 
     38  1.1  christos typedef enum _offmesh_route_origin {
     39  1.1  christos     offmesh_route_origin_user,
     40  1.1  christos     offmesh_route_origin_ncp,
     41  1.1  christos } offmesh_route_origin_t;
     42  1.1  christos 
     43  1.1  christos typedef enum _offmesh_route_preference {
     44  1.1  christos     offmesh_route_preference_low = -1,
     45  1.1  christos     offmesh_route_preference_medium,
     46  1.1  christos     offmesh_route_preference_high,
     47  1.1  christos } offmesh_route_preference_t;
     48  1.1  christos 
     49  1.1  christos typedef struct _cti_service {
     50  1.1  christos     uint64_t enterprise_number;
     51  1.1  christos     uint16_t service_type;
     52  1.1  christos     uint16_t service_version;
     53  1.1  christos     uint16_t rloc16;
     54  1.1  christos     uint16_t service_id;
     55  1.1  christos     uint8_t *NONNULL service;
     56  1.1  christos     uint8_t *NONNULL server;
     57  1.1  christos     size_t service_length;
     58  1.1  christos     size_t server_length;
     59  1.1  christos     int ref_count;
     60  1.1  christos     int flags;      // E.g., kCTIFlag_NCP
     61  1.1  christos } cti_service_t;
     62  1.1  christos 
     63  1.1  christos typedef struct _cti_service_vec {
     64  1.1  christos     size_t num;
     65  1.1  christos     int ref_count;
     66  1.1  christos     cti_service_t *NULLABLE *NONNULL services;
     67  1.1  christos } cti_service_vec_t;
     68  1.1  christos 
     69  1.1  christos typedef struct _cti_prefix {
     70  1.1  christos     struct in6_addr prefix;
     71  1.1  christos     int prefix_length;
     72  1.1  christos     int metric;
     73  1.1  christos     int flags;
     74  1.1  christos     int rloc;
     75  1.1  christos     bool stable;
     76  1.1  christos     bool ncp;
     77  1.1  christos     int ref_count;
     78  1.1  christos } cti_prefix_t;
     79  1.1  christos 
     80  1.1  christos // Bits in the prefix flags
     81  1.1  christos #define kCTIPriorityShift      14
     82  1.1  christos #define kCTIPreferredShift     13
     83  1.1  christos #define kCTISLAACShift         12
     84  1.1  christos #define kCTIDHCPShift          11
     85  1.1  christos #define kCTIConfigureShift     10
     86  1.1  christos #define kCTIDefaultRouteShift  9
     87  1.1  christos #define kCTIOnMeshShift        8
     88  1.1  christos #define kCTIDNSShift           7
     89  1.1  christos #define kCTIDPShift            6
     90  1.1  christos 
     91  1.1  christos // Priority values
     92  1.1  christos #define kCTIPriorityMedium    0
     93  1.1  christos #define kCTIPriorityHigh      1
     94  1.1  christos #define kCTIPriorityReserved  2
     95  1.1  christos #define kCTIPriorityLow       3
     96  1.1  christos 
     97  1.1  christos // Macros to fetch values from the prefix flags
     98  1.1  christos #define CTI_PREFIX_FLAGS_PRIORITY(flags)       (((flags) >> kCTIPriorityShift) & 3)
     99  1.1  christos #define CTI_PREFIX_FLAGS_PREFERRED(flags)      (((flags) >> kCTIPreferredShift) & 1)
    100  1.1  christos #define CTI_PREFIX_FLAGS_SLAAC(flags)          (((flags) >> kCTISLAACShift) & 1)
    101  1.1  christos #define CTI_PREFIX_FLAGS_DHCP(flags)           (((flags) >> kCTIDHCPShift) & 1)
    102  1.1  christos #define CTI_PREFIX_FLAGS_CONFIGURE(flags)      (((flags) >> kCTIConfigureShift) & 1)
    103  1.1  christos #define CTI_PREFIX_FLAGS_DEFAULT_ROUTE(flags)  (((flags) >> kCTIDefaultRouteShift) & 1)
    104  1.1  christos #define CTI_PREFIX_FLAGS_ON_MESH(flags)        (((flags) >> kCTIOnMeshShift) & 1)
    105  1.1  christos #define CTI_PREFIX_FLAGS_DNS(flags)            (((flags) >> kCTIDNSShift) & 1)
    106  1.1  christos #define CTI_PREFIX_DLAGS_DP(flags)             (((flags) >> kCTIDPShift) & 1)
    107  1.1  christos 
    108  1.1  christos // Macros to set values in the prefix flags
    109  1.1  christos #define CTI_PREFIX_FLAGS_PRIORITY_SET(flags, value)       ((flags) = \
    110  1.1  christos                                                             (((flags) & ~(3 << kCTIPriorityShift)) | \
    111  1.1  christos                                                              (((value) & 3) << kCTIPriorityShift)))
    112  1.1  christos #define CTI_PREFIX_FLAGS_PREFERRED_SET(flags, value)      ((flags) = \
    113  1.1  christos                                                             (((flags) & ~(1 << kCTIPreferredShift)) | \
    114  1.1  christos                                                              (((value) & 1) << kCTIPreferredShift)))
    115  1.1  christos #define CTI_PREFIX_FLAGS_SLAAC_SET(flags, value)          ((flags) = \
    116  1.1  christos                                                             (((flags) & ~(1 << kCTISLAACShift)) | \
    117  1.1  christos                                                              (((value) & 1) << kCTISLAACShift)))
    118  1.1  christos #define CTI_PREFIX_FLAGS_DHCP_SET(flags, value)           ((flags) = \
    119  1.1  christos                                                             (((flags) & ~(1 << kCTIDHCPShift)) | \
    120  1.1  christos                                                              (((value) & 1) << kCTIDHCPShift)))
    121  1.1  christos #define CTI_PREFIX_FLAGS_CONFIGURE_SET(flags, value)      ((flags) = \
    122  1.1  christos                                                             (((flags) & ~(1 << kCTIConfigureShift)) | \
    123  1.1  christos                                                              (((value) & 1) << kCTIConfigureShift)))
    124  1.1  christos #define CTI_PREFIX_FLAGS_DEFAULT_ROUTE_SET(flags, value)  ((flags) = \
    125  1.1  christos                                                             (((flags) & ~(1 << kCTIDefaultRouteShift)) | \
    126  1.1  christos                                                              (((value) & 1) << kCTIDefaultRouteShift)))
    127  1.1  christos #define CTI_PREFIX_FLAGS_ON_MESH_SET(flags, value)        ((flags) = \
    128  1.1  christos                                                             (((flags) & ~(1 << kCTIOnMeshShift)) | \
    129  1.1  christos                                                              (((value) & 1) << kCTIOnMeshShift)))
    130  1.1  christos #define CTI_PREFIX_FLAGS_DNS_SET(flags, value)            ((flags) = \
    131  1.1  christos                                                             (((flags) & ~(1 << kCTIDNSShift)) | \
    132  1.1  christos                                                              (((value) & 1) << kCTIDNSShift)))
    133  1.1  christos #define CTI_PREFIX_DLAGS_DP_SET(flags, value)             ((flags) = \
    134  1.1  christos                                                             (((flags) & ~(1 << kCTIDPShift)) | \
    135  1.1  christos                                                              (((value) & 1) << kCTIDPShift)))
    136  1.1  christos 
    137  1.1  christos typedef struct _cti_prefix_vec {
    138  1.1  christos     size_t num;
    139  1.1  christos     int ref_count;
    140  1.1  christos     cti_prefix_t *NULLABLE *NONNULL prefixes;
    141  1.1  christos } cti_prefix_vec_t;
    142  1.1  christos 
    143  1.1  christos typedef struct _cti_route {
    144  1.1  christos     struct in6_addr prefix;
    145  1.1  christos     int prefix_length;
    146  1.1  christos     offmesh_route_origin_t origin;
    147  1.1  christos     bool nat64;
    148  1.1  christos     bool stable;
    149  1.1  christos     offmesh_route_preference_t preference;
    150  1.1  christos     int rloc;
    151  1.1  christos     bool next_hop_is_host;
    152  1.1  christos     int ref_count;
    153  1.1  christos } cti_route_t;
    154  1.1  christos 
    155  1.1  christos typedef struct _cti_route_vec {
    156  1.1  christos     size_t num;
    157  1.1  christos     int ref_count;
    158  1.1  christos     cti_route_t *NULLABLE *NONNULL routes;
    159  1.1  christos } cti_route_vec_t;
    160  1.1  christos 
    161  1.1  christos typedef struct srp_server_state srp_server_t;
    162  1.1  christos 
    163  1.1  christos /* cti_reply:
    164  1.1  christos  *
    165  1.1  christos  * A general reply mechanism to indicate success or failure for a cti call that doesn't
    166  1.1  christos  * return any data.
    167  1.1  christos  *
    168  1.1  christos  * cti_reply parameters:
    169  1.1  christos  *
    170  1.1  christos  * context:    The context that was passed to the cti service call to which this is a callback.
    171  1.1  christos  *
    172  1.1  christos  * status:	   Will be kCTIStatus_NoError on success, otherwise will indicate the
    173  1.1  christos  * 			   failure that occurred.
    174  1.1  christos  */
    175  1.1  christos 
    176  1.1  christos typedef void
    177  1.1  christos (*cti_reply_t)(void *NULLABLE context, cti_status_t status);
    178  1.1  christos 
    179  1.1  christos /* cti_string_property_reply: Callback for get calls that fetch a string property
    180  1.1  christos  *
    181  1.1  christos  * Called exactly once in response to (for example) a cti_get_tunnel_name() or cti_get_on_link_prefix() call, either
    182  1.1  christos  * with an error or with a string containing the response.
    183  1.1  christos  *
    184  1.1  christos  * cti_reply parameters:
    185  1.1  christos  *
    186  1.1  christos  * context:       The context that was passed to the cti service call to which this is a callback.
    187  1.1  christos  *
    188  1.1  christos  * tunnel_name:   If error is kCTIStatus_NoError, a string containing the name of the Thread
    189  1.1  christos  * 			      interface.
    190  1.1  christos  *
    191  1.1  christos  * status:	      Will be kCTIStatus_NoError on success, otherwise will indicate the
    192  1.1  christos  * 			      failure that occurred.
    193  1.1  christos  */
    194  1.1  christos 
    195  1.1  christos typedef void
    196  1.1  christos (*cti_string_property_reply_t)(void *NULLABLE context, const char *NONNULL string,
    197  1.1  christos                                cti_status_t status);
    198  1.1  christos 
    199  1.1  christos /* cti_get_tunnel_name
    200  1.1  christos  *
    201  1.1  christos  * Get the name of the tunnel that wpantund is presenting as the Thread network interface.
    202  1.1  christos  * The tunnel name is passed to the reply callback if the request succeeds; otherwise an error
    203  1.1  christos  * is either returned immediately or returned to the callback.
    204  1.1  christos  *
    205  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    206  1.1  christos  *                 an event occurs.
    207  1.1  christos  *
    208  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    209  1.1  christos  *
    210  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    211  1.1  christos  *
    212  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating the
    213  1.1  christos  *                 error that occurred. Note: A return value of kCTIStatus_NoError does not mean that the
    214  1.1  christos  *                 request succeeded, merely that it was successfully started.
    215  1.1  christos  */
    216  1.1  christos 
    217  1.1  christos #define cti_get_tunnel_name(server, context, callback, client_queue) \
    218  1.1  christos     cti_get_tunnel_name_(server, context, callback, client_queue, __FILE__, __LINE__)
    219  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    220  1.1  christos cti_get_tunnel_name_(srp_server_t *NULLABLE server, void *NULLABLE context, cti_string_property_reply_t NONNULL callback,
    221  1.1  christos                      run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
    222  1.1  christos 
    223  1.1  christos /* cti_track_neighbor_ml_eid
    224  1.1  christos  *
    225  1.1  christos  * Track changes in our neighbor's mesh-local address (ML-EID). This makes sense when acting as an end device, not as a
    226  1.1  christos  * router.  The ML-EID tunnel is passed to the reply callback if the request succeeds; otherwise an error is either
    227  1.1  christos  * returned immediately or returned to the callback.
    228  1.1  christos  *
    229  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    230  1.1  christos  *                 an event occurs.
    231  1.1  christos  *
    232  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    233  1.1  christos  *
    234  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    235  1.1  christos  *
    236  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating the
    237  1.1  christos  *                 error that occurred. Note: A return value of kCTIStatus_NoError does not mean that the
    238  1.1  christos  *                 request succeeded, merely that it was successfully started.
    239  1.1  christos  */
    240  1.1  christos 
    241  1.1  christos #define cti_track_neighbor_ml_eid(server, ref, context, callback, client_queue) \
    242  1.1  christos     cti_track_neighbor_ml_eid_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
    243  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    244  1.1  christos cti_track_neighbor_ml_eid_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref,
    245  1.1  christos                            void *NULLABLE context, cti_string_property_reply_t NONNULL callback,
    246  1.1  christos                            run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
    247  1.1  christos 
    248  1.1  christos /* cti_get_mesh_local_prefix
    249  1.1  christos  *
    250  1.1  christos  * Get the mesh_local IPv6 prefix that is in use on the Thread mesh. The prefix is passed to the reply callback if the
    251  1.1  christos  * request succeeds; otherwise an error is either returned immediately or returned to the callback.
    252  1.1  christos  *
    253  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    254  1.1  christos  *                 an event occurs.
    255  1.1  christos  *
    256  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    257  1.1  christos  *
    258  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    259  1.1  christos  *
    260  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating the
    261  1.1  christos  *                 error that occurred. Note: A return value of kCTIStatus_NoError does not mean that the
    262  1.1  christos  *                 request succeeded, merely that it was successfully started.
    263  1.1  christos  */
    264  1.1  christos 
    265  1.1  christos #define cti_get_mesh_local_prefix(server, context, callback, client_queue) \
    266  1.1  christos     cti_get_mesh_local_prefix_(server, context, callback, client_queue, __FILE__, __LINE__)
    267  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    268  1.1  christos cti_get_mesh_local_prefix_(srp_server_t *NULLABLE server,
    269  1.1  christos                            void *NULLABLE context, cti_string_property_reply_t NONNULL callback,
    270  1.1  christos                            run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
    271  1.1  christos 
    272  1.1  christos /* cti_get_mesh_local_address
    273  1.1  christos  *
    274  1.1  christos  * Get the mesh_local IPv6 address that is in use on this device on the Thread mesh. The address is passed to the reply
    275  1.1  christos  * callback if the request succeeds; otherwise an error is either returned immediately or returned to the callback.
    276  1.1  christos  *
    277  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    278  1.1  christos  *                 an event occurs.
    279  1.1  christos  *
    280  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    281  1.1  christos  *
    282  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    283  1.1  christos  *
    284  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating the
    285  1.1  christos  *                 error that occurred. Note: A return value of kCTIStatus_NoError does not mean that the
    286  1.1  christos  *                 request succeeded, merely that it was successfully started.
    287  1.1  christos  */
    288  1.1  christos 
    289  1.1  christos #define cti_get_mesh_local_address(server, context, callback, client_queue) \
    290  1.1  christos     cti_get_mesh_local_address_(server, context, callback, client_queue, __FILE__, __LINE__)
    291  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    292  1.1  christos cti_get_mesh_local_address_(srp_server_t *NULLABLE server,
    293  1.1  christos                             void *NULLABLE context, cti_string_property_reply_t NONNULL callback,
    294  1.1  christos                             run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
    295  1.1  christos 
    296  1.1  christos /*
    297  1.1  christos  * cti_service_vec_create
    298  1.1  christos  *
    299  1.1  christos  * creates a service array vector of specified length
    300  1.1  christos  *
    301  1.1  christos  * num_services:     Number of service slots available in the service vector.
    302  1.1  christos  *
    303  1.1  christos  * return value:     NULL, if the call failed; otherwise a service vector capable of containing the requested number of
    304  1.1  christos  *                   services.
    305  1.1  christos  */
    306  1.1  christos cti_service_vec_t *NULLABLE
    307  1.1  christos cti_service_vec_create_(size_t num_services, const char *NONNULL file, int line);
    308  1.1  christos #define cti_service_vec_create(num_services) cti_service_vec_create_(num_services, __FILE__, __LINE__)
    309  1.1  christos 
    310  1.1  christos /*
    311  1.1  christos  * cti_service_vec_release
    312  1.1  christos  *
    313  1.1  christos  * decrements the reference count on the provided service vector and, if it reaches zero, finalizes the service vector,
    314  1.1  christos  * which calls cti_service_release on each service in the vector, potentially also finalizing them.
    315  1.1  christos  *
    316  1.1  christos  * num_services:     Number of service slots available in the service vector.
    317  1.1  christos  *
    318  1.1  christos  * return value:     NULL, if the call failed; otherwise a service vector capable of containing the requested number of
    319  1.1  christos  *                   services.
    320  1.1  christos  */
    321  1.1  christos 
    322  1.1  christos void
    323  1.1  christos cti_service_vec_release_(cti_service_vec_t *NONNULL services, const char *NONNULL file, int line);
    324  1.1  christos #define cti_service_vec_release(services) cti_service_vec_release_(services, __FILE__, __LINE__)
    325  1.1  christos 
    326  1.1  christos /*
    327  1.1  christos  * cti_service_create
    328  1.1  christos  *
    329  1.1  christos  * Creates a service containing the specified information.   service and server are retained, and will be
    330  1.1  christos  * freed using free() when the service object is finalized.   Caller must not retain or free these values, and
    331  1.1  christos  * they must be allocated on the malloc heap.
    332  1.1  christos  *
    333  1.1  christos  * enterprise_number: The enterprise number for this service.
    334  1.1  christos  *
    335  1.1  christos  * service_type:      The service type, from the service data.
    336  1.1  christos  *
    337  1.1  christos  * service_version:   The service version, from the service data.
    338  1.1  christos  *
    339  1.1  christos  * server:            Server information for this service, stored in network byte order.   Format depends on service type.
    340  1.1  christos  *
    341  1.1  christos  * server_length:     Length of server information in bytes.
    342  1.1  christos  *
    343  1.1  christos  * flags:             Thread network status flags, e.g. NCP versue User
    344  1.1  christos  *
    345  1.1  christos  * return value:     NULL, if the call failed; otherwise a service object containing the specified state.
    346  1.1  christos  */
    347  1.1  christos 
    348  1.1  christos cti_service_t *NULLABLE
    349  1.1  christos cti_service_create_(uint64_t enterprise_number, uint16_t rloc16, uint16_t service_type, uint16_t service_version,
    350  1.1  christos                     uint8_t *NONNULL service, size_t service_length, uint8_t *NONNULL server, size_t server_length,
    351  1.1  christos                     uint16_t service_id, int flags, const char *NONNULL file, int line);
    352  1.1  christos #define cti_service_create(enterprise_number, rloc16, service_type, service_version, service, service_length, \
    353  1.1  christos                            server, server_length, service_id, flags) \
    354  1.1  christos     cti_service_create_(enterprise_number, rloc16, service_type, service_version, service, service_length, \
    355  1.1  christos                         server, server_length, service_id, flags, __FILE__, __LINE__)
    356  1.1  christos 
    357  1.1  christos /*
    358  1.1  christos  * cti_service_vec_release
    359  1.1  christos  *
    360  1.1  christos  * decrements the reference count on the provided service vector and, if it reaches zero, finalizes the service vector,
    361  1.1  christos  * which calls cti_service_release on each service in the vector, potentially also finalizing them.
    362  1.1  christos  *
    363  1.1  christos  * services:         The service vector to release
    364  1.1  christos  *
    365  1.1  christos  * return value:     NULL, if the call failed; otherwise a service vector capable of containing the requested number of
    366  1.1  christos  *                   services.
    367  1.1  christos  */
    368  1.1  christos 
    369  1.1  christos void
    370  1.1  christos cti_service_release_(cti_service_t *NONNULL service, const char *NONNULL file, int line);
    371  1.1  christos #define cti_service_release(services) cti_service_release(service, __FILE__, __LINE__)
    372  1.1  christos 
    373  1.1  christos /* cti_service_reply: Callback from cti_get_service_list()
    374  1.1  christos  *
    375  1.1  christos  * Called when an error occurs during processing of the cti_get_service_list call, or when data
    376  1.1  christos  * is available in response to the call.
    377  1.1  christos  *
    378  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
    379  1.1  christos  * releasing the connection state and restarting if needed.
    380  1.1  christos  *
    381  1.1  christos  * The callback will be called once immediately upon success, and once again each time the service list
    382  1.1  christos  * is updated.   If the callback wishes to retain either the cti_service_vec_t or any of the elements
    383  1.1  christos  * of that vector, the appropriate retain function should be called; when the object is no longer needed,
    384  1.1  christos  * the corresponding release call must be called.
    385  1.1  christos  *
    386  1.1  christos  * cti_reply parameters:
    387  1.1  christos  *
    388  1.1  christos  * context:           The context that was passed to the cti service call to which this is a callback.
    389  1.1  christos  *
    390  1.1  christos  * services:          If status is kCTIStatus_NoError, a cti_service_vec_t containing the list of services
    391  1.1  christos  *                    provided in the update.
    392  1.1  christos  *
    393  1.1  christos  * status:	          Will be kCTIStatus_NoError if the service list request is successful, or
    394  1.1  christos  *                    will indicate the failure that occurred.
    395  1.1  christos  */
    396  1.1  christos 
    397  1.1  christos typedef void
    398  1.1  christos (*cti_service_reply_t)(void *NULLABLE context, cti_service_vec_t *NULLABLE services, cti_status_t status);
    399  1.1  christos 
    400  1.1  christos /* cti_get_service_list
    401  1.1  christos  *
    402  1.1  christos  * Requests wpantund to immediately send the current list of services published in the Thread network data.
    403  1.1  christos  * Whenever the service list is updated, the callback will be called again with the new information.  A
    404  1.1  christos  * return value of kCTIStatus_NoError means that the caller can expect the reply callback to be called at least
    405  1.1  christos  * once.  Any other error status means that the request could not be sent, and the callback will never be
    406  1.1  christos  * called.
    407  1.1  christos  *
    408  1.1  christos  * To discontinue receiving service add/remove callbacks, the calling program should call
    409  1.1  christos  * cti_connection_ref_deallocate on the conn_ref returned by a successful call to get_service_list();
    410  1.1  christos  *
    411  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
    412  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
    413  1.1  christos  *
    414  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    415  1.1  christos  *                 an event occurs.
    416  1.1  christos  *
    417  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    418  1.1  christos  *                 If the get_services call fails, response will be NULL and status
    419  1.1  christos  *                 will indicate what went wrong.  No further callbacks can be expected
    420  1.1  christos  *                 after this.   If the request succeeds, then the callback will be called
    421  1.1  christos  *                 once immediately with the current service list, and then again whenever
    422  1.1  christos  *                 the service list is updated.
    423  1.1  christos  *
    424  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    425  1.1  christos  *
    426  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    427  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    428  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    429  1.1  christos  */
    430  1.1  christos 
    431  1.1  christos #define cti_get_service_list(server, ref, context, callback, client_queue) \
    432  1.1  christos     cti_get_service_list_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
    433  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    434  1.1  christos cti_get_service_list_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref, void *NULLABLE context,
    435  1.1  christos                       cti_service_reply_t NONNULL callback, run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
    436  1.1  christos 
    437  1.1  christos /*
    438  1.1  christos  * cti_service_vec_create
    439  1.1  christos  *
    440  1.1  christos  * creates a service array vector of specified length
    441  1.1  christos  *
    442  1.1  christos  * num_prefixes:     Number of prefix slots available in the prefix vector.
    443  1.1  christos  *
    444  1.1  christos  * return value:     NULL, if the call failed; otherwise a prefix vector capable of containing the requested number of
    445  1.1  christos  *                   prefixes.
    446  1.1  christos  */
    447  1.1  christos cti_prefix_vec_t *NULLABLE
    448  1.1  christos cti_prefix_vec_create_(size_t num_prefixes, const char *NONNULL file, int line);
    449  1.1  christos #define cti_prefix_vec_create(num_prefixes) cti_prefix_vec_create_(num_prefixes, __FILE__, __LINE__)
    450  1.1  christos 
    451  1.1  christos /*
    452  1.1  christos  * cti_prefix_vec_release
    453  1.1  christos  *
    454  1.1  christos  * decrements the reference count on the provided prefix vector and, if it reaches zero, finalizes the prefix vector,
    455  1.1  christos  * which calls cti_prefix_release on each prefix in the vector, potentially also finalizing them.
    456  1.1  christos  *
    457  1.1  christos  * num_prefixes:     Number of prefix slots available in the prefix vector.
    458  1.1  christos  *
    459  1.1  christos  * return value:     NULL, if the call failed; otherwise a prefix vector capable of containing the requested number of
    460  1.1  christos  *                   prefixes.
    461  1.1  christos  */
    462  1.1  christos 
    463  1.1  christos void
    464  1.1  christos cti_prefix_vec_release_(cti_prefix_vec_t *NONNULL prefixes, const char *NONNULL file, int line);
    465  1.1  christos #define cti_prefix_vec_release(prefixes) cti_prefix_vec_release_(prefixes, __FILE__, __LINE__)
    466  1.1  christos 
    467  1.1  christos /*
    468  1.1  christos  * cti_prefix_create
    469  1.1  christos  *
    470  1.1  christos  * Creates a prefix containing the specified information.   prefix and server are retained, and will be
    471  1.1  christos  * freed using free() when the prefix object is finalized.   Caller must not retain or free these values, and
    472  1.1  christos  * they must be allocated on the malloc heap.
    473  1.1  christos  *
    474  1.1  christos  * enterprise_number: The enterprise number for this prefix.
    475  1.1  christos  *
    476  1.1  christos  * prefix_type:      The prefix type, from the prefix data.
    477  1.1  christos  *
    478  1.1  christos  * prefix_version:   The prefix version, from the prefix data.
    479  1.1  christos  *
    480  1.1  christos  * server:            Server information for this prefix, stored in network byte order.   Format depends on prefix type.
    481  1.1  christos  *
    482  1.1  christos  * server_length:     Length of server information in bytes.
    483  1.1  christos  *
    484  1.1  christos  * flags:             Thread network status flags, e.g. NCP versue User
    485  1.1  christos  *
    486  1.1  christos  * return value:     NULL, if the call failed; otherwise a prefix object containing the specified state.
    487  1.1  christos  */
    488  1.1  christos 
    489  1.1  christos cti_prefix_t *NULLABLE
    490  1.1  christos cti_prefix_create_(struct in6_addr *NONNULL prefix, int prefix_length, int metric, int flags, int rloc, bool stable, bool ncp,
    491  1.1  christos                    const char *NONNULL file, int line);
    492  1.1  christos #define cti_prefix_create(prefix, prefix_length, metric, flags, rloc, stable, ncp) \
    493  1.1  christos     cti_prefix_create_(prefix, prefix_length, metric, flags, rloc, stable, ncp, __FILE__, __LINE__)
    494  1.1  christos 
    495  1.1  christos /*
    496  1.1  christos  * cti_prefix_vec_release
    497  1.1  christos  *
    498  1.1  christos  * decrements the reference count on the provided prefix vector and, if it reaches zero, finalizes the prefix vector,
    499  1.1  christos  * which calls cti_prefix_release on each prefix in the vector, potentially also finalizing them.
    500  1.1  christos  *
    501  1.1  christos  * prefixes:         The prefix vector to release.
    502  1.1  christos  *
    503  1.1  christos  * return value:     NULL, if the call failed; otherwise a prefix vector capable of containing the requested number of
    504  1.1  christos  *                   prefixes.
    505  1.1  christos  */
    506  1.1  christos 
    507  1.1  christos void
    508  1.1  christos cti_prefix_release_(cti_prefix_t *NONNULL prefix, const char *NONNULL file, int line);
    509  1.1  christos #define cti_prefix_release(prefixes) cti_prefix_release(prefix, __FILE__, __LINE__)
    510  1.1  christos 
    511  1.1  christos /* cti_prefix_reply: Callback from cti_get_prefix_list()
    512  1.1  christos  *
    513  1.1  christos  * Called when an error occurs during processing of the cti_get_prefix_list call, or when a prefix
    514  1.1  christos  * is added or removed.
    515  1.1  christos  *
    516  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
    517  1.1  christos  * releasing the connection state and restarting if needed.
    518  1.1  christos  *
    519  1.1  christos  * The callback will be called once for each prefix present on the Thread network at the time
    520  1.1  christos  * get_prefix_list() is first called, and then again whenever a prefix is added or removed.
    521  1.1  christos  *
    522  1.1  christos  * cti_reply parameters:
    523  1.1  christos  *
    524  1.1  christos  * context:           The context that was passed to the cti prefix call to which this is a callback.
    525  1.1  christos  *
    526  1.1  christos  * prefix_vec:        If status is kCTIStatus_NoError, a vector containing all of the prefixes that were reported in
    527  1.1  christos  *                    this event.
    528  1.1  christos  *
    529  1.1  christos  * status:	          Will be kCTIStatus_NoError if the prefix list request is successful, or
    530  1.1  christos  *                    will indicate the failure that occurred.
    531  1.1  christos  */
    532  1.1  christos 
    533  1.1  christos typedef void
    534  1.1  christos (*cti_prefix_reply_t)(void *NULLABLE context, cti_prefix_vec_t *NULLABLE prefixes, cti_status_t status);
    535  1.1  christos 
    536  1.1  christos /* cti_get_prefix_list
    537  1.1  christos  *
    538  1.1  christos  * Requests wpantund to immediately send the current list of off-mesh prefixes configured in the Thread
    539  1.1  christos  * network data.  Whenever the prefix list is updated, the callback will be called again with the new
    540  1.1  christos  * information.  A return value of kCTIStatus_NoError means that the caller can expect the reply callback to be
    541  1.1  christos  * called at least once.  Any other error means that the request could not be sent, and the callback will
    542  1.1  christos  * never be called.
    543  1.1  christos  *
    544  1.1  christos  * To discontinue receiving prefix add/remove callbacks, the calling program should call
    545  1.1  christos  * cti_connection_ref_deallocate on the conn_ref returned by a successful call to get_prefix_list();
    546  1.1  christos  *
    547  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
    548  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
    549  1.1  christos  *
    550  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    551  1.1  christos  *                 an event occurs.
    552  1.1  christos  *
    553  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    554  1.1  christos  *
    555  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    556  1.1  christos  *
    557  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    558  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    559  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    560  1.1  christos  */
    561  1.1  christos 
    562  1.1  christos #define cti_get_prefix_list(server, ref, context, callback, client_queue) \
    563  1.1  christos     cti_get_prefix_list_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
    564  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    565  1.1  christos cti_get_prefix_list_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref, void *NULLABLE context,
    566  1.1  christos                      cti_prefix_reply_t NONNULL callback, run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
    567  1.1  christos 
    568  1.1  christos /* cti_state_reply: Callback from cti_get_state()
    569  1.1  christos  *
    570  1.1  christos  * Called when an error occurs during processing of the cti_get_state call, or when network state
    571  1.1  christos  * information is available.
    572  1.1  christos  *
    573  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
    574  1.1  christos  * releasing the connection state and restarting if needed.
    575  1.1  christos  *
    576  1.1  christos  * The callback will be called initially to report the network state, and subsequently whenever the
    577  1.1  christos  * network state changes.
    578  1.1  christos  *
    579  1.1  christos  * cti_reply parameters:
    580  1.1  christos  *
    581  1.1  christos  * context:           The context that was passed to the cti state call to which this is a callback.
    582  1.1  christos  *
    583  1.1  christos  * state:             The network state.
    584  1.1  christos  *
    585  1.1  christos  * status:	          Will be kCTIStatus_NoError if the prefix list request is successful, or
    586  1.1  christos  *                    will indicate the failure that occurred.
    587  1.1  christos  */
    588  1.1  christos 
    589  1.1  christos typedef void
    590  1.1  christos (*cti_state_reply_t)(void *NULLABLE context, cti_network_state_t state, cti_status_t status);
    591  1.1  christos 
    592  1.1  christos /* cti_get_state
    593  1.1  christos  *
    594  1.1  christos  * Requests wpantund to immediately send the current state of the thread network.  Whenever the thread
    595  1.1  christos  * network state changes, the callback will be called again with the new state.  A return value of
    596  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called at least once.  Any
    597  1.1  christos  * other error means that the request could not be sent, and the callback will never be called.
    598  1.1  christos  *
    599  1.1  christos  * To discontinue receiving state change callbacks, the calling program should call
    600  1.1  christos  * cti_connection_ref_deallocate on the conn_ref returned by a successful call to cti_get_state();
    601  1.1  christos  *
    602  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
    603  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
    604  1.1  christos  *
    605  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    606  1.1  christos  *                 an event occurs.
    607  1.1  christos  *
    608  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    609  1.1  christos  *
    610  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    611  1.1  christos  *
    612  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    613  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    614  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    615  1.1  christos  */
    616  1.1  christos 
    617  1.1  christos #define cti_get_state(server, ref, context, callback, client_queue) \
    618  1.1  christos     cti_get_state_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
    619  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    620  1.1  christos cti_get_state_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref, void *NULLABLE context,
    621  1.1  christos                cti_state_reply_t NONNULL callback, run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
    622  1.1  christos 
    623  1.1  christos /* cti_uint64_property_reply: Callback from cti_get_partition_id() or cti_get_xpanid()
    624  1.1  christos  *
    625  1.1  christos  * Called when an error occurs during processing of the cti_get_* call, or when a new value for the requested property
    626  1.1  christos  * is available.
    627  1.1  christos  *
    628  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
    629  1.1  christos  * releasing the connection and restarting if needed.
    630  1.1  christos  *
    631  1.1  christos  * The callback will be called initially to report the current value for the property, and subsequently whenever the
    632  1.1  christos  * property changes.
    633  1.1  christos  *
    634  1.1  christos  * cti_uint64_property_reply parameters:
    635  1.1  christos  *
    636  1.1  christos  * context:           The context that was passed to the cti prefix call to which this is a callback.
    637  1.1  christos  *
    638  1.1  christos  * property_value     The value of the property (only valid if status is kCTIStatus_NoError).
    639  1.1  christos  *
    640  1.1  christos  * status:	          Will be kCTIStatus_NoError if the partition ID request is successful, or will indicate the failure
    641  1.1  christos  *                    that occurred.
    642  1.1  christos  */
    643  1.1  christos 
    644  1.1  christos typedef void
    645  1.1  christos (*cti_uint64_property_reply_t)(void *NULLABLE context, uint64_t property_value, cti_status_t status);
    646  1.1  christos 
    647  1.1  christos /* cti_get_partition_id
    648  1.1  christos  *
    649  1.1  christos  * Requests wpantund to immediately send the current partition_id of the thread network.  Whenever the thread
    650  1.1  christos  * network partition_id changes, the callback will be called again with the new partition_id.  A return value of
    651  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called at least once.  Any
    652  1.1  christos  * other error means that the request could not be sent, and the callback will never be called.
    653  1.1  christos  *
    654  1.1  christos  * To discontinue receiving partition_id change callbacks, the calling program should call
    655  1.1  christos  * cti_connection_ref_deallocate on the conn_ref returned by a successful call to cti_get_partition_id();
    656  1.1  christos  *
    657  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
    658  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
    659  1.1  christos  *
    660  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    661  1.1  christos  *                 an event occurs.
    662  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    663  1.1  christos  *
    664  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    665  1.1  christos  *
    666  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    667  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    668  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    669  1.1  christos  */
    670  1.1  christos 
    671  1.1  christos #define cti_get_partition_id(server, ref, context, callback, client_queue) \
    672  1.1  christos     cti_get_partition_id_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
    673  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    674  1.1  christos cti_get_partition_id_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref, void *NULLABLE context,
    675  1.1  christos                       cti_uint64_property_reply_t NONNULL callback, run_context_t NULLABLE client_queue,
    676  1.1  christos                       const char *NONNULL file, int line);
    677  1.1  christos 
    678  1.1  christos /* cti_get_extended_pan_id
    679  1.1  christos  *
    680  1.1  christos  * Requests wpantund to immediately send the current extended_pan_id of the thread network.  Whenever the thread
    681  1.1  christos  * network extended_pan_id changes, the callback will be called again with the new extended_pan_id.  A return value of
    682  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called at least once.  Any
    683  1.1  christos  * other error means that the request could not be sent, and the callback will never be called.
    684  1.1  christos  *
    685  1.1  christos  * To discontinue receiving extended_pan_id change callbacks, the calling program should call
    686  1.1  christos  * cti_connection_ref_deallocate on the conn_ref returned by a successful call to cti_get_extended_pan_id();
    687  1.1  christos  *
    688  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
    689  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
    690  1.1  christos  *
    691  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    692  1.1  christos  *                 an event occurs.
    693  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    694  1.1  christos  *
    695  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    696  1.1  christos  *
    697  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    698  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    699  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    700  1.1  christos  */
    701  1.1  christos 
    702  1.1  christos #define cti_get_extended_pan_id(server, ref, context, callback, client_queue) \
    703  1.1  christos     cti_get_extended_pan_id_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
    704  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    705  1.1  christos cti_get_extended_pan_id_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref, void *NULLABLE context,
    706  1.1  christos                          cti_uint64_property_reply_t NONNULL callback, run_context_t NULLABLE client_queue,
    707  1.1  christos                          const char *NONNULL file, int line);
    708  1.1  christos 
    709  1.1  christos /* cti_network_node_type_reply: Callback from cti_get_network_node_type()
    710  1.1  christos  *
    711  1.1  christos  * Called when an error occurs during processing of the cti_get_network_node_type call, or when network partition ID
    712  1.1  christos  * information is available.
    713  1.1  christos  *
    714  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for releasing the
    715  1.1  christos  * connection network_node_type and restarting if needed.
    716  1.1  christos  *
    717  1.1  christos  * The callback will be called initially to report the network partition ID, and subsequently whenever the network
    718  1.1  christos  * partition ID changes.
    719  1.1  christos  *
    720  1.1  christos  * cti_reply parameters:
    721  1.1  christos  *
    722  1.1  christos  * context:           The context that was passed to the cti prefix call to which this is a callback.
    723  1.1  christos  *
    724  1.1  christos  * network_node_type: The network node type, kCTI_NetworkNodeType_Unknown if it is not known.
    725  1.1  christos  *
    726  1.1  christos  * status:	          Will be kCTIStatus_NoError if the partition ID request is successful, or will indicate the failure
    727  1.1  christos  *                    that occurred.
    728  1.1  christos  */
    729  1.1  christos 
    730  1.1  christos typedef void
    731  1.1  christos (*cti_network_node_type_reply_t)(void *NULLABLE context, cti_network_node_type_t network_node_type, cti_status_t status);
    732  1.1  christos 
    733  1.1  christos /* cti_get_network_node_type
    734  1.1  christos  *
    735  1.1  christos  * Requests wpantund to immediately send the current network_node_type of the thread network.  Whenever the thread
    736  1.1  christos  * network network_node_type changes, the callback will be called again with the new network_node_type.  A return value of
    737  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called at least once.  Any
    738  1.1  christos  * other error means that the request could not be sent, and the callback will never be called.
    739  1.1  christos  *
    740  1.1  christos  * To discontinue receiving network_node_type change callbacks, the calling program should call
    741  1.1  christos  * cti_connection_ref_deallocate on the conn_ref returned by a successful call to cti_get_network_node_type();
    742  1.1  christos  *
    743  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
    744  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
    745  1.1  christos  *
    746  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    747  1.1  christos  *                 an event occurs.
    748  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    749  1.1  christos  *
    750  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    751  1.1  christos  *
    752  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    753  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    754  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    755  1.1  christos  */
    756  1.1  christos 
    757  1.1  christos #define cti_get_network_node_type(server, ref, context, callback, client_queue) \
    758  1.1  christos     cti_get_network_node_type_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
    759  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    760  1.1  christos cti_get_network_node_type_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref, void *NULLABLE context,
    761  1.1  christos                            cti_network_node_type_reply_t NONNULL callback, run_context_t NULLABLE client_queue,
    762  1.1  christos                            const char *NONNULL file, int line);
    763  1.1  christos 
    764  1.1  christos /* cti_add_service
    765  1.1  christos  *
    766  1.1  christos  * Requests wpantund to add the specified service to the thread network data.  A return value of
    767  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called with a success or fail
    768  1.1  christos  * status exactly one time.  Any other error means that the request could not be sent, and the callback will
    769  1.1  christos  * never be called.
    770  1.1  christos  *
    771  1.1  christos  * context:           An anonymous pointer that will be passed along to the callback when
    772  1.1  christos  *                    an event occurs.
    773  1.1  christos  *
    774  1.1  christos  * callback:          CallBack function for the client that indicates success or failure.
    775  1.1  christos  *
    776  1.1  christos  * client_queue:      Queue the client wants to schedule the callback on
    777  1.1  christos  *
    778  1.1  christos  * enterprise_number: Contains the enterprise number of the service.
    779  1.1  christos  *
    780  1.1  christos  * service_data:      Typically four bytes, in network byte order, the first two bytes indicate
    781  1.1  christos  *                    the type of service within the enterprise' number space, and the second
    782  1.1  christos  *                    two bytes indicate the version number.
    783  1.1  christos  *
    784  1.1  christos  * service_data_len:  The length of the service data in bytes.
    785  1.1  christos  *
    786  1.1  christos  * server_data:       Typically four bytes, in network byte order, the first two bytes indicate
    787  1.1  christos  *                    the type of service within the enterprise' number space, and the second
    788  1.1  christos  *                    two bytes indicate the version number.
    789  1.1  christos  *
    790  1.1  christos  * server_data_len:   The length of the service data in bytes.
    791  1.1  christos  *
    792  1.1  christos  * return value:      Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    793  1.1  christos  *                    the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    794  1.1  christos  *                    that the request succeeded, merely that it was successfully started.
    795  1.1  christos  */
    796  1.1  christos 
    797  1.1  christos #define cti_add_service(server, context, callback, client_queue, \
    798  1.1  christos                         enterprise_number, service_data, service_data_length, server_data, server_data_length) \
    799  1.1  christos     cti_add_service_(server, context, callback, client_queue, enterprise_number, \
    800  1.1  christos                      service_data, service_data_length, server_data, server_data_length, __FILE__, __LINE__)
    801  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    802  1.1  christos cti_add_service_(srp_server_t *NULLABLE server, void *NULLABLE context, cti_reply_t NONNULL callback,
    803  1.1  christos                  run_context_t NULLABLE client_queue, uint32_t enterprise_number, const uint8_t *NONNULL service_data,
    804  1.1  christos                  size_t service_data_length, const uint8_t *NULLABLE server_data, size_t server_data_length,
    805  1.1  christos                  const char *NONNULL file, int line);
    806  1.1  christos 
    807  1.1  christos /* cti_remove_service
    808  1.1  christos  *
    809  1.1  christos  * Requests wpantund to remove the specified service from the thread network data.  A return value of
    810  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called with a success or fail
    811  1.1  christos  * status exactly one time.  Any other error means that the request could not be sent, and the callback will
    812  1.1  christos  * never be called.
    813  1.1  christos  *
    814  1.1  christos  * context:           An anonymous pointer that will be passed along to the callback when
    815  1.1  christos  *                    an event occurs.
    816  1.1  christos  *
    817  1.1  christos  * callback:          callback function for the client that indicates success or failure.
    818  1.1  christos  *
    819  1.1  christos  * client_queue:      Queue the client wants to schedule the callback on
    820  1.1  christos  *
    821  1.1  christos  * enterprise_number: Contains the enterprise number of the service.
    822  1.1  christos  *
    823  1.1  christos  * service_data:      Typically four bytes, in network byte order, the first two bytes indicate
    824  1.1  christos  *                    the type of service within the enterprise' number space, and the second
    825  1.1  christos  *                    two bytes indicate the version number.
    826  1.1  christos  *
    827  1.1  christos  * service_data_len:  The length of the service data in bytes.
    828  1.1  christos  *
    829  1.1  christos  * return value:      Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    830  1.1  christos  *                    the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    831  1.1  christos  *                    that the request succeeded, merely that it was successfully started.
    832  1.1  christos  */
    833  1.1  christos 
    834  1.1  christos #define cti_remove_service(server, context, callback, client_queue, \
    835  1.1  christos                            enterprise_number, service_data, service_data_length) \
    836  1.1  christos     cti_remove_service_(server, context, callback, client_queue,            \
    837  1.1  christos                         enterprise_number, service_data, service_data_length, __FILE__, __LINE__)
    838  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    839  1.1  christos cti_remove_service_(srp_server_t *NULLABLE server, void *NULLABLE context, cti_reply_t NONNULL callback,
    840  1.1  christos                     run_context_t NULLABLE client_queue, uint32_t enterprise_number, const uint8_t *NONNULL service_data,
    841  1.1  christos                     size_t service_data_length, const char *NONNULL file, int line);
    842  1.1  christos 
    843  1.1  christos /* cti_add_prefix
    844  1.1  christos  *
    845  1.1  christos  * Requests wpantund to add the specified prefix to the set of off-mesh prefixes configured on the thread
    846  1.1  christos  * network.  A return value of kCTIStatus_NoError means that the caller can expect the reply callback to be
    847  1.1  christos  * called with a success or fail status exactly one time.  Any other error means that the request could not
    848  1.1  christos  * be sent, and the callback will never be called.
    849  1.1  christos  *
    850  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    851  1.1  christos  *                 an event occurs.
    852  1.1  christos  *
    853  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    854  1.1  christos  *
    855  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    856  1.1  christos  *
    857  1.1  christos  * prefix:         A pointer to a struct in6_addr.  Must not be reatained by the callback.
    858  1.1  christos  *
    859  1.1  christos  * prefix_len:     The length of the prefix in bits.
    860  1.1  christos  *
    861  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    862  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    863  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    864  1.1  christos  */
    865  1.1  christos 
    866  1.1  christos #define cti_add_prefix(server, context, callback, client_queue, \
    867  1.1  christos                        prefix, prefix_length, on_mesh, preferred, slaac, stable, priority) \
    868  1.1  christos     cti_add_prefix_(server, context, callback, client_queue, prefix, prefix_length, \
    869  1.1  christos                     on_mesh, preferred, slaac, stable, priority, __FILE__, __LINE__)
    870  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    871  1.1  christos cti_add_prefix_(srp_server_t *NULLABLE server, void *NULLABLE context, cti_reply_t NONNULL callback, run_context_t NULLABLE client_queue,
    872  1.1  christos                 struct in6_addr *NONNULL prefix, int prefix_length, bool on_mesh, bool preferred, bool slaac,
    873  1.1  christos                 bool stable, int priority, const char *NONNULL file, int line);
    874  1.1  christos 
    875  1.1  christos /* cti_remove_prefix
    876  1.1  christos  *
    877  1.1  christos  * Requests wpantund to remove the specified prefix from the set of off-mesh prefixes configured on the thread network.
    878  1.1  christos  * A return value of kCTIStatus_NoError means that the caller can expect the reply callback to be called with a success
    879  1.1  christos  * or fail status exactly one time.  Any other error means that the request could not be sent, and the callback will
    880  1.1  christos  * never be called.
    881  1.1  christos  *
    882  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    883  1.1  christos  *                 an event occurs.
    884  1.1  christos  *
    885  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    886  1.1  christos  *
    887  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    888  1.1  christos  *
    889  1.1  christos  * prefix:         A pointer to a struct in6_addr.  Must not be reatained by the callback.
    890  1.1  christos  *
    891  1.1  christos  * prefix_len:     The length of the prefix in bits.
    892  1.1  christos  *
    893  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    894  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    895  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    896  1.1  christos  */
    897  1.1  christos 
    898  1.1  christos #define cti_remove_prefix(server, context, callback, client_queue, prefix, prefix_length) \
    899  1.1  christos     cti_remove_prefix_(server, context, callback, client_queue, prefix, prefix_length, __FILE__, __LINE__)
    900  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    901  1.1  christos cti_remove_prefix_(srp_server_t *NULLABLE server, void *NULLABLE context, cti_reply_t NONNULL callback,
    902  1.1  christos                    run_context_t NULLABLE client_queue, struct in6_addr *NONNULL prefix, int prefix_length,
    903  1.1  christos                    const char *NONNULL file, int line);
    904  1.1  christos 
    905  1.1  christos /* cti_add_route
    906  1.1  christos  *
    907  1.1  christos  * Requests wpantund to add the specified route on the thread network.
    908  1.1  christos  * A return value of kCTIStatus_NoError means that the caller can expect the reply callback to be
    909  1.1  christos  * called with a success or fail status exactly one time.  Any other error means that the request could not
    910  1.1  christos  * be sent, and the callback will never be called.
    911  1.1  christos  *
    912  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    913  1.1  christos  *                 an event occurs.
    914  1.1  christos  *
    915  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    916  1.1  christos  *
    917  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    918  1.1  christos  *
    919  1.1  christos  * prefix:         A pointer to a struct in6_addr.
    920  1.1  christos  *
    921  1.1  christos  * prefix_len:     The length of the prefix in bits.
    922  1.1  christos  *
    923  1.1  christos  * priority:       Route priority (>0 for high, 0 for medium, <0 for low).
    924  1.1  christos  *
    925  1.1  christos  * domain_id:      Domain id for the route (default is zero).
    926  1.1  christos  *
    927  1.1  christos  * stable:         True if the route is part of stable network data.
    928  1.1  christos  *
    929  1.1  christos  * nat64:          True if this is NAT64 prefix.
    930  1.1  christos  *
    931  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    932  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    933  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    934  1.1  christos  */
    935  1.1  christos 
    936  1.1  christos #define cti_add_route(server, context, callback, client_queue, \
    937  1.1  christos                        prefix, prefix_length, priority, domain_id, stable, nat64) \
    938  1.1  christos     cti_add_route_(server, context, callback, client_queue, prefix, prefix_length, \
    939  1.1  christos                     priority, domain_id, stable, nat64, __FILE__, __LINE__)
    940  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    941  1.1  christos cti_add_route_(srp_server_t *NULLABLE server, void *NULLABLE context, cti_reply_t NONNULL callback,
    942  1.1  christos                run_context_t NULLABLE client_queue, struct in6_addr *NONNULL prefix, int prefix_length,
    943  1.1  christos                int priority, int domain_id, bool stable, bool nat64, const char *NONNULL file, int line);
    944  1.1  christos 
    945  1.1  christos /* cti_remove_route
    946  1.1  christos  *
    947  1.1  christos  * Requests wpantund to remove the specified route on the thread network.
    948  1.1  christos  * A return value of kCTIStatus_NoError means that the caller can expect the reply callback to be called with a success
    949  1.1  christos  * or fail status exactly one time.  Any other error means that the request could not be sent, and the callback will
    950  1.1  christos  * never be called.
    951  1.1  christos  *
    952  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
    953  1.1  christos  *                 an event occurs.
    954  1.1  christos  *
    955  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
    956  1.1  christos  *
    957  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
    958  1.1  christos  *
    959  1.1  christos  * prefix:         A pointer to a struct in6_addr.
    960  1.1  christos  *
    961  1.1  christos  * prefix_len:     The length of the prefix in bits.
    962  1.1  christos  *
    963  1.1  christos  * domain_id:      Domain id for the route (default is zero).
    964  1.1  christos  *
    965  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
    966  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
    967  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
    968  1.1  christos  */
    969  1.1  christos 
    970  1.1  christos #define cti_remove_route(server, context, callback, client_queue, prefix, prefix_length, domain_id) \
    971  1.1  christos     cti_remove_route_(server, context, callback, client_queue, prefix, prefix_length, domain_id, __FILE__, __LINE__)
    972  1.1  christos DNS_SERVICES_EXPORT cti_status_t
    973  1.1  christos cti_remove_route_(srp_server_t *NULLABLE server, void *NULLABLE context, cti_reply_t NONNULL callback,
    974  1.1  christos                   run_context_t NULLABLE client_queue, struct in6_addr *NONNULL prefix, int prefix_length,
    975  1.1  christos                   int domain_id, const char *NONNULL file, int line);
    976  1.1  christos 
    977  1.1  christos /*
    978  1.1  christos  * cti_route_vec_create
    979  1.1  christos  *
    980  1.1  christos  * creates a route array vector of specified length
    981  1.1  christos  *
    982  1.1  christos  * num_routes:    Number of route slots available in the route vector.
    983  1.1  christos  *
    984  1.1  christos  * return value:  NULL, if the call failed; otherwise a prefix vector capable of containing the
    985  1.1  christos  *                requested number of routes.
    986  1.1  christos  */
    987  1.1  christos cti_route_vec_t *NULLABLE
    988  1.1  christos cti_route_vec_create_(size_t num_routes, const char *NONNULL file, int line);
    989  1.1  christos #define cti_route_vec_create(num_routes) cti_route_vec_create_(num_routes, __FILE__, __LINE__)
    990  1.1  christos 
    991  1.1  christos /*
    992  1.1  christos  * cti_route_vec_release
    993  1.1  christos  *
    994  1.1  christos  * decrements the reference count on the provided route vector and, if it reaches zero, finalizes the route vector,
    995  1.1  christos  * which calls cti_route_release on each route in the vector, potentially also finalizing them.
    996  1.1  christos  *
    997  1.1  christos  * num_routes:     Number of route slots available in the route vector.
    998  1.1  christos  *
    999  1.1  christos  * return value:   NULL, if the call failed; otherwise a route vector capable of containing the
   1000  1.1  christos  *                 requested number of routes.
   1001  1.1  christos  */
   1002  1.1  christos 
   1003  1.1  christos void
   1004  1.1  christos cti_route_vec_release_(cti_route_vec_t *NONNULL routes, const char *NONNULL file, int line);
   1005  1.1  christos #define cti_route_vec_release(routes) cti_route_vec_release_(routes, __FILE__, __LINE__)
   1006  1.1  christos 
   1007  1.1  christos /*
   1008  1.1  christos  * cti_route_create
   1009  1.1  christos  *
   1010  1.1  christos  * Creates a cti_route_t containing the specified information. The route is retained, and will be
   1011  1.1  christos  * freed using free() when the route object is finalized. Caller must not retain or free these values, and
   1012  1.1  christos  * they must be allocated on the malloc heap.
   1013  1.1  christos  *
   1014  1.1  christos  * prefix:            A pointer to a struct in6_addr.
   1015  1.1  christos  *
   1016  1.1  christos  * prefix_len:        The length of the prefix in bits.
   1017  1.1  christos  *
   1018  1.1  christos  * origin:            User or ncp.
   1019  1.1  christos  *
   1020  1.1  christos  * nat64:             True if this is NAT64 prefix.
   1021  1.1  christos  *
   1022  1.1  christos  * stable:            True if the route is part of stable network data.
   1023  1.1  christos  *
   1024  1.1  christos  * preference:        Route priority.
   1025  1.1  christos  *
   1026  1.1  christos  * rloc:              Routing locator.
   1027  1.1  christos  *
   1028  1.1  christos  * next_hop_is_host:  True if next hop is host.
   1029  1.1  christos  *
   1030  1.1  christos  * return value:      NULL, if the call failed; otherwise a route object containing the specified state.
   1031  1.1  christos  */
   1032  1.1  christos 
   1033  1.1  christos cti_route_t *NULLABLE
   1034  1.1  christos cti_route_create_(struct in6_addr *NONNULL prefix, int prefix_length, offmesh_route_origin_t origin,
   1035  1.1  christos                   bool nat64, bool stable, offmesh_route_preference_t preference, int rloc,
   1036  1.1  christos                   bool next_hop_is_host, const char *NONNULL file, int line);
   1037  1.1  christos #define cti_route_create(prefix, prefix_length, origin, nat64, stable, preference, rloc, next_hop_is_host) \
   1038  1.1  christos     cti_route_create_(prefix, prefix_length, origin, nat64, stable, preference, rloc, next_hop_is_host, __FILE__, __LINE__)
   1039  1.1  christos 
   1040  1.1  christos /*
   1041  1.1  christos  * cti_route_release
   1042  1.1  christos  *
   1043  1.1  christos  * Decrements the reference count on the provided route vector and, if it reaches zero, finalizes the route vector,
   1044  1.1  christos  * which calls cti_route_release on each route in the vector, potentially also finalizing them.
   1045  1.1  christos  *
   1046  1.1  christos  * routes:           The route vector to release.
   1047  1.1  christos  *
   1048  1.1  christos  * return value:     NULL, if the call failed; otherwise a route vector capable of containing the requested number of
   1049  1.1  christos  *                   routes.
   1050  1.1  christos  */
   1051  1.1  christos 
   1052  1.1  christos void
   1053  1.1  christos cti_route_release_(cti_route_t *NONNULL route, const char *NONNULL file, int line);
   1054  1.1  christos #define cti_route_release(routes) cti_route_release(route, __FILE__, __LINE__)
   1055  1.1  christos 
   1056  1.1  christos /* cti_offmesh_route_reply: Callback from cti_get_offmesh_route_list()
   1057  1.1  christos  *
   1058  1.1  christos  * Called when an error occurs during processing of the cti_get_offmesh_route_list call, or when a route
   1059  1.1  christos  * is added or removed.
   1060  1.1  christos  *
   1061  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
   1062  1.1  christos  * releasing the connection state and restarting if needed.
   1063  1.1  christos  *
   1064  1.1  christos  * The callback will be called once for each offmesh route present on the Thread network at the time
   1065  1.1  christos  * cti_get_offmesh_prefix_list() is first called, and then again whenever a route is added or removed.
   1066  1.1  christos  *
   1067  1.1  christos  * cti_offmesh_route_reply parameters:
   1068  1.1  christos  *
   1069  1.1  christos  * context:           The context that was passed to the cti_get_offmesh_route_list call to which this is a callback.
   1070  1.1  christos  *
   1071  1.1  christos  * route_vec:         If status is kCTIStatus_NoError, a vector containing all of the routes that were reported in
   1072  1.1  christos  *                    this event.
   1073  1.1  christos  *
   1074  1.1  christos  * status:	          Will be kCTIStatus_NoError if the offmesh route list request is successful, or
   1075  1.1  christos  *                    will indicate the failure that occurred.
   1076  1.1  christos  */
   1077  1.1  christos 
   1078  1.1  christos typedef void
   1079  1.1  christos (*cti_offmesh_route_reply_t)(void *NULLABLE context, cti_route_vec_t *NULLABLE routes, cti_status_t status);
   1080  1.1  christos 
   1081  1.1  christos /* cti_get_offmesh_route_list
   1082  1.1  christos  *
   1083  1.1  christos  * Requests wpantund to immediately send the current list of off-mesh routes configured in the Thread
   1084  1.1  christos  * network data.  Whenever the route list is updated, the callback will be called again with the new
   1085  1.1  christos  * information.  A return value of kCTIStatus_NoError means that the caller can expect the reply callback to be
   1086  1.1  christos  * called at least once.  Any other error means that the request could not be sent, and the callback will
   1087  1.1  christos  * never be called.
   1088  1.1  christos  *
   1089  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
   1090  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
   1091  1.1  christos  *
   1092  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
   1093  1.1  christos  *                 an event occurs.
   1094  1.1  christos  *
   1095  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
   1096  1.1  christos  *
   1097  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
   1098  1.1  christos  *
   1099  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
   1100  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
   1101  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
   1102  1.1  christos  */
   1103  1.1  christos 
   1104  1.1  christos #define cti_get_offmesh_route_list(server, ref, context, callback, client_queue) \
   1105  1.1  christos     cti_get_offmesh_route_list_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
   1106  1.1  christos DNS_SERVICES_EXPORT cti_status_t
   1107  1.1  christos cti_get_offmesh_route_list_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref,
   1108  1.1  christos                             void *NULLABLE context, cti_offmesh_route_reply_t NONNULL callback,
   1109  1.1  christos                             run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
   1110  1.1  christos 
   1111  1.1  christos /* cti_onmesh_prefix_reply: Callback from cti_get_onmesh_prefix_list()
   1112  1.1  christos  *
   1113  1.1  christos  * Called when an error occurs during processing of the cti_get_onmesh_prefix_list call, or when a route
   1114  1.1  christos  * is added or removed.
   1115  1.1  christos  *
   1116  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
   1117  1.1  christos  * releasing the connection state and restarting if needed.
   1118  1.1  christos  *
   1119  1.1  christos  * The callback will be called once for each offmesh route present on the Thread network at the time
   1120  1.1  christos  * cti_get_offmesh_prefix_list() is first called, and then again whenever a route is added or removed.
   1121  1.1  christos  *
   1122  1.1  christos  * cti_onmesh_prefix_reply parameters:
   1123  1.1  christos  *
   1124  1.1  christos  * context:           The context that was passed to the cti_get_onmesh_prefix_list call to which this is a callback.
   1125  1.1  christos  *
   1126  1.1  christos  * prefix_vec:        If status is kCTIStatus_NoError, a vector containing all of the prefixes that were reported in
   1127  1.1  christos  *                    this event.
   1128  1.1  christos  *
   1129  1.1  christos  * status:	          Will be kCTIStatus_NoError if the onmesh prefix list request is successful, or
   1130  1.1  christos  *                    will indicate the failure that occurred.
   1131  1.1  christos  */
   1132  1.1  christos 
   1133  1.1  christos typedef void
   1134  1.1  christos (*cti_onmesh_prefix_reply_t)(void *NULLABLE context, cti_prefix_vec_t *NULLABLE routes, cti_status_t status);
   1135  1.1  christos 
   1136  1.1  christos /* cti_get_onmesh_prefix_list
   1137  1.1  christos  *
   1138  1.1  christos  * Requests wpantund to immediately send the current list of on-mesh prefixes configured in the Thread
   1139  1.1  christos  * network data.  Whenever the prefix list is updated, the callback will be called again with the new
   1140  1.1  christos  * information.  A return value of kCTIStatus_NoError means that the caller can expect the reply callback to be
   1141  1.1  christos  * called at least once.  Any other error means that the request could not be sent, and the callback will
   1142  1.1  christos  * never be called.
   1143  1.1  christos  *
   1144  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
   1145  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
   1146  1.1  christos  *
   1147  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
   1148  1.1  christos  *                 an event occurs.
   1149  1.1  christos  *
   1150  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
   1151  1.1  christos  *
   1152  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
   1153  1.1  christos  *
   1154  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
   1155  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
   1156  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
   1157  1.1  christos  */
   1158  1.1  christos 
   1159  1.1  christos #define cti_get_onmesh_prefix_list(server, ref, context, callback, client_queue) \
   1160  1.1  christos     cti_get_onmesh_prefix_list_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
   1161  1.1  christos DNS_SERVICES_EXPORT cti_status_t
   1162  1.1  christos cti_get_onmesh_prefix_list_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref,
   1163  1.1  christos                             void *NULLABLE context, cti_onmesh_prefix_reply_t NONNULL callback,
   1164  1.1  christos                             run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
   1165  1.1  christos 
   1166  1.1  christos /* cti_rloc16_reply: Callback from cti_get_rloc16()
   1167  1.1  christos  *
   1168  1.1  christos  * Called when an error occurs during processing of the cti_get_rloc16 call, or when rloc16
   1169  1.1  christos  * is updated.
   1170  1.1  christos  *
   1171  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
   1172  1.1  christos  * releasing the connection state and restarting if needed.
   1173  1.1  christos  *
   1174  1.1  christos  * The callback will be called initially to report the current value for the property, and subsequently
   1175  1.1  christos  * whenever the property changes.
   1176  1.1  christos  *
   1177  1.1  christos  * cti_rloc16_reply parameters:
   1178  1.1  christos  *
   1179  1.1  christos  * context:           The context that was passed to the cti call to which this is a callback.
   1180  1.1  christos  *
   1181  1.1  christos  * rloc16:            The rloc16 value(only valid if status is kCTIStatus_NoError).
   1182  1.1  christos  *
   1183  1.1  christos  * status:            Will be kCTIStatus_NoError if the rloc16 request is successful, or will indicate the failure
   1184  1.1  christos  *                    that occurred.
   1185  1.1  christos  */
   1186  1.1  christos typedef void
   1187  1.1  christos (*cti_rloc16_reply_t)(void *NULLABLE context, uint16_t rloc16, cti_status_t status);
   1188  1.1  christos 
   1189  1.1  christos /* cti_get_rloc16
   1190  1.1  christos  *
   1191  1.1  christos  * Requests wpantund to immediately send the rloc16 of the local device. Whenever the RLOC16
   1192  1.1  christos  * changes, the callback will be called again with the new RLOC16.  A return value of
   1193  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called at least once.  Any
   1194  1.1  christos  * other error means that the request could not be sent, and the callback will never be called.
   1195  1.1  christos  *
   1196  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
   1197  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
   1198  1.1  christos  *
   1199  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
   1200  1.1  christos  *                 an event occurs.
   1201  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
   1202  1.1  christos  *
   1203  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
   1204  1.1  christos  *
   1205  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
   1206  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
   1207  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
   1208  1.1  christos  */
   1209  1.1  christos #define cti_get_rloc16(server, ref, context, callback, client_queue) \
   1210  1.1  christos     cti_get_rloc16_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
   1211  1.1  christos 
   1212  1.1  christos DNS_SERVICES_EXPORT cti_status_t
   1213  1.1  christos cti_get_rloc16_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref,
   1214  1.1  christos                 void *NULLABLE context, cti_rloc16_reply_t NONNULL callback,
   1215  1.1  christos                 run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
   1216  1.1  christos 
   1217  1.1  christos /* cti_active_data_set_change_reply: Callback from cti_get_active_data_set_change()
   1218  1.1  christos  *
   1219  1.1  christos  * Called when an error occurs during processing of the cti_get_active_data_set_change call, or when the active data set
   1220  1.1  christos  * is updated.
   1221  1.1  christos  *
   1222  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
   1223  1.1  christos  * releasing the connection state and restarting if needed.
   1224  1.1  christos  *
   1225  1.1  christos  * The callback will be called whenever the active data set changes.
   1226  1.1  christos  *
   1227  1.1  christos  * cti_active_data_set_change_reply parameters:
   1228  1.1  christos  *
   1229  1.1  christos  * context:           The context that was passed to the cti call to which this is a callback.
   1230  1.1  christos  *
   1231  1.1  christos  * status:            Will be kCTIStatus_NoError if the active_data_set_change request is successful, or will indicate the failure
   1232  1.1  christos  *                    that occurred.
   1233  1.1  christos  */
   1234  1.1  christos typedef void
   1235  1.1  christos (*cti_reply_t)(void *NULLABLE context, cti_status_t status);
   1236  1.1  christos 
   1237  1.1  christos /* cti_get_active_data_set_change
   1238  1.1  christos  *
   1239  1.1  christos  * Requests wpantund to immediately send the active_data_set_change of the local device. Whenever the ACTIVE_DATA_SET_CHANGE
   1240  1.1  christos  * changes, the callback will be called again with the new ACTIVE_DATA_SET_CHANGE.  A return value of
   1241  1.1  christos  * kCTIStatus_NoError means that the caller can expect the reply callback to be called at least once.  Any
   1242  1.1  christos  * other error means that the request could not be sent, and the callback will never be called.
   1243  1.1  christos  *
   1244  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
   1245  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
   1246  1.1  christos  *
   1247  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
   1248  1.1  christos  *                 an event occurs.
   1249  1.1  christos  * callback:       CallBack function for the client that indicates success or failure.
   1250  1.1  christos  *
   1251  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
   1252  1.1  christos  *
   1253  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
   1254  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
   1255  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
   1256  1.1  christos  */
   1257  1.1  christos #define cti_track_active_data_set(server, ref, context, callback, client_queue) \
   1258  1.1  christos     cti_track_active_data_set_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
   1259  1.1  christos 
   1260  1.1  christos DNS_SERVICES_EXPORT cti_status_t
   1261  1.1  christos cti_track_active_data_set_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref,
   1262  1.1  christos                 void *NULLABLE context, cti_reply_t NONNULL callback,
   1263  1.1  christos                 run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
   1264  1.1  christos 
   1265  1.1  christos /* cti_wed_change_reply: Callback from cti_get_wed_change()
   1266  1.1  christos  *
   1267  1.1  christos  * Called when an error occurs during processing of the cti_get_wed_change call, or when the active data set
   1268  1.1  christos  * is updated.
   1269  1.1  christos  *
   1270  1.1  christos  * In the case of an error, the callback will not be called again, and the caller is responsible for
   1271  1.1  christos  * releasing the connection state and restarting if needed.
   1272  1.1  christos  *
   1273  1.1  christos  * The callback will be called whenever the active data set changes.
   1274  1.1  christos  *
   1275  1.1  christos  * cti_wed_change_reply parameters:
   1276  1.1  christos  *
   1277  1.1  christos  * context:           The context that was passed to the cti call to which this is a callback.
   1278  1.1  christos  *
   1279  1.1  christos  * status:            Will be kCTIStatus_NoError if the wed_change request is successful, or will indicate the failure
   1280  1.1  christos  *                    that occurred.
   1281  1.1  christos  */
   1282  1.1  christos typedef void
   1283  1.1  christos (*cti_reply_t)(void *NULLABLE context, cti_status_t status);
   1284  1.1  christos 
   1285  1.1  christos /* cti_wed_reply: Callback for get calls that fetch the current WED status
   1286  1.1  christos  *
   1287  1.1  christos  * Called one or more times in response to a cti_track_wed_status() call, either with an error or with the current WED status.
   1288  1.1  christos  *
   1289  1.1  christos  * cti_wed_reply parameters:
   1290  1.1  christos  *
   1291  1.1  christos  * context:       The context that was passed to the cti service call to which this is a callback.
   1292  1.1  christos  *
   1293  1.1  christos  * ext_address:   If error is kCTIStatus_NoError, a string containing the name of the ext address.
   1294  1.1  christos  *
   1295  1.1  christos  * ml_eid:        If error is kCTIStatus_NoError, a string containing the ML-EID
   1296  1.1  christos  *
   1297  1.1  christos  * added:         If true, this was added; otherwise it was removed.
   1298  1.1  christos  *
   1299  1.1  christos  * status:	      Will be kCTIStatus_NoError on success, otherwise will indicate the
   1300  1.1  christos  * 			      failure that occurred.
   1301  1.1  christos  */
   1302  1.1  christos 
   1303  1.1  christos typedef void
   1304  1.1  christos (*cti_wed_reply_t)(void *NULLABLE context, const char *NULLABLE ext_address, const char *NULLABLE ml_eid, bool added,
   1305  1.1  christos                    cti_status_t status);
   1306  1.1  christos 
   1307  1.1  christos /* cti_get_wed_change
   1308  1.1  christos  *
   1309  1.1  christos  * Requests wpantund to immediately send the WED attachment status of the local device. Whenever the WED attachment
   1310  1.1  christos  * status changes, the callback will be called again with the new status.  A return value of kCTIStatus_NoError means
   1311  1.1  christos  * that the caller can expect the reply callback to be called at least once.  Any other error means that the request
   1312  1.1  christos  * could not be sent, and the callback will never be called.
   1313  1.1  christos  *
   1314  1.1  christos  * ref:            A pointer to a reference to the connection is stored through ref if ref is not NULL.
   1315  1.1  christos  *                 When events are no longer needed, call cti_discontinue_events() on the returned pointer.
   1316  1.1  christos  *
   1317  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
   1318  1.1  christos  *                 an event occurs.
   1319  1.1  christos  *
   1320  1.1  christos  * callback:       CallBack function for the client that indicates success or failure, and on success
   1321  1.1  christos  *                 indicates attachment to a Wake-on End Device (WED).
   1322  1.1  christos  *
   1323  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
   1324  1.1  christos  *
   1325  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
   1326  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
   1327  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
   1328  1.1  christos  */
   1329  1.1  christos #define cti_track_wed_status(server, ref, context, callback, client_queue) \
   1330  1.1  christos     cti_track_wed_status_(server, ref, context, callback, client_queue, __FILE__, __LINE__)
   1331  1.1  christos 
   1332  1.1  christos DNS_SERVICES_EXPORT cti_status_t
   1333  1.1  christos cti_track_wed_status_(srp_server_t *NULLABLE server, cti_connection_t NULLABLE *NULLABLE ref,
   1334  1.1  christos                       void *NULLABLE context, cti_wed_reply_t NONNULL callback,
   1335  1.1  christos                       run_context_t NULLABLE client_queue, const char *NONNULL file, int line);
   1336  1.1  christos 
   1337  1.1  christos /* cti_add_ml_eid_mapping
   1338  1.1  christos  *
   1339  1.1  christos  * Provides the thread daemon with a mapping between an IP address registered by an SRP client and
   1340  1.1  christos  * the source address from which the registration was received, which will be the client's ml-eid.
   1341  1.1  christos  * Additionally provides the client's hostname.
   1342  1.1  christos  *
   1343  1.1  christos  * context:        An anonymous pointer that will be passed along to the callback when
   1344  1.1  christos  *                 an event occurs.
   1345  1.1  christos  *
   1346  1.1  christos  * callback:       CallBack function for the client that indicates success or failure, and on success
   1347  1.1  christos  *                 indicates that the update was accepted by the thread daemon.
   1348  1.1  christos  *
   1349  1.1  christos  * omr_addr:       IP address on the OMR prefix registered by the client.
   1350  1.1  christos  *
   1351  1.1  christos  * ml_eid:         IP address on the mesh-local prefix of the client.
   1352  1.1  christos  *
   1353  1.1  christos  * client_queue:   Queue the client wants to schedule the callback on
   1354  1.1  christos  *
   1355  1.1  christos  *
   1356  1.1  christos  * return value:   Returns kCTIStatus_NoError when no error otherwise returns an error code indicating
   1357  1.1  christos  *                 the error that occurred. Note: A return value of kCTIStatus_NoError does not mean
   1358  1.1  christos  *                 that the request succeeded, merely that it was successfully started.
   1359  1.1  christos  */
   1360  1.1  christos #define cti_add_ml_eid_mapping(server, context, callback, client_queue, omr_addr, ml_eid, hostname) \
   1361  1.1  christos     cti_add_ml_eid_mapping_(server, context, callback, client_queue, omr_addr, ml_eid, hostname, __FILE__, __LINE__)
   1362  1.1  christos 
   1363  1.1  christos DNS_SERVICES_EXPORT cti_status_t
   1364  1.1  christos cti_add_ml_eid_mapping_(srp_server_t *NULLABLE server, void *NULLABLE context,
   1365  1.1  christos                         cti_reply_t NONNULL callback, run_context_t NULLABLE client_queue,
   1366  1.1  christos                         struct in6_addr *NONNULL omr_addr, struct in6_addr *NONNULL ml_eid,
   1367  1.1  christos                         const char *NONNULL hostname, const char *NONNULL file, int line);
   1368  1.1  christos 
   1369  1.1  christos /* cti_events_discontinue
   1370  1.1  christos  *
   1371  1.1  christos  * Requests that the CTI library stop delivering events on the specified connection.   The connection will have
   1372  1.1  christos  * been returned by a CTI library call that subscribes to events.
   1373  1.1  christos  */
   1374  1.1  christos DNS_SERVICES_EXPORT cti_status_t
   1375  1.1  christos cti_events_discontinue(cti_connection_t NONNULL ref);
   1376  1.1  christos 
   1377  1.1  christos typedef union cti_callback {
   1378  1.1  christos     cti_reply_t NULLABLE reply;
   1379  1.1  christos     cti_string_property_reply_t NONNULL string_property_reply;
   1380  1.1  christos     cti_service_reply_t NONNULL service_reply;
   1381  1.1  christos     cti_prefix_reply_t NONNULL prefix_reply;
   1382  1.1  christos     cti_state_reply_t NONNULL state_reply;
   1383  1.1  christos     cti_uint64_property_reply_t NONNULL uint64_property_reply;
   1384  1.1  christos     cti_network_node_type_reply_t NONNULL network_node_type_reply;
   1385  1.1  christos     cti_offmesh_route_reply_t NONNULL offmesh_route_reply;
   1386  1.1  christos     cti_onmesh_prefix_reply_t NONNULL onmesh_prefix_reply;
   1387  1.1  christos     cti_rloc16_reply_t NONNULL rloc16_reply;
   1388  1.1  christos     cti_wed_reply_t NONNULL wed_reply;
   1389  1.1  christos } cti_callback_t;
   1390  1.1  christos 
   1391  1.1  christos #endif /* __CTI_SERVICES_H__ */
   1392  1.1  christos 
   1393  1.1  christos // Local Variables:
   1394  1.1  christos // mode: C
   1395  1.1  christos // tab-width: 4
   1396  1.1  christos // c-file-style: "bsd"
   1397  1.1  christos // c-basic-offset: 4
   1398  1.1  christos // fill-column: 120
   1399  1.1  christos // indent-tabs-mode: nil
   1400  1.1  christos // End:
   1401