示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }
示例#3
0
        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();
            }
        }