blob: 79fcb9d205b428767fdadb7aa02977d8efae3651 [file] [log] [blame]
From 8d3bd15463b31c5b3347239317fcf1f41d467838 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-rx.c | 46 +++++++++++++++++++++++++-
src/systemd/sd-lldp-rx.h | 4 +++
3 files changed, 71 insertions(+), 1 deletion(-)
diff --git a/src/libsystemd-network/lldp-neighbor.c b/src/libsystemd-network/lldp-neighbor.c
index 44847b2b92..cacad8adea 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-neighbor.h"
#include "memory-util.h"
#include "missing_network.h"
@@ -790,3 +791,24 @@ int sd_lldp_neighbor_get_timestamp(sd_lldp_neighbor *n, clockid_t clock, uint64_
*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-rx.c b/src/libsystemd-network/sd-lldp-rx.c
index 34bdcb644b..ae4d2d599c 100644
--- a/src/libsystemd-network/sd-lldp-rx.c
+++ b/src/libsystemd-network/sd-lldp-rx.c
@@ -10,6 +10,7 @@
#include "ether-addr-util.h"
#include "event-util.h"
#include "fd-util.h"
+#include "json.h"
#include "lldp-neighbor.h"
#include "lldp-network.h"
#include "lldp-rx-internal.h"
@@ -492,7 +493,50 @@ int sd_lldp_rx_get_neighbors(sd_lldp_rx *lldp_rx, sd_lldp_neighbor ***ret) {
return k;
}
-int sd_lldp_rx_set_neighbors_max(sd_lldp_rx *lldp_rx, uint64_t m) {
+_public_ int sd_lldp_rx_get_neighbors_json(sd_lldp_rx *lldp, JsonVariant ***ret) {
+ int i, j, r, n = 0;
+ _cleanup_free_ sd_lldp_neighbor **l = NULL;
+ JsonVariant **v = NULL;
+
+ assert_return(lldp, -EINVAL);
+ assert_return(ret, -EINVAL);
+
+ r = sd_lldp_rx_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;
+ else
+ sd_lldp_neighbor_unref(l[i]);
+ }
+
+ *ret = v;
+
+ for (i = 0; i < n; j++)
+
+ return n;
+
+clear:
+ for (j = i; j < n; j++)
+ sd_lldp_neighbor_unref(l[j]);
+
+ for (j = 0; j < i; j++)
+ json_variant_unrefp(v + j);
+
+ free(v);
+ return r;
+}
+
+_public_ int sd_lldp_rx_set_neighbors_max(sd_lldp_rx *lldp_rx, uint64_t m) {
assert_return(lldp_rx, -EINVAL);
assert_return(m > 0, -EINVAL);
diff --git a/src/systemd/sd-lldp-rx.h b/src/systemd/sd-lldp-rx.h
index bfeac14ce3..8a538b2444 100644
--- a/src/systemd/sd-lldp-rx.h
+++ b/src/systemd/sd-lldp-rx.h
@@ -32,6 +32,8 @@ _SD_BEGIN_DECLARATIONS;
typedef struct sd_lldp_rx sd_lldp_rx;
typedef struct sd_lldp_neighbor sd_lldp_neighbor;
+typedef struct JsonVariant JsonVariant;
+
typedef enum sd_lldp_rx_event_t {
SD_LLDP_RX_EVENT_ADDED,
SD_LLDP_RX_EVENT_REMOVED,
@@ -67,10 +69,12 @@ int sd_lldp_rx_match_capabilities(sd_lldp_rx *lldp_rx, uint16_t mask);
int sd_lldp_rx_set_filter_address(sd_lldp_rx *lldp_rx, const struct ether_addr *address);
int sd_lldp_rx_get_neighbors(sd_lldp_rx *lldp_rx, sd_lldp_neighbor ***neighbors);
+int sd_lldp_rx_get_neighbors_json(sd_lldp_rx *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.35.1