diff --git a/src/warppipe.cpp b/src/warppipe.cpp index d07554a..98472e1 100644 --- a/src/warppipe.cpp +++ b/src/warppipe.cpp @@ -925,41 +925,42 @@ void Client::Impl::EnforceRulesForLink(uint32_t link_id, uint32_t out_port, auto node_it = nodes.find(src_node_id); if (node_it == nodes.end()) return; + std::vector rule_target_ids; for (const auto& rule_entry : route_rules) { if (!MatchesRule(node_it->second, rule_entry.second.match)) continue; - - uint32_t target_node_id = 0; for (const auto& n : nodes) { if (n.second.name == rule_entry.second.target_node) { - target_node_id = n.first; + rule_target_ids.push_back(n.first); break; } } - if (target_node_id == 0) return; - - auto in_port_it = ports.find(in_port); - if (in_port_it == ports.end()) return; - if (in_port_it->second.node.value == target_node_id) return; - - if (link_proxies.count(link_id)) return; - for (const auto& proxy : auto_link_proxies) { - if (proxy && proxy->output_port == out_port && - proxy->input_port == in_port) return; - } - for (const auto& proxy : saved_link_proxies) { - if (proxy && proxy->output_port == out_port && - proxy->input_port == in_port) return; - } - for (const auto& pair : auto_link_claimed_pairs) { - if (pair.first == out_port && pair.second == in_port) return; - } - for (const auto& pair : pending_link_pairs) { - if (pair.first == out_port && pair.second == in_port) return; - } - - pw_registry_destroy(registry, link_id); - return; } + if (rule_target_ids.empty()) return; + + auto in_port_it = ports.find(in_port); + if (in_port_it == ports.end()) return; + uint32_t dest_node_id = in_port_it->second.node.value; + for (uint32_t tid : rule_target_ids) { + if (dest_node_id == tid) return; + } + + if (link_proxies.count(link_id)) return; + for (const auto& proxy : auto_link_proxies) { + if (proxy && proxy->output_port == out_port && + proxy->input_port == in_port) return; + } + for (const auto& proxy : saved_link_proxies) { + if (proxy && proxy->output_port == out_port && + proxy->input_port == in_port) return; + } + for (const auto& pair : auto_link_claimed_pairs) { + if (pair.first == out_port && pair.second == in_port) return; + } + for (const auto& pair : pending_link_pairs) { + if (pair.first == out_port && pair.second == in_port) return; + } + + pw_registry_destroy(registry, link_id); } void Client::Impl::SchedulePolicySync() { @@ -1079,6 +1080,21 @@ void Client::Impl::ProcessPendingAutoLinks() { if (!is_ours) { if (link_proxies.count(link_id)) is_ours = true; } + if (!is_ours) { + uint32_t out_port = link_entry.second.output_port.value; + for (const auto& proxy : auto_link_proxies) { + if (proxy && proxy->output_port == out_port && + proxy->input_port == in_port) { is_ours = true; break; } + } + } + if (!is_ours) { + uint32_t out_port = link_entry.second.output_port.value; + for (const auto& pair : auto_link_claimed_pairs) { + if (pair.first == out_port && pair.second == in_port) { + is_ours = true; break; + } + } + } if (!is_ours) { uint32_t out_port = link_entry.second.output_port.value; for (const auto& proxy : saved_link_proxies) {