blob: 8f85d59dfc00ca68ed50c38a03401ba1a7001d5a [file] [log] [blame]
From 64d19ae11c2a3014fa58a0c05620b6ee95352125 Mon Sep 17 00:00:00 2001
From: Tomas Pecka <peckato1@users.noreply.github.com>
Date: Thu, 7 Oct 2021 11:16:57 +0200
Subject: [PATCH 1/9] network: Serialize LLDP neighbor to JSON format
Add functions serializing LLDP neighbors to JSON (JsonVariant).
The entry contains a chassis id, system name and port id of the remote
neighbor. Also it possibly contains an integer coding the enabled system
capabilities and port description.
---
src/libsystemd-network/lldp-neighbor.c | 22 +++++++++++++++
src/libsystemd-network/sd-lldp.c | 37 ++++++++++++++++++++++++++
src/systemd/sd-lldp.h | 4 +++
3 files changed, 63 insertions(+)
diff --git a/src/libsystemd-network/lldp-neighbor.c b/src/libsystemd-network/lldp-neighbor.c
index 3bd775158e..5c00205110 100644
--- a/src/libsystemd-network/lldp-neighbor.c
+++ b/src/libsystemd-network/lldp-neighbor.c
@@ -5,6 +5,7 @@
#include "ether-addr-util.h"
#include "hexdecoct.h"
#include "in-addr-util.h"
+#include "json.h"
#include "lldp-internal.h"
#include "lldp-neighbor.h"
#include "memory-util.h"
@@ -777,3 +778,24 @@ _public_ int sd_lldp_neighbor_get_timestamp(sd_lldp_neighbor *n, clockid_t clock
*ret = triple_timestamp_by_clock(&n->timestamp, clock);
return 0;
}
+
+_public_ int sd_lldp_neighbor_build_json(sd_lldp_neighbor *n, JsonVariant **ret) {
+ const char *chassis_id = NULL, *port_id = NULL, *system_name = NULL, *port_description = NULL;
+ uint16_t cc;
+ bool valid_cc;
+
+ (void) sd_lldp_neighbor_get_chassis_id_as_string(n, &chassis_id);
+ (void) sd_lldp_neighbor_get_port_id_as_string(n, &port_id);
+ (void) sd_lldp_neighbor_get_system_name(n, &system_name);
+ (void) sd_lldp_neighbor_get_port_description(n, &port_description);
+
+ valid_cc = sd_lldp_neighbor_get_enabled_capabilities(n, &cc) >= 0;
+
+ return json_build(ret, JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR("neighbor", JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR("chassisId", JSON_BUILD_STRING(chassis_id)),
+ JSON_BUILD_PAIR("systemName", JSON_BUILD_STRING(system_name)),
+ JSON_BUILD_PAIR_CONDITION(valid_cc, "enabledCapabilities", JSON_BUILD_UNSIGNED(cc)),
+ JSON_BUILD_PAIR("portId", JSON_BUILD_STRING(port_id)),
+ JSON_BUILD_PAIR_CONDITION(port_description, "portDescription", JSON_BUILD_STRING(port_description))))));
+}
diff --git a/src/libsystemd-network/sd-lldp.c b/src/libsystemd-network/sd-lldp.c
index 49aa876a53..2d51992237 100644
--- a/src/libsystemd-network/sd-lldp.c
+++ b/src/libsystemd-network/sd-lldp.c
@@ -10,6 +10,7 @@
#include "ether-addr-util.h"
#include "event-util.h"
#include "fd-util.h"
+#include "json.h"
#include "lldp-internal.h"
#include "lldp-neighbor.h"
#include "lldp-network.h"
@@ -488,6 +489,42 @@ _public_ int sd_lldp_get_neighbors(sd_lldp *lldp, sd_lldp_neighbor ***ret) {
return k;
}
+_public_ int sd_lldp_get_neighbors_json(sd_lldp *lldp, JsonVariant ***ret) {
+ int i, j, r, n = 0;
+ sd_lldp_neighbor **l = NULL;
+ JsonVariant **v = NULL;
+
+ assert_return(lldp, -EINVAL);
+ assert_return(ret, -EINVAL);
+
+ r = sd_lldp_get_neighbors(lldp, &l);
+ if (r < 0)
+ return r;
+
+ n = r;
+
+ v = new0(JsonVariant*, n);
+ if (!v)
+ return -ENOMEM;
+
+ for (i = 0; i < n; i++) {
+ r = sd_lldp_neighbor_build_json(l[i], v + i);
+ if (r < 0)
+ goto clear;
+ }
+
+ *ret = v;
+
+ return n;
+
+clear:
+ for (j = 0; j < i; j++)
+ json_variant_unrefp(v + j);
+
+ free(v);
+ return r;
+}
+
_public_ int sd_lldp_set_neighbors_max(sd_lldp *lldp, uint64_t m) {
assert_return(lldp, -EINVAL);
assert_return(m > 0, -EINVAL);
diff --git a/src/systemd/sd-lldp.h b/src/systemd/sd-lldp.h
index 64047ee817..7594502802 100644
--- a/src/systemd/sd-lldp.h
+++ b/src/systemd/sd-lldp.h
@@ -28,6 +28,8 @@
_SD_BEGIN_DECLARATIONS;
+typedef struct JsonVariant JsonVariant;
+
/* IEEE 802.1AB-2009 Clause 8: TLV Types */
enum {
SD_LLDP_TYPE_END = 0,
@@ -156,10 +158,12 @@ int sd_lldp_match_capabilities(sd_lldp *lldp, uint16_t mask);
int sd_lldp_set_filter_address(sd_lldp *lldp, const struct ether_addr *address);
int sd_lldp_get_neighbors(sd_lldp *lldp, sd_lldp_neighbor ***neighbors);
+int sd_lldp_get_neighbors_json(sd_lldp *lldp, JsonVariant ***neighbors);
int sd_lldp_neighbor_from_raw(sd_lldp_neighbor **ret, const void *raw, size_t raw_size);
sd_lldp_neighbor *sd_lldp_neighbor_ref(sd_lldp_neighbor *n);
sd_lldp_neighbor *sd_lldp_neighbor_unref(sd_lldp_neighbor *n);
+int sd_lldp_neighbor_build_json(sd_lldp_neighbor *n, JsonVariant **ret);
/* Access to LLDP frame metadata */
int sd_lldp_neighbor_get_source_address(sd_lldp_neighbor *n, struct ether_addr* address);
--
2.33.0