Example #1
0
        private void InstallFlow(IConnection connection)
        {
            _controller.Topo.AddSwitch(connection.SwitchFeatures, connection);

            _controller.LogDebug($"[{connection.Mac}] Installing Discovery Flow");
            OfpMatch match = new OfpMatch
            {
                Wildcards = new OfpWildcards()
                {
                    Wildcards = OfpFlowWildcards.OFPFW_DL_TYPE | OfpFlowWildcards.OFPFW_DL_DST
                },
                DlType = (ushort)EthernetPacketType.LLDP,
                DlDst  = EthernetAddress.NDP_MULTICAST.GetAddressBytes()
            };

            OfpFlowMod flow = new OfpFlowMod
            {
                Priority = _flowPriority,
                Match    = match
            };

            flow.Actions[OfpActionType.OFPAT_OUTPUT] = new OfpActionOutput()
            {
                Port = (ushort)OfpPort.OFPP_CONTROLLER
            };
            connection.Write(flow.ToByteArray());

            //Console.WriteLine($"[{connection.Mac}]Sending LLDP");
            foreach (var port in connection.SwitchFeatures.Ports)
            {
                _handler.SendLldpPacket(connection, port);
            }
        }
Example #2
0
        private void SendFlowMod(IConnection connection, Link link, PhysicalAddress src, PhysicalAddress dst, ushort priority = _flowPriority)
        {
            OfpMatch match = new OfpMatch
            {
                //Wildcards = new OfpWildcards() { Wildcards = 0 },
                Wildcards = new OfpWildcards()
                {
                    Wildcards = ~(OfpFlowWildcards.OFPFW_DL_DST | OfpFlowWildcards.OFPFW_DL_SRC), NwDstMask = 63, NwSrcMask = 63
                },
                DlSrc = src.GetAddressBytes(),
                DlDst = dst.GetAddressBytes()
            };
            OfpFlowMod flow = new OfpFlowMod
            {
                Priority = priority,
                Match    = match
            };

            flow.Actions[OfpActionType.OFPAT_OUTPUT] = new OfpActionOutput()
            {
                Port = link.SrcPort
            };
            _controller.LogDebug($"[{connection.Mac}]FlowMod from [{src}] to [{dst}]");
            connection.Write(flow.ToByteArray());
        }
Example #3
0
        public void TestOfpMatch()
        {
            OfpMatch dst;
            OfpMatch src = new OfpMatch()
            {
                DlSrc     = new byte[] { 1, 2, 3, 4, 5, 6 },
                DlDst     = new byte[] { 6, 5, 4, 3, 2, 1 },
                DlType    = 0x8100,
                Wildcards = new OfpWildcards(Convert.ToUInt32("0000000000000001100000100100001", 2)),
                NwProto   = 1,
                TpSrc     = 3389,
                TpDst     = 1433,
                NwTos     = 10,
                InPort    = 443,
                DlVlanPcp = 3,
                NwSrc     = 123456u,
                NwDst     = 654321u,
                DlVlan    = 1
            };

            using (MemoryStream ms = new MemoryStream(src.ToByteArray()))
            {
                dst = new OfpMatch(ms);
            }

            Assert.AreEqual(src.DlDst.ToPhysicalAddress(), dst.DlDst.ToPhysicalAddress());
            Assert.AreEqual(src.DlSrc.ToPhysicalAddress(), dst.DlSrc.ToPhysicalAddress());
            Assert.AreEqual(src.DlType, dst.DlType);
            Assert.AreEqual(src.DlVlan, dst.DlVlan);
            Assert.AreEqual(src.DlVlanPcp, dst.DlVlanPcp);
            Assert.AreEqual(src.InPort, dst.InPort);
            Assert.AreEqual(src.NwDst, dst.NwDst);
            Assert.AreEqual(src.NwProto, dst.NwProto);
            Assert.AreEqual(src.NwSrc, dst.NwSrc);
            Assert.AreEqual(src.NwTos, dst.NwTos);
            Assert.AreEqual(src.Wildcards, dst.Wildcards);
            Assert.AreEqual(src.TpDst, dst.TpDst);
            Assert.AreEqual(src.TpSrc, dst.TpSrc);
        }
Example #4
0
        private void SendFlowMod(Topology.Switch sw, Link link, IPAddress src, IPAddress dst, ushort priority = _flowPriority)
        {
            OfpMatch match = new OfpMatch
            {
                Wildcards = new OfpWildcards()
                {
                    NwDstMask = 0, NwSrcMask = 0
                },
                NwSrc = (uint)src.Address,
                NwDst = (uint)dst.Address,
            };
            OfpFlowMod flow = new OfpFlowMod
            {
                Priority = priority,
                Match    = match
            };

            flow.Actions[OfpActionType.OFPAT_OUTPUT] = new OfpActionOutput()
            {
                Port = link.SrcPort
            };
            _controller.LogDebug($"[{sw.MacAddress}]FlowMod from [{src}] to [{dst}]");
            sw.Connection.Write(flow.ToByteArray());
        }