static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) { _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL; DnsTransaction *t = NULL; Manager *m = userdata; DnsScope *scope; int r; r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p); if (r <= 0) return r; scope = manager_find_scope(m, p); if (!scope) { log_warning("Got LLMNR UDP packet on unknown scope. Ignoring."); return 0; } if (dns_packet_validate_reply(p) > 0) { log_debug("Got LLMNR reply packet for id %u", DNS_PACKET_ID(p)); dns_scope_check_conflicts(scope, p); t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p))); if (t) dns_transaction_process_reply(t, p); } else if (dns_packet_validate_query(p) > 0) { log_debug("Got LLMNR query packet for id %u", DNS_PACKET_ID(p)); dns_scope_process_query(scope, NULL, p); } else log_debug("Invalid LLMNR UDP packet."); return 0; }
static int on_stream_complete(DnsStream *s, int error) { _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL; DnsTransaction *t; assert(s); assert(s->transaction); /* Copy the data we care about out of the stream before we * destroy it. */ t = s->transaction; p = dns_packet_ref(s->read_packet); t->stream = dns_stream_free(t->stream); if (error != 0) { dns_transaction_complete(t, DNS_TRANSACTION_RESOURCES); return 0; } if (dns_packet_validate_reply(p) <= 0) { log_debug("Invalid LLMNR TCP packet."); dns_transaction_complete(t, DNS_TRANSACTION_INVALID_REPLY); return 0; } dns_scope_check_conflicts(t->scope, p); t->block_gc++; dns_transaction_process_reply(t, p); t->block_gc--; /* If the response wasn't useful, then complete the transition now */ if (t->state == DNS_TRANSACTION_PENDING) dns_transaction_complete(t, DNS_TRANSACTION_INVALID_REPLY); return 0; }