$data) { $dot1dBasePort_table[$base_port] = $port_ifIndex_table[$data['dot1dBasePortIfIndex']]; } // Fetch list of active VLANs (with vlan context exist) $sql = 'SELECT DISTINCT `vlan_vlan` FROM `vlans` WHERE `device_id` = ? AND `vlan_context` = ? AND (`vlan_status` = ? OR `vlan_status` = ?)'; foreach (dbFetchRows($sql, [ $device['device_id'], 1, 'active', 'operational']) as $cisco_vlan) { $vlan = $cisco_vlan['vlan_vlan']; // Set per-VLAN context $device_context = $device; // Add vlan context for snmp auth if ($device['snmp_version'] === 'v3') { $device_context['snmp_context'] = 'vlan-' . $vlan; } else { $device_context['snmp_context'] = $vlan; } //$device_context['snmp_retries'] = 1; // Set retries to 0 for speedup walking //dot1dTpFdbAddress[0:7:e:6d:55:41] 0:7:e:6d:55:41 //dot1dTpFdbPort[0:7:e:6d:55:41] 28 //dot1dTpFdbStatus[0:7:e:6d:55:41] learned $dot1dTpFdbEntry_table = snmpwalk_multipart_oid($device_context, 'dot1dTpFdbEntry', [], 'BRIDGE-MIB', NULL, OBS_SNMP_ALL_TABLE); if (!snmp_status()) { // Continue if no entries for vlan unset($device_context); continue; } foreach ($dot1dTpFdbEntry_table as $mac => $entry) { $mac = mac_zeropad($mac); $fdb_port = $entry['dot1dTpFdbPort']; // If not exist ifIndex associations from previous walks, fetch association for current vlan context // This is derp, but I not know better speedup this walks if (!isset($dot1dBasePort_table[$fdb_port]) && !isset($dot1dBasePortIfIndex[$vlan])) { print_debug("Cache dot1dBasePort -> IfIndex association table by vlan $vlan"); // Need to walk port association for this vlan context $dot1dBasePortIfIndex[$vlan] = snmpwalk_cache_oid($device_context, 'dot1dBasePortIfIndex', [], 'BRIDGE-MIB'); foreach ($dot1dBasePortIfIndex[$vlan] as $base_port => $data) { $dot1dBasePort_table[$base_port] = $port_ifIndex_table[$data['dot1dBasePortIfIndex']]; } // Prevent rewalk in cycle if empty output if (is_null($dot1dBasePortIfIndex[$vlan])) { $dot1dBasePortIfIndex[$vlan] = FALSE; } } $data = []; $data['port_id'] = $dot1dBasePort_table[$fdb_port]['port_id']; $data['port_index'] = isset($dot1dBasePort_table[$fdb_port]) ? $dot1dBasePort_table[$fdb_port]['ifIndex'] : $fdb_port; $data['fdb_status'] = $entry['dot1dTpFdbStatus']; $fdbs[$vlan][$mac] = $data; } } unset($dot1dBasePortIfIndex, $dot1dTpFdbEntry_table, $dot1dBasePort_table); // EOF