3 * Copyright (c) 2019 Apple Computer, Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * This file contains structure definitions used by the SRP Advertising Proxy.
20 typedef struct adv_instance adv_instance_t
;
21 typedef struct adv_address_registration adv_address_t
;
22 typedef struct adv_host adv_host_t
;
23 typedef struct adv_update adv_update_t
;
24 typedef struct client_update client_update_t
;
25 typedef struct adv_instance_vec adv_instance_vec_t
;
26 typedef struct adv_host_vec adv_host_vec_t
;
27 typedef struct adv_address_vec adv_address_vec_t
;
32 dnssd_txn_t
*NULLABLE txn
; // Outstanding mDNSServiceRegister transaction, if any.
33 adv_host_t
*NONNULL host
; // Host to which this service instance belongs
34 adv_update_t
*NULLABLE update
; // Ongoing update that currently owns this instance, if any.
35 char *NONNULL instance_name
; // Single label instance name (future: service instance FQDN)
36 char *NONNULL service_type
; // Two label service type (e.g., _ipps._tcp)
37 int port
; // Port on which service can be found.
38 char *NULLABLE txt_data
; // Contents of txt record
39 uint16_t txt_length
; // length of txt record contents
42 // An address registration
43 struct adv_address_registration
{
45 // dnssd_txn_t *txn; // The registration
46 adv_host_t
*NONNULL host
; // The host this record belongs to
47 uint16_t rrtype
; // A or AAAA
48 uint16_t rdlen
; // 4 or 16
49 uint8_t rdata
[16]; // Room for either IPv4 or IPv6 address
54 wakeup_t
*NONNULL retry_wakeup
; // Wakeup for retry when we run into a temporary failure
55 wakeup_t
*NONNULL lease_wakeup
; // Wakeup at least expiry time
56 dnssd_txn_t
*NULLABLE txn
; // dnssd transaction for host RR
57 adv_host_t
*NULLABLE next
; // Hosts are maintained in a linked list.
58 adv_update_t
*NULLABLE updates
; // Updates to this host, if any
59 client_update_t
*NULLABLE clients
; // Updates that clients have sent for which replies have not yet been sent.
60 char *NONNULL name
; // Name of host (without domain)
61 char *NONNULL registered_name
; // The name that is registered, which may be different due to mDNS conflict
62 int name_serial
; // The number we are using to disambiguate the name.
63 int num_addresses
; // Number of addresses registered (we only actually support one)
64 adv_address_t
*NULLABLE
*NULLABLE addresses
; // One or more addresses
65 adv_instance_vec_t
*NONNULL instances
; // Zero or more service instances.
66 DNSRecordRef NULLABLE rref
; // Record reference for key or address.
67 dns_rr_t key
; // The key data represented as an RR; key->name is NULL.
68 uint32_t key_id
; // A possibly-unique id that is computed across the key for brevity in
70 int retry_interval
; // Interval to wait before attempting to re-register after the daemon has
72 uint16_t key_rdlen
; // Length of key
73 uint8_t *NONNULL key_rdata
; // Raw KEY rdata, suitable for DNSServiceRegisterRecord().
74 uint32_t lease_interval
; // Interval for address lease
75 uint32_t key_lease
; // Interval for key lease
76 int64_t lease_expiry
; // Time when lease expires, relative to ioloop_timenow().
77 bool have_registration
; // True if we've registered a key or address record for the host.
79 // True if we have a pending late conflict resolution. If we get a conflict after the update for the
80 // host registration has expired, and there happens to be another update in progress, then we want
81 // to defer the host registration.
82 bool hostname_update_pending
;
86 adv_host_t
*NONNULL host
; // Host being updated
88 // Ordinarily NULL, but may be non-NULL if we lost the server during an update and had
89 // to construct an update to re-add the host.
90 adv_update_t
*NULLABLE next
;
92 // Connection state, if applicable, of the client request that produced this update.
93 client_update_t
*NULLABLE client
;
94 int num_outstanding_updates
; // Total count updates that have been issued but not yet confirmed.
96 // Addresses to apply to the host. At present only one address is ever advertised, but we remember all the
97 // addresses that were registered.
98 int num_remove_addresses
;
99 adv_address_t
*NULLABLE
*NULLABLE remove_addresses
;
100 int num_add_addresses
;
101 adv_address_t
*NULLABLE
*NONNULL add_addresses
;
103 // If non-null, this update is changing the advertised address of the host to the referenced address.
104 adv_address_t
*NULLABLE selected_addr
;
106 // The set of instances from the update that already exist but have changed.
107 // This array mirrors the array of instances configured on the host; entries to be updated
108 // are non-NULL, entries that don't need updated are NULL.
109 adv_instance_vec_t
*NONNULL update_instances
;
111 // The set of instances that exist and need to be removed.
112 adv_instance_vec_t
*NONNULL remove_instances
;
114 // The set of instances that need to be added.
115 adv_instance_vec_t
*NONNULL add_instances
;
117 // Outstanding instance updates
118 int num_instances_started
;
119 int num_instances_completed
;
121 // Lease intervals for host entry and key entry.
122 uint32_t host_lease
, key_lease
;
124 // If nonzero, this is an explicit expiry time for the lease, because the update is restoring
125 // a host after a server restart, or else renaming a host after a late name conflict. In this
126 // case, we do not want to extend the lease--just get the host registration right.
127 uint64_t lease_expiry
;
129 // True if we are registering the key to hold the hostname.
130 bool registering_key
;
133 struct adv_instance_vec
{
136 adv_instance_t
* NULLABLE
*NONNULL vec
;
139 struct adv_host_vec
{
142 adv_host_t
* NULLABLE
*NONNULL vec
;
145 struct adv_address_vec
{
148 adv_address_t
* NULLABLE
*NONNULL vec
;
151 struct client_update
{
152 client_update_t
*NULLABLE next
;
153 comm_t
*NONNULL connection
; // Connection on which in-process update was received.
154 dns_message_t
*NONNULL parsed_message
; // Message that triggered the update.
155 message_t
*NONNULL message
; // Message that triggered the update.
157 dns_host_description_t
*NONNULL host
; // Host data parsed from message
158 service_instance_t
*NULLABLE instances
; // Service instances parsed from message
159 service_t
*NONNULL services
; // Services parsed from message
160 dns_name_t
*NONNULL update_zone
; // Zone being updated
161 uint32_t host_lease
, key_lease
; // Lease intervals for host entry and key entry.
167 // c-file-style: "bsd"
170 // indent-tabs-mode: nil