blob: 8f85d59dfc00ca68ed50c38a03401ba1a7001d5a [file] [log] [blame]
Tomáš Peckaae301762021-10-13 10:50:37 +02001From 64d19ae11c2a3014fa58a0c05620b6ee95352125 Mon Sep 17 00:00:00 2001
2From: Tomas Pecka <peckato1@users.noreply.github.com>
3Date: Thu, 7 Oct 2021 11:16:57 +0200
4Subject: [PATCH 1/9] network: Serialize LLDP neighbor to JSON format
5
6Add functions serializing LLDP neighbors to JSON (JsonVariant).
7
8The entry contains a chassis id, system name and port id of the remote
9neighbor. Also it possibly contains an integer coding the enabled system
10capabilities and port description.
11---
12 src/libsystemd-network/lldp-neighbor.c | 22 +++++++++++++++
13 src/libsystemd-network/sd-lldp.c | 37 ++++++++++++++++++++++++++
14 src/systemd/sd-lldp.h | 4 +++
15 3 files changed, 63 insertions(+)
16
17diff --git a/src/libsystemd-network/lldp-neighbor.c b/src/libsystemd-network/lldp-neighbor.c
18index 3bd775158e..5c00205110 100644
19--- a/src/libsystemd-network/lldp-neighbor.c
20+++ b/src/libsystemd-network/lldp-neighbor.c
21@@ -5,6 +5,7 @@
22 #include "ether-addr-util.h"
23 #include "hexdecoct.h"
24 #include "in-addr-util.h"
25+#include "json.h"
26 #include "lldp-internal.h"
27 #include "lldp-neighbor.h"
28 #include "memory-util.h"
29@@ -777,3 +778,24 @@ _public_ int sd_lldp_neighbor_get_timestamp(sd_lldp_neighbor *n, clockid_t clock
30 *ret = triple_timestamp_by_clock(&n->timestamp, clock);
31 return 0;
32 }
33+
34+_public_ int sd_lldp_neighbor_build_json(sd_lldp_neighbor *n, JsonVariant **ret) {
35+ const char *chassis_id = NULL, *port_id = NULL, *system_name = NULL, *port_description = NULL;
36+ uint16_t cc;
37+ bool valid_cc;
38+
39+ (void) sd_lldp_neighbor_get_chassis_id_as_string(n, &chassis_id);
40+ (void) sd_lldp_neighbor_get_port_id_as_string(n, &port_id);
41+ (void) sd_lldp_neighbor_get_system_name(n, &system_name);
42+ (void) sd_lldp_neighbor_get_port_description(n, &port_description);
43+
44+ valid_cc = sd_lldp_neighbor_get_enabled_capabilities(n, &cc) >= 0;
45+
46+ return json_build(ret, JSON_BUILD_OBJECT(
47+ JSON_BUILD_PAIR("neighbor", JSON_BUILD_OBJECT(
48+ JSON_BUILD_PAIR("chassisId", JSON_BUILD_STRING(chassis_id)),
49+ JSON_BUILD_PAIR("systemName", JSON_BUILD_STRING(system_name)),
50+ JSON_BUILD_PAIR_CONDITION(valid_cc, "enabledCapabilities", JSON_BUILD_UNSIGNED(cc)),
51+ JSON_BUILD_PAIR("portId", JSON_BUILD_STRING(port_id)),
52+ JSON_BUILD_PAIR_CONDITION(port_description, "portDescription", JSON_BUILD_STRING(port_description))))));
53+}
54diff --git a/src/libsystemd-network/sd-lldp.c b/src/libsystemd-network/sd-lldp.c
55index 49aa876a53..2d51992237 100644
56--- a/src/libsystemd-network/sd-lldp.c
57+++ b/src/libsystemd-network/sd-lldp.c
58@@ -10,6 +10,7 @@
59 #include "ether-addr-util.h"
60 #include "event-util.h"
61 #include "fd-util.h"
62+#include "json.h"
63 #include "lldp-internal.h"
64 #include "lldp-neighbor.h"
65 #include "lldp-network.h"
66@@ -488,6 +489,42 @@ _public_ int sd_lldp_get_neighbors(sd_lldp *lldp, sd_lldp_neighbor ***ret) {
67 return k;
68 }
69
70+_public_ int sd_lldp_get_neighbors_json(sd_lldp *lldp, JsonVariant ***ret) {
71+ int i, j, r, n = 0;
72+ sd_lldp_neighbor **l = NULL;
73+ JsonVariant **v = NULL;
74+
75+ assert_return(lldp, -EINVAL);
76+ assert_return(ret, -EINVAL);
77+
78+ r = sd_lldp_get_neighbors(lldp, &l);
79+ if (r < 0)
80+ return r;
81+
82+ n = r;
83+
84+ v = new0(JsonVariant*, n);
85+ if (!v)
86+ return -ENOMEM;
87+
88+ for (i = 0; i < n; i++) {
89+ r = sd_lldp_neighbor_build_json(l[i], v + i);
90+ if (r < 0)
91+ goto clear;
92+ }
93+
94+ *ret = v;
95+
96+ return n;
97+
98+clear:
99+ for (j = 0; j < i; j++)
100+ json_variant_unrefp(v + j);
101+
102+ free(v);
103+ return r;
104+}
105+
106 _public_ int sd_lldp_set_neighbors_max(sd_lldp *lldp, uint64_t m) {
107 assert_return(lldp, -EINVAL);
108 assert_return(m > 0, -EINVAL);
109diff --git a/src/systemd/sd-lldp.h b/src/systemd/sd-lldp.h
110index 64047ee817..7594502802 100644
111--- a/src/systemd/sd-lldp.h
112+++ b/src/systemd/sd-lldp.h
113@@ -28,6 +28,8 @@
114
115 _SD_BEGIN_DECLARATIONS;
116
117+typedef struct JsonVariant JsonVariant;
118+
119 /* IEEE 802.1AB-2009 Clause 8: TLV Types */
120 enum {
121 SD_LLDP_TYPE_END = 0,
122@@ -156,10 +158,12 @@ int sd_lldp_match_capabilities(sd_lldp *lldp, uint16_t mask);
123 int sd_lldp_set_filter_address(sd_lldp *lldp, const struct ether_addr *address);
124
125 int sd_lldp_get_neighbors(sd_lldp *lldp, sd_lldp_neighbor ***neighbors);
126+int sd_lldp_get_neighbors_json(sd_lldp *lldp, JsonVariant ***neighbors);
127
128 int sd_lldp_neighbor_from_raw(sd_lldp_neighbor **ret, const void *raw, size_t raw_size);
129 sd_lldp_neighbor *sd_lldp_neighbor_ref(sd_lldp_neighbor *n);
130 sd_lldp_neighbor *sd_lldp_neighbor_unref(sd_lldp_neighbor *n);
131+int sd_lldp_neighbor_build_json(sd_lldp_neighbor *n, JsonVariant **ret);
132
133 /* Access to LLDP frame metadata */
134 int sd_lldp_neighbor_get_source_address(sd_lldp_neighbor *n, struct ether_addr* address);
135--
1362.33.0
137