/// <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); } } } }
/// <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; } } }
/// <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; } }
/// <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); } } } } } } }