b5908b737770367c213281a7d89d83406db6840a
[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 java.util.Arrays;
12 import java.util.Collection;
13 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
14 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
15 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpOpCase;
17 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpShaCase;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpSpaCase;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpThaCase;
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpTpaCase;
21 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthDstCase;
22 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthSrcCase;
23 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthTypeCase;
24 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalExperimenterIdCase;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv4CodeCase;
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv4TypeCase;
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv6CodeCase;
28 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv6TypeCase;
29 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalInPhyPortCase;
30 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalInPortCase;
31 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpDscpCase;
32 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpEcnCase;
33 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpProtoCase;
34 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv4DstCase;
35 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv4SrcCase;
36 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6DstCase;
37 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6ExthdrCase;
38 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6FlabelCase;
39 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdSllCase;
40 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdTargetCase;
41 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdTllCase;
42 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6SrcCase;
43 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMetadataCase;
44 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsBosCase;
45 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsLabelCase;
46 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsTcCase;
47 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalPacketTypeCase;
48 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalPbbIsidCase;
49 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalSctpDstCase;
50 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalSctpSrcCase;
51 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTcpDstCase;
52 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTcpSrcCase;
53 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIdCase;
54 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIpv4DstCase;
55 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIpv4SrcCase;
56 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalUdpDstCase;
57 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalUdpSrcCase;
58 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalVlanPcpCase;
59 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalVlanVidCase;
60 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatchBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldAction;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.MatchEntryValue;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Dst;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Src;
85
86 /**
87  * Converts Openflow 1.3+ specific flow match to MD-SAL format flow match.
88  *
89  * <p>
90  * Example usage:
91  * <pre>
92  * {@code
93  * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
94  * data.setDatapathId(datapathId);
95  * Optional<MatchBuilder> salMatch = convertorManager.convert(ofMatch, data);
96  * }
97  * </pre>
98  */
99 public class MatchResponseConvertor extends Convertor<MatchEntriesGrouping, MatchBuilder,
100         VersionDatapathIdConvertorData> {
101     private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>
102         OF_TO_SAL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
103             .addCase(new OfToSalInPortCase())
104             .addCase(new OfToSalInPhyPortCase())
105             .addCase(new OfToSalMetadataCase())
106             .addCase(new OfToSalPacketTypeCase())
107             .addCase(new OfToSalEthSrcCase())
108             .addCase(new OfToSalEthDstCase())
109             .addCase(new OfToSalEthTypeCase())
110             .addCase(new OfToSalVlanVidCase())
111             .addCase(new OfToSalVlanPcpCase())
112             .addCase(new OfToSalIpDscpCase())
113             .addCase(new OfToSalIpEcnCase())
114             .addCase(new OfToSalIpProtoCase())
115             .addCase(new OfToSalTcpSrcCase())
116             .addCase(new OfToSalTcpDstCase())
117             .addCase(new OfToSalUdpSrcCase())
118             .addCase(new OfToSalUdpDstCase())
119             .addCase(new OfToSalSctpSrcCase())
120             .addCase(new OfToSalSctpDstCase())
121             .addCase(new OfToSalIcmpv4TypeCase())
122             .addCase(new OfToSalIcmpv4CodeCase())
123             .addCase(new OfToSalIcmpv6TypeCase())
124             .addCase(new OfToSalIcmpv6CodeCase())
125             .addCase(new OfToSalIpv4SrcCase())
126             .addCase(new OfToSalIpv4DstCase())
127             .addCase(new OfToSalArpOpCase())
128             .addCase(new OfToSalArpSpaCase())
129             .addCase(new OfToSalArpTpaCase())
130             .addCase(new OfToSalArpShaCase())
131             .addCase(new OfToSalArpThaCase())
132             .addCase(new OfToSalIpv6SrcCase())
133             .addCase(new OfToSalIpv6DstCase())
134             .addCase(new OfToSalIpv6FlabelCase())
135             .addCase(new OfToSalIpv6NdTargetCase())
136             .addCase(new OfToSalIpv6NdSllCase())
137             .addCase(new OfToSalIpv6NdTllCase())
138             .addCase(new OfToSalIpv6ExthdrCase())
139             .addCase(new OfToSalMplsLabelCase())
140             .addCase(new OfToSalMplsBosCase())
141             .addCase(new OfToSalMplsTcCase())
142             .addCase(new OfToSalPbbIsidCase())
143             .addCase(new OfToSalTunnelIdCase())
144             .addCase(new OfToSalExperimenterIdCase());
145
146     private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>
147         OF_TO_SAL_TUNNEL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
148             .addCase(new OfToSalTunnelIpv4SrcCase())
149             .addCase(new OfToSalTunnelIpv4DstCase());
150     private static final java.util.List<Class<?>> TYPES = Arrays.asList(Match.class, SetFieldAction.class);
151
152     @Override
153     public Collection<Class<?>> getTypes() {
154         return  TYPES;
155     }
156
157     @Override
158     public MatchBuilder convert(MatchEntriesGrouping source, VersionDatapathIdConvertorData datapathIdConvertorData) {
159         final MatchBuilder matchBuilder = new MatchBuilder();
160
161         final MatchResponseConvertorData data = new MatchResponseConvertorData(datapathIdConvertorData.getVersion());
162         data.setDatapathId(datapathIdConvertorData.getDatapathId());
163         data.setMatchBuilder(matchBuilder);
164         data.setEthernetMatchBuilder(new EthernetMatchBuilder());
165         data.setVlanMatchBuilder(new VlanMatchBuilder());
166         data.setIpMatchBuilder(new IpMatchBuilder());
167         data.setTcpMatchBuilder(new TcpMatchBuilder());
168         data.setUdpMatchBuilder(new UdpMatchBuilder());
169         data.setSctpMatchBuilder(new SctpMatchBuilder());
170         data.setIcmpv4MatchBuilder(new Icmpv4MatchBuilder());
171         data.setIcmpv6MatchBuilder(new Icmpv6MatchBuilder());
172         data.setIpv4MatchBuilder(new Ipv4MatchBuilder());
173         data.setIpv4MatchArbitraryBitMaskBuilder(new Ipv4MatchArbitraryBitMaskBuilder());
174         data.setIpv6MatchArbitraryBitMaskBuilder(new Ipv6MatchArbitraryBitMaskBuilder());
175         data.setArpMatchBuilder(new ArpMatchBuilder());
176         data.setIpv6MatchBuilder(new Ipv6MatchBuilder());
177         data.setProtocolMatchFieldsBuilder(new ProtocolMatchFieldsBuilder());
178         data.setTunnelIpv4MatchBuilder(new TunnelIpv4MatchBuilder());
179         data.setTcpFlagsMatchBuilder(new TcpFlagsMatchBuilder());
180
181         for (MatchEntry ofMatch : source.getMatchEntry()) {
182             if (TunnelIpv4Dst.class.isAssignableFrom(ofMatch.getOxmMatchField())
183                     || TunnelIpv4Src.class.isAssignableFrom(ofMatch.getOxmMatchField())) {
184                 /*
185                  * TODO: Fix TunnelIpv4Src and Ipv4Dst, because current implementation do not work
186                  * TunnelIpv4Src and TunnelIpv4Dst are not compatible with
187                  * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField
188                  * and so you cannot even set them to OxmMatchField.
189                  * Creation of TunnelIpv4SrcCase and TunnelIpv4DstCase in
190                  * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value
191                  *     .grouping.match.entry.value
192                  * and proper use of it can fix this bug.
193                  */
194                 OF_TO_SAL_TUNNEL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data, getConvertorExecutor());
195             } else {
196                 data.setOxmMatchField(ofMatch.getOxmMatchField());
197                 OF_TO_SAL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data, getConvertorExecutor());
198             }
199         }
200
201         return matchBuilder;
202     }
203 }