diff options
author | Thomas Haller <thaller@redhat.com> | 2016-03-10 18:24:42 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-03-10 18:24:42 +0100 |
commit | 8542149e80d5b72656b53a4e7dc4642dc7826a62 (patch) | |
tree | ab9eea9fd71aa2b562b86f80cfcee38efa7ea22f | |
parent | 68c84b01678a5689a18bd21f3d7ec8e721fb405e (diff) | |
download | NetworkManager-th/systemd-lldp-bgo763384.tar.gz |
fixup! systemd: merge branch master into th/systemd-integrationth/systemd-lldp-bgo763384
-rw-r--r-- | src/devices/nm-lldp-listener.c | 95 |
1 files changed, 52 insertions, 43 deletions
diff --git a/src/devices/nm-lldp-listener.c b/src/devices/nm-lldp-listener.c index 349d778bb2..7774848e3d 100644 --- a/src/devices/nm-lldp-listener.c +++ b/src/devices/nm-lldp-listener.c @@ -21,6 +21,7 @@ #include "nm-default.h" #include <net/ethernet.h> +#include <errno.h> #include "sd-lldp.h" #include "lldp.h" @@ -274,7 +275,7 @@ process_lldp_neighbors (NMLldpListener *self) NMLldpListenerPrivate *priv = NM_LLDP_LISTENER_GET_PRIVATE (self); nm_auto_free sd_lldp_neighbor **neighbors = NULL; GHashTable *hash; - int num, i; + int num, i, r; g_return_if_fail (priv->lldp_handle); @@ -296,7 +297,6 @@ process_lldp_neighbors (NMLldpListener *self) gsize chassis_id_len, port_id_len, len; GValue *value; const char *str; - int r; if (i >= MAX_NEIGHBORS) break; @@ -304,16 +304,16 @@ process_lldp_neighbors (NMLldpListener *self) r = sd_lldp_neighbor_get_chassis_id (neighbors[i], &chassis_id_type, &chassis_id, &chassis_id_len); if (r < 0) - continue; + goto next; if (chassis_id_len < 1) - continue; + goto next; r = sd_lldp_neighbor_get_port_id (neighbors[i], &port_id_type, &port_id, &port_id_len); if (r < 0) - continue; + goto next; if (port_id_len < 1) - continue; + goto next; neigh = g_slice_new0 (LLDPNeighbor); neigh->tlvs = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, gvalue_destroy); @@ -321,7 +321,7 @@ process_lldp_neighbors (NMLldpListener *self) neigh->port_id_type = port_id_type; if (sd_lldp_neighbor_get_destination_address (neighbors[i], &neigh->destination_address) < 0) - continue; + goto next; switch (chassis_id_type) { case LLDP_CHASSIS_SUBTYPE_INTERFACE_ALIAS: @@ -335,7 +335,7 @@ process_lldp_neighbors (NMLldpListener *self) break; default: _LOGD ("process: unsupported chassis ID type %d", chassis_id_type); - continue; + goto next; } switch (port_id_type) { @@ -350,7 +350,7 @@ process_lldp_neighbors (NMLldpListener *self) break; default: _LOGD ("process: unsupported port ID type %d", port_id_type); - continue; + goto next; } if (sd_lldp_neighbor_get_port_description (neighbors[i], &str) == 0) { @@ -374,52 +374,59 @@ process_lldp_neighbors (NMLldpListener *self) } if (sd_lldp_neighbor_tlv_rewind (neighbors[i]) < 0) - continue; + goto next; do { guint8 oui[3]; guint8 subtype; - if (sd_lldp_neighbor_tlv_get_oui (neighbors[i], oui, &subtype) > 0) { - if ( memcmp (oui, LLDP_OUI_802_1, sizeof (oui)) == 0 - && NM_IN_SET (subtype, - LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID, - LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID, - LLDP_OUI_802_1_SUBTYPE_VLAN_NAME)) { - if (sd_lldp_neighbor_tlv_get_raw (neighbors[i], &data, &len) < 0) - continue; - - switch (subtype) { - case LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID: + r = sd_lldp_neighbor_tlv_get_oui (neighbors[i], oui, &subtype); + if (r < 0) { + if (r == -ENXIO) + continue; + goto next; + } + + if (memcmp (oui, LLDP_OUI_802_1, sizeof (oui)) != 0) + continue; + + if (NM_IN_SET (subtype, + LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID, + LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID, + LLDP_OUI_802_1_SUBTYPE_VLAN_NAME)) { + if (sd_lldp_neighbor_tlv_get_raw (neighbors[i], &data, &len) < 0) + continue; + + switch (subtype) { + case LLDP_OUI_802_1_SUBTYPE_PORT_VLAN_ID: #if 0 - if (sd_lldp_packet_read_port_vlan_id (packets[i], &data16) == 0) { - value = gvalue_new_uint (data16); - g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_PVID, value); - } + if (sd_lldp_packet_read_port_vlan_id (packets[i], &data16) == 0) { + value = gvalue_new_uint (data16); + g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_PVID, value); + } #endif - break; - case LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID: + break; + case LLDP_OUI_802_1_SUBTYPE_PORT_PROTOCOL_VLAN_ID: #if 0 - if (sd_lldp_neighbor_get_port_protocol_vlan_id (neighbors[i], &data8, &data16) == 0) { - value = gvalue_new_uint (data16); - g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_PPVID, value); + if (sd_lldp_neighbor_get_port_protocol_vlan_id (neighbors[i], &data8, &data16) == 0) { + value = gvalue_new_uint (data16); + g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_PPVID, value); - value = gvalue_new_uint (data8); - g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_PPVID_FLAGS, value); - } + value = gvalue_new_uint (data8); + g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_PPVID_FLAGS, value); + } #endif - break; - case LLDP_OUI_802_1_SUBTYPE_VLAN_NAME: + break; + case LLDP_OUI_802_1_SUBTYPE_VLAN_NAME: #if 0 - if (sd_lldp_neighbor_get_vlan_name (neighbors[i], &data16, &str, &len) == 0) { - value = gvalue_new_uint (data16); - g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_VID, value); + if (sd_lldp_neighbor_get_vlan_name (neighbors[i], &data16, &str, &len) == 0) { + value = gvalue_new_uint (data16); + g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_VID, value); - value = gvalue_new_str (str); - g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_VLAN_NAME, value); - } -#endif - break; + value = gvalue_new_str (str); + g_hash_table_insert (neigh->tlvs, NM_LLDP_ATTR_IEEE_802_1_VLAN_NAME, value); } +#endif + break; } } } while (sd_lldp_neighbor_tlv_next (neighbors[i]) > 0); @@ -429,6 +436,8 @@ process_lldp_neighbors (NMLldpListener *self) g_hash_table_add (hash, neigh); neigh = NULL; +next: + ; } for (i = 0; neighbors && i < num; i++) |