Exemple #1
0
        private void Initialize(MemoryStream ms, OfpHeader header)
        {
            if (!_versionChecked)
            {
                _version        = header.Version;
                _versionChecked = true;
                var reply = new OfpSwitchFeaturesRequest();
                _log.Debug("Request for features");
                //Console.WriteLine("Request for features");
                Write(reply.ToByteArray());
            }
            else if (header.Type == OfpType.OFPT_FEATURES_REPLY)
            {
                OfpSwitchFeatures features = new OfpSwitchFeatures(ms, header);
                _mac = features.DatapathId.GetPhysicalAddress();
                _log.Info($"A switch connected - MAC={_mac}");
                //Console.WriteLine($"A switch connected - MAC={_mac}");
                foreach (var ofpPhyPort in features.Ports)
                {
                    //Console.WriteLine($"\tPortNum={ofpPhyPort.PortNo} \tPortName={ofpPhyPort.Name} \tPortState={ofpPhyPort.State.ToString()}");
                }
                SwitchFeatures  = features;
                _featureChecked = true;
                var reply = new OfpSwitchConfig(true);
                reply.Flags       = OfpConfigFlags.OFPC_FRAG_NORMAL;
                reply.MissSendLen = 65535;
                Write(reply.ToByteArray());
                var reply2 = new OfpSwitchConfigRequest();
                Write(reply2.ToByteArray());
            }
            else if (header.Type == OfpType.OFPT_GET_CONFIG_REPLY)
            {
                OfpSwitchConfig config = new OfpSwitchConfig(ms, header);
                _log.Info($"[{_mac}] Config: Flag={config.Flags} MissSendLen={config.MissSendLen}");
                //Console.WriteLine($"[{_mac}] Config: Flag={config.Flags} MissSendLen={config.MissSendLen}");
                _configChecked = true;
                return;
            }
            else if (header.Type == OfpType.OFPT_ECHO_REQUEST)
            {
                OfpEcho echo = new OfpEcho(ms, header);
                _version        = echo.Header.Version;
                _versionChecked = true;
                var reply = new OfpEcho(true);
                reply.Data = echo.Data;
                Write(reply.ToByteArray());
            }
            else if (header.Type == OfpType.OFPT_ERROR)
            {
                OfpErrorMsg error = new OfpErrorMsg(ms, header);
                _log.Info($"[{_mac}] Error: type={error.Type.ToString()} code={error.GetErrorCode()}");
                //Console.WriteLine($"[{_mac}] Error: type={error.Type.ToString()} code={error.GetErrorCode()}");
                return;
            }

            else
            {
                return;
            }
        }
Exemple #2
0
 private void Barrier(MemoryStream ms, OfpHeader header)
 {
     if (header.Type == OfpType.OFPT_BARRIER_REQUEST)
     {
         return;
     }
     OfpBarrier barrier = new OfpBarrier();
 }
Exemple #3
0
        private void Error(MemoryStream ms, OfpHeader header)
        {
            OfpErrorMsg error = new OfpErrorMsg(ms, header);

            Debug.WriteLine($"[{_mac}] ERROR:{error.Type} - {error.GetErrorCode()}");
            _log.Info($"[{_mac}] ERROR:{error.Type} - {error.GetErrorCode()}");
            //Console.WriteLine($"[{_mac}] ERROR:{error.Type} - {error.GetErrorCode()}");
            _controller.PluginSystem.Error(error, this);
        }
Exemple #4
0
        private void Echo(MemoryStream ms, OfpHeader header)
        {
            OfpEcho echo = new OfpEcho(ms, header);

            if (echo.Header.Type == OfpType.OFPT_ECHO_REQUEST)
            {
                Write(new OfpEcho(true).ToByteArray());
            }
            _controller.PluginSystem.Echo(echo, this);
        }
