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