Home | History | Annotate | Download | only in ServiceRegistration

Lines Matching refs:client

1 /* dnssd-client.c
94 #include "dnssd-client.h"
127 dnssd_client_finalize(dnssd_client_t *client)
129 thread_service_release(client->published_service);
130 ioloop_wakeup_release(client->wakeup_timer);
131 free(client->state_header.name);
132 free(client->id);
133 free(client);
141 dnssd_client_t *client = context;
142 RELEASE_HERE(client, dnssd_client);
148 dnssd_client_t *client = context;
154 state_machine_event_deliver(&client->state_header, event);
161 dnssd_client_t *client = context;
168 state_machine_event_deliver(&client->state_header, event);
175 dnssd_client_t *client = context;
181 state_machine_event_deliver(&client->state_header, event);
188 dnssd_client_t *client = context;
214 if (!inet_pton(AF_INET6, prefix_addr_string, &client->mesh_local_prefix)) {
218 client->have_mesh_local_prefix = true;
224 state_machine_event_deliver(&client->state_header, event);
227 RELEASE_HERE(client, dnssd_client); // was retained for callback, can only get one callback
232 dnssd_client_remove_published_service(dnssd_client_t *client)
234 if (client->dns_service_registration != NULL) {
235 mrc_dns_service_registration_forget(&client->dns_service_registration);
241 dnssd_client_service_unpublish(dnssd_client_t *client)
243 if (client->dns_service_registration != NULL) {
244 thread_service_note(client->id, client->published_service, "unpublishing service");
246 dnssd_client_remove_published_service(client);
253 dnssd_client_t *client)
286 state_machine_event_deliver(&client->state_header, event);
290 RELEASE_HERE(client, dnssd_client);
296 dnssd_client_service_publish(dnssd_client_t *client)
298 dnssd_client_service_unpublish(client);
313 if (client->published_service->service_type == unicast_service) {
314 aaaa_data = &client->published_service->u.unicast.address.s6_addr[0];
315 } else if (client->published_service->service_type == anycast_service) {
316 aaaa_data = &client->published_service->u.anycast.address.s6_addr[0];
318 port = client->dns_service_registration_port;
328 if (client->dns_service_registration_type == dnssd_client_dns_service_type_push) {
337 client->dns_service_registration = mrc_dns_service_registration_create_push(push_definition);
338 if (client->dns_service_registration) {
339 mrc_dns_service_registration_set_reports_connection_errors(client->dns_service_registration,
342 } else if (client->dns_service_registration_type == dnssd_client_dns_service_type_do53) {
352 client->dns_service_registration = mrc_dns_service_registration_create(do53_definition);
354 ERROR("Unknown DNS service registration type: %d", client->dns_service_registration_type);
357 require_action(client->dns_service_registration != NULL, out, ERROR("failed to create DNS service registration"));
358 mrc_dns_service_registration_set_queue(client->dns_service_registration, dispatch_get_main_queue());
360 RETAIN_HERE(client, dnssd_client); // For the handler
361 mrc_dns_service_registration_set_event_handler(client->dns_service_registration,
364 dnssd_client_dns_service_event_handler(event, event_err, client);
366 INFO("Publishing dnssd client service -- domain: " PRI_DNS_NAME_SRP ", address: " PRI_SEGMENTED_IPv6_ADDR_SRP,
368 mrc_dns_service_registration_activate(client->dns_service_registration);
389 // -- not_client: Not a client because server or because no service (in which case hopefully we are becoming server)
390 // -- client: Found a working service, configured as client
398 { SERVICE_PUB_NAME_DECL(client), dnssd_client_action_client },
407 dnssd_client_t *client = state_header->state_object
410 dnssd_client_should_be_client(dnssd_client_t *client)
415 srp_server_t *server_state = client->server_state;
428 should_be_client ? "could be client" : "can't be client",
439 BR_STATE_ANNOUNCE(client, event);
441 if (client->have_mesh_local_prefix) {
453 BR_STATE_ANNOUNCE(client, event);
456 if (client->published_service != NULL) {
457 dnssd_client_service_unpublish(client);
463 if (dnssd_client_should_be_client(client)) {
469 // We get into this state when we've determined we should be a client
474 BR_STATE_ANNOUNCE(client, event);
477 srp_server_t *server_state = client->server_state;
486 ioloop_add_wake_event(client->wakeup_timer, client, dnssd_client_wait_expired,
488 RETAIN_HERE(client, dnssd_client); // for the wake event
501 // If we no longer need to be a client, stop trying.
503 if (!dnssd_client_should_be_client(client)) {
504 ioloop_cancel_wake_event(client->wakeup_timer);
510 service = service_tracker_verified_service_get(client->server_state->service_tracker);
512 if (client->published_service != NULL) {
513 thread_service_release(client->published_service);
515 client->published_service = service;
516 thread_service_retain(client->published_service);
524 ioloop_cancel_wake_event(client->wakeup_timer);
531 service = service_tracker_unverified_service_get(client->server_state->service_tracker, unicast_service);
534 service_tracker_thread_service_note(client->server_state->service_tracker, service,
539 memcpy(&service->u.anycast.address, &client->mesh_local_prefix, 8);
544 RETAIN_HERE(client, dnssd_client); // For the probe
545 probe_srp_service(service, client, dnssd_client_probe_callback, dnssd_client_context_release);
560 BR_STATE_ANNOUNCE(client, event);
564 dnssd_client_service_publish(client);
569 if (client->published_service == NULL) {
572 client->published_service->ignore = true; // Don't consider this service when deciding what to advertise
573 client->published_service->responding = false;
574 thread_service_release(client->published_service);
575 client->published_service = NULL;
581 if (client->published_service == NULL) {
585 // If we should no longer be client, unpublish the service and wait
586 if (!dnssd_client_should_be_client(client)) {
590 if (service_tracker_verified_service_still_exists(client->server_state->service_tracker,
591 client->published_service)) {
600 dnssd_client_cancel(dnssd_client_t *client)
602 if (client->server_state->service_tracker != NULL) {
603 service_tracker_cancel_probes(client->server_state->service_tracker);
604 service_tracker_callback_cancel(client->server_state->service_tracker, client);
606 if (client->server_state->thread_tracker != NULL) {
607 thread_tracker_callback_cancel(client->server_state->thread_tracker, client);
609 ioloop_cancel_wake_event(client->wakeup_timer);
610 if (client->active_data_set_connection != NULL) {
611 cti_events_discontinue(client->active_data_set_connection);
612 RELEASE_HERE(client, dnssd_client); // callback held reference
613 client->active_data_set_connection = NULL;
615 dnssd_client_remove_published_service(client);
616 state_machine_cancel(&client->state_header);
622 dnssd_client_t *ret = NULL, *client = calloc(1, sizeof(*client));
623 if (client == NULL) {
624 return client;
626 RETAIN_HERE(client, dnssd_client);
627 client->wakeup_timer = ioloop_wakeup_create();
628 if (client->wakeup_timer == NULL) {
635 client->id = strdup(client_id_buf);
636 if (client->id == NULL) {
637 ERROR("no memory for client ID");
640 client->interface_index = -1;
641 client->dns_service_registration_type = dnssd_client_dns_service_type_push;
642 client->dns_service_registration_port = DNS_OVER_TLS_DEFAULT_PORT;
644 if (!state_machine_header_setup(&client->state_header,
645 client, client->id,
653 client->server_state = server_state;
655 dnssd_client_context_release, client))
659 RETAIN_HERE(client, dnssd_client); // for service tracker
661 ret = client;
662 client = NULL;
664 if (client != NULL) {
665 RELEASE_HERE(client, dnssd_client);
673 dnssd_client_t *client = context;
678 client->interface_index = if_nametoindex(name);
680 RELEASE_HERE(client, dnssd_client); // was retained for callback, can only get one callback
686 dnssd_client_t *client = context;
690 RELEASE_HERE(client, dnssd_client); // no more callbacks
691 cti_events_discontinue(client->active_data_set_connection);
692 client->active_data_set_connection = NULL;
696 status = cti_get_mesh_local_prefix(client->server_state, client, dnssd_client_get_mesh_local_prefix_callback, NULL);
700 RETAIN_HERE(client, dnssd_client); // for mesh-local callback
702 status = cti_get_tunnel_name(client->server_state, client, dnssd_client_get_tunnel_name_callback, NULL);
706 RETAIN_HERE(client, dnssd_client); // for tunnel name callback
711 dnssd_client_start(dnssd_client_t *client)
713 cti_track_active_data_set(client->server_state, &client->active_data_set_connection,
714 client, dnssd_client_active_data_set_changed_callback, NULL);
715 RETAIN_HERE(client, dnssd_client); // for callback
716 dnssd_client_active_data_set_changed_callback(client, kCTIStatus_NoError); // Get the initial state.
717 state_machine_next_state(&client->state_header, dnssd_client_state_startup);