Manages ethernet on Nerves based embedded systems, with optional Celluose integration.
- DHCP, including timeouts and re-acquisition
- IP4LL/AIPA automatic ethernet address configuration
- Easy callback-based notification of device state changes
{:ok, eth0} = Ethernet.start_link interface: "eth0", hostname: "happy"
Options are specified by a keyword list, as follows:
keyword | type | description |
---|---|---|
interface | string | interface to configure (eg "eth0", "en2", "lo0", etc) |
hostname | string | hostname to pass to dhcp server during dhcp request |
Config options may be specified by a keyword list for configuration in a config.exs
file using the :static_config
key. Required keys of list are:
keyword | type | description |
---|---|---|
ip | string | IP address to configure to (e.g. "192.168.15.100") |
mask | string | Subnet Mask to use (e.g. "255.255.255.0") |
router | string | IP address of router (e.g. "192.168.15.1") |
config :ethernet, static_config: [
ip: "192.168.1.10",
mask: "255.255.0.0",
router: "192.168.1.1"
]
Ethernet
implements an event manager which provides information about changes in the status of the interface.
For instance, imagine you wanted to implement a handler that wrote the new network configuration to standard output everytime it changed. You could implement it like this:
defmodule NetworkStateInspectionHandler
use GenEvent
def handle_event(:if_changed, new_config) do
IO.write "New configuration: #{inspect new_config}"
end
end
And then, you could start the interface and add the handler like this..
{:ok, eth0} = Ethernet.start_link interface: "eth0", hostname: "happy"
GenEvent.add_handler(eth0, NetworkStateInspectionHandler, [])
Ethernet
is capable of storing static configuration values, provided a
module is implemented following the Ethernet.Storage
Behaviour. It is up
to the implementer to determine how this should be accomplished. An example
of using cellulose/persistent_storage
project is provided in the /examples
directory.
To utilize your module just specify it in your config:
config :ethernet, storage: EthernetPersistentStorage
Or when you start Ethernet just pass it with the key :storage
:
Ethernet.start storage: EthernetPersistentStorage
- needs a lot better AIPA/IP4LL address negotiation
# Start Ethernet using dhcp and calling back to AIPA/ipv4ll
#config.exs
config :ethernet, interface: "eth2", hostname: "bbb"
# starting...
iex> Ethernet.start
# Start Ethernet with static configuration
#config.exs
config :ethernet, interface: "eth2", hostname: "bbb", static_config: [
ip: "192.168.1.100", mask: "255.255.255.0", router: "192.168.1.1"
]
# starting...
iex> Ethernet.start
We appreciate any contribution to Cellulose Projects, so check out our CONTRIBUTING.md guide for more information. We usually keep a list of features and bugs in the issue tracker.