Exemple #5
0
        private void Stats(MemoryStream ms, OfpHeader header)
        {
            if (header.Type == OfpType.OFPT_STATS_REQUEST)
            {
                return;
            }
            else
            {
                OfpStatsReply reply  = new OfpStatsReply(ms, header);
                MemoryStream  bodyms = new MemoryStream(reply.Body);
                switch (reply.Type)
                {
                case OfpStatsTypes.OFPST_DESC:
                    OfpDescStats stats1 = new OfpDescStats(bodyms);
                    _controller.PluginSystem.DescStats(stats1, this);
                    break;

                case OfpStatsTypes.OFPST_FLOW:
                    OfpFlowStats stats2 = new OfpFlowStats(bodyms);
                    _controller.PluginSystem.FlowStats(stats2, this);
                    break;

                case OfpStatsTypes.OFPST_AGGREGATE:
                    OfpAggregateStats stats3 = new OfpAggregateStats(bodyms);
                    _controller.PluginSystem.AggregateStats(stats3, this);
                    break;

                case OfpStatsTypes.OFPST_TABLE:
                    OfpTableStats stats4 = new OfpTableStats(bodyms);
                    _controller.PluginSystem.TableStats(stats4, this);
                    break;

                case OfpStatsTypes.OFPST_PORT:
                    OfpPortStats stats5 = new OfpPortStats(bodyms);
                    _controller.PluginSystem.PortStats(stats5, this);
                    break;

                case OfpStatsTypes.OFPST_QUEUE:
                    OfpQueueStats stats6 = new OfpQueueStats(bodyms);
                    _controller.PluginSystem.QueueStats(stats6, this);
                    break;

                case OfpStatsTypes.OFPST_VENDOR:
                    OfpVendorStats stats7 = new OfpVendorStats(bodyms, (int)ms.Length);
                    _controller.PluginSystem.VendorStats(stats7, this);
                    break;

                default:
                    //throw new ArgumentOutOfRangeException();
                    break;
                }
                bodyms.Dispose();
            }
        }
Exemple #6
0
 private void Features(MemoryStream ms, OfpHeader header)
 {
     if (header.Type == OfpType.OFPT_FEATURES_REQUEST)
     {
         return;
     }
     else
     {
         OfpSwitchFeatures features = new OfpSwitchFeatures(ms, header);
         _controller.PluginSystem.SwitchFeatures(features, this);
     }
 }
Exemple #7
0
        private OfpHeader ParesHeader(byte[] stream)
        {
            OfpHeader header;

            try
            {
                header = new OfpHeader(stream);
            }
            catch (Exception)
            {
                header = null;
                //throw;
            }
            return(header);
        }
Exemple #8
0
 private void SwitchConfig(MemoryStream ms, OfpHeader header)
 {
     if (header.Type == OfpType.OFPT_GET_CONFIG_REQUEST)
     {
         return;
     }
     else if (header.Type == OfpType.OFPT_SET_CONFIG)
     {
         return;
     }
     else
     {
         OfpSwitchConfig config = new OfpSwitchConfig(ms, header);
         _controller.PluginSystem.SwitchConfig(config, this);
     }
 }
Exemple #9
0
        private OfpHeader ParesHeader(Stream stream)
        {
            var       pos = stream.Position;
            OfpHeader header;

            try
            {
                header = new OfpHeader(stream);
            }
            catch (Exception)
            {
                header = null;
                //throw;
            }
            stream.Position = pos;
            return(header);
        }
Exemple #10
0
        public void TestOfpHeader()
        {
            OfpHeader dst = new OfpHeader();
            OfpHeader src = new OfpHeader()
            {
                Length = 12, Version = 1, Type = OfpType.OFPT_ERROR, Xid = 2
            };

            using (MemoryStream ms = new MemoryStream(src.ToByteArray()))
            {
                dst = new OfpHeader(ms);
            }
            Assert.AreEqual(src.Version, dst.Version);
            Assert.AreEqual(src.Type, dst.Type);
            Assert.AreEqual(src.Length, dst.Length);
            Assert.AreEqual(src.Xid, dst.Xid);
        }
Exemple #11
0
        private void PacketIn(MemoryStream ms, OfpHeader header)
        {
            OfpPacketIn packetIn = new OfpPacketIn(ms, header);
            Packet      packet   = null;

            if (Math.Abs(packetIn.TotalLen - packetIn.Data.Length) <= 8)
            {
                try
                {
                    packet = Packet.ParsePacket(LinkLayers.Ethernet, packetIn.Data);
                }
                catch (Exception)
                {
                    packet = null;
                }
            }
            _controller.PluginSystem.PacketIn(packetIn, packet, this);
        }
Exemple #12
0
 private void FlowMod(MemoryStream ms, OfpHeader header)
 {
     return;
 }
