README.md


# erlang-lldp
## About
This package implements LLDP protocol. It can be included as a library or as a standalone application. It exposes a behavior `gen_lldp` that can be included in projects where user can provide custom interfaces to their operating system or their use case. For example, this can be used in Erlang based OpenFlow Controller(originally from FlowForwarding/loom) [loom](https://github.com/vasu-dasari/loom) to discover topology.
## How to use
    
### Standalone App
Development and test environment is captured in [docker-compose.yml](https://github.com/vasu-dasari/erlang-lldp/blob/master/docker/docker-compose.yml)

|Name|What is this  |
|--|--|
|lldp|Docker for compiling running `erlang-lldp` code  |
|lldp1|Linux Docker container connected to `lldp`|
|lldp2|Linux Docker container connected to `lldp`|
    $ make up    # Bring up development and test environment
    $ make.      # Compile the code
    $ make run   # Run the application
![Setup Diagram](https://github.com/vasu-dasari/erlang-lldp/blob/master/docs/Setup.jpeg)

Now from Erlang shell one can do the following to display local interface information and discovered neighbors information

    (lldp@lldp)10> lldp_manager:dashboard(lldp_netlink).
    -------- ------------------ ------------ ------------ ------------------ ---- ---------- ----------
      IfName         Chassis Id      Port Id  System Name       Mgmt Address Nbrs    Rx Pkts    Tx Pkts
    -------- ------------------ ------------ ------------ ------------------ ---- ---------- ----------
        eth2  02:42:0A:00:7B:0A         eth2         lldp         10.0.101.1    1         11         15
        eth1  02:42:0A:00:7B:0A         eth1         lldp         10.0.100.1    1         11         15
    ------------------ ------------------ --- ------------ ------------------ ------------------
            Chassis Id            Port Id Ttl  System Name          Mgmt Info         Expires At
    ------------------ ------------------ --- ------------ ------------------ ------------------
     02:42:0A:00:7B:1E  02:42:0A:00:65:02 120        lldp2        10.0.123.30   4/23/2019 6:08pm
     02:42:0A:00:7B:14  02:42:0A:00:64:02 120        lldp1        10.0.123.20   4/23/2019 6:08pm

### As a library
Include the library as a rebar [lldp from hex](https://hex.pm/packages/lldp) dependency as follows:
```erlang  
{deps, [
    lldp
 ]}.  
```
![Software Model](https://github.com/vasu-dasari/erlang-lldp/blob/master/docs/Software%20Model.jpeg)

`erlang-lldp` can be adapted to be used on a custom platform as well. Platform specific information can be captured in an Erlang module by following `gen_lldp` behavior. It is expected to support the following callback functions by the custom module.

|Callback|Description|
|--|--|
|init|Initialization function which can be used to relay platform specific state variable|
|handle_message|Typical message like `tx_packet` to transmit packet, or `started` to indicate, module is to be initialized and hence populate interface information, etc|
|notify|Notifications like, neighbor has been added/deleted/updated|
|info|Platform specific information that needs to be plumbed through `lldp_mamager:info` calls|
|terminate|LLDP module is being shutdown|

### Changelog