return 0;
}
-int dns_add_new_service(DnsServiceBrowser *sb, DnsResourceRecord *rr, int owner_family, usec_t until) {
+int dns_add_new_service(DnsServiceBrowser *sb, DnsResourceRecord *rr, int owner_family, int ifindex, usec_t until) {
_cleanup_(dnssd_discovered_service_unrefp) DnssdDiscoveredService *s = NULL;
int r;
.service_browser = sb,
.rr = dns_resource_record_copy(rr),
.family = owner_family,
+ .ifindex = ifindex,
.until = until,
.query = NULL,
.rr_ttl_state = DNS_RECORD_TTL_STATE_80_PERCENT,
DNS_ANSWER_FOREACH_ITEM(item, answer) {
_cleanup_free_ char *name = NULL, *type = NULL, *domain = NULL;
_cleanup_(sd_json_variant_unrefp) sd_json_variant *entry = NULL;
+ int ifindex;
if (dns_service_match_and_update(sb->dns_services, item->rr, owner_family, item->until))
continue;
if (!type)
continue;
- r = dns_add_new_service(sb, item->rr, owner_family, item->until);
+ /* Prefer the per-item ifindex, fall back to the service browser's ifindex */
+ ifindex = item->ifindex > 0 ? item->ifindex : sb->ifindex;
+
+ r = dns_add_new_service(sb, item->rr, owner_family, ifindex, item->until);
if (r < 0) {
log_error_errno(r, "Failed to add new DNS service: %m");
goto finish;
strna(type),
strna(domain),
strna(af_to_ipv4_ipv6(owner_family)),
- sb->ifindex);
+ ifindex);
r = sd_json_buildo(
&entry,
!isempty(type), "type", SD_JSON_BUILD_STRING(type)),
SD_JSON_BUILD_PAIR_CONDITION(
!isempty(domain), "domain", SD_JSON_BUILD_STRING(domain)),
- SD_JSON_BUILD_PAIR_INTEGER("ifindex", sb->ifindex));
+ SD_JSON_BUILD_PAIR_INTEGER("ifindex", ifindex));
if (r < 0) {
log_error_errno(r, "Failed to build JSON for new service: %m");
goto finish;
LIST_FOREACH(dns_services, service, sb->dns_services) {
_cleanup_free_ char *name = NULL, *type = NULL, *domain = NULL;
_cleanup_(sd_json_variant_unrefp) sd_json_variant *entry = NULL;
+ int ifindex;
if (service->family != owner_family)
continue;
}
}
+ /* Capture ifindex before removing the service */
+ ifindex = service->ifindex;
+
dns_remove_service(sb, service);
log_debug("Remove from the list %s, %s, %s, %s, %d",
strna(type),
strna(domain),
strna(af_to_ipv4_ipv6(owner_family)),
- sb->ifindex);
+ ifindex);
r = sd_json_buildo(
&entry,
SD_JSON_BUILD_PAIR_STRING("name", name ?: ""),
SD_JSON_BUILD_PAIR_STRING("type", type ?: ""),
SD_JSON_BUILD_PAIR_STRING("domain", domain ?: ""),
- SD_JSON_BUILD_PAIR_INTEGER("ifindex", sb->ifindex));
+ SD_JSON_BUILD_PAIR_INTEGER("ifindex", ifindex));
if (r < 0) {
log_error_errno(r, "Failed to build JSON for removed service: %m");
goto finish;
sd_event_source *schedule_event;
DnsResourceRecord *rr;
int family;
+ int ifindex;
usec_t until;
DnsRecordTTLState rr_ttl_state;
DnsQuery *query;
bool dns_service_match_and_update(DnssdDiscoveredService *services, DnsResourceRecord *rr, int owner_family, usec_t until);
int mdns_manage_services_answer(DnsServiceBrowser *sb, DnsAnswer *answer, int owner_family);
-int dns_add_new_service(DnsServiceBrowser *sb, DnsResourceRecord *rr, int owner_family, usec_t until);
+int dns_add_new_service(DnsServiceBrowser *sb, DnsResourceRecord *rr, int owner_family, int ifindex, usec_t until);
int mdns_service_update(DnssdDiscoveredService *service, DnsResourceRecord *rr, usec_t t, usec_t until);
int mdns_browser_revisit_cache(DnsServiceBrowser *sb, int owner_family);
int dns_subscribe_browse_service(