Home | History | Annotate | Download | only in DSO

Lines Matching refs:dso

0 /* dso-transport.c
42 #include "dso.h"
43 #include "dso-transport.h"
63 static dso_connect_state_t *dso_connect_states; // DSO connect states that exist.
64 static dso_transport_t *dso_transport_states; // DSO transport states that exist.
106 LogRedact(MDNS_LOG_CATEGORY_DEFAULT, MDNS_LOG_DEFAULT, "[DSO%u->DSOT%u] dso_transport_t finalizing for " PUB_S " - "
107 "transport: %p.", transport->dso != NULL ? transport->dso->serial : DSO_STATE_INVALID_SERIAL,
138 // We do all of the finalization for the dso state object and any objects it depends on here in the
140 // _after_ the DSO connection has been dropped might still write to the DSO structure or one of the
146 // DSO state, or else must NULL out the pointer to the DSO state.
193 // Notice if a DSO connection state is active but hasn't seen activity in a while.
203 cs->callback(cs->context, NULL, cs->dso, kDSOEventType_ConnectFailed);
219 // If cs->dso->transport is non-null, we're already connected.
220 if (cs->dso && cs->dso->transport == NULL) {
221 cs->callback(cs->context, NULL, cs->dso, kDSOEventType_ShouldReconnect);
237 void dso_reconnect(dso_connect_state_t *cs, dso_state_t *dso)
239 cs->dso = dso;
252 // If a DSO was created by an incoming connection, the creator of the listener can use this function
254 void dso_set_callback(dso_state_t *dso, void *context, dso_event_callback_t cb)
256 dso->cb = cb;
257 dso->context = context;
260 // This is called before writing a DSO message to the output buffer. length is the length of the message.
328 // so we cancel it. Since this can call dso_state_cancel, the caller must not reference the DSO state object
333 const uint32_t serial = transport->dso->serial;
337 dso_state_cancel(transport->dso);
345 dso_state_t *const dso = dso_find_by_serial(serial);
348 LogRedact(MDNS_LOG_CATEGORY_DEFAULT, MDNS_LOG_DEFAULT, "[DSO%u] dso_write_finish: write failed - "
350 if (dso != NULL) {
351 dso_state_cancel(dso);
354 if (dso != NULL && dso->transport != NULL) {
355 dso->transport->unsent_bytes -= bytes_to_write;
356 LogRedact(MDNS_LOG_CATEGORY_DEFAULT, MDNS_LOG_DEFAULT, "[DSO%u] dso_write_finish: completed - "
358 dso->transport->unsent_bytes);
361 "[DSO%u] dso_write_finish: completed but the corresponding dso_state_t has been canceled - "
377 dso_state_cancel(transport->dso);
386 LogMsg("dso_write_finish: fatal: mDNSPlatformWrite on %s returned %d", transport->dso->remote_name, errno);
389 transport->dso->remote_name, (long)result, (long)total);
391 dso_state_cancel(transport->dso);
445 // Write a DSO message
446 int dso_message_write(dso_state_t *dso, dso_message_t *msg, bool disregard_low_water)
448 dso_transport_t *transport = dso->transport;
449 if (transport == NULL || transport->dso == NULL) {
469 bool dso_send_simple_response(dso_state_t *dso, int rcode, const DNSMessageHeader *header, const char *pres)
471 dso_transport_t *transport = dso->transport;
477 LogRedact(MDNS_LOG_CATEGORY_DEFAULT, MDNS_LOG_FAULT, "[DSO%u]: rcode[%d] is out of range", dso->serial, rcode);
497 // DSO Message we received has a primary TLV that's not implemented.
499 bool dso_send_not_implemented(dso_state_t *dso, const DNSMessageHeader *header)
501 return dso_send_simple_response(dso, kDNSFlag1_RC_DSOTypeNI, header, "DSOTYPENI");
504 // Non-DSO message we received is refused.
505 bool dso_send_refused(dso_state_t *dso, const DNSMessageHeader *header)
507 return dso_send_simple_response(dso, kDNSFlag1_RC_Refused, header, "REFUSED");
510 bool dso_send_formerr(dso_state_t *dso, const DNSMessageHeader *header)
512 return dso_send_simple_response(dso, kDNSFlag1_RC_FormErr, header, "FORMERR");
515 bool dso_send_servfail(dso_state_t *dso, const DNSMessageHeader *header)
517 return dso_send_simple_response(dso, kDNSFlag1_RC_ServFail, header, "SERVFAIL");
520 bool dso_send_name_error(dso_state_t *dso, const DNSMessageHeader *header)
522 return dso_send_simple_response(dso, kDNSFlag1_RC_NXDomain, header, "NXDOMAIN");
525 bool dso_send_no_error(dso_state_t *dso, const DNSMessageHeader *header)
527 return dso_send_simple_response(dso, kDNSFlag1_RC_NoErr, header, "NOERROR");
541 if (transport->dso == NULL) {
543 "dso_read_message_length: transport->dso is NULL while reading message");
547 const uint32_t serial = transport->dso->serial;
555 dso_state_t *dso;
558 dso = dso_find_by_serial(serial);
563 if (dso != NULL) {
565 dso_state_cancel(dso);
570 if (dso != NULL && transport->dso == dso && transport->dso->cb != NULL) {
577 dso->transport = NULL;
579 transport->dso->cb(transport->dso->context, &disconnect_context, transport->dso,
582 } else if (dso != NULL) {
586 dso_state_cancel(dso);
589 } else if (dso != NULL) {
608 "[DSO%u] dso_read_message_length: the corresponding dso_state_t has been canceled.",
622 if (transport->dso == NULL) {
624 "dso_read_message: transport->dso is NULL while reading message");
628 const uint32_t serial = transport->dso->serial;
636 dso_state_t *dso;
639 dso = dso_find_by_serial(serial);
643 if (dso != NULL) {
645 dso_state_cancel(dso);
650 if (dso != NULL && transport->dso == dso && transport->dso->cb != NULL) {
656 dso->transport = NULL;
658 transport->dso->cb(transport->dso->context, &disconnect_context, transport->dso,
661 } else if (dso != NULL) {
665 dso_state_cancel(dso);
668 } else if (dso != NULL) {
682 dns_message_received(dso, message.message, message.length, &message);
692 "[DSO%u] dso_read_message: the corresponding dso_state_t has been canceled.",
699 // Called whenever there's data available on a DSO connection
703 dso_state_t *dso;
707 dso = transport->dso;
712 dso_state_cancel(dso);
732 // LogMsg("read(%d, %p:%p, %d) -> %d", fd, dso->inbuf, dso->inbufp, dso->bytes_needed, count);
734 LogMsg("dso_read_callback: read from %s returned %d", dso->remote_name, errno);
735 dso_state_cancel(dso);
742 LogMsg("dso_read_callback: remote %s closed", dso->remote_name);
743 dso_state_cancel(dso);
759 LogMsg("dso_read_callback: %s sent zero-length message.", dso->remote_name);
760 dso_state_cancel(dso);
769 dso->remote_name, bytes_needed);
770 dso_state_cancel(dso);
782 dns_message_received(dso, message.message, message.length, &message);
794 const char *remote_name, dso_event_callback_t cb, dso_state_t *dso)
815 if (dso == NULL) {
816 transport->dso = dso_state_create(is_server, max_outstanding_queries, remote_name, cb, context, context_callback,
818 if (transport->dso == NULL) {
824 transport->dso = dso;
834 transport->dso->transport = transport;
835 transport->dso->transport_finalize = dso_transport_finalize;
841 LogRedact(MDNS_LOG_CATEGORY_DEFAULT, MDNS_LOG_DEFAULT, "[DSO%u->DSOT%u] New dso_transport_t created - "
842 "transport: %p, remote_name: " PRI_S ".", transport->dso->serial, transport->serial, transport, remote_name);
850 size_t outbuf_size_in, const char *remote_name, dso_event_callback_t cb, dso_state_t *dso)
858 // There's no point in a DSO that doesn't have a callback.
885 if (dso == NULL) {
886 transport->dso = dso_state_create(is_server, max_outstanding_queries, remote_name, cb, context, context_callback,
888 if (transport->dso == NULL) {
894 transport->dso = dso;
906 dso_state_cancel(transport->dso);
910 transport->dso->transport = transport;
911 transport->dso->transport_finalize = dso_transport_finalize;
924 dso_state_t *dso, void *context,
997 cs->dso = dso;
1018 LogRedact(MDNS_LOG_CATEGORY_DEFAULT, MDNS_LOG_DEFAULT, "[DSO%u->DSOC%u] New dso_connect_state_t created - "
1019 "dso_connect: %p, hostname: " PUB_S ", context: %p.", dso->serial, cs->serial, cs, hostname, context);
1090 cs->max_outstanding_queries, cs->outbuf_size, cs->hostname, cs->callback, cs->dso);
1098 transport->dso->cb(cs->context, NULL, transport->dso, kDSOEventType_Connected);
1157 cs->callback(cs->context, &context, cs->dso, kDSOEventType_Disconnected);
1166 // The expectation is that if we are connecting to a DSO server, we really should succeed. If we
1172 cs->callback(cs->context, NULL, cs->dso, kDSOEventType_ConnectFailed);
1289 // If there is a dso state on the connect state and it is referencing this transport,
1291 if (ncs->dso != NULL && ncs->dso->transport == ncs->transport) {
1292 ncs->dso->transport = NULL;
1295 if (ncs->transport->dso != NULL && ncs->transport->dso->transport == ncs->transport) {
1296 ncs->transport->dso->transport = NULL;
1315 if (ncs->dso != NULL) {
1316 ncs->dso->has_session = false;
1370 cs->max_outstanding_queries, cs->inbuf_size, cs->outbuf_size, cs->hostname, cs->callback, cs->dso);
1379 transport->dso->cb(cs->context, NULL, transport->dso, kDSOEventType_Connected);
1657 LogMsg("No memory for new DSO connection from %s", remote_name);
1663 if (transport->dso->cb) {
1664 transport->dso->cb(lc->context, 0, transport->dso, kDSOEventType_Connected);
1666 LogMsg("DSO connection from %s", remote_name);