diff --git a/lib/vintage_net/interfaces_monitor.ex b/lib/vintage_net/interfaces_monitor.ex index 0343787e..342070a2 100644 --- a/lib/vintage_net/interfaces_monitor.ex +++ b/lib/vintage_net/interfaces_monitor.ex @@ -105,21 +105,37 @@ defmodule VintageNet.InterfacesMonitor do end defp handle_report(state, {:newaddr, ifindex, address_report}) do - new_info = - get_or_create_info(state, ifindex) - |> Info.newaddr(address_report) - |> Info.update_address_properties() + case Map.fetch(state.interface_info, ifindex) do + {:ok, info} -> + new_info = + info + |> Info.newaddr(address_report) + |> Info.update_address_properties() - %{state | interface_info: Map.put(state.interface_info, ifindex, new_info)} + %{state | interface_info: Map.put(state.interface_info, ifindex, new_info)} + + :error -> + Logger.debug("interfaces_monitor ignoring newaddr for unknown interface #{ifindex}") + + state + end end defp handle_report(state, {:deladdr, ifindex, address_report}) do - new_info = - get_or_create_info(state, ifindex) - |> Info.deladdr(address_report) - |> Info.update_address_properties() + case Map.fetch(state.interface_info, ifindex) do + {:ok, info} -> + new_info = + info + |> Info.deladdr(address_report) + |> Info.update_address_properties() - %{state | interface_info: Map.put(state.interface_info, ifindex, new_info)} + %{state | interface_info: Map.put(state.interface_info, ifindex, new_info)} + + :error -> + Logger.debug("interfaces_monitor ignoring deladdr for unknown interface #{ifindex}") + + state + end end defp get_by_ifname(state, ifname) do @@ -150,15 +166,4 @@ defmodule VintageNet.InterfacesMonitor do |> Info.update_present() end end - - defp get_or_create_info(state, ifindex) do - case Map.fetch(state.interface_info, ifindex) do - {:ok, info} -> - info - - _missing -> - # Race between address and link notifications? - Info.new("__unknown") - end - end end