Exemplo n.º 1
0
        /// <summary>
        /// Отправка Ethernet кадра
        /// </summary>
        /// <param name="Device">Устройство отправитель</param>
        /// <param name="Frame">Кадр для отправления</param>
        public void Execute(Device Device, Frame Frame)
        {
            bool RecordExist = false; //Cуществование записи

            PhysicalLayer physicalLayer = new PhysicalLayer();

            foreach (var RouteRecord in ((Switch)Device).RoutingTable)
            {
                if (RouteRecord.DestinationAddress == Frame.DestinationAdress)
                {
                    //Установка id порта прибытия для кадра
                    foreach (var Port in ((Switch)Device).DataPorts[RouteRecord.PortId].Device.DeviceObject.DataPorts)
                    {
                        if (Port.Device != null)
                        {
                            if (((Switch)Device).Id.Equals(Port.Device.DeviceObject.Id))
                            {
                                ((Networks.Frames.Ethernet)Frame).PortDstId = Port.ID;
                            }
                        }
                    }
                    physicalLayer.ExecuteProtocol(new SF(), ((Switch)Device).DataPorts[RouteRecord.PortId].Device.DeviceObject, Frame);
                    RecordExist = true;
                    break;
                }
            }

            //Если нету записи в таблице маршрутизации
            if (!RecordExist)
            {
                foreach (var Port in ((Switch)Device).DataPorts)
                {
                    if (Port.Device != null && !Port.PortStpRole.Equals(PortSTPRole.DisabledPort))
                    {
                        //Установка id порта отправителя для кадра
                        foreach (var Portt in Port.Device.DeviceObject.DataPorts)
                        {
                            if (Portt.Device != null)
                            {
                                if (((Switch)Device).Id.Equals(Portt.Device.DeviceObject.Id))
                                {
                                    ((Networks.Frames.Ethernet)Frame).PortDstId = Portt.ID;
                                }
                            }
                        }
                        physicalLayer.ExecuteProtocol(new SF(), Port.Device.DeviceObject, Frame);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Исполнение протокола STP
        /// </summary>
        /// <param name="Device">Исполняемое устройство</param>
        public void Execute(Device Device)
        {
            PhysicalLayer PhysicalLayer = new PhysicalLayer();
            BPDU          BPDU          = new BPDU();

            foreach (var Port in Device.DataPorts)
            {
                BPDU = new BPDU(Device.Id, ((Switch)Device).DeviceIDToRetranslate, Port.ID, ((Switch)Device).PathCostToRetranslate, Device.MACAdress);

                //Если в порт подключено устройство и порт не имеет root роли
                if (Port.Device != null && ((Switch)Device).RootSwitch)
                {
                    PhysicalLayer.ExecuteProtocol(new SF(), Port.Device.DeviceObject, BPDU);
                }

                if (Port.Device != null && Port.PortStpRole.Equals(PortSTPRole.NondesignatedPort))
                {
                    Port.PortStpRole = PortSTPRole.DisabledPort;
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Обработка пакетов по правилам STP
        /// </summary>
        /// <param name="Cash">Кэш устройства</param>
        public void Processing(List <Frame> Cash, Device Device)
        {
            //Инициализация переменных для проверки соединения с root мостом
            if (!((Switch)Device).RootSwitch)
            {
                ((Switch)Device).RSConnnection      = false;
                ((Switch)Device).RSConnectionCheck += 1;
            }
            else
            {
                ((Switch)Device).RSConnnection = true;
            }

            //Обнаружение root моста и изменение полей BPDU пакета
            foreach (var Frame in Cash)
            {
                if (Frame.FrameType.Equals(FrameType.BPDU))
                {
                    if (((BPDU)Frame).RootBridgeId < ((Switch)Device).DeviceIDToRetranslate)
                    {
                        ((Switch)Device).RootSwitch            = false;
                        ((Switch)Device).DeviceIDToRetranslate = ((BPDU)Frame).RootBridgeId;
                        ((Switch)Device).PathCostToRetranslate = ((BPDU)Frame).RootPathCost + 1;

                        foreach (var Port in Device.DataPorts)
                        {
                            if (Port.Device != null)
                            {
                                if (Port.Device.DeviceObject.MACAdress == ((BPDU)Frame).SourceAddress)
                                {
                                    Port.PortStpRole = PortSTPRole.RootPort;
                                    Port.Device.DeviceObject.DataPorts[((BPDU)Frame).PortID].PortStpRole = PortSTPRole.DesignatedPort;
                                }
                            }
                        }

                        PhysicalLayer PhysicalLayer = new PhysicalLayer();
                        BPDU          BPDU          = new BPDU();

                        //Ретрансляция пакета
                        foreach (var Port in Device.DataPorts)
                        {
                            BPDU = new BPDU(Device.Id, ((Switch)Device).DeviceIDToRetranslate, Port.ID, ((Switch)Device).PathCostToRetranslate, Device.MACAdress);
                            if (Port.Device != null && !Port.PortStpRole.Equals(PortSTPRole.RootPort))
                            {
                                PhysicalLayer.ExecuteProtocol(new SF(), Port.Device.DeviceObject, BPDU);
                            }
                        }
                    }
                }
            }

            //Ретрансляция дальше полученного пакета от root моста
            foreach (var Frame in Cash)
            {
                if (Frame.FrameType.Equals(FrameType.BPDU))
                {
                    bool exit = false;
                    if (((BPDU)Frame).RootBridgeId == ((Switch)Device).DeviceIDToRetranslate)
                    {
                        PhysicalLayer PhysicalLayer = new PhysicalLayer();
                        BPDU          BPDU          = new BPDU();

                        foreach (var Port in Device.DataPorts)
                        {
                            BPDU = new BPDU(Device.Id, ((Switch)Device).DeviceIDToRetranslate, Port.ID, ((Switch)Device).PathCostToRetranslate, Device.MACAdress);
                            if (Port.Device != null && !Port.PortStpRole.Equals(PortSTPRole.RootPort))
                            {
                                PhysicalLayer.ExecuteProtocol(new SF(), Port.Device.DeviceObject, BPDU);
                                exit = true;
                            }
                        }
                        if (exit)
                        {
                            break;
                        }
                    }
                }
            }

            //Переключение root роли, если находится порт с меньшим путём до root моста
            foreach (var Frame in Cash)
            {
                if (Frame.FrameType.Equals(FrameType.BPDU))
                {
                    if (((BPDU)Frame).RootBridgeId == ((Switch)Device).DeviceIDToRetranslate && ((BPDU)Frame).RootPathCost < ((Switch)Device).PathCostToRetranslate - 1)
                    {
                        foreach (var Port in Device.DataPorts)
                        {
                            if (Port.Device != null)
                            {
                                if (Port.PortStpRole.Equals(PortSTPRole.RootPort))
                                {
                                    Port.PortStpRole = PortSTPRole.NondesignatedPort;
                                }
                                if (Port.Device.DeviceObject.MACAdress == ((BPDU)Frame).SourceAddress)
                                {
                                    Port.PortStpRole = PortSTPRole.RootPort;
                                    ((Switch)Device).PathCostToRetranslate = ((BPDU)Frame).RootPathCost + 1;
                                    Port.Device.DeviceObject.DataPorts[((BPDU)Frame).PortID].PortStpRole = PortSTPRole.DesignatedPort;
                                }
                            }
                        }
                    }
                }
            }

            //Проверка соединения с root мостом
            foreach (var Frame in Cash)
            {
                if (Frame.FrameType.Equals(FrameType.BPDU))
                {
                    if (((BPDU)Frame).RootBridgeId == ((Switch)Device).DeviceIDToRetranslate)
                    {
                        foreach (var Port in Device.DataPorts)
                        {
                            if (Port.Device != null)
                            {
                                if (Port.Device.DeviceObject.MACAdress == ((BPDU)Frame).SourceAddress && Port.PortStpRole.Equals(PortSTPRole.RootPort) && !((Switch)Device).RootSwitch)
                                {
                                    ((Switch)Device).RSConnnection     = true;
                                    ((Switch)Device).RSConnectionCheck = 0;
                                }
                            }
                        }
                    }
                }
            }

            //Контрольная проверка соедиения с root мостом
            if (!((Switch)Device).RSConnnection && ((Switch)Device).RSConnectionCheck == 10)
            {
                //MessageBox.Show("Произошла потеря");
                ((Switch)Device).RootSwitch            = true;
                ((Switch)Device).DeviceIDToRetranslate = ((Switch)Device).Id;
                ((Switch)Device).PathCostToRetranslate = 0;

                foreach (var Port in Device.DataPorts)
                {
                    Port.PortStpRole = PortSTPRole.NondesignatedPort;
                }

                ((Switch)Device).RSConnectionCheck = 0;
                ((Switch)Device).RSConnnection     = false;
            }

            if (((Switch)Device).RSConnectionCheck == 10)
            {
                ((Switch)Device).RSConnectionCheck = 0;
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Обработка кадров протоколом ethernet
        /// </summary>
        /// <param name="Cash">Кэш устройства</param>
        /// <param name="Device">Устройство</param>
        public void Processing(List <Frame> Cash, Device Device)
        {
            bool RecordExist = false; //Cуществование записи

            PhysicalLayer physicalLayer = new PhysicalLayer();

            foreach (var Frame in Cash)
            {
                if (Frame.FrameType.Equals(FrameType.Ethernet))
                {
                    //Если кадр пришёл в пункт назначения
                    if (Device.MACAdress.Equals(Frame.DestinationAdress) && !((Networks.Frames.Ethernet)Frame).ACK)
                    {
                        bool RouteExist = false;
                        EthernetRoutingTableRecord ethernetRoutingTableRecord = new EthernetRoutingTableRecord(Frame.SourceAddress, ((Networks.Frames.Ethernet)Frame).PortDstId);

                        /*foreach (var RouteRecord in ((Switch)Device).RoutingTable)
                         * {
                         *  if (RouteRecord.Equals(ethernetRoutingTableRecord)) RouteExist = true;
                         * }
                         * if (!RouteExist)*/((Switch)Device).RoutingTable.Add(ethernetRoutingTableRecord);
                        Networks.Frames.Ethernet ethernet = new Networks.Frames.Ethernet(Frame.DestinationAdress, Frame.SourceAddress, FrameType.Ethernet, DateTime.Now.TimeOfDay);
                        ethernet.ACK = true;
                        this.Execute(Device, ethernet);
                    }
                    //Иначе, если это не пункт назначения
                    else
                    {
                        foreach (var RouteRecord in ((Switch)Device).RoutingTable)
                        {
                            if (RouteRecord.DestinationAddress == Frame.DestinationAdress)
                            {
                                foreach (var Port in ((Switch)Device).DataPorts[RouteRecord.PortId].Device.DeviceObject.DataPorts)
                                {
                                    if (Port.Device != null)
                                    {
                                        if (((Switch)Device).Id.Equals(Port.Device.DeviceObject.Id))
                                        {
                                            ((Networks.Frames.Ethernet)Frame).PortDstId = Port.ID;
                                        }
                                    }
                                }
                                physicalLayer.ExecuteProtocol(new SF(), ((Switch)Device).DataPorts[RouteRecord.PortId].Device.DeviceObject, Frame);
                                RecordExist = true;
                                break;
                            }
                        }

                        //Если нету записи в таблице маршрутизации
                        if (!RecordExist)
                        {
                            bool RouteExist = false;
                            EthernetRoutingTableRecord ethernetRoutingTableRecord = new EthernetRoutingTableRecord(Frame.SourceAddress, ((Networks.Frames.Ethernet)Frame).PortDstId);

                            /*foreach (var RouteRecord in ((Switch)Device).RoutingTable)
                             * {
                             *  if (RouteRecord.Equals(ethernetRoutingTableRecord)) RouteExist = true;
                             * }
                             * if (!RouteExist)*/((Switch)Device).RoutingTable.Add(ethernetRoutingTableRecord);
                            foreach (var Port in ((Switch)Device).DataPorts)
                            {
                                if (Port.Device != null && !Port.PortStpRole.Equals(PortSTPRole.DisabledPort) && Port.ID != ((Networks.Frames.Ethernet)Frame).PortDstId)
                                {
                                    foreach (var Portt in Port.Device.DeviceObject.DataPorts)
                                    {
                                        if (Portt.Device != null)
                                        {
                                            if (((Switch)Device).Id.Equals(Portt.Device.DeviceObject.Id))
                                            {
                                                ((Networks.Frames.Ethernet)Frame).PortDstId = Portt.ID;
                                            }
                                        }
                                    }
                                    physicalLayer.ExecuteProtocol(new SF(), Port.Device.DeviceObject, Frame);
                                }
                            }
                        }
                    }
                }
            }
        }