blob: 79fcb9d205b428767fdadb7aa02977d8efae3651 [file] [log] [blame]
Tomáš Pecka5e070252022-05-20 20:41:21 +02001From 8d3bd15463b31c5b3347239317fcf1f41d467838 Mon Sep 17 00:00:00 2001
Tomáš Peckaae301762021-10-13 10:50:37 +02002From: 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---
Václav Kubernát8cd61562021-12-08 13:27:31 +010012 src/libsystemd-network/lldp-neighbor.c | 22 ++++++++++++
13 src/libsystemd-network/sd-lldp-rx.c | 46 +++++++++++++++++++++++++-
14 src/systemd/sd-lldp-rx.h | 4 +++
15 3 files changed, 71 insertions(+), 1 deletion(-)
Tomáš Peckaae301762021-10-13 10:50:37 +020016
17diff --git a/src/libsystemd-network/lldp-neighbor.c b/src/libsystemd-network/lldp-neighbor.c
Václav Kubernát8cd61562021-12-08 13:27:31 +010018index 44847b2b92..cacad8adea 100644
Tomáš Peckaae301762021-10-13 10:50:37 +020019--- 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"
Tomáš Peckaae301762021-10-13 10:50:37 +020026 #include "lldp-neighbor.h"
27 #include "memory-util.h"
Václav Kubernát8cd61562021-12-08 13:27:31 +010028 #include "missing_network.h"
29@@ -790,3 +791,24 @@ int sd_lldp_neighbor_get_timestamp(sd_lldp_neighbor *n, clockid_t clock, uint64_
Tomáš Peckaae301762021-10-13 10:50:37 +020030 *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+}
Václav Kubernát8cd61562021-12-08 13:27:31 +010054diff --git a/src/libsystemd-network/sd-lldp-rx.c b/src/libsystemd-network/sd-lldp-rx.c
55index 34bdcb644b..ae4d2d599c 100644
56--- a/src/libsystemd-network/sd-lldp-rx.c
57+++ b/src/libsystemd-network/sd-lldp-rx.c
Tomáš Peckaae301762021-10-13 10:50:37 +020058@@ -10,6 +10,7 @@
59 #include "ether-addr-util.h"
60 #include "event-util.h"
61 #include "fd-util.h"
62+#include "json.h"
Tomáš Peckaae301762021-10-13 10:50:37 +020063 #include "lldp-neighbor.h"
64 #include "lldp-network.h"
Václav Kubernát8cd61562021-12-08 13:27:31 +010065 #include "lldp-rx-internal.h"
66@@ -492,7 +493,50 @@ int sd_lldp_rx_get_neighbors(sd_lldp_rx *lldp_rx, sd_lldp_neighbor ***ret) {
Tomáš Peckaae301762021-10-13 10:50:37 +020067 return k;
68 }
69
Václav Kubernát8cd61562021-12-08 13:27:31 +010070-int sd_lldp_rx_set_neighbors_max(sd_lldp_rx *lldp_rx, uint64_t m) {
71+_public_ int sd_lldp_rx_get_neighbors_json(sd_lldp_rx *lldp, JsonVariant ***ret) {
Tomáš Peckaae301762021-10-13 10:50:37 +020072+ int i, j, r, n = 0;
Václav Kubernát8cd61562021-12-08 13:27:31 +010073+ _cleanup_free_ sd_lldp_neighbor **l = NULL;
Tomáš Peckaae301762021-10-13 10:50:37 +020074+ JsonVariant **v = NULL;
75+
76+ assert_return(lldp, -EINVAL);
77+ assert_return(ret, -EINVAL);
78+
Václav Kubernát8cd61562021-12-08 13:27:31 +010079+ r = sd_lldp_rx_get_neighbors(lldp, &l);
Tomáš Peckaae301762021-10-13 10:50:37 +020080+ if (r < 0)
81+ return r;
82+
83+ n = r;
84+
85+ v = new0(JsonVariant*, n);
86+ if (!v)
87+ return -ENOMEM;
88+
89+ for (i = 0; i < n; i++) {
90+ r = sd_lldp_neighbor_build_json(l[i], v + i);
91+ if (r < 0)
92+ goto clear;
Václav Kubernát8cd61562021-12-08 13:27:31 +010093+ else
94+ sd_lldp_neighbor_unref(l[i]);
Tomáš Peckaae301762021-10-13 10:50:37 +020095+ }
96+
97+ *ret = v;
98+
Václav Kubernát8cd61562021-12-08 13:27:31 +010099+ for (i = 0; i < n; j++)
100+
Tomáš Peckaae301762021-10-13 10:50:37 +0200101+ return n;
102+
103+clear:
Václav Kubernát8cd61562021-12-08 13:27:31 +0100104+ for (j = i; j < n; j++)
105+ sd_lldp_neighbor_unref(l[j]);
106+
Tomáš Peckaae301762021-10-13 10:50:37 +0200107+ for (j = 0; j < i; j++)
108+ json_variant_unrefp(v + j);
109+
110+ free(v);
111+ return r;
112+}
113+
Václav Kubernát8cd61562021-12-08 13:27:31 +0100114+_public_ int sd_lldp_rx_set_neighbors_max(sd_lldp_rx *lldp_rx, uint64_t m) {
115 assert_return(lldp_rx, -EINVAL);
Tomáš Peckaae301762021-10-13 10:50:37 +0200116 assert_return(m > 0, -EINVAL);
Tomáš Peckaae301762021-10-13 10:50:37 +0200117
Václav Kubernát8cd61562021-12-08 13:27:31 +0100118diff --git a/src/systemd/sd-lldp-rx.h b/src/systemd/sd-lldp-rx.h
119index bfeac14ce3..8a538b2444 100644
120--- a/src/systemd/sd-lldp-rx.h
121+++ b/src/systemd/sd-lldp-rx.h
122@@ -32,6 +32,8 @@ _SD_BEGIN_DECLARATIONS;
123 typedef struct sd_lldp_rx sd_lldp_rx;
124 typedef struct sd_lldp_neighbor sd_lldp_neighbor;
Tomáš Peckaae301762021-10-13 10:50:37 +0200125
126+typedef struct JsonVariant JsonVariant;
127+
Václav Kubernát8cd61562021-12-08 13:27:31 +0100128 typedef enum sd_lldp_rx_event_t {
129 SD_LLDP_RX_EVENT_ADDED,
130 SD_LLDP_RX_EVENT_REMOVED,
131@@ -67,10 +69,12 @@ int sd_lldp_rx_match_capabilities(sd_lldp_rx *lldp_rx, uint16_t mask);
132 int sd_lldp_rx_set_filter_address(sd_lldp_rx *lldp_rx, const struct ether_addr *address);
Tomáš Peckaae301762021-10-13 10:50:37 +0200133
Václav Kubernát8cd61562021-12-08 13:27:31 +0100134 int sd_lldp_rx_get_neighbors(sd_lldp_rx *lldp_rx, sd_lldp_neighbor ***neighbors);
135+int sd_lldp_rx_get_neighbors_json(sd_lldp_rx *lldp, JsonVariant ***neighbors);
Tomáš Peckaae301762021-10-13 10:50:37 +0200136
137 int sd_lldp_neighbor_from_raw(sd_lldp_neighbor **ret, const void *raw, size_t raw_size);
138 sd_lldp_neighbor *sd_lldp_neighbor_ref(sd_lldp_neighbor *n);
139 sd_lldp_neighbor *sd_lldp_neighbor_unref(sd_lldp_neighbor *n);
140+int sd_lldp_neighbor_build_json(sd_lldp_neighbor *n, JsonVariant **ret);
141
142 /* Access to LLDP frame metadata */
143 int sd_lldp_neighbor_get_source_address(sd_lldp_neighbor *n, struct ether_addr* address);
144--
Tomáš Pecka5e070252022-05-20 20:41:21 +02001452.35.1
Tomáš Peckaae301762021-10-13 10:50:37 +0200146