Bug 5540 - ConvertorManager DataContainer source, one Convertor interface
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / MatchResponseConvertor.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
10
11 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
12 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
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;
80 import org.opendaylight.yangtools.yang.binding.DataContainer;
81
82 /**
83  * Converts Openflow 1.3+ specific flow match to MD-SAL format flow
84  * match
85  *
86  * Example usage:
87  * <pre>
88  * {@code
89  * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
90  * data.setDatapathId(datapathId);
91  * Optional<MatchBuilder> salMatch = ConvertorManager.getInstance().convert(ofMatch, data);
92  * }
93  * </pre>
94  */
95 public class MatchResponseConvertor implements Convertor<MatchEntriesGrouping, MatchBuilder, VersionDatapathIdConvertorData> {
96     private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData> OF_TO_SAL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
97             .addCase(new OfToSalInPortCase())
98             .addCase(new OfToSalInPhyPortCase())
99             .addCase(new OfToSalMetadataCase())
100             .addCase(new OfToSalEthSrcCase())
101             .addCase(new OfToSalEthDstCase())
102             .addCase(new OfToSalEthTypeCase())
103             .addCase(new OfToSalVlanVidCase())
104             .addCase(new OfToSalVlanPcpCase())
105             .addCase(new OfToSalIpDscpCase())
106             .addCase(new OfToSalIpEcnCase())
107             .addCase(new OfToSalIpProtoCase())
108             .addCase(new OfToSalTcpSrcCase())
109             .addCase(new OfToSalTcpDstCase())
110             .addCase(new OfToSalUdpSrcCase())
111             .addCase(new OfToSalUdpDstCase())
112             .addCase(new OfToSalSctpSrcCase())
113             .addCase(new OfToSalSctpDstCase())
114             .addCase(new OfToSalIcmpv4TypeCase())
115             .addCase(new OfToSalIcmpv4CodeCase())
116             .addCase(new OfToSalIcmpv6TypeCase())
117             .addCase(new OfToSalIcmpv6CodeCase())
118             .addCase(new OfToSalIpv4SrcCase())
119             .addCase(new OfToSalIpv4DstCase())
120             .addCase(new OfToSalArpOpCase())
121             .addCase(new OfToSalArpSpaCase())
122             .addCase(new OfToSalArpTpaCase())
123             .addCase(new OfToSalArpShaCase())
124             .addCase(new OfToSalArpThaCase())
125             .addCase(new OfToSalIpv6SrcCase())
126             .addCase(new OfToSalIpv6DstCase())
127             .addCase(new OfToSalIpv6FlabelCase())
128             .addCase(new OfToSalIpv6NdTargetCase())
129             .addCase(new OfToSalIpv6NdSllCase())
130             .addCase(new OfToSalIpv6NdTllCase())
131             .addCase(new OfToSalIpv6ExthdrCase())
132             .addCase(new OfToSalMplsLabelCase())
133             .addCase(new OfToSalMplsBosCase())
134             .addCase(new OfToSalMplsTcCase())
135             .addCase(new OfToSalPbbIsidCase())
136             .addCase(new OfToSalTunnelIdCase())
137             .addCase(new OfToSalExperimenterIdCase());
138
139     private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData> OF_TO_SAL_TUNNEL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
140             .addCase(new OfToSalTunnelIpv4SrcCase())
141             .addCase(new OfToSalTunnelIpv4DstCase());
142
143     @Override
144     public Class<? extends DataContainer> getType() {
145         return MatchEntriesGrouping.class;
146     }
147
148     @Override
149     public MatchBuilder convert(MatchEntriesGrouping source, VersionDatapathIdConvertorData datapathIdConvertorData) {
150         final MatchBuilder matchBuilder = new MatchBuilder();
151
152         final MatchResponseConvertorData data = new MatchResponseConvertorData(datapathIdConvertorData.getVersion());
153         data.setDatapathId(datapathIdConvertorData.getDatapathId());
154         data.setMatchBuilder(matchBuilder);
155         data.setEthernetMatchBuilder(new EthernetMatchBuilder());
156         data.setVlanMatchBuilder(new VlanMatchBuilder());
157         data.setIpMatchBuilder(new IpMatchBuilder());
158         data.setTcpMatchBuilder(new TcpMatchBuilder());
159         data.setUdpMatchBuilder(new UdpMatchBuilder());
160         data.setSctpMatchBuilder(new SctpMatchBuilder());
161         data.setIcmpv4MatchBuilder(new Icmpv4MatchBuilder());
162         data.setIcmpv6MatchBuilder(new Icmpv6MatchBuilder());
163         data.setIpv4MatchBuilder(new Ipv4MatchBuilder());
164         data.setIpv4MatchArbitraryBitMaskBuilder(new Ipv4MatchArbitraryBitMaskBuilder());
165         data.setIpv6MatchArbitraryBitMaskBuilder(new Ipv6MatchArbitraryBitMaskBuilder());
166         data.setArpMatchBuilder(new ArpMatchBuilder());
167         data.setIpv6MatchBuilder(new Ipv6MatchBuilder());
168         data.setProtocolMatchFieldsBuilder(new ProtocolMatchFieldsBuilder());
169         data.setTunnelIpv4MatchBuilder(new TunnelIpv4MatchBuilder());
170         data.setTcpFlagsMatchBuilder(new TcpFlagsMatchBuilder());
171
172         for (MatchEntry ofMatch : source.getMatchEntry()) {
173             if (TunnelIpv4Dst.class.isAssignableFrom(ofMatch.getOxmMatchField()) ||
174                     TunnelIpv4Src.class.isAssignableFrom(ofMatch.getOxmMatchField())) {
175                 /**
176                  * TODO: Fix TunnelIpv4Src and Ipv4Dst, because current implementation do not work
177                  * TunnelIpv4Src and TunnelIpv4Dst are not compatible with
178                  * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField
179                  * and so you cannot even set them to OxmMatchField.
180                  * Creation of TunnelIpv4SrcCase and TunnelIpv4DstCase in
181                  * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value
182                  * and proper use of it can fix this bug.
183                  */
184                 OF_TO_SAL_TUNNEL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data);
185             } else {
186                 data.setOxmMatchField(ofMatch.getOxmMatchField());
187                 OF_TO_SAL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data);
188             }
189         }
190
191         return matchBuilder;
192     }
193 }