74 lines
2.9 KiB
PHP
74 lines
2.9 KiB
PHP
<?php
|
|
/**
|
|
* Observium
|
|
*
|
|
* This file is part of Observium.
|
|
*
|
|
* @package observium
|
|
* @subpackage discovery
|
|
* @copyright (C) Adam Armstrong
|
|
*
|
|
*/
|
|
|
|
$oids = snmpwalk_cache_threepart_oid($device, 'ipNetToPhysicalPhysAddress', [], 'IP-MIB', NULL, OBS_SNMP_ALL_TABLE);
|
|
if (snmp_status()) {
|
|
// First check IP-MIB::ipNetToPhysicalPhysAddress (IPv4 & IPv6)
|
|
//ipNetToPhysicalPhysAddress[5][ipv4]["80.93.52.129"] 0:23:ab:64:d:42
|
|
//ipNetToPhysicalPhysAddress[34][ipv6]["2a:01:00:d8:00:00:00:01:00:00:00:00:00:00:00:03"] 0:15:63:e8:fb:31:0:0
|
|
print_debug("Used IP-MIB::ipNetToPhysicalPhysAddress");
|
|
|
|
foreach ($oids as $ifIndex => $oids1) {
|
|
foreach ($oids1 as $ip_version => $oids2) {
|
|
$mac_found[$ip_version][$vrf_name] = 1;
|
|
|
|
foreach ($oids2 as $ip => $entry) {
|
|
$mac_array = explode(':', $entry['ipNetToPhysicalPhysAddress']);
|
|
switch (safe_count($mac_array)) {
|
|
case 4:
|
|
// Convert IPv4 to fake MAC for 6to4 tunnels
|
|
//ipNetToPhysicalPhysAddress[27][ipv6]["20:02:c0:58:63:01:00:00:00:00:00:00:00:00:00:00"] 0:0:c0:58
|
|
$mac_array[] = 'ff';
|
|
$mac_array[] = 'fe';
|
|
$mac = implode(':', $mac_array);
|
|
break;
|
|
case 8:
|
|
array_pop($mac_array);
|
|
array_pop($mac_array);
|
|
$mac = implode(':', $mac_array);
|
|
break;
|
|
case 6:
|
|
default:
|
|
$mac = $entry['ipNetToPhysicalPhysAddress'];
|
|
}
|
|
if (!is_valid_param($mac, 'mac')) {
|
|
print_debug("Invalid MAC address '$mac'");
|
|
print_debug_vars($entry);
|
|
continue;
|
|
}
|
|
$ip = ip_uncompress(hex2ip($ip));
|
|
|
|
$mac_table[$vrf_name][$ip_version][$ifIndex][$ip] = mac_zeropad($mac);
|
|
}
|
|
}
|
|
}
|
|
} elseif ($oids = snmpwalk_cache_twopart_oid($device, 'ipNetToMediaPhysAddress', [], 'IP-MIB', NULL, OBS_SNMP_ALL_TABLE)) {
|
|
// Check IP-MIB::ipNetToMediaPhysAddress (IPv4 only)
|
|
//ipNetToMediaPhysAddress[213][10.0.0.162] 70:81:5:ec:f9:bf
|
|
print_debug("Used IP-MIB::ipNetToMediaPhysAddress");
|
|
$ip_version = 'ipv4';
|
|
$mac_found[$ip_version][$vrf_name] = 1;
|
|
|
|
foreach ($oids as $ifIndex => $oids1) {
|
|
foreach ($oids1 as $ip => $entry) {
|
|
if (!is_valid_param($entry['ipNetToMediaPhysAddress'], 'mac')) {
|
|
print_debug("Invalid MAC address '{$entry['ipNetToMediaPhysAddress']}'");
|
|
print_debug_vars($entry);
|
|
continue;
|
|
}
|
|
$mac_table[$vrf_name][$ip_version][$ifIndex][$ip] = mac_zeropad($entry['ipNetToMediaPhysAddress']);
|
|
}
|
|
}
|
|
}
|
|
//print_debug_vars($oids);
|
|
|
|
// EOF
|