summaryrefslogtreecommitdiff
path: root/src/devices/nm-lldp-listener.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/nm-lldp-listener.c')
-rw-r--r--src/devices/nm-lldp-listener.c1727
1 files changed, 883 insertions, 844 deletions
diff --git a/src/devices/nm-lldp-listener.c b/src/devices/nm-lldp-listener.c
index 9d37758d64..20fbd195e6 100644
--- a/src/devices/nm-lldp-listener.c
+++ b/src/devices/nm-lldp-listener.c
@@ -19,260 +19,275 @@
#define MAX_NEIGHBORS 128
#define MIN_UPDATE_INTERVAL_NSEC (2 * NM_UTILS_NSEC_PER_SEC)
-#define LLDP_MAC_NEAREST_BRIDGE (&((struct ether_addr) { .ether_addr_octet = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e } }))
-#define LLDP_MAC_NEAREST_NON_TPMR_BRIDGE (&((struct ether_addr) { .ether_addr_octet = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x03 } }))
-#define LLDP_MAC_NEAREST_CUSTOMER_BRIDGE (&((struct ether_addr) { .ether_addr_octet = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 } }))
+#define LLDP_MAC_NEAREST_BRIDGE \
+ (&((struct ether_addr){.ether_addr_octet = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e}}))
+#define LLDP_MAC_NEAREST_NON_TPMR_BRIDGE \
+ (&((struct ether_addr){.ether_addr_octet = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x03}}))
+#define LLDP_MAC_NEAREST_CUSTOMER_BRIDGE \
+ (&((struct ether_addr){.ether_addr_octet = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x00}}))
/*****************************************************************************/
-NM_GOBJECT_PROPERTIES_DEFINE (NMLldpListener,
- PROP_NEIGHBORS,
-);
+NM_GOBJECT_PROPERTIES_DEFINE(NMLldpListener, PROP_NEIGHBORS, );
typedef struct {
- sd_lldp *lldp_handle;
- GHashTable *lldp_neighbors;
- GVariant *variant;
+ sd_lldp * lldp_handle;
+ GHashTable *lldp_neighbors;
+ GVariant * variant;
- /* the timestamp in nsec until which we delay updates. */
- gint64 ratelimit_next_nsec;
- guint ratelimit_id;
+ /* the timestamp in nsec until which we delay updates. */
+ gint64 ratelimit_next_nsec;
+ guint ratelimit_id;
- int ifindex;
+ int ifindex;
} NMLldpListenerPrivate;
struct _NMLldpListener {
- GObject parent;
- NMLldpListenerPrivate _priv;
+ GObject parent;
+ NMLldpListenerPrivate _priv;
};
struct _NMLldpListenerClass {
- GObjectClass parent;
+ GObjectClass parent;
};
-G_DEFINE_TYPE (NMLldpListener, nm_lldp_listener, G_TYPE_OBJECT)
+G_DEFINE_TYPE(NMLldpListener, nm_lldp_listener, G_TYPE_OBJECT)
-#define NM_LLDP_LISTENER_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMLldpListener, NM_IS_LLDP_LISTENER)
+#define NM_LLDP_LISTENER_GET_PRIVATE(self) \
+ _NM_GET_PRIVATE(self, NMLldpListener, NM_IS_LLDP_LISTENER)
/*****************************************************************************/
typedef struct {
- GVariant *variant;
- sd_lldp_neighbor *neighbor_sd;
- char *chassis_id;
- char *port_id;
- guint8 chassis_id_type;
- guint8 port_id_type;
+ GVariant * variant;
+ sd_lldp_neighbor *neighbor_sd;
+ char * chassis_id;
+ char * port_id;
+ guint8 chassis_id_type;
+ guint8 port_id_type;
} LldpNeighbor;
/*****************************************************************************/
-#define _NMLOG_PREFIX_NAME "lldp"
-#define _NMLOG_DOMAIN LOGD_DEVICE
-#define _NMLOG(level, ...) \
- G_STMT_START { \
- const NMLogLevel _level = (level); \
- \
- if (nm_logging_enabled (_level, _NMLOG_DOMAIN)) { \
- char _sbuf[64]; \
- int _ifindex = (self) ? NM_LLDP_LISTENER_GET_PRIVATE (self)->ifindex : 0; \
- \
- _nm_log (_level, _NMLOG_DOMAIN, 0, \
- _ifindex > 0 ? nm_platform_link_get_name (NM_PLATFORM_GET, _ifindex) : NULL, \
- NULL, \
- "%s%s: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
- _NMLOG_PREFIX_NAME, \
- ((_ifindex > 0) \
- ? nm_sprintf_buf (_sbuf, "[%p,%d]", (self), _ifindex) \
- : ((self) \
- ? nm_sprintf_buf (_sbuf, "[%p]", (self)) \
- : "")) \
- _NM_UTILS_MACRO_REST (__VA_ARGS__)); \
- } \
- } G_STMT_END \
-
-#define LOG_NEIGH_FMT "CHASSIS=%u/%s PORT=%u/%s"
-#define LOG_NEIGH_ARG(neigh) (neigh)->chassis_id_type, (neigh)->chassis_id, (neigh)->port_id_type, (neigh)->port_id
+#define _NMLOG_PREFIX_NAME "lldp"
+#define _NMLOG_DOMAIN LOGD_DEVICE
+#define _NMLOG(level, ...) \
+ G_STMT_START \
+ { \
+ const NMLogLevel _level = (level); \
+ \
+ if (nm_logging_enabled(_level, _NMLOG_DOMAIN)) { \
+ char _sbuf[64]; \
+ int _ifindex = (self) ? NM_LLDP_LISTENER_GET_PRIVATE(self)->ifindex : 0; \
+ \
+ _nm_log(_level, \
+ _NMLOG_DOMAIN, \
+ 0, \
+ _ifindex > 0 ? nm_platform_link_get_name(NM_PLATFORM_GET, _ifindex) : NULL, \
+ NULL, \
+ "%s%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \
+ _NMLOG_PREFIX_NAME, \
+ ((_ifindex > 0) ? nm_sprintf_buf(_sbuf, "[%p,%d]", (self), _ifindex) \
+ : ((self) ? nm_sprintf_buf(_sbuf, "[%p]", (self)) : "")) \
+ _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
+ } \
+ } \
+ G_STMT_END
+
+#define LOG_NEIGH_FMT "CHASSIS=%u/%s PORT=%u/%s"
+#define LOG_NEIGH_ARG(neigh) \
+ (neigh)->chassis_id_type, (neigh)->chassis_id, (neigh)->port_id_type, (neigh)->port_id
/*****************************************************************************/
static void
-lldp_neighbor_get_raw (LldpNeighbor *neigh,
- const guint8 **out_raw_data,
- gsize *out_raw_len)
+lldp_neighbor_get_raw(LldpNeighbor *neigh, const guint8 **out_raw_data, gsize *out_raw_len)
{
- gconstpointer raw_data;
- gsize raw_len;
- int r;
+ gconstpointer raw_data;
+ gsize raw_len;
+ int r;
- nm_assert (neigh);
+ nm_assert(neigh);
- r = sd_lldp_neighbor_get_raw (neigh->neighbor_sd, &raw_data, &raw_len);
+ r = sd_lldp_neighbor_get_raw(neigh->neighbor_sd, &raw_data, &raw_len);
- nm_assert (r >= 0);
- nm_assert (raw_data);
- nm_assert (raw_len > 0);
+ nm_assert(r >= 0);
+ nm_assert(raw_data);
+ nm_assert(raw_len > 0);
- *out_raw_data = raw_data;
- *out_raw_len = raw_len;
+ *out_raw_data = raw_data;
+ *out_raw_len = raw_len;
}
static gboolean
-lldp_neighbor_id_get (struct sd_lldp_neighbor *neighbor_sd,
- guint8 *out_chassis_id_type,
- const guint8 **out_chassis_id,
- gsize *out_chassis_id_len,
- guint8 *out_port_id_type,
- const guint8 **out_port_id,
- gsize *out_port_id_len)
+lldp_neighbor_id_get(struct sd_lldp_neighbor *neighbor_sd,
+ guint8 * out_chassis_id_type,
+ const guint8 ** out_chassis_id,
+ gsize * out_chassis_id_len,
+ guint8 * out_port_id_type,
+ const guint8 ** out_port_id,
+ gsize * out_port_id_len)
{
- int r;
-
- r = sd_lldp_neighbor_get_chassis_id (neighbor_sd,
- out_chassis_id_type,
- (gconstpointer *) out_chassis_id,
- out_chassis_id_len);
- if (r < 0)
- return FALSE;
-
- r = sd_lldp_neighbor_get_port_id (neighbor_sd,
- out_port_id_type,
- (gconstpointer *) out_port_id,
- out_port_id_len);
- if (r < 0)
- return FALSE;
-
- return TRUE;
+ int r;
+
+ r = sd_lldp_neighbor_get_chassis_id(neighbor_sd,
+ out_chassis_id_type,
+ (gconstpointer *) out_chassis_id,
+ out_chassis_id_len);
+ if (r < 0)
+ return FALSE;
+
+ r = sd_lldp_neighbor_get_port_id(neighbor_sd,
+ out_port_id_type,
+ (gconstpointer *) out_port_id,
+ out_port_id_len);
+ if (r < 0)
+ return FALSE;
+
+ return TRUE;
}
static guint
-lldp_neighbor_id_hash (gconstpointer ptr)
+lldp_neighbor_id_hash(gconstpointer ptr)
{
- const LldpNeighbor *neigh = ptr;
- guint8 chassis_id_type;
- guint8 port_id_type;
- const guint8 *chassis_id;
- const guint8 *port_id;
- gsize chassis_id_len;
- gsize port_id_len;
- NMHashState h;
-
- if (!lldp_neighbor_id_get (neigh->neighbor_sd, &chassis_id_type, &chassis_id, &chassis_id_len, &port_id_type, &port_id, &port_id_len)) {
- nm_assert_not_reached ();
- return 0;
- }
-
- nm_hash_init (&h, 23423423u);
- nm_hash_update_vals (&h,
- chassis_id_len,
- port_id_len,
- chassis_id_type,
- port_id_type);
- nm_hash_update (&h, chassis_id, chassis_id_len);
- nm_hash_update (&h, port_id, port_id_len);
- return nm_hash_complete (&h);
+ const LldpNeighbor *neigh = ptr;
+ guint8 chassis_id_type;
+ guint8 port_id_type;
+ const guint8 * chassis_id;
+ const guint8 * port_id;
+ gsize chassis_id_len;
+ gsize port_id_len;
+ NMHashState h;
+
+ if (!lldp_neighbor_id_get(neigh->neighbor_sd,
+ &chassis_id_type,
+ &chassis_id,
+ &chassis_id_len,
+ &port_id_type,
+ &port_id,
+ &port_id_len)) {
+ nm_assert_not_reached();
+ return 0;
+ }
+
+ nm_hash_init(&h, 23423423u);
+ nm_hash_update_vals(&h, chassis_id_len, port_id_len, chassis_id_type, port_id_type);
+ nm_hash_update(&h, chassis_id, chassis_id_len);
+ nm_hash_update(&h, port_id, port_id_len);
+ return nm_hash_complete(&h);
}
static int
-lldp_neighbor_id_cmp (const LldpNeighbor *a, const LldpNeighbor *b)
+lldp_neighbor_id_cmp(const LldpNeighbor *a, const LldpNeighbor *b)
{
- guint8 a_chassis_id_type;
- guint8 b_chassis_id_type;
- guint8 a_port_id_type;
- guint8 b_port_id_type;
- const guint8 *a_chassis_id;
- const guint8 *b_chassis_id;
- const guint8 *a_port_id;
- const guint8 *b_port_id;
- gsize a_chassis_id_len;
- gsize b_chassis_id_len;
- gsize a_port_id_len;
- gsize b_port_id_len;
-
- NM_CMP_SELF (a, b);
-
- if (!lldp_neighbor_id_get (a->neighbor_sd, &a_chassis_id_type, &a_chassis_id, &a_chassis_id_len, &a_port_id_type, &a_port_id, &a_port_id_len)) {
- nm_assert_not_reached ();
- return FALSE;
- }
-
- if (!lldp_neighbor_id_get (b->neighbor_sd, &b_chassis_id_type, &b_chassis_id, &b_chassis_id_len, &b_port_id_type, &b_port_id, &b_port_id_len)) {
- nm_assert_not_reached ();
- return FALSE;
- }
-
- NM_CMP_DIRECT (a_chassis_id_type, b_chassis_id_type);
- NM_CMP_DIRECT (a_port_id_type, b_port_id_type);
- NM_CMP_DIRECT (a_chassis_id_len, b_chassis_id_len);
- NM_CMP_DIRECT (a_port_id_len, b_port_id_len);
- NM_CMP_DIRECT_MEMCMP (a_chassis_id, b_chassis_id, a_chassis_id_len);
- NM_CMP_DIRECT_MEMCMP (a_port_id, b_port_id, a_port_id_len);
- return 0;
+ guint8 a_chassis_id_type;
+ guint8 b_chassis_id_type;
+ guint8 a_port_id_type;
+ guint8 b_port_id_type;
+ const guint8 *a_chassis_id;
+ const guint8 *b_chassis_id;
+ const guint8 *a_port_id;
+ const guint8 *b_port_id;
+ gsize a_chassis_id_len;
+ gsize b_chassis_id_len;
+ gsize a_port_id_len;
+ gsize b_port_id_len;
+
+ NM_CMP_SELF(a, b);
+
+ if (!lldp_neighbor_id_get(a->neighbor_sd,
+ &a_chassis_id_type,
+ &a_chassis_id,
+ &a_chassis_id_len,
+ &a_port_id_type,
+ &a_port_id,
+ &a_port_id_len)) {
+ nm_assert_not_reached();
+ return FALSE;
+ }
+
+ if (!lldp_neighbor_id_get(b->neighbor_sd,
+ &b_chassis_id_type,
+ &b_chassis_id,
+ &b_chassis_id_len,
+ &b_port_id_type,
+ &b_port_id,
+ &b_port_id_len)) {
+ nm_assert_not_reached();
+ return FALSE;
+ }
+
+ NM_CMP_DIRECT(a_chassis_id_type, b_chassis_id_type);
+ NM_CMP_DIRECT(a_port_id_type, b_port_id_type);
+ NM_CMP_DIRECT(a_chassis_id_len, b_chassis_id_len);
+ NM_CMP_DIRECT(a_port_id_len, b_port_id_len);
+ NM_CMP_DIRECT_MEMCMP(a_chassis_id, b_chassis_id, a_chassis_id_len);
+ NM_CMP_DIRECT_MEMCMP(a_port_id, b_port_id, a_port_id_len);
+ return 0;
}
static int
-lldp_neighbor_id_cmp_p (gconstpointer a, gconstpointer b, gpointer user_data)
+lldp_neighbor_id_cmp_p(gconstpointer a, gconstpointer b, gpointer user_data)
{
- return lldp_neighbor_id_cmp (*((const LldpNeighbor *const*) a),
- *((const LldpNeighbor *const*) b));
+ return lldp_neighbor_id_cmp(*((const LldpNeighbor *const *) a),
+ *((const LldpNeighbor *const *) b));
}
static gboolean
-lldp_neighbor_id_equal (gconstpointer a, gconstpointer b)
+lldp_neighbor_id_equal(gconstpointer a, gconstpointer b)
{
- return lldp_neighbor_id_cmp (a, b) == 0;
+ return lldp_neighbor_id_cmp(a, b) == 0;
}
static void
-lldp_neighbor_free (LldpNeighbor *neighbor)
+lldp_neighbor_free(LldpNeighbor *neighbor)
{
- if (!neighbor)
- return;
-
- g_free (neighbor->chassis_id);
- g_free (neighbor->port_id);
- nm_g_variant_unref (neighbor->variant);
- sd_lldp_neighbor_unref (neighbor->neighbor_sd);
- nm_g_slice_free (neighbor);
+ if (!neighbor)
+ return;
+
+ g_free(neighbor->chassis_id);
+ g_free(neighbor->port_id);
+ nm_g_variant_unref(neighbor->variant);
+ sd_lldp_neighbor_unref(neighbor->neighbor_sd);
+ nm_g_slice_free(neighbor);
}
static void
-lldp_neighbor_freep (LldpNeighbor **ptr)
+lldp_neighbor_freep(LldpNeighbor **ptr)
{
- lldp_neighbor_free (*ptr);
+ lldp_neighbor_free(*ptr);
}
static gboolean
-lldp_neighbor_equal (LldpNeighbor *a, LldpNeighbor *b)
+lldp_neighbor_equal(LldpNeighbor *a, LldpNeighbor *b)
{
- const guint8 *raw_data_a;
- const guint8 *raw_data_b;
- gsize raw_len_a;
- gsize raw_len_b;
-
- if (a->neighbor_sd == b->neighbor_sd)
- return TRUE;
-
- lldp_neighbor_get_raw (a, &raw_data_a, &raw_len_a);
- lldp_neighbor_get_raw (b, &raw_data_b, &raw_len_b);
- return raw_len_a == raw_len_b
- && (memcmp (raw_data_a, raw_data_b, raw_len_a) == 0);
+ const guint8 *raw_data_a;
+ const guint8 *raw_data_b;
+ gsize raw_len_a;
+ gsize raw_len_b;
+
+ if (a->neighbor_sd == b->neighbor_sd)
+ return TRUE;
+
+ lldp_neighbor_get_raw(a, &raw_data_a, &raw_len_a);
+ lldp_neighbor_get_raw(b, &raw_data_b, &raw_len_b);
+ return raw_len_a == raw_len_b && (memcmp(raw_data_a, raw_data_b, raw_len_a) == 0);
}
static GVariant *
-parse_management_address_tlv (const uint8_t *data, gsize len)
+parse_management_address_tlv(const uint8_t *data, gsize len)
{
- GVariantBuilder builder;
- gsize addr_len;
- const guint8 *v_object_id_arr;
- gsize v_object_id_len;
- const guint8 *v_address_arr;
- gsize v_address_len;
- guint32 v_interface_number;
- guint32 v_interface_number_subtype;
- guint32 v_address_subtype;
-
- /* 802.1AB-2009 - Figure 8-11
+ GVariantBuilder builder;
+ gsize addr_len;
+ const guint8 * v_object_id_arr;
+ gsize v_object_id_len;
+ const guint8 * v_address_arr;
+ gsize v_address_len;
+ guint32 v_interface_number;
+ guint32 v_interface_number_subtype;
+ guint32 v_address_subtype;
+
+ /* 802.1AB-2009 - Figure 8-11
*
* - TLV type / length (2 bytes)
* - address string length (1 byte)
@@ -284,800 +299,824 @@ parse_management_address_tlv (const uint8_t *data, gsize len)
* - OID (0 to 128 bytes)
*/
- if (len < 11)
- return NULL;
-
- nm_assert ((data[0] >> 1) == SD_LLDP_TYPE_MGMT_ADDRESS);
- nm_assert ((((data[0] & 1) << 8) + data[1]) + 2 == len);
-
- data += 2;
- len -= 2;
- addr_len = *data; /* length of (address subtype + address) */
-
- if (addr_len < 2 || addr_len > 32)
- return NULL;
- if (len < ( 1 /* address stringth length */
- + addr_len /* address subtype + address */
- + 5 /* interface */
- + 1)) /* oid */
- return NULL;
-
- data++;
- len--;
- v_address_subtype = *data;
- v_address_arr = &data[1];
- v_address_len = addr_len - 1;
-
- data += addr_len;
- len -= addr_len;
- v_interface_number_subtype = *data;
-
- data++;
- len--;
- v_interface_number = unaligned_read_be32 (data);
-
- data += 4;
- len -= 4;
- v_object_id_len = *data;
- if (len < (1 + v_object_id_len))
- return NULL;
- data++;
- v_object_id_arr = data;
-
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
- nm_g_variant_builder_add_sv_uint32 (&builder, "address-subtype", v_address_subtype);
- nm_g_variant_builder_add_sv_bytearray (&builder, "address", v_address_arr, v_address_len);
- nm_g_variant_builder_add_sv_uint32 (&builder, "interface-number-subtype", v_interface_number_subtype);
- nm_g_variant_builder_add_sv_uint32 (&builder, "interface-number", v_interface_number);
- if (v_object_id_len > 0)
- nm_g_variant_builder_add_sv_bytearray (&builder, "object-id", v_object_id_arr, v_object_id_len);
- return g_variant_builder_end (&builder);
+ if (len < 11)
+ return NULL;
+
+ nm_assert((data[0] >> 1) == SD_LLDP_TYPE_MGMT_ADDRESS);
+ nm_assert((((data[0] & 1) << 8) + data[1]) + 2 == len);
+
+ data += 2;
+ len -= 2;
+ addr_len = *data; /* length of (address subtype + address) */
+
+ if (addr_len < 2 || addr_len > 32)
+ return NULL;
+ if (len < (1 /* address stringth length */
+ + addr_len /* address subtype + address */
+ + 5 /* interface */
+ + 1)) /* oid */
+ return NULL;
+
+ data++;
+ len--;
+ v_address_subtype = *data;
+ v_address_arr = &data[1];
+ v_address_len = addr_len - 1;
+
+ data += addr_len;
+ len -= addr_len;
+ v_interface_number_subtype = *data;
+
+ data++;
+ len--;
+ v_interface_number = unaligned_read_be32(data);
+
+ data += 4;
+ len -= 4;
+ v_object_id_len = *data;
+ if (len < (1 + v_object_id_len))
+ return NULL;
+ data++;
+ v_object_id_arr = data;
+
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
+ nm_g_variant_builder_add_sv_uint32(&builder, "address-subtype", v_address_subtype);
+ nm_g_variant_builder_add_sv_bytearray(&builder, "address", v_address_arr, v_address_len);
+ nm_g_variant_builder_add_sv_uint32(&builder,
+ "interface-number-subtype",
+ v_interface_number_subtype);
+ nm_g_variant_builder_add_sv_uint32(&builder, "interface-number", v_interface_number);
+ if (v_object_id_len > 0)
+ nm_g_variant_builder_add_sv_bytearray(&builder,
+ "object-id",
+ v_object_id_arr,
+ v_object_id_len);
+ return g_variant_builder_end(&builder);
}
static char *
-format_network_address (const guint8 *data, gsize sz)
+format_network_address(const guint8 *data, gsize sz)
{
- NMIPAddr a;
- int family;
-
- if ( sz == 5
- && data[0] == 1 /* LLDP_MGMT_ADDR_IP4 */) {
- memcpy (&a, &data[1], sizeof (a.addr4));
- family = AF_INET;
- } else if ( sz == 17
- && data[0] == 2 /* LLDP_MGMT_ADDR_IP6 */) {
- memcpy (&a, &data[1], sizeof (a.addr6));
- family = AF_INET6;
- } else
- return NULL;
-
- return nm_utils_inet_ntop_dup (family, &a);
+ NMIPAddr a;
+ int family;
+
+ if (sz == 5 && data[0] == 1 /* LLDP_MGMT_ADDR_IP4 */) {
+ memcpy(&a, &data[1], sizeof(a.addr4));
+ family = AF_INET;
+ } else if (sz == 17 && data[0] == 2 /* LLDP_MGMT_ADDR_IP6 */) {
+ memcpy(&a, &data[1], sizeof(a.addr6));
+ family = AF_INET6;
+ } else
+ return NULL;
+
+ return nm_utils_inet_ntop_dup(family, &a);
}
static const char *
-format_string (const guint8 *data, gsize len, gboolean allow_trim, char **out_to_free)
+format_string(const guint8 *data, gsize len, gboolean allow_trim, char **out_to_free)
{
- gboolean is_null_terminated = FALSE;
+ gboolean is_null_terminated = FALSE;
- nm_assert (out_to_free && !*out_to_free);
+ nm_assert(out_to_free && !*out_to_free);
- if (allow_trim) {
- while ( len > 0
- && data[len - 1] == '\0') {
- is_null_terminated = TRUE;
- len--;
- }
- }
+ if (allow_trim) {
+ while (len > 0 && data[len - 1] == '\0') {
+ is_null_terminated = TRUE;
+ len--;
+ }
+ }
- if (len == 0)
- return NULL;
+ if (len == 0)
+ return NULL;
- if (memchr (data, len, '\0'))
- return NULL;
+ if (memchr(data, len, '\0'))
+ return NULL;
- return nm_utils_buf_utf8safe_escape (data,
- is_null_terminated ? -1 : (gssize) len,
- NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL
- | NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII,
- out_to_free);
+ return nm_utils_buf_utf8safe_escape(data,
+ is_null_terminated ? -1 : (gssize) len,
+ NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL
+ | NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII,
+ out_to_free);
}
static char *
-format_string_cp (const guint8 *data, gsize len, gboolean allow_trim)
+format_string_cp(const guint8 *data, gsize len, gboolean allow_trim)
{
- char *s_free = NULL;
- const char *s;
+ char * s_free = NULL;
+ const char *s;
- s = format_string (data, len, allow_trim, &s_free);
- nm_assert (!s_free || s == s_free);
- return s ? (s_free ?: g_strdup (s)) : NULL;
+ s = format_string(data, len, allow_trim, &s_free);
+ nm_assert(!s_free || s == s_free);
+ return s ? (s_free ?: g_strdup(s)) : NULL;
}
static LldpNeighbor *
-lldp_neighbor_new (sd_lldp_neighbor *neighbor_sd)
+lldp_neighbor_new(sd_lldp_neighbor *neighbor_sd)
{
- LldpNeighbor *neigh;
- guint8 chassis_id_type;
- guint8 port_id_type;
- const guint8 *chassis_id;
- const guint8 *port_id;
- gsize chassis_id_len;
- gsize port_id_len;
- gs_free char *s_chassis_id = NULL;
- gs_free char *s_port_id = NULL;
-
- if (!lldp_neighbor_id_get (neighbor_sd,
- &chassis_id_type,
- &chassis_id,
- &chassis_id_len,
- &port_id_type,
- &port_id,
- &port_id_len))
- return NULL;
-
- switch (chassis_id_type) {
- case SD_LLDP_CHASSIS_SUBTYPE_CHASSIS_COMPONENT:
- case SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS:
- case SD_LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT:
- case SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME:
- case SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED:
- s_chassis_id = format_string_cp (chassis_id, chassis_id_len, FALSE);
- break;
- case SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS:
- s_chassis_id = nm_utils_hwaddr_ntoa (chassis_id, chassis_id_len);
- break;
- case SD_LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS:
- s_chassis_id = format_network_address (chassis_id, chassis_id_len);
- break;
- }
- if (!s_chassis_id) {
- /* Invalid/unsupported chassis_id? Expose as hex string. This format is not stable, and
+ LldpNeighbor *neigh;
+ guint8 chassis_id_type;
+ guint8 port_id_type;
+ const guint8 *chassis_id;
+ const guint8 *port_id;
+ gsize chassis_id_len;
+ gsize port_id_len;
+ gs_free char *s_chassis_id = NULL;
+ gs_free char *s_port_id = NULL;
+
+ if (!lldp_neighbor_id_get(neighbor_sd,
+ &chassis_id_type,
+ &chassis_id,
+ &chassis_id_len,
+ &port_id_type,
+ &port_id,
+ &port_id_len))
+ return NULL;
+
+ switch (chassis_id_type) {
+ case SD_LLDP_CHASSIS_SUBTYPE_CHASSIS_COMPONENT:
+ case SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS:
+ case SD_LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT:
+ case SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME:
+ case SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED:
+ s_chassis_id = format_string_cp(chassis_id, chassis_id_len, FALSE);
+ break;
+ case SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS:
+ s_chassis_id = nm_utils_hwaddr_ntoa(chassis_id, chassis_id_len);
+ break;
+ case SD_LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS:
+ s_chassis_id = format_network_address(chassis_id, chassis_id_len);
+ break;
+ }
+ if (!s_chassis_id) {
+ /* Invalid/unsupported chassis_id? Expose as hex string. This format is not stable, and
* in the future we may add a better string representation for these case (thus
* changing the API). */
- s_chassis_id = nm_utils_bin2hexstr_full (chassis_id, chassis_id_len, '\0', FALSE, NULL);
- }
-
- switch (port_id_type) {
- case SD_LLDP_PORT_SUBTYPE_INTERFACE_ALIAS:
- case SD_LLDP_PORT_SUBTYPE_PORT_COMPONENT:
- case SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME:
- case SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED:
- s_port_id = format_string_cp (port_id, port_id_len, FALSE);
- break;
- case SD_LLDP_PORT_SUBTYPE_MAC_ADDRESS:
- s_port_id = nm_utils_hwaddr_ntoa (port_id, port_id_len);
- break;
- case SD_LLDP_PORT_SUBTYPE_NETWORK_ADDRESS:
- s_port_id = format_network_address (port_id, port_id_len);
- break;
- }
- if (!s_port_id) {
- /* Invalid/unsupported port_id? Expose as hex string. This format is not stable, and
+ s_chassis_id = nm_utils_bin2hexstr_full(chassis_id, chassis_id_len, '\0', FALSE, NULL);
+ }
+
+ switch (port_id_type) {
+ case SD_LLDP_PORT_SUBTYPE_INTERFACE_ALIAS:
+ case SD_LLDP_PORT_SUBTYPE_PORT_COMPONENT:
+ case SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME:
+ case SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED:
+ s_port_id = format_string_cp(port_id, port_id_len, FALSE);
+ break;
+ case SD_LLDP_PORT_SUBTYPE_MAC_ADDRESS:
+ s_port_id = nm_utils_hwaddr_ntoa(port_id, port_id_len);
+ break;
+ case SD_LLDP_PORT_SUBTYPE_NETWORK_ADDRESS:
+ s_port_id = format_network_address(port_id, port_id_len);
+ break;
+ }
+ if (!s_port_id) {
+ /* Invalid/unsupported port_id? Expose as hex string. This format is not stable, and
* in the future we may add a better string representation for these case (thus
* changing the API). */
- s_port_id = nm_utils_bin2hexstr_full (port_id, port_id_len, '\0', FALSE, NULL);
- }
-
- neigh = g_slice_new (LldpNeighbor);
- *neigh = (LldpNeighbor) {
- .neighbor_sd = sd_lldp_neighbor_ref (neighbor_sd),
- .chassis_id_type = chassis_id_type,
- .chassis_id = g_steal_pointer (&s_chassis_id),
- .port_id_type = port_id_type,
- .port_id = g_steal_pointer (&s_port_id),
- };
- return neigh;
+ s_port_id = nm_utils_bin2hexstr_full(port_id, port_id_len, '\0', FALSE, NULL);
+ }
+
+ neigh = g_slice_new(LldpNeighbor);
+ *neigh = (LldpNeighbor){
+ .neighbor_sd = sd_lldp_neighbor_ref(neighbor_sd),
+ .chassis_id_type = chassis_id_type,
+ .chassis_id = g_steal_pointer(&s_chassis_id),
+ .port_id_type = port_id_type,
+ .port_id = g_steal_pointer(&s_port_id),
+ };
+ return neigh;
}
static GVariant *
-lldp_neighbor_to_variant (LldpNeighbor *neigh)
+lldp_neighbor_to_variant(LldpNeighbor *neigh)
{
- struct ether_addr destination_address;
- GVariantBuilder builder;
- const char *str;
- const guint8 *raw_data;
- gsize raw_len;
- uint16_t u16;
- uint8_t *data8;
- gsize len;
- int r;
-
- if (neigh->variant)
- return neigh->variant;
-
- lldp_neighbor_get_raw (neigh, &raw_data, &raw_len);
-
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
-
- nm_g_variant_builder_add_sv_bytearray (&builder,
- NM_LLDP_ATTR_RAW,
- raw_data,
- raw_len);
- nm_g_variant_builder_add_sv_uint32 (&builder, NM_LLDP_ATTR_CHASSIS_ID_TYPE, neigh->chassis_id_type);
- nm_g_variant_builder_add_sv_str (&builder, NM_LLDP_ATTR_CHASSIS_ID, neigh->chassis_id);
- nm_g_variant_builder_add_sv_uint32 (&builder, NM_LLDP_ATTR_PORT_ID_TYPE, neigh->port_id_type);
- nm_g_variant_builder_add_sv_str (&builder, NM_LLDP_ATTR_PORT_ID, neigh->port_id);
-
- r = sd_lldp_neighbor_get_destination_address (neigh->neighbor_sd, &destination_address);
- if (r < 0)
- str = NULL;
- else if (nm_utils_ether_addr_equal (&destination_address, LLDP_MAC_NEAREST_BRIDGE))
- str = NM_LLDP_DEST_NEAREST_BRIDGE;
- else if (nm_utils_ether_addr_equal (&destination_address, LLDP_MAC_NEAREST_NON_TPMR_BRIDGE))
- str = NM_LLDP_DEST_NEAREST_NON_TPMR_BRIDGE;
- else if (nm_utils_ether_addr_equal (&destination_address, LLDP_MAC_NEAREST_CUSTOMER_BRIDGE))
- str = NM_LLDP_DEST_NEAREST_CUSTOMER_BRIDGE;
- else
- str = NULL;
- if (str)
- nm_g_variant_builder_add_sv_str (&builder, NM_LLDP_ATTR_DESTINATION, str);
-
- if (sd_lldp_neighbor_get_port_description (neigh->neighbor_sd, &str) == 0)
- nm_g_variant_builder_add_sv_str (&builder, NM_LLDP_ATTR_PORT_DESCRIPTION, str);
-
- if (sd_lldp_neighbor_get_system_name (neigh->neighbor_sd, &str) == 0)
- nm_g_variant_builder_add_sv_str (&builder, NM_LLDP_ATTR_SYSTEM_NAME, str);
-
- if (sd_lldp_neighbor_get_system_description (neigh->neighbor_sd, &str) == 0)
- nm_g_variant_builder_add_sv_str (&builder, NM_LLDP_ATTR_SYSTEM_DESCRIPTION, str);
-
- if (sd_lldp_neighbor_get_system_capabilities (neigh->neighbor_sd, &u16) == 0)
- nm_g_variant_builder_add_sv_uint32 (&builder, NM_LLDP_ATTR_SYSTEM_CAPABILITIES, u16);
-
- r = sd_lldp_neighbor_tlv_rewind (neigh->neighbor_sd);
- if (r < 0)
- nm_assert_not_reached ();
- else {
- gboolean v_management_addresses_has = FALSE;
- GVariantBuilder v_management_addresses;
- GVariant *v_ieee_802_1_pvid = NULL;
- GVariant *v_ieee_802_1_ppvid = NULL;
- GVariant *v_ieee_802_1_ppvid_flags = NULL;
- GVariantBuilder v_ieee_802_1_ppvids;
- GVariant *v_ieee_802_1_vid = NULL;
- GVariant *v_ieee_802_1_vlan_name = NULL;
- GVariantBuilder v_ieee_802_1_vlans;
- GVariant *v_ieee_802_3_mac_phy_conf = NULL;
- GVariant *v_ieee_802_3_power_via_mdi = NULL;
- GVariant *v_ieee_802_3_max_frame_size = NULL;
- GVariant *v_mud_url = NULL;
- GVariantBuilder tmp_builder;
- GVariant *tmp_variant;
-
- do {
- guint8 oui[3];
- guint8 type;
- guint8 subtype;
-
- if (sd_lldp_neighbor_tlv_get_type (neigh->neighbor_sd, &type) < 0)
- continue;
-
- if (sd_lldp_neighbor_tlv_get_raw (neigh->neighbor_sd, (void *) &data8, &len) < 0)
- continue;
-
- switch (type) {
- case SD_LLDP_TYPE_MGMT_ADDRESS:
- tmp_variant = parse_management_address_tlv (data8, len);
- if (tmp_variant) {
- if (!v_management_addresses_has) {
- v_management_addresses_has = TRUE;
- g_variant_builder_init (&v_management_addresses, G_VARIANT_TYPE ("aa{sv}"));
- }
- g_variant_builder_add_value (&v_management_addresses, tmp_variant);
- }
- continue;
- case SD_LLDP_TYPE_PRIVATE:
- break;
- default:
- continue;
- }
-
- r = sd_lldp_neighbor_tlv_get_oui (neigh->neighbor_sd, oui, &subtype);
- if (r < 0) {
- if (r == -ENXIO)
- continue;
-
- /* in other cases, something is seriously wrong. Abort, but
+ struct ether_addr destination_address;
+ GVariantBuilder builder;
+ const char * str;
+ const guint8 * raw_data;
+ gsize raw_len;
+ uint16_t u16;
+ uint8_t * data8;
+ gsize len;
+ int r;
+
+ if (neigh->variant)
+ return neigh->variant;
+
+ lldp_neighbor_get_raw(neigh, &raw_data, &raw_len);
+
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
+
+ nm_g_variant_builder_add_sv_bytearray(&builder, NM_LLDP_ATTR_RAW, raw_data, raw_len);
+ nm_g_variant_builder_add_sv_uint32(&builder,
+ NM_LLDP_ATTR_CHASSIS_ID_TYPE,
+ neigh->chassis_id_type);
+ nm_g_variant_builder_add_sv_str(&builder, NM_LLDP_ATTR_CHASSIS_ID, neigh->chassis_id);
+ nm_g_variant_builder_add_sv_uint32(&builder, NM_LLDP_ATTR_PORT_ID_TYPE, neigh->port_id_type);
+ nm_g_variant_builder_add_sv_str(&builder, NM_LLDP_ATTR_PORT_ID, neigh->port_id);
+
+ r = sd_lldp_neighbor_get_destination_address(neigh->neighbor_sd, &destination_address);
+ if (r < 0)
+ str = NULL;
+ else if (nm_utils_ether_addr_equal(&destination_address, LLDP_MAC_NEAREST_BRIDGE))
+ str = NM_LLDP_DEST_NEAREST_BRIDGE;
+ else if (nm_utils_ether_addr_equal(&destination_address, LLDP_MAC_NEAREST_NON_TPMR_BRIDGE))
+ str = NM_LLDP_DEST_NEAREST_NON_TPMR_BRIDGE;
+ else if (nm_utils_ether_addr_equal(&destination_address, LLDP_MAC_NEAREST_CUSTOMER_BRIDGE))
+ str = NM_LLDP_DEST_NEAREST_CUSTOMER_BRIDGE;
+ else
+ str = NULL;
+ if (str)
+ nm_g_variant_builder_add_sv_str(&builder, NM_LLDP_ATTR_DESTINATION, str);
+
+ if (sd_lldp_neighbor_get_port_description(neigh->neighbor_sd, &str) == 0)
+ nm_g_variant_builder_add_sv_str(&builder, NM_LLDP_ATTR_PORT_DESCRIPTION, str);
+
+ if (sd_lldp_neighbor_get_system_name(neigh->neighbor_sd, &str) == 0)
+ nm_g_variant_builder_add_sv_str(&builder, NM_LLDP_ATTR_SYSTEM_NAME, str);
+
+ if (sd_lldp_neighbor_get_system_description(neigh->neighbor_sd, &str) == 0)
+ nm_g_variant_builder_add_sv_str(&builder, NM_LLDP_ATTR_SYSTEM_DESCRIPTION, str);
+
+ if (sd_lldp_neighbor_get_system_capabilities(neigh->neighbor_sd, &u16) == 0)
+ nm_g_variant_builder_add_sv_uint32(&builder, NM_LLDP_ATTR_SYSTEM_CAPABILITIES, u16);
+
+ r = sd_lldp_neighbor_tlv_rewind(neigh->neighbor_sd);
+ if (r < 0)
+ nm_assert_not_reached();
+ else {
+ gboolean v_management_addresses_has = FALSE;
+ GVariantBuilder v_management_addresses;
+ GVariant * v_ieee_802_1_pvid = NULL;
+ GVariant * v_ieee_802_1_ppvid = NULL;
+ GVariant * v_ieee_802_1_ppvid_flags = NULL;
+ GVariantBuilder v_ieee_802_1_ppvids;
+ GVariant * v_ieee_802_1_vid = NULL;
+ GVariant * v_ieee_802_1_vlan_name = NULL;
+ GVariantBuilder v_ieee_802_1_vlans;
+ GVariant * v_ieee_802_3_mac_phy_conf = NULL;
+ GVariant * v_ieee_802_3_power_via_mdi = NULL;
+ GVariant * v_ieee_802_3_max_frame_size = NULL;
+ GVariant * v_mud_url = NULL;
+ GVariantBuilder tmp_builder;
+ GVariant * tmp_variant;
+
+ do {
+ guint8 oui[3];
+ guint8 type;
+ guint8 subtype;
+
+ if (sd_lldp_neighbor_tlv_get_type(neigh->neighbor_sd, &type) < 0)
+ continue;
+
+ if (sd_lldp_neighbor_tlv_get_raw(neigh->neighbor_sd, (void *) &data8, &len) < 0)
+ continue;
+
+ switch (type) {
+ case SD_LLDP_TYPE_MGMT_ADDRESS:
+ tmp_variant = parse_management_address_tlv(data8, len);
+ if (tmp_variant) {
+ if (!v_management_addresses_has) {
+ v_management_addresses_has = TRUE;
+ g_variant_builder_init(&v_management_addresses, G_VARIANT_TYPE("aa{sv}"));
+ }
+ g_variant_builder_add_value(&v_management_addresses, tmp_variant);
+ }
+ continue;
+ case SD_LLDP_TYPE_PRIVATE:
+ break;
+ default:
+ continue;
+ }
+
+ r = sd_lldp_neighbor_tlv_get_oui(neigh->neighbor_sd, oui, &subtype);
+ if (r < 0) {
+ if (r == -ENXIO)
+ continue;
+
+ /* in other cases, something is seriously wrong. Abort, but
* keep what we parsed so far. */
- break;
- }
+ break;
+ }
- if (len <= 6)
- continue;
+ if (len <= 6)
+ continue;
- /* skip over leading TLV, OUI and subtype */
+ /* skip over leading TLV, OUI and subtype */
#if NM_MORE_ASSERTS > 5
- {
- guint8 check_hdr[] = {
- 0xfe | (((len - 2) >> 8) & 0x01), ((len - 2) & 0xFF),
- oui[0], oui[1], oui[2],
- subtype
- };
-
- nm_assert (len > 2 + 3 +1);
- nm_assert (memcmp (data8, check_hdr, sizeof check_hdr) == 0);
- }
+ {
+ guint8 check_hdr[] = {0xfe | (((len - 2) >> 8) & 0x01),
+ ((len - 2) & 0xFF),
+ oui[0],
+ oui[1],
+ oui[2],
+ subtype};
+
+ nm_assert(len > 2 + 3 + 1);
+ nm_assert(memcmp(data8, check_hdr, sizeof check_hdr) == 0);
+ }
#endif
- data8 += 6;
- len -= 6;
-
- if (memcmp (oui, SD_LLDP_OUI_802_1, sizeof (oui)) == 0) {
- switch (subtype) {
- case SD_LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID:
- if (len != 2)
- continue;
- if (!v_ieee_802_1_pvid)
- v_ieee_802_1_pvid = g_variant_new_uint32 (unaligned_read_be16 (data8));
- break;
- case SD_LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID:
- if (len != 3)
- continue;
- if (!v_ieee_802_1_ppvid) {
- v_ieee_802_1_ppvid_flags = g_variant_new_uint32 (data8[0]);
- v_ieee_802_1_ppvid = g_variant_new_uint32 (unaligned_read_be16 (&data8[1]));
- g_variant_builder_init (&v_ieee_802_1_ppvids, G_VARIANT_TYPE ("aa{sv}"));
- }
- g_variant_builder_init (&tmp_builder, G_VARIANT_TYPE ("a{sv}"));
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "ppvid", unaligned_read_be16 (&data8[1]));
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "flags", data8[0]);
- g_variant_builder_add_value (&v_ieee_802_1_ppvids, g_variant_builder_end (&tmp_builder));
- break;
- case SD_LLDP_OUI_802_1_SUBTYPE_VLAN_NAME: {
- gs_free char *name_to_free = NULL;
- const char *name;
- guint32 vid;
- gsize l;
-
- if (len <= 3)
- continue;
-
- l = data8[2];
- if (len != 3 + l)
- continue;
- if (l > 32)
- continue;
-
- name = format_string (&data8[3], l, TRUE, &name_to_free);
- if (!name)
- continue;
-
- vid = unaligned_read_be16 (&data8[0]);
- if (!v_ieee_802_1_vid) {
- v_ieee_802_1_vid = g_variant_new_uint32 (vid);
- v_ieee_802_1_vlan_name = g_variant_new_string (name);
- g_variant_builder_init (&v_ieee_802_1_vlans, G_VARIANT_TYPE ("aa{sv}"));
- }
- g_variant_builder_init (&tmp_builder, G_VARIANT_TYPE ("a{sv}"));
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "vid", vid);
- nm_g_variant_builder_add_sv_str (&tmp_builder, "name", name);
- g_variant_builder_add_value (&v_ieee_802_1_vlans, g_variant_builder_end (&tmp_builder));
- break;
- }
- default:
- continue;
- }
- } else if (memcmp (oui, SD_LLDP_OUI_802_3, sizeof (oui)) == 0) {
- switch (subtype) {
- case SD_LLDP_OUI_802_3_SUBTYPE_MAC_PHY_CONFIG_STATUS:
- if (len != 5)
- continue;
-
- if (!v_ieee_802_3_mac_phy_conf) {
- g_variant_builder_init (&tmp_builder, G_VARIANT_TYPE ("a{sv}"));
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "autoneg", data8[0]);
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "pmd-autoneg-cap", unaligned_read_be16 (&data8[1]));
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "operational-mau-type", unaligned_read_be16 (&data8[3]));
- v_ieee_802_3_mac_phy_conf = g_variant_builder_end (&tmp_builder);
- }
- break;
- case SD_LLDP_OUI_802_3_SUBTYPE_POWER_VIA_MDI:
- if (len != 3)
- continue;
-
- if (!v_ieee_802_3_power_via_mdi) {
- g_variant_builder_init (&tmp_builder, G_VARIANT_TYPE ("a{sv}"));
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "mdi-power-support", data8[0]);
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "pse-power-pair", data8[1]);
- nm_g_variant_builder_add_sv_uint32 (&tmp_builder, "power-class", data8[2]);
- v_ieee_802_3_power_via_mdi = g_variant_builder_end (&tmp_builder);
- }
- break;
- case SD_LLDP_OUI_802_3_SUBTYPE_MAXIMUM_FRAME_SIZE:
- if (len != 2)
- continue;
- if (!v_ieee_802_3_max_frame_size)
- v_ieee_802_3_max_frame_size = g_variant_new_uint32 (unaligned_read_be16 (data8));
- break;
- }
- } else if (memcmp (oui, SD_LLDP_OUI_MUD, sizeof (oui)) == 0) {
- switch (subtype) {
- case SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION:
- if (!v_mud_url) {
- gs_free char *s_free = NULL;
- const char *s;
-
- s = format_string (data8, len, TRUE, &s_free);
- if (s)
- v_mud_url = g_variant_new_string (s);
- }
- break;
- }
- }
- } while (sd_lldp_neighbor_tlv_next (neigh->neighbor_sd) > 0);
-
- if (v_management_addresses_has)
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_MANAGEMENT_ADDRESSES, g_variant_builder_end (&v_management_addresses));
- if (v_ieee_802_1_pvid)
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_1_PVID, v_ieee_802_1_pvid);
- if (v_ieee_802_1_ppvid) {
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_1_PPVID, v_ieee_802_1_ppvid);
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_1_PPVID_FLAGS, v_ieee_802_1_ppvid_flags);
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_1_PPVIDS, g_variant_builder_end (&v_ieee_802_1_ppvids));
- }
- if (v_ieee_802_1_vid) {
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_1_VID, v_ieee_802_1_vid);
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_1_VLAN_NAME, v_ieee_802_1_vlan_name);
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_1_VLANS, g_variant_builder_end (&v_ieee_802_1_vlans));
- }
- if (v_ieee_802_3_mac_phy_conf)
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_3_MAC_PHY_CONF, v_ieee_802_3_mac_phy_conf);
- if (v_ieee_802_3_power_via_mdi)
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_3_POWER_VIA_MDI, v_ieee_802_3_power_via_mdi);
- if (v_ieee_802_3_max_frame_size)
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_IEEE_802_3_MAX_FRAME_SIZE, v_ieee_802_3_max_frame_size);
- if (v_mud_url)
- nm_g_variant_builder_add_sv (&builder, NM_LLDP_ATTR_MUD_URL, v_mud_url);
- }
-
- return (neigh->variant = g_variant_ref_sink (g_variant_builder_end (&builder)));
+ data8 += 6;
+ len -= 6;
+
+ if (memcmp(oui, SD_LLDP_OUI_802_1, sizeof(oui)) == 0) {
+ switch (subtype) {
+ case SD_LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID:
+ if (len != 2)
+ continue;
+ if (!v_ieee_802_1_pvid)
+ v_ieee_802_1_pvid = g_variant_new_uint32(unaligned_read_be16(data8));
+ break;
+ case SD_LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID:
+ if (len != 3)
+ continue;
+ if (!v_ieee_802_1_ppvid) {
+ v_ieee_802_1_ppvid_flags = g_variant_new_uint32(data8[0]);
+ v_ieee_802_1_ppvid = g_variant_new_uint32(unaligned_read_be16(&data8[1]));
+ g_variant_builder_init(&v_ieee_802_1_ppvids, G_VARIANT_TYPE("aa{sv}"));
+ }
+ g_variant_builder_init(&tmp_builder, G_VARIANT_TYPE("a{sv}"));
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder,
+ "ppvid",
+ unaligned_read_be16(&data8[1]));
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder, "flags", data8[0]);
+ g_variant_builder_add_value(&v_ieee_802_1_ppvids,
+ g_variant_builder_end(&tmp_builder));
+ break;
+ case SD_LLDP_OUI_802_1_SUBTYPE_VLAN_NAME:
+ {
+ gs_free char *name_to_free = NULL;
+ const char * name;
+ guint32 vid;
+ gsize l;
+
+ if (len <= 3)
+ continue;
+
+ l = data8[2];
+ if (len != 3 + l)
+ continue;
+ if (l > 32)
+ continue;
+
+ name = format_string(&data8[3], l, TRUE, &name_to_free);
+ if (!name)
+ continue;
+
+ vid = unaligned_read_be16(&data8[0]);
+ if (!v_ieee_802_1_vid) {
+ v_ieee_802_1_vid = g_variant_new_uint32(vid);
+ v_ieee_802_1_vlan_name = g_variant_new_string(name);
+ g_variant_builder_init(&v_ieee_802_1_vlans, G_VARIANT_TYPE("aa{sv}"));
+ }
+ g_variant_builder_init(&tmp_builder, G_VARIANT_TYPE("a{sv}"));
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder, "vid", vid);
+ nm_g_variant_builder_add_sv_str(&tmp_builder, "name", name);
+ g_variant_builder_add_value(&v_ieee_802_1_vlans,
+ g_variant_builder_end(&tmp_builder));
+ break;
+ }
+ default:
+ continue;
+ }
+ } else if (memcmp(oui, SD_LLDP_OUI_802_3, sizeof(oui)) == 0) {
+ switch (subtype) {
+ case SD_LLDP_OUI_802_3_SUBTYPE_MAC_PHY_CONFIG_STATUS:
+ if (len != 5)
+ continue;
+
+ if (!v_ieee_802_3_mac_phy_conf) {
+ g_variant_builder_init(&tmp_builder, G_VARIANT_TYPE("a{sv}"));
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder, "autoneg", data8[0]);
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder,
+ "pmd-autoneg-cap",
+ unaligned_read_be16(&data8[1]));
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder,
+ "operational-mau-type",
+ unaligned_read_be16(&data8[3]));
+ v_ieee_802_3_mac_phy_conf = g_variant_builder_end(&tmp_builder);
+ }
+ break;
+ case SD_LLDP_OUI_802_3_SUBTYPE_POWER_VIA_MDI:
+ if (len != 3)
+ continue;
+
+ if (!v_ieee_802_3_power_via_mdi) {
+ g_variant_builder_init(&tmp_builder, G_VARIANT_TYPE("a{sv}"));
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder,
+ "mdi-power-support",
+ data8[0]);
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder,
+ "pse-power-pair",
+ data8[1]);
+ nm_g_variant_builder_add_sv_uint32(&tmp_builder, "power-class", data8[2]);
+ v_ieee_802_3_power_via_mdi = g_variant_builder_end(&tmp_builder);
+ }
+ break;
+ case SD_LLDP_OUI_802_3_SUBTYPE_MAXIMUM_FRAME_SIZE:
+ if (len != 2)
+ continue;
+ if (!v_ieee_802_3_max_frame_size)
+ v_ieee_802_3_max_frame_size =
+ g_variant_new_uint32(unaligned_read_be16(data8));
+ break;
+ }
+ } else if (memcmp(oui, SD_LLDP_OUI_MUD, sizeof(oui)) == 0) {
+ switch (subtype) {
+ case SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION:
+ if (!v_mud_url) {
+ gs_free char *s_free = NULL;
+ const char * s;
+
+ s = format_string(data8, len, TRUE, &s_free);
+ if (s)
+ v_mud_url = g_variant_new_string(s);
+ }
+ break;
+ }
+ }
+ } while (sd_lldp_neighbor_tlv_next(neigh->neighbor_sd) > 0);
+
+ if (v_management_addresses_has)
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_MANAGEMENT_ADDRESSES,
+ g_variant_builder_end(&v_management_addresses));
+ if (v_ieee_802_1_pvid)
+ nm_g_variant_builder_add_sv(&builder, NM_LLDP_ATTR_IEEE_802_1_PVID, v_ieee_802_1_pvid);
+ if (v_ieee_802_1_ppvid) {
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_1_PPVID,
+ v_ieee_802_1_ppvid);
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_1_PPVID_FLAGS,
+ v_ieee_802_1_ppvid_flags);
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_1_PPVIDS,
+ g_variant_builder_end(&v_ieee_802_1_ppvids));
+ }
+ if (v_ieee_802_1_vid) {
+ nm_g_variant_builder_add_sv(&builder, NM_LLDP_ATTR_IEEE_802_1_VID, v_ieee_802_1_vid);
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_1_VLAN_NAME,
+ v_ieee_802_1_vlan_name);
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_1_VLANS,
+ g_variant_builder_end(&v_ieee_802_1_vlans));
+ }
+ if (v_ieee_802_3_mac_phy_conf)
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_3_MAC_PHY_CONF,
+ v_ieee_802_3_mac_phy_conf);
+ if (v_ieee_802_3_power_via_mdi)
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_3_POWER_VIA_MDI,
+ v_ieee_802_3_power_via_mdi);
+ if (v_ieee_802_3_max_frame_size)
+ nm_g_variant_builder_add_sv(&builder,
+ NM_LLDP_ATTR_IEEE_802_3_MAX_FRAME_SIZE,
+ v_ieee_802_3_max_frame_size);
+ if (v_mud_url)
+ nm_g_variant_builder_add_sv(&builder, NM_LLDP_ATTR_MUD_URL, v_mud_url);
+ }
+
+ return (neigh->variant = g_variant_ref_sink(g_variant_builder_end(&builder)));
}
/*****************************************************************************/
GVariant *
-nmtst_lldp_parse_from_raw (const guint8 *raw_data,
- gsize raw_len)
+nmtst_lldp_parse_from_raw(const guint8 *raw_data, gsize raw_len)
{
- nm_auto (sd_lldp_neighbor_unrefp) sd_lldp_neighbor *neighbor_sd = NULL;
- nm_auto (lldp_neighbor_freep) LldpNeighbor *neigh = NULL;
- GVariant *variant;
- int r;
+ nm_auto(sd_lldp_neighbor_unrefp) sd_lldp_neighbor *neighbor_sd = NULL;
+ nm_auto(lldp_neighbor_freep) LldpNeighbor * neigh = NULL;
+ GVariant * variant;
+ int r;
- g_assert (raw_data);
- g_assert (raw_len > 0);
+ g_assert(raw_data);
+ g_assert(raw_len > 0);
- r = sd_lldp_neighbor_from_raw (&neighbor_sd, raw_data, raw_len);
- g_assert (r >= 0);
+ r = sd_lldp_neighbor_from_raw(&neighbor_sd, raw_data, raw_len);
+ g_assert(r >= 0);
- neigh = lldp_neighbor_new (neighbor_sd);
- g_assert (neigh);
+ neigh = lldp_neighbor_new(neighbor_sd);
+ g_assert(neigh);
- variant = lldp_neighbor_to_variant (neigh);
- g_assert (variant);
+ variant = lldp_neighbor_to_variant(neigh);
+ g_assert(variant);
- return g_variant_ref (variant);
+ return g_variant_ref(variant);
}
/*****************************************************************************/
static void
-data_changed_notify (NMLldpListener *self, NMLldpListenerPrivate *priv)
+data_changed_notify(NMLldpListener *self, NMLldpListenerPrivate *priv)
{
- nm_clear_g_variant (&priv->variant);
- _notify (self, PROP_NEIGHBORS);
+ nm_clear_g_variant(&priv->variant);
+ _notify(self, PROP_NEIGHBORS);
}
static gboolean
-data_changed_timeout (gpointer user_data)
+data_changed_timeout(gpointer user_data)
{
- NMLldpListener *self = user_data;
- NMLldpListenerPrivate *priv;
+ NMLldpListener * self = user_data;
+ NMLldpListenerPrivate *priv;
- g_return_val_if_fail (NM_IS_LLDP_LISTENER (self), G_SOURCE_REMOVE);
+ g_return_val_if_fail(NM_IS_LLDP_LISTENER(self), G_SOURCE_REMOVE);
- priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
+ priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
- priv->ratelimit_id = 0;
- priv->ratelimit_next_nsec = nm_utils_get_monotonic_timestamp_nsec() + MIN_UPDATE_INTERVAL_NSEC;
- data_changed_notify (self, priv);
- return G_SOURCE_REMOVE;
+ priv->ratelimit_id = 0;
+ priv->ratelimit_next_nsec = nm_utils_get_monotonic_timestamp_nsec() + MIN_UPDATE_INTERVAL_NSEC;
+ data_changed_notify(self, priv);
+ return G_SOURCE_REMOVE;
}
static void
-data_changed_schedule (NMLldpListener *self)
+data_changed_schedule(NMLldpListener *self)
{
- NMLldpListenerPrivate *priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
- gint64 now_nsec;
-
- if (priv->ratelimit_id != 0)
- return;
-
- now_nsec = nm_utils_get_monotonic_timestamp_nsec ();
- if (now_nsec < priv->ratelimit_next_nsec) {
- priv->ratelimit_id = g_timeout_add_full (G_PRIORITY_LOW,
- NM_UTILS_NSEC_TO_MSEC_CEIL (priv->ratelimit_next_nsec - now_nsec),
- data_changed_timeout,
- self,
- NULL);
- return;
- }
-
- priv->ratelimit_id = g_idle_add_full (G_PRIORITY_LOW,
- data_changed_timeout,
- self,
- NULL);
+ NMLldpListenerPrivate *priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
+ gint64 now_nsec;
+
+ if (priv->ratelimit_id != 0)
+ return;
+
+ now_nsec = nm_utils_get_monotonic_timestamp_nsec();
+ if (now_nsec < priv->ratelimit_next_nsec) {
+ priv->ratelimit_id =
+ g_timeout_add_full(G_PRIORITY_LOW,
+ NM_UTILS_NSEC_TO_MSEC_CEIL(priv->ratelimit_next_nsec - now_nsec),
+ data_changed_timeout,
+ self,
+ NULL);
+ return;
+ }
+
+ priv->ratelimit_id = g_idle_add_full(G_PRIORITY_LOW, data_changed_timeout, self, NULL);
}
static void
-process_lldp_neighbor (NMLldpListener *self, sd_lldp_neighbor *neighbor_sd, gboolean remove)
+process_lldp_neighbor(NMLldpListener *self, sd_lldp_neighbor *neighbor_sd, gboolean remove)
{
- NMLldpListenerPrivate *priv;
- nm_auto (lldp_neighbor_freep) LldpNeighbor *neigh = NULL;
- LldpNeighbor *neigh_old;
+ NMLldpListenerPrivate * priv;
+ nm_auto(lldp_neighbor_freep) LldpNeighbor *neigh = NULL;
+ LldpNeighbor * neigh_old;
- g_return_if_fail (NM_IS_LLDP_LISTENER (self));
+ g_return_if_fail(NM_IS_LLDP_LISTENER(self));
- priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
+ priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
- g_return_if_fail (priv->lldp_handle);
- g_return_if_fail (neighbor_sd);
+ g_return_if_fail(priv->lldp_handle);
+ g_return_if_fail(neighbor_sd);
- nm_assert (priv->lldp_neighbors);
+ nm_assert(priv->lldp_neighbors);
- neigh = lldp_neighbor_new (neighbor_sd);
- if (!neigh) {
- _LOGT ("process: failed to parse neighbor");
- return;
- }
+ neigh = lldp_neighbor_new(neighbor_sd);
+ if (!neigh) {
+ _LOGT("process: failed to parse neighbor");
+ return;
+ }
- neigh_old = g_hash_table_lookup (priv->lldp_neighbors, neigh);
+ neigh_old = g_hash_table_lookup(priv->lldp_neighbors, neigh);
- if (remove) {
- if (neigh_old) {
- _LOGT ("process: %s neigh: "LOG_NEIGH_FMT,
- "remove", LOG_NEIGH_ARG (neigh));
+ if (remove) {
+ if (neigh_old) {
+ _LOGT("process: %s neigh: " LOG_NEIGH_FMT, "remove", LOG_NEIGH_ARG(neigh));
- g_hash_table_remove (priv->lldp_neighbors, neigh_old);
- goto handle_changed;
- }
- return;
- }
+ g_hash_table_remove(priv->lldp_neighbors, neigh_old);
+ goto handle_changed;
+ }
+ return;
+ }
- if ( neigh_old
- && lldp_neighbor_equal (neigh_old, neigh))
- return;
+ if (neigh_old && lldp_neighbor_equal(neigh_old, neigh))
+ return;
- _LOGD ("process: %s neigh: "LOG_NEIGH_FMT,
- neigh_old ? "update" : "new",
- LOG_NEIGH_ARG (neigh));
+ _LOGD("process: %s neigh: " LOG_NEIGH_FMT, neigh_old ? "update" : "new", LOG_NEIGH_ARG(neigh));
- g_hash_table_add (priv->lldp_neighbors, g_steal_pointer (&neigh));
+ g_hash_table_add(priv->lldp_neighbors, g_steal_pointer(&neigh));
handle_changed:
- data_changed_schedule (self);
+ data_changed_schedule(self);
}
static void
-lldp_event_handler (sd_lldp *lldp, sd_lldp_event event, sd_lldp_neighbor *n, void *userdata)
+lldp_event_handler(sd_lldp *lldp, sd_lldp_event event, sd_lldp_neighbor *n, void *userdata)
{
- process_lldp_neighbor (userdata,
- n,
- !NM_IN_SET (event, SD_LLDP_EVENT_ADDED,
- SD_LLDP_EVENT_UPDATED,
- SD_LLDP_EVENT_REFRESHED));
+ process_lldp_neighbor(
+ userdata,
+ n,
+ !NM_IN_SET(event, SD_LLDP_EVENT_ADDED, SD_LLDP_EVENT_UPDATED, SD_LLDP_EVENT_REFRESHED));
}
gboolean
-nm_lldp_listener_start (NMLldpListener *self, int ifindex, GError **error)
+nm_lldp_listener_start(NMLldpListener *self, int ifindex, GError **error)
{
- NMLldpListenerPrivate *priv;
- int ret;
-
- g_return_val_if_fail (NM_IS_LLDP_LISTENER (self), FALSE);
- g_return_val_if_fail (ifindex > 0, FALSE);
- g_return_val_if_fail (!error || !*error, FALSE);
-
- priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
-
- if (priv->lldp_handle) {
- g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "already running");
- return FALSE;
- }
-
- ret = sd_lldp_new (&priv->lldp_handle);
- if (ret < 0) {
- g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "initialization failed");
- return FALSE;
- }
-
- ret = sd_lldp_set_ifindex (priv->lldp_handle, ifindex);
- if (ret < 0) {
- g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "failed setting ifindex");
- goto err;
- }
-
- ret = sd_lldp_set_callback (priv->lldp_handle, lldp_event_handler, self);
- if (ret < 0) {
- g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "set callback failed");
- goto err;
- }
-
- ret = sd_lldp_set_neighbors_max (priv->lldp_handle, MAX_NEIGHBORS);
- nm_assert (ret == 0);
-
- priv->ifindex = ifindex;
-
- ret = sd_lldp_attach_event (priv->lldp_handle, NULL, 0);
- if (ret < 0) {
- g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "attach event failed");
- goto err_free;
- }
-
- ret = sd_lldp_start (priv->lldp_handle);
- if (ret < 0) {
- g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "start failed");
- goto err;
- }
-
- priv->lldp_neighbors = g_hash_table_new_full (lldp_neighbor_id_hash,
- lldp_neighbor_id_equal,
- (GDestroyNotify) lldp_neighbor_free, NULL);
-
- _LOGD ("start");
-
- return TRUE;
+ NMLldpListenerPrivate *priv;
+ int ret;
+
+ g_return_val_if_fail(NM_IS_LLDP_LISTENER(self), FALSE);
+ g_return_val_if_fail(ifindex > 0, FALSE);
+ g_return_val_if_fail(!error || !*error, FALSE);
+
+ priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
+
+ if (priv->lldp_handle) {
+ g_set_error_literal(error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "already running");
+ return FALSE;
+ }
+
+ ret = sd_lldp_new(&priv->lldp_handle);
+ if (ret < 0) {
+ g_set_error_literal(error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_FAILED,
+ "initialization failed");
+ return FALSE;
+ }
+
+ ret = sd_lldp_set_ifindex(priv->lldp_handle, ifindex);
+ if (ret < 0) {
+ g_set_error_literal(error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_FAILED,
+ "failed setting ifindex");
+ goto err;
+ }
+
+ ret = sd_lldp_set_callback(priv->lldp_handle, lldp_event_handler, self);
+ if (ret < 0) {
+ g_set_error_literal(error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "set callback failed");
+ goto err;
+ }
+
+ ret = sd_lldp_set_neighbors_max(priv->lldp_handle, MAX_NEIGHBORS);
+ nm_assert(ret == 0);
+
+ priv->ifindex = ifindex;
+
+ ret = sd_lldp_attach_event(priv->lldp_handle, NULL, 0);
+ if (ret < 0) {
+ g_set_error_literal(error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "attach event failed");
+ goto err_free;
+ }
+
+ ret = sd_lldp_start(priv->lldp_handle);
+ if (ret < 0) {
+ g_set_error_literal(error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "start failed");
+ goto err;
+ }
+
+ priv->lldp_neighbors = g_hash_table_new_full(lldp_neighbor_id_hash,
+ lldp_neighbor_id_equal,
+ (GDestroyNotify) lldp_neighbor_free,
+ NULL);
+
+ _LOGD("start");
+
+ return TRUE;
err:
- sd_lldp_detach_event (priv->lldp_handle);
+ sd_lldp_detach_event(priv->lldp_handle);
err_free:
- sd_lldp_unref (priv->lldp_handle);
- priv->lldp_handle = NULL;
- priv->ifindex = 0;
- return FALSE;
+ sd_lldp_unref(priv->lldp_handle);
+ priv->lldp_handle = NULL;
+ priv->ifindex = 0;
+ return FALSE;
}
void
-nm_lldp_listener_stop (NMLldpListener *self)
+nm_lldp_listener_stop(NMLldpListener *self)
{
- NMLldpListenerPrivate *priv;
- guint size;
- gboolean changed = FALSE;
-
- g_return_if_fail (NM_IS_LLDP_LISTENER (self));
- priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
-
- if (priv->lldp_handle) {
- _LOGD ("stop");
- sd_lldp_stop (priv->lldp_handle);
- sd_lldp_detach_event (priv->lldp_handle);
- sd_lldp_unref (priv->lldp_handle);
- priv->lldp_handle = NULL;
-
- size = g_hash_table_size (priv->lldp_neighbors);
- g_hash_table_remove_all (priv->lldp_neighbors);
- nm_clear_pointer (&priv->lldp_neighbors, g_hash_table_unref);
- if ( size > 0
- || priv->ratelimit_id != 0)
- changed = TRUE;
- }
-
- nm_clear_g_source (&priv->ratelimit_id);
- priv->ratelimit_next_nsec = 0;
- priv->ifindex = 0;
-
- if (changed)
- data_changed_notify (self, priv);
+ NMLldpListenerPrivate *priv;
+ guint size;
+ gboolean changed = FALSE;
+
+ g_return_if_fail(NM_IS_LLDP_LISTENER(self));
+ priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
+
+ if (priv->lldp_handle) {
+ _LOGD("stop");
+ sd_lldp_stop(priv->lldp_handle);
+ sd_lldp_detach_event(priv->lldp_handle);
+ sd_lldp_unref(priv->lldp_handle);
+ priv->lldp_handle = NULL;
+
+ size = g_hash_table_size(priv->lldp_neighbors);
+ g_hash_table_remove_all(priv->lldp_neighbors);
+ nm_clear_pointer(&priv->lldp_neighbors, g_hash_table_unref);
+ if (size > 0 || priv->ratelimit_id != 0)
+ changed = TRUE;
+ }
+
+ nm_clear_g_source(&priv->ratelimit_id);
+ priv->ratelimit_next_nsec = 0;
+ priv->ifindex = 0;
+
+ if (changed)
+ data_changed_notify(self, priv);
}
gboolean
-nm_lldp_listener_is_running (NMLldpListener *self)
+nm_lldp_listener_is_running(NMLldpListener *self)
{
- NMLldpListenerPrivate *priv;
+ NMLldpListenerPrivate *priv;
- g_return_val_if_fail (NM_IS_LLDP_LISTENER (self), FALSE);
+ g_return_val_if_fail(NM_IS_LLDP_LISTENER(self), FALSE);
- priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
- return !!priv->lldp_handle;
+ priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
+ return !!priv->lldp_handle;
}
GVariant *
-nm_lldp_listener_get_neighbors (NMLldpListener *self)
+nm_lldp_listener_get_neighbors(NMLldpListener *self)
{
- NMLldpListenerPrivate *priv;
-
- g_return_val_if_fail (NM_IS_LLDP_LISTENER (self), FALSE);
-
- priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
-
- if (G_UNLIKELY (!priv->variant)) {
- gs_free LldpNeighbor **neighbors = NULL;
- GVariantBuilder array_builder;
- guint i, n;
-
- g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
- neighbors = (LldpNeighbor **) nm_utils_hash_keys_to_array (priv->lldp_neighbors,
- lldp_neighbor_id_cmp_p,
- NULL,
- &n);
- for (i = 0; i < n; i++)
- g_variant_builder_add_value (&array_builder, lldp_neighbor_to_variant (neighbors[i]));
- priv->variant = g_variant_ref_sink (g_variant_builder_end (&array_builder));
- }
- return priv->variant;
+ NMLldpListenerPrivate *priv;
+
+ g_return_val_if_fail(NM_IS_LLDP_LISTENER(self), FALSE);
+
+ priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
+
+ if (G_UNLIKELY(!priv->variant)) {
+ gs_free LldpNeighbor **neighbors = NULL;
+ GVariantBuilder array_builder;
+ guint i, n;
+
+ g_variant_builder_init(&array_builder, G_VARIANT_TYPE("aa{sv}"));
+ neighbors = (LldpNeighbor **)
+ nm_utils_hash_keys_to_array(priv->lldp_neighbors, lldp_neighbor_id_cmp_p, NULL, &n);
+ for (i = 0; i < n; i++)
+ g_variant_builder_add_value(&array_builder, lldp_neighbor_to_variant(neighbors[i]));
+ priv->variant = g_variant_ref_sink(g_variant_builder_end(&array_builder));
+ }
+ return priv->variant;
}
static void
-get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
+get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
- NMLldpListener *self = NM_LLDP_LISTENER (object);
-
- switch (prop_id) {
- case PROP_NEIGHBORS:
- g_value_set_variant (value, nm_lldp_listener_get_neighbors (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
+ NMLldpListener *self = NM_LLDP_LISTENER(object);
+
+ switch (prop_id) {
+ case PROP_NEIGHBORS:
+ g_value_set_variant(value, nm_lldp_listener_get_neighbors(self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
}
static void
-nm_lldp_listener_init (NMLldpListener *self)
+nm_lldp_listener_init(NMLldpListener *self)
{
- _LOGT ("lldp listener created");
+ _LOGT("lldp listener created");
}
NMLldpListener *
-nm_lldp_listener_new (void)
+nm_lldp_listener_new(void)
{
- return (NMLldpListener *) g_object_new (NM_TYPE_LLDP_LISTENER, NULL);
+ return (NMLldpListener *) g_object_new(NM_TYPE_LLDP_LISTENER, NULL);
}
static void
-dispose (GObject *object)
+dispose(GObject *object)
{
- nm_lldp_listener_stop (NM_LLDP_LISTENER (object));
+ nm_lldp_listener_stop(NM_LLDP_LISTENER(object));
- G_OBJECT_CLASS (nm_lldp_listener_parent_class)->dispose (object);
+ G_OBJECT_CLASS(nm_lldp_listener_parent_class)->dispose(object);
}
static void
-finalize (GObject *object)
+finalize(GObject *object)
{
- NMLldpListener *self = NM_LLDP_LISTENER (object);
- NMLldpListenerPrivate *priv = NM_LLDP_LISTENER_GET_PRIVATE (self);
+ NMLldpListener * self = NM_LLDP_LISTENER(object);
+ NMLldpListenerPrivate *priv = NM_LLDP_LISTENER_GET_PRIVATE(self);
- nm_lldp_listener_stop (self);
+ nm_lldp_listener_stop(self);
- nm_clear_g_variant (&priv->variant);
+ nm_clear_g_variant(&priv->variant);
- _LOGT ("lldp listener destroyed");
+ _LOGT("lldp listener destroyed");
- G_OBJECT_CLASS (nm_lldp_listener_parent_class)->finalize (object);
+ G_OBJECT_CLASS(nm_lldp_listener_parent_class)->finalize(object);
}
static void
-nm_lldp_listener_class_init (NMLldpListenerClass *klass)
+nm_lldp_listener_class_init(NMLldpListenerClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
- object_class->dispose = dispose;
- object_class->finalize = finalize;
- object_class->get_property = get_property;
+ object_class->dispose = dispose;
+ object_class->finalize = finalize;
+ object_class->get_property = get_property;
- obj_properties[PROP_NEIGHBORS] =
- g_param_spec_variant (NM_LLDP_LISTENER_NEIGHBORS, "", "",
- G_VARIANT_TYPE ("aa{sv}"),
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS);
+ obj_properties[PROP_NEIGHBORS] =
+ g_param_spec_variant(NM_LLDP_LISTENER_NEIGHBORS,
+ "",
+ "",
+ G_VARIANT_TYPE("aa{sv}"),
+ NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
- g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
+ g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
}