2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
11 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
12 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor;
13 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
14 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpOpCase;
15 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpShaCase;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpSpaCase;
17 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpThaCase;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpTpaCase;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthDstCase;
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthSrcCase;
21 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthTypeCase;
22 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv4CodeCase;
23 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv4TypeCase;
24 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv6CodeCase;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv6TypeCase;
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalInPhyPortCase;
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalInPortCase;
28 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpDscpCase;
29 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpEcnCase;
30 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpProtoCase;
31 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv4DstCase;
32 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv4SrcCase;
33 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6DstCase;
34 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6ExthdrCase;
35 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6FlabelCase;
36 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdSllCase;
37 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdTargetCase;
38 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdTllCase;
39 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6SrcCase;
40 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMetadataCase;
41 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsBosCase;
42 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsLabelCase;
43 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsTcCase;
44 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalPbbIsidCase;
45 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalSctpDstCase;
46 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalSctpSrcCase;
47 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTcpDstCase;
48 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalExperimenterIdCase;
49 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTcpSrcCase;
50 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIdCase;
51 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIpv4DstCase;
52 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIpv4SrcCase;
53 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalUdpDstCase;
54 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalUdpSrcCase;
55 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalVlanPcpCase;
56 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalVlanVidCase;
57 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatchBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.MatchEntryValue;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Dst;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Src;
82 * Converts Openflow 1.3+ specific flow match to MD-SAL format flow
88 * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
89 * data.setDatapathId(datapathId);
90 * Optional<MatchBuilder> salMatch = ConvertorManager.getInstance().convert(ofMatch, data);
94 public class MatchResponseConvertor implements ParametrizedConvertor<MatchEntriesGrouping, MatchBuilder, VersionDatapathIdConvertorData> {
95 private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData> OF_TO_SAL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
96 .addCase(new OfToSalInPortCase())
97 .addCase(new OfToSalInPhyPortCase())
98 .addCase(new OfToSalMetadataCase())
99 .addCase(new OfToSalEthSrcCase())
100 .addCase(new OfToSalEthDstCase())
101 .addCase(new OfToSalEthTypeCase())
102 .addCase(new OfToSalVlanVidCase())
103 .addCase(new OfToSalVlanPcpCase())
104 .addCase(new OfToSalIpDscpCase())
105 .addCase(new OfToSalIpEcnCase())
106 .addCase(new OfToSalIpProtoCase())
107 .addCase(new OfToSalTcpSrcCase())
108 .addCase(new OfToSalTcpDstCase())
109 .addCase(new OfToSalUdpSrcCase())
110 .addCase(new OfToSalUdpDstCase())
111 .addCase(new OfToSalSctpSrcCase())
112 .addCase(new OfToSalSctpDstCase())
113 .addCase(new OfToSalIcmpv4TypeCase())
114 .addCase(new OfToSalIcmpv4CodeCase())
115 .addCase(new OfToSalIcmpv6TypeCase())
116 .addCase(new OfToSalIcmpv6CodeCase())
117 .addCase(new OfToSalIpv4SrcCase())
118 .addCase(new OfToSalIpv4DstCase())
119 .addCase(new OfToSalArpOpCase())
120 .addCase(new OfToSalArpSpaCase())
121 .addCase(new OfToSalArpTpaCase())
122 .addCase(new OfToSalArpShaCase())
123 .addCase(new OfToSalArpThaCase())
124 .addCase(new OfToSalIpv6SrcCase())
125 .addCase(new OfToSalIpv6DstCase())
126 .addCase(new OfToSalIpv6FlabelCase())
127 .addCase(new OfToSalIpv6NdTargetCase())
128 .addCase(new OfToSalIpv6NdSllCase())
129 .addCase(new OfToSalIpv6NdTllCase())
130 .addCase(new OfToSalIpv6ExthdrCase())
131 .addCase(new OfToSalMplsLabelCase())
132 .addCase(new OfToSalMplsBosCase())
133 .addCase(new OfToSalMplsTcCase())
134 .addCase(new OfToSalPbbIsidCase())
135 .addCase(new OfToSalTunnelIdCase())
136 .addCase(new OfToSalExperimenterIdCase());
138 private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData> OF_TO_SAL_TUNNEL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
139 .addCase(new OfToSalTunnelIpv4SrcCase())
140 .addCase(new OfToSalTunnelIpv4DstCase());
143 public Class<?> getType() {
144 return MatchEntriesGrouping.class;
148 public MatchBuilder convert(MatchEntriesGrouping source, VersionDatapathIdConvertorData datapathIdConvertorData) {
149 final MatchBuilder matchBuilder = new MatchBuilder();
151 final MatchResponseConvertorData data = new MatchResponseConvertorData(datapathIdConvertorData.getVersion());
152 data.setDatapathId(datapathIdConvertorData.getDatapathId());
153 data.setMatchBuilder(matchBuilder);
154 data.setEthernetMatchBuilder(new EthernetMatchBuilder());
155 data.setVlanMatchBuilder(new VlanMatchBuilder());
156 data.setIpMatchBuilder(new IpMatchBuilder());
157 data.setTcpMatchBuilder(new TcpMatchBuilder());
158 data.setUdpMatchBuilder(new UdpMatchBuilder());
159 data.setSctpMatchBuilder(new SctpMatchBuilder());
160 data.setIcmpv4MatchBuilder(new Icmpv4MatchBuilder());
161 data.setIcmpv6MatchBuilder(new Icmpv6MatchBuilder());
162 data.setIpv4MatchBuilder(new Ipv4MatchBuilder());
163 data.setIpv4MatchArbitraryBitMaskBuilder(new Ipv4MatchArbitraryBitMaskBuilder());
164 data.setIpv6MatchArbitraryBitMaskBuilder(new Ipv6MatchArbitraryBitMaskBuilder());
165 data.setArpMatchBuilder(new ArpMatchBuilder());
166 data.setIpv6MatchBuilder(new Ipv6MatchBuilder());
167 data.setProtocolMatchFieldsBuilder(new ProtocolMatchFieldsBuilder());
168 data.setTunnelIpv4MatchBuilder(new TunnelIpv4MatchBuilder());
169 data.setTcpFlagsMatchBuilder(new TcpFlagsMatchBuilder());
171 for (MatchEntry ofMatch : source.getMatchEntry()) {
172 if (TunnelIpv4Dst.class.isAssignableFrom(ofMatch.getOxmMatchField()) ||
173 TunnelIpv4Src.class.isAssignableFrom(ofMatch.getOxmMatchField())) {
175 * TODO: Fix TunnelIpv4Src and Ipv4Dst, because current implementation do not work
176 * TunnelIpv4Src and TunnelIpv4Dst are not compatible with
177 * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField
178 * and so you cannot even set them to OxmMatchField.
179 * Creation of TunnelIpv4SrcCase and TunnelIpv4DstCase in
180 * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value
181 * and proper use of it can fix this bug.
183 OF_TO_SAL_TUNNEL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data);
185 data.setOxmMatchField(ofMatch.getOxmMatchField());
186 OF_TO_SAL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data);