# `VintageNet.Technology`
[🔗](https://github.com/nerves-networking/vintage_net/blob/v0.13.7/lib/vintage_net/technology.ex#L5)

Technologies define how network interface types work

VintageNet comes with several built-in technologies, but more can be
added or existing ones modified by implementing the `Technology` behaviour.

# `check_system`

```elixir
@callback check_system(opts :: keyword()) :: :ok | {:error, String.t()}
```

Check that the system has all of the required programs for this technology

This is intended to help identify missing programs without configuring a
network.

# `ioctl`

```elixir
@callback ioctl(VintageNet.ifname(), command :: atom(), args :: list()) ::
  :ok | {:ok, any()} | {:error, any()}
```

Handle an ioctl that has been requested on the network interface

The function runs isolated in its own process and only one ioctl is
guaranteed to be running at a time. `VintageNet` will handle crashes and
hangs and unceremoniously kill the ioctl if the user changes their mind and
reconfigures the network interface.

Ioctl support is optional. Examples of `ioctl`s include:

* `:scan` - scan for WiFi networks
* `:statistics` - return a map of network statistics

# `normalize`

```elixir
@callback normalize(config :: map()) :: map()
```

Normalize a configuration

Technologies use this to update input configurations to a canonical
representation. This includes things like inserting default fields,
converting IP addresses passed in as strings to tuples, and deriving
parameters so that they need not be derived again in the future.

Configuration errors raise exceptions.

# `to_raw_config`

```elixir
@callback to_raw_config(VintageNet.ifname(), config :: map(), opts :: keyword()) ::
  VintageNet.Interface.RawConfig.t()
```

Convert a technology-specific configuration to one for VintageNet

The `config` is the normalized configuration map (`normalize/1` will have
been called at some point so the technology does not need to call it again).

The `opts` parameter contains VintageNet's application environment. This
contains potentially useful file paths and other information.

Configuration errors raise exceptions. Errors should be infrequent, though,
since VintageNet will call `normalize/1` first and expects most errors to be
caught by it.

# `module_from_config!`

```elixir
@spec module_from_config!(%{:type =&gt; module(), optional(any()) =&gt; any()}) :: module()
```

Helper to fetch the Technology implementation from a configuration

---

*Consult [api-reference.md](api-reference.md) for complete listing*
