Packages
nerves_hub_link
2.11.1
2.12.0
2.11.1
2.11.0
retired
2.10.2
2.10.1
2.10.0
2.9.0
2.9.0-rc.3
2.9.0-rc.2
2.9.0-rc.1
2.8.1
2.8.0
2.7.3
2.7.2
2.7.0
retired
2.6.0
2.5.2
2.5.1
2.5.0
2.4.0
2.3.0
2.2.1
2.2.0
2.1.1
2.1.0
2.0.0
1.4.1
1.4.0
1.3.0
1.2.0
1.1.0
1.0.1
1.0.0
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.2
0.10.1
retired
0.10.0
retired
0.10.0-rc.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.6
Manage your Nerves fleet by connecting it to NervesHub
Current section
Files
Jump to
Current section
Files
lib/nerves_hub_link/network_interface.ex
# SPDX-FileCopyrightText: 2026 Nate Shoemaker
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule NervesHubLink.NetworkInterface do
@moduledoc """
Functions for determining the network interface when connecting to NervesHub and downloading firmware.
"""
require Logger
@doc """
Get the network interface from a Slipstream.Socket or Mint.HTTP struct. This is used to report the
network interface being used for the connection to NervesHub and for firmware downloads.
"""
@spec from_socket(:ssl.socket() | :inet.socket() | Mint.Types.socket()) :: nil | binary()
def from_socket(socket) do
address_from_socket(socket)
|> interface_from_address()
rescue
err ->
Logger.warning(
"[NervesHubLink] Error: could not retrieve network interface: #{inspect(err)}"
)
nil
end
defp address_from_socket({:sslsocket, _, _} = socket) do
{:ok, {address, _}} = :ssl.sockname(socket)
address
end
defp address_from_socket(socket) do
{:ok, {address, _}} = :inet.sockname(socket)
address
end
defp interface_from_address(address) do
{:ok, interfaces} = :inet.getifaddrs()
case Enum.find(interfaces, fn {_name, attrs} -> attrs[:addr] == address end) do
{interface, _attrs} ->
# charlist -> string
List.to_string(interface)
nil ->
nil
end
end
end