private List <SnmpResult <int, string> > MapMacAddresses(SnmpTarget snmpTarget) { var fdbAddressTable = ReadFdbAddressTable(snmpTarget); var fdbPortTable = ReadFdbPortTable(snmpTarget); var portMappings = fdbPortTable.Select(port => new { PortNumber = Convert.ToInt32(port.Value.ToString()), Oid = port.Oid.ToString() }) .GroupBy(mappings => mappings.PortNumber) .Where(mappings => mappings.Any()) .ToDictionary(mapping => mapping.Key, mapping => mapping.ToList()); var macMappings = fdbAddressTable.Select(port => new { MacAddress = port.Value.ToString(), Oid = port.Oid.ToString().Replace(SnmpOids.Dot1DTpFdbAddress, SnmpOids.Dot1DTpFdbPort) }) .GroupBy(mappings => mappings.Oid) .Where(mappings => mappings.Any()) .ToDictionary(mapping => mapping.Key, mapping => mapping.First().MacAddress); var results = new List <SnmpResult <int, string> >(); foreach (var portMapping in portMappings) { string macAddress; foreach (var oid in portMapping.Value) { if (macMappings.TryGetValue(oid.Oid, out macAddress)) { var result = new SnmpResult <int, string> { Identifier = portMapping.Key, Result = macAddress.Replace(' ', ':'), SnmpTarget = snmpTarget, Oid = "" }; results.Add(result); } } } return(results); }
private List <SnmpResult <int, long> > ProcessTargetsTraffic(SnmpTarget snmpTarget, string snmpOid, string communityString = "public") { var results = new List <SnmpResult <int, long> >(); var community = new OctetString(communityString); var param = new AgentParameters(community) { Version = SnmpVersion.Ver2 }; var agent = new IpAddress(snmpTarget.IpAddress); var target = new UdpTarget((IPAddress)agent, 161, 2000, 1); var rootOid = new Oid(snmpOid); var lastOid = (Oid)rootOid.Clone(); var pdu = new Pdu(PduType.GetBulk) { NonRepeaters = 0, MaxRepetitions = 5 }; while (lastOid != null) { if (pdu.RequestId != 0) { pdu.RequestId += 1; } pdu.VbList.Clear(); pdu.VbList.Add(lastOid); var result = (SnmpV2Packet)target.Request(pdu, param); if (result != null) { if (result.Pdu.ErrorStatus != 0) { Console.WriteLine("Error in SNMP reply. Error {0} index {1}", result.Pdu.ErrorStatus, result.Pdu.ErrorIndex); break; } foreach (var v in result.Pdu.VbList) { var current = new SnmpResult <int, long>(); if (rootOid.IsRootOf(v.Oid)) { Console.WriteLine("{0} ({1}): {2}", v.Oid, SnmpConstants.GetTypeName(v.Value.Type), v.Value); current.Result = Convert.ToInt64(v.Value.ToString()); current.Identifier = Convert.ToInt32(v.Oid.ToString().Split('.').Last()); current.Oid = v.Oid.ToString(); current.SnmpTarget = snmpTarget; results.Add(current); lastOid = v.Value.Type == SnmpConstants.SMI_ENDOFMIBVIEW ? null : v.Oid; } else { lastOid = null; } } } else { Console.WriteLine("No response received from SNMP agent."); } } target.Close(); return(results); }