Example #1
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;
                }
            }
        }
Example #2
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;
            }
        }