Exemple #13
0
        protected void HandleMessage(byte[] message, OfpHeader header)
        {
            //state = null;
            MemoryStream ms = new MemoryStream(message);

            //var header = ParesHeader(ms);
            if (header == null)
            {
                return;
            }

            _log.Debug($"[{_mac}] message={header.Type.ToString()}");
            //Console.WriteLine($"[{_mac}] message={header.Type.ToString()}");

            if (!_inited)
            {
                Initialize(ms, header);
                if (_versionChecked && _configChecked && _featureChecked)
                {
                    _inited = true;
                    _log.Info($"[{_mac}] inited.");
                    //Console.WriteLine($"[{_mac}] inited.");
                    OnConnectionReady?.Invoke(this);
                }
                return;
            }

            switch (header.Type)
            {
            case OfpType.OFPT_HELLO:
                Hello(ms, header);
                break;

            case OfpType.OFPT_ERROR:
                Error(ms, header);
                break;

            case OfpType.OFPT_ECHO_REQUEST:
                Echo(ms, header);
                break;

            case OfpType.OFPT_ECHO_REPLY:
                Echo(ms, header);
                break;

            case OfpType.OFPT_VENDOR:
                Vendor(ms, header);
                break;

            case OfpType.OFPT_FEATURES_REQUEST:
                Features(ms, header);
                break;

            case OfpType.OFPT_FEATURES_REPLY:
                Features(ms, header);
                break;

            case OfpType.OFPT_GET_CONFIG_REQUEST:
                SwitchConfig(ms, header);
                break;

            case OfpType.OFPT_GET_CONFIG_REPLY:
                SwitchConfig(ms, header);
                break;

            case OfpType.OFPT_SET_CONFIG:
                SwitchConfig(ms, header);
                break;

            case OfpType.OFPT_PACKET_IN:
                PacketIn(ms, header);
                break;

            case OfpType.OFPT_FLOW_REMOVED:
                FlowRemoved(ms, header);
                break;

            case OfpType.OFPT_PORT_STATUS:
                PortStatus(ms, header);
                break;

            case OfpType.OFPT_PACKET_OUT:
                PacketOut(ms, header);
                break;

            case OfpType.OFPT_FLOW_MOD:
                FlowMod(ms, header);
                break;

            case OfpType.OFPT_PORT_MOD:
                //NotImplemented
                break;

            case OfpType.OFPT_STATS_REQUEST:
                Stats(ms, header);
                break;

            case OfpType.OFPT_STATS_REPLY:
                Stats(ms, header);
                break;

            case OfpType.OFPT_BARRIER_REQUEST:
                Barrier(ms, header);
                break;

            case OfpType.OFPT_BARRIER_REPLY:
                Barrier(ms, header);
                break;

            case OfpType.OFPT_QUEUE_GET_CONFIG_REQUEST:
                QueueConfig(ms, header);
                break;

            case OfpType.OFPT_QUEUE_GET_CONFIG_REPLY:
                QueueConfig(ms, header);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            ms.Close();
        }
Exemple #14
0
 private void PacketOut(MemoryStream ms, OfpHeader header)
 {
     return;
 }
Exemple #15
0
        private void Hello(MemoryStream ms, OfpHeader header)
        {
            OfpHello hello = new OfpHello(ms, header);

            _controller.PluginSystem.Hello(hello, this);
        }
Exemple #16
0
        private void PortStatus(MemoryStream ms, OfpHeader header)
        {
            OfpPortStatus status = new OfpPortStatus(ms, header);

            _controller.PluginSystem.PortStatus(status, this);
        }
Exemple #17
0
        private void FlowRemoved(MemoryStream ms, OfpHeader header)
        {
            OfpFlowRemoved removed = new OfpFlowRemoved(ms, header);

            _controller.PluginSystem.FlowRemoved(removed, this);
        }
Exemple #18
0
        private void Vendor(MemoryStream ms, OfpHeader header)
        {
            OfpVendorHeader vendor = new OfpVendorHeader(ms, header);

            _controller.PluginSystem.Vendor(vendor, this);
        }
Exemple #19
0
        private void QueueConfig(MemoryStream ms, OfpHeader header)
        {
            OfpQueueGetConfig config = new OfpQueueGetConfig(ms, header);

            _controller.PluginSystem.QueueConfig(config, this);
        }