srp-api.h revision 1.1.1.1 1 1.1 christos /* srp-api.h
2 1.1 christos *
3 1.1 christos * Copyright (c) 2019 Apple Computer, 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 * Structure definitions for the Service Registration Protocol gateway.
18 1.1 christos */
19 1.1 christos
20 1.1 christos #include "srp.h"
21 1.1 christos #if defined(THREAD_DEVKIT_ADK) || defined(LINUX)
22 1.1 christos #include "../mDNSShared/dns_sd.h"
23 1.1 christos #endif
24 1.1 christos
25 1.1 christos #ifdef __cplusplus
26 1.1 christos extern "C" {
27 1.1 christos #endif
28 1.1 christos
29 1.1 christos typedef void (*srp_hostname_conflict_callback_t)(const char *NONNULL hostname);
30 1.1 christos typedef void (*srp_wakeup_callback_t)(void *NONNULL state);
31 1.1 christos typedef void (*srp_datagram_callback_t)(void *NONNULL state, void *NONNULL message, size_t message_length);
32 1.1 christos typedef struct client_state client_state_t;
33 1.1 christos typedef struct dns_wire dns_wire_t;
34 1.1 christos
35 1.1 christos // The below functions provide a way for the host to inform the SRP service of the state of the network.
36 1.1 christos
37 1.1 christos // For testing
38 1.1 christos client_state_t *NULLABLE srp_client_get_current(void);
39 1.1 christos void srp_client_set_current(client_state_t *NONNULL new_client);
40 1.1 christos dns_wire_t *NULLABLE srp_client_generate_update(client_state_t *NONNULL client,
41 1.1 christos uint32_t update_lease_time, uint32_t update_key_lease_time,
42 1.1 christos size_t *NONNULL p_length, dns_wire_t *NULLABLE in_wire,
43 1.1 christos uint32_t serial, bool removing);
44 1.1 christos int srp_host_key_reset_for_client(client_state_t *NONNULL client);
45 1.1 christos
46 1.1 christos // Call this before calling anything else. Context will be passed back whenever the srp code
47 1.1 christos // calls any of the host functions.
48 1.1 christos int srp_host_init(void *NULLABLE host_context);
49 1.1 christos
50 1.1 christos // Call this to reset the host key (e.g. on factory reset)
51 1.1 christos int srp_host_key_reset(void);
52 1.1 christos
53 1.1 christos // This function can be called by accessories that have different requirements for lease intervals.
54 1.1 christos // Normally new_lease_time would be 3600 (1 hour) and new_key_lease_type would be 604800 (7 days).
55 1.1 christos int srp_set_lease_times(uint32_t new_lease_time, uint32_t new_key_lease_time);
56 1.1 christos
57 1.1 christos // Called when a new address is configured that should be advertised. This can be called during a refresh,
58 1.1 christos // in which case it doesn't mark the network state as changed if the address was already present.
59 1.1 christos int srp_add_interface_address(uint16_t rrtype, const uint8_t *NONNULL rdata, uint16_t rdlen);
60 1.1 christos
61 1.1 christos // Called whenever the SRP server address changes or the SRP server becomes newly reachable. This can be
62 1.1 christos // called during a refresh, in which case it doesn't mark the network state as changed if the address was
63 1.1 christos // already present.
64 1.1 christos int srp_add_server_address(const uint8_t *NONNULL port, uint16_t rrtype, const uint8_t *NONNULL rdata, uint16_t rdlen);
65 1.1 christos
66 1.1 christos // Called when the node knows its hostname (usually once). The callback is called if we try to do an SRP
67 1.1 christos // update and find out that the hostname is in use; in this case, the callback is expected to generate a new
68 1.1 christos // hostname and re-register it. It is permitted to call srp_set_hostname() from the callback.
69 1.1 christos // If the hostname is changed by the callback, then it is used immediately on return from the callback;
70 1.1 christos // if the hostname is changed in any other situation, nothing is done with the new name until
71 1.1 christos // srp_network_state_stable() is called.
72 1.1 christos int srp_set_hostname(const char *NONNULL hostname, srp_hostname_conflict_callback_t NULLABLE callback);
73 1.1 christos
74 1.1 christos // Called when a network state change is complete (that is, all new addresses have been saved and
75 1.1 christos // any update to the SRP server address has been provided). This is only needed when not using the
76 1.1 christos // refresh mechanism.
77 1.1 christos int srp_network_state_stable(bool *NULLABLE did_something);
78 1.1 christos
79 1.1 christos // Delete a previously-configured SRP server address. This should not be done during a refresh.
80 1.1 christos int srp_delete_interface_address(uint16_t rrtype, const uint8_t *NONNULL rdata, uint16_t rdlen);
81 1.1 christos
82 1.1 christos // Delete a previously-configured SRP server address. This should not be done during a refresh.
83 1.1 christos int srp_delete_server_address(uint16_t rrtype, const uint8_t *NONNULL port, const uint8_t *NONNULL rdata,
84 1.1 christos uint16_t rdlen);
85 1.1 christos
86 1.1 christos // Call this to start an address refresh. This makes sense to do in cases where the caller
87 1.1 christos // is not tracking changes, but rather is just doing a full refresh whenever the network state
88 1.1 christos // is seen to have changed. When the refresh is done, if any addresses were added or removed,
89 1.1 christos // network_state_changed will be true, and so a call to dnssd_network_state_change_finished()
90 1.1 christos // will trigger an update; if nothing changed, no update will be sent.
91 1.1 christos int srp_start_address_refresh(void);
92 1.1 christos
93 1.1 christos // Call this when the address refresh is done. This invokes srp_network_state_stable().
94 1.1 christos int srp_finish_address_refresh(bool *NULLABLE did_something);
95 1.1 christos
96 1.1 christos // Call this to deregister everything that's currently registered. A return value other than kDNSServiceErr_NoError
97 1.1 christos // means that there's nothing to deregister.
98 1.1 christos int srp_deregister(void *NULLABLE os_context);
99 1.1 christos
100 1.1 christos // Call this to deregister a specific service instance, identified by the DNSServiceRef. A return value
101 1.1 christos // other than kDNSServiceErr_NoError means that the specified service instance wasn't found.
102 1.1 christos int srp_deregister_instance(DNSServiceRef NULLABLE sdRef);
103 1.1 christos
104 1.1 christos // Call this to update the service type on an existing registration. This only makes sense for a subtype: if
105 1.1 christos // this changes the base type, it will look like a new service instance to the SRP server.
106 1.1 christos DNSServiceErrorType srp_update_service_type(DNSServiceRef NONNULL sdRef, const char *NONNULL regtype, DNSServiceRegisterReply NULLABLE callback, void *NULLABLE context);
107 1.1 christos
108 1.1 christos // The below functions must be provided by the host.
109 1.1 christos
110 1.1 christos // This function fetches a key with the specified name for use in signing SRP updates.
111 1.1 christos // At present, only ECDSA is supported. If a key with the specified name doesn't exist,
112 1.1 christos // the host is expected to generate and store it.
113 1.1 christos srp_key_t *NULLABLE srp_get_key(const char *NONNULL key_name, void *NULLABLE host_context);
114 1.1 christos
115 1.1 christos // This function clears the key with the specified name.
116 1.1 christos int srp_reset_key(const char *NONNULL key_name, void *NULLABLE host_context);
117 1.1 christos
118 1.1 christos // This function fetches the IP address type (rrtype), address (rrdata x rdlength) and port (port[0],
119 1.1 christos // port[1]) of the most recent server with which the SRP client has successfully registered from stable
120 1.1 christos // storage. If the fetch is successful and there was a server recorded in stable storage, it returns true;
121 1.1 christos // otherwise it returns false. A false status can mean that there's no way to fetch this information, that
122 1.1 christos // no registration has happened in the past, or that there was some other error accessing stable storage.
123 1.1 christos bool srp_get_last_server(uint16_t *NONNULL rrtype, uint8_t *NONNULL rrdata, uint16_t rdlength,
124 1.1 christos uint8_t *NONNULL port, void *NULLABLE host_context);
125 1.1 christos
126 1.1 christos // This function stores the IP address type (rrtype), address (rrdata x rdlength) and port (port[0],
127 1.1 christos // port[1]) of the most recent server with which the SRP client has successfully registered to stable
128 1.1 christos // storage. If the store is successful, it returns true; otherwise it returns false. A false status can
129 1.1 christos // mean that there's no way to store this information, or that there was an error writing this information
130 1.1 christos // to stable storage.
131 1.1 christos bool srp_save_last_server(uint16_t rrtype, uint8_t *NONNULL rrdata, uint16_t rdlength,
132 1.1 christos uint8_t *NONNULL port, void *NULLABLE host_context);
133 1.1 christos
134 1.1 christos // This is called to create a context for sending and receiving UDP messages to and from a specified
135 1.1 christos // remote host address and port. The context passed is to be used whenever the srp host implementation
136 1.1 christos // does a callback, e.g. when a datagram arrives or when a wakeup occurs (see srp_set_wakeup()).
137 1.1 christos // The context is not actually connected to a specific address and port until srp_connect_udp() is
138 1.1 christos // invoked on it.
139 1.1 christos int srp_make_udp_context(void *NULLABLE host_context, void *NULLABLE *NONNULL p_context,
140 1.1 christos srp_datagram_callback_t NONNULL callback, void *NONNULL context);
141 1.1 christos
142 1.1 christos // Connect a udp context to a particular destination. The context has to have already been created by
143 1.1 christos // srp_make_udp_context(). When packets are received, they will be passed to the callback set
144 1.1 christos // in srp_make_udp_context(). This must not be called on a context that is already bound to
145 1.1 christos // some other destination--call srp_disconnect_udp() first if reusing.
146 1.1 christos int
147 1.1 christos srp_connect_udp(void *NONNULL context, const uint8_t *NONNULL port, uint16_t address_type,
148 1.1 christos const uint8_t *NONNULL address, uint16_t addrlen);
149 1.1 christos
150 1.1 christos // Disconnect a udp context. This is used to dissociate from the udp context state that was created
151 1.1 christos // by a previous call to srp_connect_udp
152 1.1 christos int
153 1.1 christos srp_disconnect_udp(void *NONNULL context);
154 1.1 christos
155 1.1 christos // This gets rid of the UDP context, frees any associated memory, cancels any outstanding wakeups.
156 1.1 christos // The freeing may occur later than the deactivating, depending on how the underlying event loop
157 1.1 christos // works.
158 1.1 christos int srp_deactivate_udp_context(void *NONNULL host_context, void *NONNULL context);
159 1.1 christos
160 1.1 christos // This is called to send a datagram to a UDP connection. The UDP connection is identified by the
161 1.1 christos // anonymous pointer that was returned by srp_make_udp_context().
162 1.1 christos int srp_send_datagram(void *NULLABLE host_context,
163 1.1 christos void *NONNULL context, void *NONNULL message, size_t message_length);
164 1.1 christos
165 1.1 christos // This is called with the context returned by srp_make_udp_context. The caller is expected to schedule
166 1.1 christos // a wakeup event <milliseconds> in the future, when when that event occurs, it's expected to call the
167 1.1 christos // callback with the context that was passed to srp_make_udp_context.
168 1.1 christos int srp_set_wakeup(void *NULLABLE host_context,
169 1.1 christos void *NONNULL context, int milliseconds, srp_wakeup_callback_t NONNULL callback);
170 1.1 christos
171 1.1 christos // This is called to cancel a wakeup, and should not fail even if there is no wakeup pending.
172 1.1 christos int srp_cancel_wakeup(void *NULLABLE host_context, void *NONNULL context);
173 1.1 christos
174 1.1 christos // Returns the current wall clock time in seconds since 1970
175 1.1 christos uint32_t srp_timenow(void);
176 1.1 christos
177 1.1 christos #ifdef __cplusplus
178 1.1 christos } // extern "C"
179 1.1 christos #endif
180 1.1 christos
181 1.1 christos // Local Variables:
182 1.1 christos // mode: C
183 1.1 christos // tab-width: 4
184 1.1 christos // c-file-style: "bsd"
185 1.1 christos // c-basic-offset: 4
186 1.1 christos // fill-column: 108
187 1.1 christos // indent-tabs-mode: nil
188 1.1 christos // End:
189