# Network Functions

## NetworkBridges

      				size_t NetworkBridges
        				struct channel * channel
        				void  * memory
        				size_t extent

Search a channel for local powerline devices (bridges) and store their Ethernet hardware in consecutive `memory` locations. The memory `extent` is specified in bytes. The number of devices found is returned as the function value, provided enough space is available to store all addressed. Unlike function NetworkDevices, the channel `peer` address is ignored.

We call local devices bridges because each serves as an Ethernet-to-Powerline bridge for the local host.

### Enumerating Local Devices

    #include <net/if.h>
    #include "../ether/channel.h"
    extern struct channel channel;
    uint8_t address [255][ETHER_ADDR_LEN];
    size_t bridges = NetworkBridges (&channel, address, sizeof (address));
    size_t bridge = 0;
    while (bridge < bridges)
    {
       binout (address [bridge], ETHER_ADDR_LEN, ':', stdout);
       putc ('\n', stdout);
    }

The code segment shown above illustrates how to use function `NetworkBridges` to identify all local devices. We do not need to set the channel `peer` because `NetworkBridges` always uses the Atheros `localcast` address. Array `address` is declared with two dimensions to simplify access to individual addresses on return.

## NetworkDevices

      				size_t NetworkDevices
        				struct channel * channel
        				void * memory
        				size_t extent

Query a powerline device, specified by channel, for neighboring network devices and store their Ethernet addresses in consecutive `memory` locations. The memory `extent` is specified in bytes. The number of devices found is returned as the function value, provided sufficient space is available to store all addresses. Unlike function NetworkBridges, the channel `peer` address is identifies the device to be queried.

### Enumerating Network Devices

    #include <net/if.h>
    #include "../ether/channel.h"
    extern struct channel channel;
    uint8_t address [255][ETHER_ADDR_LEN];
    size_t devices = NetworkDevices (&channel, address, sizeof (address));
    size_t device = 0;
    while (device < devices)
    {
       binout (address [device], ETHER_ADDR_LEN, ':', stdout);
       putc ('\n';, stdout);
    }

The code segment shown above illustrates how to use function `NetworkDevices` to identify all devices on a specific network. You must set the channel `peer` address before calling `NetworkDevices`. Array `address` is declared with two dimensions to simplify access to individual addresses on return. If the channel `peer` address is not the Ethernet `broadcast` or Atheros `localcast` address then the first address returned will be the channel `peer` address.