| 2505 | } |
| 2506 | |
| 2507 | void UpdateBrowser(HBrowser browser) |
| 2508 | { |
| 2509 | if (browser == 0) |
| 2510 | return; |
| 2511 | |
| 2512 | const uint64_t now = GetNow(); |
| 2513 | if (now >= browser->m_NextInterfaceRefresh) |
| 2514 | { |
| 2515 | const bool interface_changed = RefreshBrowserInterfaceAddresses(browser); |
| 2516 | EnsureMemberships(browser->m_Socket, browser->m_InterfaceAddresses, &browser->m_MembershipAddresses); |
| 2517 | if (interface_changed) |
| 2518 | { |
| 2519 | // A real topology change should trigger a fresh browse burst on |
| 2520 | // the new subnet, but periodic interface polling must not keep |
| 2521 | // collapsing the backoff on stable networks. |
| 2522 | ResetBrowserQueryBackoff(browser, now); |
| 2523 | } |
| 2524 | browser->m_NextInterfaceRefresh = now + SecondsToMicroSeconds(MDNS_INTERFACE_REFRESH_INTERVAL); |
| 2525 | } |
| 2526 | |
| 2527 | uint64_t next_query_due = browser->m_NextQuery; |
| 2528 | const uint64_t refresh_deadline = GetBrowserRefreshDeadline(browser); |
| 2529 | if (next_query_due == 0 || (refresh_deadline != 0 && refresh_deadline < next_query_due)) |
| 2530 | next_query_due = refresh_deadline; |
| 2531 | |
| 2532 | if (next_query_due == 0 || now >= next_query_due) |
| 2533 | { |
| 2534 | uint32_t query_size = BuildQueryMessage(browser, now, browser->m_Buffer, sizeof(browser->m_Buffer)); |
| 2535 | if (query_size > 0) |
| 2536 | { |
| 2537 | SendPacketOnInterfaces(browser->m_Socket, browser->m_Buffer, query_size, browser->m_InterfaceAddresses); |
| 2538 | } |
| 2539 | const uint64_t retry_at = now + browser->m_QueryInterval; |
| 2540 | browser->m_NextQuery = retry_at; |
| 2541 | if (query_size > 0) |
| 2542 | RescheduleBrowserRefreshes(browser, now, retry_at); |
| 2543 | if (browser->m_QueryInterval < MDNS_BROWSER_MAX_QUERY_INTERVAL) |
| 2544 | { |
| 2545 | browser->m_QueryInterval *= 3; |
| 2546 | if (browser->m_QueryInterval > MDNS_BROWSER_MAX_QUERY_INTERVAL) |
| 2547 | browser->m_QueryInterval = MDNS_BROWSER_MAX_QUERY_INTERVAL; |
| 2548 | } |
| 2549 | } |
| 2550 | |
| 2551 | HandleBrowserResponses(browser); |
| 2552 | ExpireBrowserEntries(browser); |
| 2553 | } |
| 2554 | |
| 2555 | Result DeleteBrowser(HBrowser browser) |
| 2556 | { |