From 74417f0d6e732e349b6d09f0bbb9a7a272512391 Mon Sep 17 00:00:00 2001 From: Brent Salisbury Date: Mon, 2 Jun 2014 15:03:25 -0400 Subject: [PATCH] BUG-1134: Added TCP flag conversions between md-sal and openflowjava -Conversions from high level model (model-flow-base) to low level models (ofjava). -Test included in OpenflowpluginTestCommandProvider as function addMDFlow f83() for testing. -Test results here: https://gist.github.com/04f96a080eb7ee32413b ---- Extensions info (see BUG-1133) ---- Support for extensions in OFPlugin is not going to be implemented this way (for POC it is temporarily ok). Vendor specific messages should be modeled in vendor bundle (augmenting MD-SAL or OFJAVA-API models). Current strategy is based on trasnparent forwarding of vendor messages through OFPlugin. More info will be shortly at https://wiki.opendaylight.org/view/OpenDaylight_OpenFlow_Plugin:Backlog:Extensibility Change-Id: Ifaa835a43ec8e0b2fb23e84abf121aefdbcde339 Signed-off-by: Brent Salisbury Signed-off-by: Michal Rehak --- .../sal/convertor/TableFeaturesConvertor.java | 5 +++ .../TableFeaturesReplyConvertor.java | 4 ++ .../convertor/match/MatchConvertorImpl.java | 34 ++++++++++++++ .../OpenflowpluginTestCommandProvider.java | 44 +++++++++++++++++++ 4 files changed, 87 insertions(+) diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesConvertor.java index 30a5ef028d..6636c4f073 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesConvertor.java @@ -85,6 +85,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbI import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpFlag; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst; @@ -539,6 +540,10 @@ public class TableFeaturesConvertor { } else if (currMatchType .equals(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid.class)) { setMatchEntry(matchEntryBuilder, VlanVid.class, currMatch.isHasMask()); + } else if (currMatchType + .equals(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlag.class)) { + //FIXME: move to extensible support + setMatchEntry(matchEntryBuilder, TcpFlag.class, currMatch.isHasMask()); } matchEntriesList.add(matchEntryBuilder.build()); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertor.java index 7422003e12..f40fc6cf3f 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertor.java @@ -78,6 +78,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbI import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpFlag; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst; @@ -473,6 +474,9 @@ public class TableFeaturesReplyConvertor { salMatchField = org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanPcp.class; } else if (ofMatchField.equals(VlanVid.class)) { salMatchField = org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid.class; + } else if (ofMatchField.equals(TcpFlag.class)) { + //FIXME: move to extensible support + salMatchField = org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlag.class; } setFieldMatchBuilder.setMatchType(salMatchField); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java index 4d3d3d7b13..ad0c7e5048 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java @@ -55,6 +55,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder; @@ -118,6 +120,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcpFlagMatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcpFlagMatchEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry; @@ -157,11 +161,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Meta import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpFlag; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst; @@ -397,6 +403,14 @@ public class MatchConvertorImpl implements MatchConvertor> { } } + //FIXME: move to extensible support + TcpFlagMatch tcpFlagMatch = match.getTcpFlagMatch(); + if (tcpFlagMatch != null) { + if (tcpFlagMatch.getTcpFlag() != null) { + matchEntriesList.add(toOfTcpFlag(tcpFlagMatch.getTcpFlag())); + } + } + org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel = match .getTunnel(); if (tunnel != null) { @@ -552,6 +566,7 @@ public class MatchConvertorImpl implements MatchConvertor> { ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder(); Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder(); ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder(); + TcpFlagMatchBuilder tcpFlagMatchBuilder = new TcpFlagMatchBuilder(); List swMatchList = swMatch.getMatchEntries(); @@ -885,6 +900,13 @@ public class MatchConvertorImpl implements MatchConvertor> { } matchBuilder.setTunnel(tunnelBuilder.build()); } + } else if (ofMatch.getOxmMatchField().equals(TcpFlag.class)) { + //FIXME: move to extensible support + TcpFlagMatchEntry tcpFlagMatch = ofMatch.getAugmentation(TcpFlagMatchEntry.class); + if (tcpFlagMatch != null) { + tcpFlagMatchBuilder.setTcpFlag(tcpFlagMatch.getTcpFlag()); + matchBuilder.setTcpFlagMatch(tcpFlagMatchBuilder.build()); + } } } return matchBuilder.build(); @@ -1206,6 +1228,18 @@ public class MatchConvertorImpl implements MatchConvertor> { return matchEntriesBuilder.build(); } + //FIXME: move to extensible support + private static MatchEntries toOfTcpFlag(Integer tcpFlag) { + MatchEntriesBuilder matchBuilder = new MatchEntriesBuilder(); + matchBuilder.setOxmClass(Nxm1Class.class); + matchBuilder.setHasMask(false); + matchBuilder.setOxmMatchField(TcpFlag.class); + TcpFlagMatchEntryBuilder tcpFlagBuilder = new TcpFlagMatchEntryBuilder(); + tcpFlagBuilder.setTcpFlag(tcpFlag); + matchBuilder.addAugmentation(TcpFlagMatchEntry.class, tcpFlagBuilder.build()); + return matchBuilder.build(); + } + private static void addMaskAugmentation(final MatchEntriesBuilder builder, final byte[] mask) { MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder(); maskBuilder.setMask(mask); diff --git a/test-provider/src/main/java/org/opendaylight/openflowplugin/test/OpenflowpluginTestCommandProvider.java b/test-provider/src/main/java/org/opendaylight/openflowplugin/test/OpenflowpluginTestCommandProvider.java index 620efed161..fd38c206f4 100644 --- a/test-provider/src/main/java/org/opendaylight/openflowplugin/test/OpenflowpluginTestCommandProvider.java +++ b/test-provider/src/main/java/org/opendaylight/openflowplugin/test/OpenflowpluginTestCommandProvider.java @@ -164,6 +164,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; @@ -660,6 +661,11 @@ public class OpenflowpluginTestCommandProvider implements CommandProvider { flow.setMatch(createToSMatch().build()); flow.setInstructions(createOutputInstructions().build()); break; + case "f83": + id += 83; // Test TCP_Flag Match + flow.setMatch(createTcpFlagMatch().build()); + flow.setInstructions(createDropInstructions().build()); + break; default: LOG.warn("flow type not understood: {}", flowType); } @@ -3201,6 +3207,44 @@ public class OpenflowpluginTestCommandProvider implements CommandProvider { return match; } + /** + * Test match for TCP_Flags + * @return match containing Ethertype (0x0800), IP Protocol (TCP), TCP_Flag (SYN) + */ + //FIXME: move to extensible support + private static MatchBuilder createTcpFlagMatch() { + MatchBuilder match = new MatchBuilder(); + + // Ethertype match + EthernetMatchBuilder ethernetType = new EthernetMatchBuilder(); + EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); + ethTypeBuilder.setType(new EtherType(0x0800L)); + ethernetType.setEthernetType(ethTypeBuilder.build()); + match.setEthernetMatch(ethernetType.build()); + + // TCP Protocol Match + IpMatchBuilder ipMatch = new IpMatchBuilder(); // ipv4 version + ipMatch.setIpProtocol((short) 6); + match.setIpMatch(ipMatch.build()); + + // TCP Port Match + PortNumber dstPort = new PortNumber(80); + TcpMatchBuilder tcpMatch = new TcpMatchBuilder(); + tcpMatch.setTcpDestinationPort(dstPort); + match.setLayer4Match(tcpMatch.build()); + /** + * Defined TCP Flag values in OVS v2.1+ + * TCP_FIN 0x001 / TCP_SYN 0x002 / TCP_RST 0x004 + * TCP_PSH 0x008 / TCP_ACK 0x010 / TCP_URG 0x020 + * TCP_ECE 0x040 / TCP_CWR 0x080 / TCP_NS 0x100 + */ + TcpFlagMatchBuilder tcpFlagMatch = new TcpFlagMatchBuilder(); + tcpFlagMatch.setTcpFlag(0x002); + match.setTcpFlagMatch(tcpFlagMatch.build()); + + return match; + } + public void _removeMDFlow(CommandInterpreter ci) { DataModification, DataObject> modification = dataBrokerService.beginTransaction(); NodeBuilder tn = createTestNode(ci.nextArgument()); -- 2.36.6