Bug 5540 - PortConvertor, MatchConvertor
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / action / ActionSetNwDstReactorMappingFactory.java
1 /**
2  * Copyright (c) 2013 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.action;
10
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Map;
14 import org.opendaylight.openflowplugin.api.OFConstants;
15 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
17 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.InjectionKey;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.InjectionResultTargetKey;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwDstCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.nw.dst._case.SetNwDstActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4DstBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6DstBuilder;
37
38 /**
39  * add prepared convertors and injectors into given mappings
40  *
41  * @see ActionSetNwSrcReactor
42  */
43 public class ActionSetNwDstReactorMappingFactory {
44
45     /**
46      * @param conversionMapping conversion mapping
47      */
48     public static void addSetNwDstConvertors(final Map<Short, Convertor<SetNwDstActionCase, ?>> conversionMapping) {
49         conversionMapping.put(OFConstants.OFP_VERSION_1_0, new ActionSetNwDstConvertorV10Impl());
50         conversionMapping.put(OFConstants.OFP_VERSION_1_3, new ActionSetNwDstConvertorImpl());
51     }
52
53     /**
54      * @param injectionMapping injection mapping
55      */
56     public static void addSetNwDstInjectors(final Map<InjectionKey, ResultInjector<?, ?>> injectionMapping) {
57         // OF-1.0| Ipv4Address -> ActionBuilder; SetNwDst
58         injectionMapping.put(new InjectionResultTargetKey(OFConstants.OFP_VERSION_1_0,
59                         ActionBuilder.class, Ipv4Address.class),
60                 new ResultInjector<Ipv4Address, ActionBuilder>() {
61                     @Override
62                     public void inject(final Ipv4Address result, final ActionBuilder target) {
63                         SetNwDstCaseBuilder setNwDstCaseBuilder = new SetNwDstCaseBuilder();
64                         SetNwDstActionBuilder setNwDstActionBuilder = new SetNwDstActionBuilder();
65                         setNwDstActionBuilder.setIpAddress(result);
66                         setNwDstCaseBuilder.setSetNwDstAction(setNwDstActionBuilder.build());
67                         target.setActionChoice(setNwDstCaseBuilder.build());
68                     }
69                 });
70
71         // OF-1.3| Ipv4Address -> ActionBuilder; SetNwDst
72         injectionMapping.put(new InjectionResultTargetKey(OFConstants.OFP_VERSION_1_3,
73                         ActionBuilder.class, Ipv4Address.class),
74                 new ResultInjector<Ipv4Address, ActionBuilder>() {
75                     @Override
76                     public void inject(final Ipv4Address result, final ActionBuilder target) {
77                         List<MatchEntry> matchEntriesList = new ArrayList<>();
78                         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
79                         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
80                         matchEntryBuilder.setOxmMatchField(Ipv4Dst.class);
81
82                         Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();
83                         Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder();
84                         ipv4DstBuilder.setIpv4Address(result);
85                         Integer prefix = IpConversionUtil.extractPrefix(result);
86                         if (prefix != null) {
87                             ipv4DstBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix));
88                         }
89                         ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build());
90
91                         matchEntryBuilder.setHasMask(false);
92                         matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());
93                         matchEntriesList.add(matchEntryBuilder.build());
94
95                         SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
96                         SetFieldActionBuilder setFieldActionBuilder = new SetFieldActionBuilder();
97                         setFieldActionBuilder.setMatchEntry(matchEntriesList);
98                         setFieldCaseBuilder.setSetFieldAction(setFieldActionBuilder.build());
99                         target.setActionChoice(setFieldCaseBuilder.build());
100                     }
101                 });
102
103         // OF-1.3| Ipv6Address -> ActionBuilder; SetNwDst
104         injectionMapping.put(new InjectionResultTargetKey(OFConstants.OFP_VERSION_1_3,
105                         ActionBuilder.class, Ipv6Address.class),
106                 new ResultInjector<Ipv6Address, ActionBuilder>() {
107                     @Override
108                     public void inject(final Ipv6Address result, final ActionBuilder target) {
109                         List<MatchEntry> matchEntriesList = new ArrayList<>();
110                         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
111                         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
112                         matchEntryBuilder.setOxmMatchField(Ipv6Dst.class);
113
114                         Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();
115                         Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder();
116                         ipv6DstBuilder.setIpv6Address(result);
117                         Integer prefix = IpConversionUtil.extractPrefix(result);
118                         if (prefix != null) {
119                             ipv6DstBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix));
120                         }
121                         ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build());
122
123                         matchEntryBuilder.setHasMask(false);
124                         matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build());
125                         matchEntriesList.add(matchEntryBuilder.build());
126
127                         SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
128                         SetFieldActionBuilder setFieldActionBuilder = new SetFieldActionBuilder();
129                         setFieldActionBuilder.setMatchEntry(matchEntriesList);
130                         setFieldCaseBuilder.setSetFieldAction(setFieldActionBuilder.build());
131                         target.setActionChoice(setFieldCaseBuilder.build());
132                     }
133                 });
134     }
135 }