-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 <brent.salisbury@gmail.com>
Signed-off-by: Michal Rehak <mirehak@cisco.com>
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;
} 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());
}
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;
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);
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;
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;
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;
}
}
+ //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) {
ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+ TcpFlagMatchBuilder tcpFlagMatchBuilder = new TcpFlagMatchBuilder();
List<MatchEntries> swMatchList = swMatch.getMatchEntries();
}
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();
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);
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;
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);
}
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<InstanceIdentifier<?>, DataObject> modification = dataBrokerService.beginTransaction();
NodeBuilder tn = createTestNode(ci.nextArgument());