add respondd-module-lldp

This commit is contained in:
Martin/Geno 2018-07-01 17:00:32 +02:00 committed by genofire
parent 0a334b837f
commit fc12743119
4 changed files with 92 additions and 0 deletions

View File

@ -0,0 +1,21 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=respondd-module-lldp
PKG_VERSION:=1
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define Package/respondd-module-lldp
SECTION:=gluon
CATEGORY:=Gluon
TITLE:=adds lldp usage neighbours provider to respondd
DEPENDS:=+respondd +lldpd
endef
define Package/respondd-module-lldp/install
$(INSTALL_DIR) $(1)/usr/lib/respondd
$(CP) $(PKG_BUILD_DIR)/respondd.so $(1)/usr/lib/respondd/lldp.so
endef
$(eval $(call BuildPackage,respondd-module-lldp))

View File

@ -0,0 +1,14 @@
This module adds a respondd lldp usage neighbours provider.
The format is the following:
```json
{
"neighbours": {
"lldp": {
"01:00:00:00:00:01": {
"02:00:00:00:00:01" : {"name":"a","descr":"b"}
}
}
}
}
```

View File

@ -0,0 +1,6 @@
all: respondd.so
CFLAGS += -Wall
respondd.so: respondd.c
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -std=c11 -shared -fPIC -D_GNU_SOURCE -o $@ $^ $(LDLIBS) -llldpctl

View File

@ -0,0 +1,51 @@
#include <respondd.h>
#include <json-c/json.h>
#include <lldpctl.h>
#include <lldp-const.h>
static struct json_object * respondd_provider_neighbours(void) {
lldpctl_conn_t *conn;
lldpctl_atom_t *ifaces, *iface, *port, *neighbors, *neighbor;
const char *ctlname, *neighmac, *portmac;
struct json_object *ret, *ret_lldp, *neighbors_obj;
ret_lldp = json_object_new_object();
ctlname = lldpctl_get_default_transport();
conn = lldpctl_new_name(ctlname, NULL, NULL, NULL);
ifaces = lldpctl_get_interfaces(conn);
lldpctl_atom_foreach(ifaces, iface) {
port = lldpctl_get_port(iface);
// check if Port ID Subtype is MAC address
if (lldpctl_atom_get_int(port, lldpctl_k_port_id_subtype) != LLDP_PORTID_SUBTYPE_LLADDR)
continue;
portmac = lldpctl_atom_get_str(port, lldpctl_k_port_id);
if (!portmac)
continue;
neighbors_obj = json_object_new_object();
neighbors = lldpctl_atom_get(port, lldpctl_k_port_neighbors);
lldpctl_atom_foreach(neighbors, neighbor) {
// check if Chassis ID Subtype is MAC address
if (lldpctl_atom_get_int(neighbor, lldpctl_k_chassis_id_subtype) != LLDP_CHASSISID_SUBTYPE_LLADDR)
continue;
neighmac = lldpctl_atom_get_str(neighbor, lldpctl_k_chassis_id);
if (!neighmac)
continue;
json_object_object_add(neighbors_obj, neighmac, json_object_new_object());
}
json_object_object_add(ret_lldp, portmac, neighbors_obj);
}
ret = json_object_new_object();
json_object_object_add(ret, "lldp", ret_lldp);
return ret;
}
const struct respondd_provider_info respondd_providers[] = {
{"neighbours", respondd_provider_neighbours},
{}
};