public ILink OnLinkTranslation(IUnderlayingNetworkLayer unl, EndPoint ep, IFrame frame) { try { var former = LinksTree.Find(ep, unl).GetDeviceId(); var dev = unl.Parser.Factory(frame, former) ?? unl.Parser; if (ParserUtils.IsInvalidDeviceId(dev.GetDeviceId())) { return(null); } var link = LinksTree.GetOrCreate(dev, unl, ep, former); if (LogCambioDeIp) { if (dev.GetDeviceId() != former) { STrace.Trace(GetType().FullName, dev.GetDeviceId(), String.Format("Detectado cambio de id: Former={0} Received={1} Address={2} Payload={3}", former, dev.GetDeviceId(), frame.RemoteAddressAsString, Encoding.ASCII.GetString(frame.Payload))); } if (!ep.Equals(link.EndPoint)) // el operador == siempre da falso por que solo compara la referencia y son 2 instancias distintas con los mismos datos! { STrace.Trace(GetType().FullName, dev.GetDeviceId(), String.Format("Detectado cambio de ip: FormerAddress={0} ReceivedAddress={1} DeviceId={2} Payload={3}", link.EndPoint, ep, dev.GetDeviceId(), Encoding.ASCII.GetString(frame.Payload))); } } return(link); } catch (ObjectNotFoundException) { STrace.Debug(GetType().FullName, String.Format("Dispositivo no registrado: {0}", frame.PayloadAsString)); } catch (Exception e) { STrace.Exception(GetType().FullName, e, String.Format("OnLinkTranslation: {0}", frame.PayloadAsString)); } return(null); }
public ILink Find(EndPoint ep, IUnderlayingNetworkLayer unl) { rwlock.EnterReadLock(); try { var link = links_table .Where(route => ep.Equals(route.Value.EndPoint)) // el operador == siempre da falso por que solo compara la referencia y son 2 instancias distintas con los mismos datos! .Select(route => route.Value) .FirstOrDefault(); if (link != null) { link.UnderlayingNetworkLayer = unl; link.Age = DateTime.Now; //link.State = LinkStates.Active; } return(link); } finally { rwlock.ExitReadLock(); } }
public ILink GetOrCreate(INode Device, IUnderlayingNetworkLayer unl, EndPoint ep, int formerEndPointId) { rwlock.EnterReadLock(); try { if (links_table.ContainsKey(Device.Id)) { var link = links_table[Device.Id]; if (Device.Id == formerEndPointId) { link.EndPoint = ep; } return(link); } } finally { rwlock.ExitReadLock(); } rwlock.EnterWriteLock(); try { if (links_table.ContainsKey(Device.Id)) { var link = links_table[Device.Id]; if (Device.Id == formerEndPointId) { link.EndPoint = ep; } return(link); } else { //limpiar otras referencias al endpoint var linkedendpoints = links_table .Where(route => ep.Equals(route.Value.EndPoint)) // el operador == siempre da falso por que solo compara la referencia y son 2 instancias distintas con los mismos datos! .Select(route => route.Value) .ToList(); foreach (var lep in linkedendpoints) { lep.EndPoint = null; } //crear el nuevo link para devolver var link = new Link { Age = DateTime.Now, State = LinkStates.New, Device = Device, UnderlayingNetworkLayer = unl, EndPoint = ep, }; links_table.Add(Device.Id, link); return(link); } } finally { rwlock.ExitWriteLock(); } }