$neighbours) { foreach ($neighbours as $cdpCacheDeviceIndex => $cdp_entry) { // Local port $port = get_port_by_index_cache($device, $cdp_entry['clcCdpApCacheLocalInterface']); // Remote hostname $remote_hostname = $cdp_entry['clcCdpApCacheNeighName']; // Remote address $remote_address = hex2ip($cdp_entry['clcCdpApCacheNeighAddress']); // Remote MAC on some devices $if = NULL; $remote_mac = NULL; if (preg_match('/^([A-F\d]{2}\s?){6}$/', $cdp_entry['clcCdpApCacheNeighInterface'])) { $remote_mac = $cdp_entry['clcCdpApCacheNeighInterface']; } else { $cdp_entry['clcCdpApCacheNeighInterface'] = snmp_hexstring($cdp_entry['clcCdpApCacheNeighInterface']); if (preg_match('/^[a-f\d]{12}$/i', $cdp_entry['clcCdpApCacheNeighInterface'])) { $remote_mac = $cdp_entry['clcCdpApCacheNeighInterface']; } else { $if = $cdp_entry['clcCdpApCacheNeighInterface']; } } // Try to find a remote device and check if already cached $remote_device_id = get_autodiscovery_device_id($device, $remote_hostname, $remote_address, $remote_mac); if (is_null($remote_device_id) && // NULL - never cached in other rounds check_autodiscovery($remote_hostname, $remote_address)) { // Check all previous autodiscovery rounds // Neighbour never checked, try autodiscovery $remote_device_id = autodiscovery_device($remote_hostname, $remote_address, 'CDP', $cdp_entry['cdpCachePlatform'], $device, $port); } // Remote port (when a remote device found) $remote_port_id = NULL; if ($remote_device_id) { if (!is_null($if)) { $query = 'SELECT `port_id` FROM `ports` WHERE (`ifName` = ? OR `ifDescr` = ? OR `port_label_short` = ?) AND `device_id` = ? AND `deleted` = ?'; $remote_port_id = dbFetchCell($query, [$if, $if, $if, $remote_device_id, 0]); // Aruba devices can report ifAlias instead ifDescr if (!$remote_port_id && !is_hex_string($if)) { $query = 'SELECT `port_id` FROM `ports` WHERE `ifAlias` = ? AND `device_id` = ? AND `deleted` = ?'; $remote_port_id = dbFetchCell($query, [$if, $remote_device_id, 0]); } } if (!$remote_port_id) { if (!is_null($remote_mac)) { // By MAC $remote_port_id = get_port_id_by_mac($remote_device_id, $remote_mac); } elseif (!is_null($if)) { // Try by ifAlias $query = 'SELECT `port_id` FROM `ports` WHERE `ifAlias` = ? AND `device_id` = ? AND `deleted` = ?'; $remote_port_id = dbFetchCell($query, [$if, $remote_device_id, 0]); } if (!$remote_port_id) { // Try by IP $peer_where = generate_query_values_and($remote_device_id, 'device_id'); // Additional filter for include self IPs // Fetch all ports with peer IP and filter by UP if ($ids = get_entity_ids_ip_by_network('port', $remote_address, $peer_where)) { $remote_port_id = $ids[0]; //$port = get_port_by_id_cache($ids[0]); } } } } $neighbour = [ 'remote_device_id' => $remote_device_id, 'remote_port_id' => $remote_port_id, 'remote_hostname' => $remote_hostname, 'remote_port' => $cdp_entry['clcCdpApCacheNeighInterface'], 'remote_platform' => $cdp_entry['clcCdpApCachePlatform'], 'remote_version' => $cdp_entry['clcCdpApCacheNeighVersion'], 'remote_address' => $remote_address, //'last_change' => $last_change ]; discover_neighbour($port, 'cdp', $neighbour); } } // EOF