ln.snmp/endpoint/SNMPEndpoint.cs

118 lines
3.6 KiB
C#
Raw Permalink Normal View History

2019-03-11 15:07:34 +01:00
using System;
using ln.snmp.types;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using ln.snmp.endpoint;
using System.Reflection;
using System.Threading;
using ln.logging;
namespace ln.snmp.endpoint
{
public abstract class SnmpEndpoint : SnmpInterface, IDisposable
{
public SNMPEngine SNMPEngine { get; }
public IPEndPoint RemoteEndpoint { get; set; }
2019-03-12 00:54:39 +01:00
public int Retries { get; set; } = 3;
2019-03-11 15:07:34 +01:00
public SnmpEndpoint(SNMPEngine snmpEngine, IPEndPoint remoteEndpoint)
{
SNMPEngine = snmpEngine;
RemoteEndpoint = remoteEndpoint;
2019-03-12 00:54:39 +01:00
2019-03-11 15:07:34 +01:00
SNMPEngine.RegisterEndpoint(this);
}
2019-03-15 07:43:15 +01:00
public void Close()
{
Dispose();
}
2019-03-11 15:07:34 +01:00
public virtual void Send(SnmpMessage message)
{
2019-03-12 00:54:39 +01:00
//message.MessageID = SNMPEngine.NextMessageID;
//if (requestMessage.snmpPDU != null)
//{
// requestMessage.snmpPDU.RequestID.LongValue = SNMPEngine.NextMessageID;
//}
2019-03-11 15:07:34 +01:00
message = Encrypt(message);
message = ApplyAuthentication(message);
SNMPEngine.SendMessage(RemoteEndpoint, message);
}
2019-03-12 00:54:39 +01:00
public virtual void DispatchReceived(SnmpMessage message)
2019-03-11 15:07:34 +01:00
{
lock (queuedRequests)
{
if (queuedRequests.ContainsKey(message.MessageID))
{
SnmpMessage queuedMessage = queuedRequests[message.MessageID];
lock (queuedMessage)
{
queuedRequests[message.MessageID] = message;
Monitor.PulseAll(queuedMessage);
}
}
else
{
2019-04-01 07:48:30 +02:00
long dt = DateTimeOffset.Now.ToUnixTimeSeconds() - message.MessageID;
Logging.Log(LogLevel.WARNING, "SNMPEndpoint: Received unqueued message id: {0} (0x{0:x8}) possibly D-T: {1}", message.MessageID,dt);
2019-03-11 15:07:34 +01:00
}
}
}
2019-03-12 00:54:39 +01:00
public virtual void Received(SnmpMessage message)
{
message = CheckAuthentication(message);
message = Decrypt(message);
2019-03-11 15:07:34 +01:00
2019-03-12 00:54:39 +01:00
DispatchReceived(message);
}
public virtual SnmpMessage Encrypt(SnmpMessage message) => message;
public virtual SnmpMessage ApplyAuthentication(SnmpMessage message) => message;
public virtual SnmpMessage CheckAuthentication(SnmpMessage message) => message;
public virtual SnmpMessage Decrypt(SnmpMessage message) => message;
2019-03-11 15:07:34 +01:00
/**
* Requests
2019-03-12 00:54:39 +01:00
**/
2019-03-11 15:07:34 +01:00
private Dictionary<int, SnmpMessage> queuedRequests = new Dictionary<int, SnmpMessage>();
public SnmpMessage EnqueueRequest(SnmpMessage requestMessage)
{
lock (queuedRequests)
{
queuedRequests.Add(requestMessage.MessageID, requestMessage);
2019-04-05 00:59:05 +02:00
Monitor.Exit(queuedRequests);
2019-03-11 15:07:34 +01:00
lock (requestMessage)
{
Send(requestMessage);
Monitor.Wait(requestMessage, SNMPEngine.Timeout);
}
2019-04-05 00:59:05 +02:00
Monitor.Enter(queuedRequests);
2019-03-11 15:07:34 +01:00
SnmpMessage responseMessage = queuedRequests[requestMessage.MessageID];
if (responseMessage == requestMessage)
throw new TimeoutException();
return responseMessage;
}
}
public override void Dispose()
{
SNMPEngine.UnregisterEndpoint(this);
base.Dispose();
}
}
}