blob: e9e86f38f8ed1dab6672691b641daf90bea6e09d [file] [log] [blame]
/* srp-gw.c
*
* Copyright (c) 2019-2022 Apple Computer, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Structure definitions for the Service Registration Protocol gateway.
*/
#ifndef SRP_GW_H
#define SRP_GW_H
typedef struct subnet subnet_t;
struct subnet {
subnet_t *NULLABLE next;
uint8_t preflen;
uint8_t family;
char bytes[8];
};
typedef struct udp_validator udp_validator_t;
struct udp_validator {
udp_validator_t *NULLABLE next;
char *NONNULL ifname;
int ifindex;
subnet_t *NONNULL subnets;
};
typedef struct delete delete_t;
struct delete {
delete_t *NULLABLE next;
dns_name_t *NONNULL name;
dns_name_t *NONNULL zone;
bool consumed;
};
typedef struct host_addr host_addr_t;
struct host_addr {
host_addr_t *NULLABLE next;
dns_rr_t rr;
};
typedef struct dns_host_description dns_host_description_t;
struct dns_host_description {
dns_name_t *NONNULL name;
host_addr_t *NULLABLE addrs;
dns_rr_t *NULLABLE key;
delete_t *NULLABLE delete;
int num_instances;
};
typedef struct service service_t;
struct service {
service_t *NULLABLE next;
service_t *NULLABLE base_type; // A pointer back in the list, or to self
dns_rr_t *NONNULL rr; // The service name is rr->name.
dns_name_t *NONNULL zone;
};
typedef struct service_instance service_instance_t;
struct service_instance {
service_instance_t *NULLABLE next;
dns_host_description_t *NULLABLE host;
dns_name_t *NONNULL name;
delete_t *NULLABLE delete;
service_t *NONNULL service;
int num_instances;
dns_rr_t *NULLABLE srv, *NULLABLE txt;
};
// The update_t structure is used to maintain the ongoing state of a particular DNS Update.
typedef enum update_state update_state_t;
enum update_state {
connect_to_server, // Establish a connection with the auth server.
create_nonexistent, // Update service instance assuming it's not already there (case 1).
refresh_existing, // Update service instance assuming it's already there and the same (case 2).
create_nonexistent_instance, // Update service instance assuming it's not there
refresh_existing_instance, // Update host assuming it's there and the same
create_nonexistent_host, // Update a host that's not present (and also the services)
refresh_existing_host, // Update a host that's present (and also the services)
delete_failed_instance, // The update failed, so delete service instances that were successfully added.
};
typedef enum update_event update_event_t;
enum update_event {
update_event_connected,
update_event_disconnected,
update_event_response_received
};
typedef struct update update_t;
struct update {
comm_t *NONNULL server; // Connection to authoritative server
comm_t *NONNULL client; // Connection to SRP client (which might just be a UDP socket).
update_state_t state;
dns_host_description_t *NONNULL host;
service_instance_t *NONNULL instances;
service_instance_t *NULLABLE instance; // If we are updating instances one at a time.
service_instance_t *NULLABLE added_instances; // Instances we have successfully added.
service_t *NONNULL services;
dns_name_t *NULLABLE zone_name; // If NULL, we are processing an update for services.arpa.
message_t *NONNULL message;
dns_message_t *NONNULL parsed_message;
dns_wire_t *NONNULL update; // The current update...
size_t update_length;
size_t update_max;
uint8_t fail_rcode; // rcode to return after deleting added service instances.
};
#endif //SRP_GW_H
// Local Variables:
// mode: C
// tab-width: 4
// c-file-style: "bsd"
// c-basic-offset: 4
// fill-column: 108
// indent-tabs-mode: nil
// End: