84341cd3fc8603a221a7224132d780f834b1ef81
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / ActionConvertor.java
1 /**
2  * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. 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 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
9
10 import com.google.common.collect.Ordering;
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Optional;
15 import org.opendaylight.openflowplugin.api.OFConstants;
16 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
17 import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
18 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
19 import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
20 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
21 import org.opendaylight.openflowplugin.extension.api.path.ActionPath;
22 import org.opendaylight.openflowplugin.openflow.md.core.extension.ActionExtensionHelper;
23 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionSetNwDstReactor;
24 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionSetNwSrcReactor;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IPProtocols;
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.OrderComparator;
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
28 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil;
29 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
30 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
31 import org.opendaylight.openflowplugin.openflow.md.util.ActionUtil;
32 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
33 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCase;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCase;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCase;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupAction;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputAction;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanAction;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstAction;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcAction;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlAction;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosAction;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueAction;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstAction;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcAction;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdAction;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpAction;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCaseBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCaseBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecMplsTtlCaseBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecNwTtlCaseBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.GroupCase;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.GroupCaseBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopMplsCaseBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCaseBuilder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopVlanCaseBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushMplsCaseBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCaseBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCaseBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetDlDstCaseBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetDlSrcCaseBuilder;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCaseBuilder;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetMplsTtlCase;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetMplsTtlCaseBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTosCaseBuilder;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCaseBuilder;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetQueueCaseBuilder;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetTpDstCaseBuilder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetTpSrcCaseBuilder;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetVlanPcpCaseBuilder;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetVlanVidCaseBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.StripVlanCaseBuilder;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.group._case.GroupActionBuilder;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.pop.mpls._case.PopMplsAction;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.pop.mpls._case.PopMplsActionBuilder;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.mpls._case.PushMplsAction;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.mpls._case.PushMplsActionBuilder;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.pbb._case.PushPbbAction;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.pbb._case.PushPbbActionBuilder;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.vlan._case.PushVlanActionBuilder;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.dl.dst._case.SetDlDstActionBuilder;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.dl.src._case.SetDlSrcActionBuilder;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldAction;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.mpls.ttl._case.SetMplsTtlActionBuilder;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.nw.tos._case.SetNwTosActionBuilder;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.nw.ttl._case.SetNwTtlAction;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.nw.ttl._case.SetNwTtlActionBuilder;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.queue._case.SetQueueActionBuilder;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.tp.dst._case.SetTpDstActionBuilder;
141 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.tp.src._case.SetTpSrcActionBuilder;
142 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.vlan.pcp._case.SetVlanPcpActionBuilder;
143 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.vlan.vid._case.SetVlanVidActionBuilder;
144 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
145 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
146 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
147 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
148 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
149 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
150 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
151 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
152 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
153 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
154 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
155 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;
156 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;
157 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;
158 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;
159 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
160 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
161 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
162 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder;
163 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder;
164 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder;
165 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder;
166 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder;
167 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder;
168 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
169 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCaseBuilder;
170 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCaseBuilder;
171 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCaseBuilder;
172 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCaseBuilder;
173 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
174 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder;
175 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder;
176 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4CodeBuilder;
177 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder;
178 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6CodeBuilder;
179 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder;
180 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDstBuilder;
181 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrcBuilder;
182 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDstBuilder;
183 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrcBuilder;
184 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
185 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
186 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionGrouping;
187 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension;
188 import org.slf4j.Logger;
189 import org.slf4j.LoggerFactory;
190
191 /**
192  * @author usha@ericsson Action List:This class takes data from SAL layer and
193  *         converts into OF Data
194  * @author avishnoi@in.ibm.com Added convertor for OF bucket actions to SAL
195  *         actions
196  */
197 public final class ActionConvertor {
198     private static final Logger LOG = LoggerFactory.getLogger(ActionConvertor.class);
199     private static final String UNKNOWN_ACTION_TYPE_VERSION = "Unknown Action Type for the Version";
200     private static final Ordering<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> ACTION_ORDERING =
201             Ordering.from(OrderComparator.<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>build());
202
203     private ActionConvertor() {
204         // NOOP
205     }
206
207     /**
208      * Translates SAL actions into OF Library actions
209      *
210      * @param actions    SAL actions
211      * @param version    Openflow protocol version used
212      * @param datapathid datapath id
213      * @param flow       TODO
214      * @return OF Library actions
215      */
216     public static List<Action> getActions(
217             final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
218             final short version, final BigInteger datapathid, final Flow flow) {
219         List<Action> actionsList = new ArrayList<>();
220         Action ofAction;
221
222         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> sortedActions =
223                 ACTION_ORDERING.sortedCopy(actions);
224
225         for (int actionItem = 0; actionItem < sortedActions.size(); actionItem++) {
226             ofAction = null;
227             ActionBuilder actionBuilder = new ActionBuilder();
228
229             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = sortedActions.get(
230                     actionItem).getAction();
231
232
233             if (action instanceof OutputActionCase) {
234                 ofAction = salToOFAction((OutputActionCase) action, actionBuilder, version);
235             } else if (action instanceof DropActionCase){
236                 //noop
237             } else if (action instanceof GroupActionCase) {
238                 ofAction = salToOFGroupAction(action, actionBuilder);
239             } else if (action instanceof CopyTtlOutCase) {
240                 ofAction = salToOFCopyTTLIOut(actionBuilder);
241             } else if (action instanceof CopyTtlInCase) {
242                 ofAction = salToOFCopyTTLIIn(actionBuilder);
243             } else if (action instanceof SetMplsTtlActionCase) {
244                 ofAction = salToOFSetMplsTtl(action, actionBuilder);
245             } else if (action instanceof DecMplsTtlCase) {
246                 ofAction = salToOFDecMplsTtl(actionBuilder);
247             } else if (action instanceof PushVlanActionCase) {
248                 ofAction = salToOFPushVlanAction(action, actionBuilder, version);
249             } else if (action instanceof PopVlanActionCase) {
250                 ofAction = (version == OFConstants.OFP_VERSION_1_0) ?
251                         salToOFStripVlan(actionBuilder, version)
252                         : salToOFPopVlan(actionBuilder);
253             } else if (action instanceof PushMplsActionCase) {
254                 ofAction = salToOFPushMplsAction(action, actionBuilder);
255             } else if (action instanceof PopMplsActionCase) {
256                 ofAction = salToOFPopMpls(action, actionBuilder);
257             } else if (action instanceof SetQueueActionCase) {
258                 ofAction = salToOFSetQueue(action, actionBuilder);
259             } else if (action instanceof SetNwTtlActionCase) {
260                 ofAction = salToOFSetNwTtl(action, actionBuilder);
261             } else if (action instanceof DecNwTtlCase) {
262                 ofAction = salToOFDecNwTtl(actionBuilder);
263             } else if (action instanceof SetFieldCase) {
264                 ofAction = salToOFSetField(action, actionBuilder, version, datapathid);
265             } else if (action instanceof PushPbbActionCase) {
266                 ofAction = salToOFPushPbbAction(action, actionBuilder);
267             } else if (action instanceof PopPbbActionCase) {
268                 ofAction = salToOFPopPBB(actionBuilder);
269
270                 // 1.0 Actions
271             } else if (action instanceof SetVlanIdActionCase) {
272                 ofAction = salToOFSetVlanId(action, actionBuilder, version);
273             } else if (action instanceof SetVlanPcpActionCase) {
274                 ofAction = salToOFSetVlanpcp(action, actionBuilder, version);
275             } else if (action instanceof StripVlanActionCase) {
276                 ofAction = salToOFStripVlan(actionBuilder, version);
277             } else if (action instanceof SetDlSrcActionCase) {
278                 ofAction = salToOFSetDlSrc(action, actionBuilder, version);
279             } else if (action instanceof SetDlDstActionCase) {
280                 ofAction = salToOFSetDlDst(action, actionBuilder, version);
281             } else if (action instanceof SetNwSrcActionCase) {
282                 ofAction = salToOFSetNwSrc(action, actionBuilder, version);
283             } else if (action instanceof SetNwDstActionCase) {
284                 ofAction = salToOFSetNwDst(action, actionBuilder, version);
285             } else if (action instanceof SetTpSrcActionCase) {
286                 ofAction = salToOFSetTpSrc(action, actionBuilder, version, IPProtocols.fromProtocolNum(flow.getMatch().
287                         getIpMatch().getIpProtocol()));
288             } else if (action instanceof SetTpDstActionCase) {
289                 ofAction = salToOFSetTpDst(action, actionBuilder, version, IPProtocols.fromProtocolNum(flow.getMatch().
290                         getIpMatch().getIpProtocol()));
291             } else if (action instanceof SetNwTosActionCase) {
292                 ofAction = salToOFSetNwTos(action, actionBuilder, version);
293             } else if (action instanceof GeneralExtensionGrouping) {
294                 /**
295                  * TODO: EXTENSION PROPOSAL (action, MD-SAL to OFJava)
296                  * - we might need sessionContext as converter input
297                  *
298                  */
299
300                 GeneralExtensionGrouping extensionCaseGrouping = (GeneralExtensionGrouping) action;
301                 Extension extAction = extensionCaseGrouping.getExtension();
302                 ConverterExtensionKey<? extends ExtensionKey> key = new ConverterExtensionKey<>(extensionCaseGrouping.getExtensionKey(), version);
303                 ConvertorToOFJava<Action> convertor =
304                         OFSessionUtil.getExtensionConvertorProvider().getConverter(key);
305                 if (convertor != null) {
306                     ofAction = convertor.convert(extAction);
307                 }
308             } else {
309                 // try vendor codecs
310                 TypeVersionKey<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> key =
311                         new TypeVersionKey<>(
312                                 (Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>) action.getImplementedInterface(),
313                                 version);
314                 ConvertorActionToOFJava<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action, Action> convertor =
315                         OFSessionUtil.getExtensionConvertorProvider().getConverter(key);
316                 LOG.trace("OFP Extension action, key:{}, converter:{}", key, convertor);
317                 if (convertor != null) {
318                     ofAction = convertor.convert(action);
319                 }
320             }
321
322             if (ofAction != null) {
323                 actionsList.add(ofAction);
324             }
325         }
326         return actionsList;
327     }
328
329     private static Action salToOFSetField(
330             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
331             final ActionBuilder actionBuilder, final short version, final BigInteger datapathid) {
332
333         SetFieldCase setFieldCase = (SetFieldCase) action;
334         org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match =
335                 setFieldCase.getSetField();
336
337         if (version == OFConstants.OFP_VERSION_1_0) {
338             // pushvlan +setField can be called to configure 1.0 switches via MDSAL app
339             if (match.getVlanMatch() != null) {
340                 SetVlanVidActionBuilder vlanidActionBuilder = new SetVlanVidActionBuilder();
341                 SetVlanVidCaseBuilder setVlanVidCaseBuilder = new SetVlanVidCaseBuilder();
342                 vlanidActionBuilder.setVlanVid(match.getVlanMatch().getVlanId().getVlanId().getValue());
343                 setVlanVidCaseBuilder.setSetVlanVidAction(vlanidActionBuilder.build());
344
345                 actionBuilder.setActionChoice(setVlanVidCaseBuilder.build());
346                 return actionBuilder.build();
347             } else {
348                 return emtpyAction(actionBuilder);
349             }
350
351         } else {
352             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
353             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
354             MatchReactor.getInstance().convert(match, version, setFieldBuilder);
355             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
356             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
357
358             return actionBuilder.build();
359         }
360     }
361
362     private static Action salToOFDecNwTtl(final ActionBuilder actionBuilder) {
363         actionBuilder.setActionChoice(new DecNwTtlCaseBuilder().build());
364         return emtpyAction(actionBuilder);
365     }
366
367     private static Action salToOFPushMplsAction(
368             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
369             final ActionBuilder actionBuilder) {
370         PushMplsActionCase pushMplsActionCase = (PushMplsActionCase) action;
371         PushMplsCaseBuilder pushMplsCaseBuilder = new PushMplsCaseBuilder();
372         PushMplsActionBuilder pushMplsBuilder = new PushMplsActionBuilder();
373         pushMplsBuilder.setEthertype(new EtherType(pushMplsActionCase.getPushMplsAction().getEthernetType()));
374         pushMplsCaseBuilder.setPushMplsAction(pushMplsBuilder.build());
375         actionBuilder.setActionChoice(pushMplsCaseBuilder.build());
376         return actionBuilder.build();
377     }
378
379     private static Action salToOFPushPbbAction(
380             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
381             final ActionBuilder actionBuilder) {
382         PushPbbActionCase pushPbbActionCase = (PushPbbActionCase) action;
383         PushPbbCaseBuilder pushPbbCaseBuilder = new PushPbbCaseBuilder();
384         PushPbbActionBuilder pushPbbBuilder = new PushPbbActionBuilder();
385         pushPbbBuilder.setEthertype(new EtherType(pushPbbActionCase.getPushPbbAction().getEthernetType()));
386         pushPbbCaseBuilder.setPushPbbAction(pushPbbBuilder.build());
387         actionBuilder.setActionChoice(pushPbbCaseBuilder.build());
388         return actionBuilder.build();
389     }
390
391     private static Action salToOFPushVlanAction(
392             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
393             final ActionBuilder actionBuilder, final short version) {
394         if (version == OFConstants.OFP_VERSION_1_0) {
395             // if client configure openflow 1.0 switch as a openflow 1.3 switch using openflow 1.3 instructions
396             // then we can ignore PUSH_VLAN as set-vlan-id will push a vlan header if not present
397             return null;
398         }
399         PushVlanActionCase pushVlanActionCase = (PushVlanActionCase) action;
400         PushVlanAction pushVlanAction = pushVlanActionCase.getPushVlanAction();
401
402         PushVlanCaseBuilder pushVlanCaseBuilder = new PushVlanCaseBuilder();
403         PushVlanActionBuilder pushVlanBuilder = new PushVlanActionBuilder();
404         if (null != pushVlanAction.getEthernetType()) {
405             pushVlanBuilder.setEthertype(new EtherType(pushVlanAction.getEthernetType()));
406         }
407         pushVlanCaseBuilder.setPushVlanAction(pushVlanBuilder.build());
408         actionBuilder.setActionChoice(pushVlanCaseBuilder.build());
409         return actionBuilder.build();
410     }
411
412     private static Action salToOFSetNwTtl(
413             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
414             final ActionBuilder actionBuilder) {
415         SetNwTtlActionCase nwTtlActionCase = (SetNwTtlActionCase) action;
416
417         SetNwTtlCaseBuilder nwTtlCaseBuilder = new SetNwTtlCaseBuilder();
418         SetNwTtlActionBuilder nwTtlBuilder = new SetNwTtlActionBuilder();
419         nwTtlBuilder.setNwTtl(nwTtlActionCase.getSetNwTtlAction().getNwTtl());
420         nwTtlCaseBuilder.setSetNwTtlAction(nwTtlBuilder.build());
421         actionBuilder.setActionChoice(nwTtlCaseBuilder.build());
422         return actionBuilder.build();
423     }
424
425     private static Action salToOFSetQueue(
426             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
427             final ActionBuilder actionBuilder) {
428         SetQueueActionCase setQueueActionCase = (SetQueueActionCase) action;
429         SetQueueAction setQueueAction = setQueueActionCase.getSetQueueAction();
430
431         SetQueueCaseBuilder setQueueCaseBuilder = new SetQueueCaseBuilder();
432         SetQueueActionBuilder setQueueBuilder = new SetQueueActionBuilder();
433         setQueueBuilder.setQueueId(setQueueAction.getQueueId());
434         setQueueCaseBuilder.setSetQueueAction(setQueueBuilder.build());
435         actionBuilder.setActionChoice(setQueueCaseBuilder.build());
436         return actionBuilder.build();
437     }
438
439     private static Action salToOFPopMpls(
440             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
441             final ActionBuilder actionBuilder) {
442         PopMplsActionCase popMplsActionCase = (PopMplsActionCase) action;
443
444         PopMplsCaseBuilder popMplsCaseBuilder = new PopMplsCaseBuilder();
445         PopMplsActionBuilder popMplsBuilder = new PopMplsActionBuilder();
446         popMplsBuilder.setEthertype(new EtherType(new EtherType(popMplsActionCase.getPopMplsAction().getEthernetType())));
447         popMplsCaseBuilder.setPopMplsAction(popMplsBuilder.build());
448         actionBuilder.setActionChoice(popMplsCaseBuilder.build());
449         return actionBuilder.build();
450     }
451
452     private static Action salToOFPopVlan(final ActionBuilder actionBuilder) {
453         actionBuilder.setActionChoice(new PopVlanCaseBuilder().build());
454         return emtpyAction(actionBuilder);
455     }
456
457     private static Action salToOFPopPBB(final ActionBuilder actionBuilder) {
458         actionBuilder.setActionChoice(new PopPbbCaseBuilder().build());
459         return emtpyAction(actionBuilder);
460     }
461
462     // set-vlan-id (1.0 feature) can be called on  1.3 switches as well using ADSAL apis
463     private static Action salToOFSetVlanId(
464             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
465             final ActionBuilder actionBuilder, final short version) {
466
467         SetVlanIdActionCase setvlanidcase = (SetVlanIdActionCase) action;
468         SetVlanIdAction setvlanidaction = setvlanidcase.getSetVlanIdAction();
469
470         SetVlanVidActionBuilder vlanidActionBuilder = new SetVlanVidActionBuilder();
471         SetVlanVidCaseBuilder setVlanVidCaseBuilder = new SetVlanVidCaseBuilder();
472
473         if (version == OFConstants.OFP_VERSION_1_0) {
474             vlanidActionBuilder.setVlanVid(setvlanidaction.getVlanId().getValue());
475             setVlanVidCaseBuilder.setSetVlanVidAction(vlanidActionBuilder.build());
476             actionBuilder.setActionChoice(setVlanVidCaseBuilder.build());
477             return actionBuilder.build();
478
479         } else {
480             if (version >= OFConstants.OFP_VERSION_1_3) {
481                 SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
482                 SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
483                 List<MatchEntry> entries = new ArrayList<>();
484                 MatchEntryBuilder matchBuilder = new MatchEntryBuilder();
485                 matchBuilder.setOxmClass(OpenflowBasicClass.class);
486                 matchBuilder.setOxmMatchField(VlanVid.class);
487                 matchBuilder.setHasMask(false);
488                 VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
489                 VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
490                 vlanVidBuilder.setCfiBit(true);
491                 vlanVidBuilder.setVlanVid(setvlanidaction.getVlanId().getValue());
492                 vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
493                 matchBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
494                 entries.add(matchBuilder.build());
495                 setFieldBuilder.setMatchEntry(entries);
496                 setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
497                 actionBuilder.setActionChoice(setFieldCaseBuilder.build());
498                 return actionBuilder.build();
499             } else {
500                 LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
501                 return null;
502             }
503         }
504     }
505
506     private static Action salToOFSetVlanpcp(
507             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
508             final ActionBuilder actionBuilder, final short version) {
509
510         SetVlanPcpActionCase setvlanpcpcase = (SetVlanPcpActionCase) action;
511         SetVlanPcpAction setvlanpcpaction = setvlanpcpcase.getSetVlanPcpAction();
512
513         if (version == OFConstants.OFP_VERSION_1_0) {
514             SetVlanPcpActionBuilder setVlanPcpActionBuilder = new SetVlanPcpActionBuilder();
515             SetVlanPcpCaseBuilder setVlanPcpCaseBuilder = new SetVlanPcpCaseBuilder();
516             setVlanPcpActionBuilder.setVlanPcp(setvlanpcpaction.getVlanPcp().getValue());
517             setVlanPcpCaseBuilder.setSetVlanPcpAction(setVlanPcpActionBuilder.build());
518             actionBuilder.setActionChoice(setVlanPcpCaseBuilder.build());
519             return actionBuilder.build();
520         } else if (version >= OFConstants.OFP_VERSION_1_3) {
521             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
522             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
523
524             List<MatchEntry> matchEntriesList = new ArrayList<>();
525
526             matchEntriesList.add(MatchConvertorUtil.toOfVlanPcp(setvlanpcpaction.getVlanPcp()));
527             setFieldBuilder.setMatchEntry(matchEntriesList);
528             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
529             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
530
531             return actionBuilder.build();
532         } else {
533             LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
534             return null;
535         }
536     }
537
538     private static Action salToOFStripVlan(final ActionBuilder actionBuilder, final short version) {
539         if (version == OFConstants.OFP_VERSION_1_0) {
540             actionBuilder.setActionChoice(new StripVlanCaseBuilder().build());
541             return emtpyAction(actionBuilder);
542         } else if (version >= OFConstants.OFP_VERSION_1_3) {
543             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
544             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
545             List<MatchEntry> entries = new ArrayList<>();
546             MatchEntryBuilder matchBuilder = new MatchEntryBuilder();
547             matchBuilder.setOxmClass(OpenflowBasicClass.class);
548             matchBuilder.setOxmMatchField(VlanVid.class);
549             matchBuilder.setHasMask(false);
550             VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
551             VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
552             vlanVidBuilder.setCfiBit(true);
553             vlanVidBuilder.setVlanVid(0x0000);
554             vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
555             matchBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
556             matchBuilder.setHasMask(false);
557             entries.add(matchBuilder.build());
558             setFieldBuilder.setMatchEntry(entries);
559             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
560             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
561             return actionBuilder.build();
562         } else {
563             LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
564             return null;
565         }
566     }
567
568     private static Action salToOFSetDlSrc(
569             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
570             final ActionBuilder actionBuilder, final short version) {
571
572         SetDlSrcActionCase setdlsrccase = (SetDlSrcActionCase) action;
573         SetDlSrcAction setdlsrcaction = setdlsrccase.getSetDlSrcAction();
574
575         if (version == OFConstants.OFP_VERSION_1_0) {
576             SetDlSrcCaseBuilder setDlSrcCaseBuilder = new SetDlSrcCaseBuilder();
577             SetDlSrcActionBuilder setDlSrcActionBuilder = new SetDlSrcActionBuilder();
578             setDlSrcActionBuilder.setDlSrcAddress(setdlsrcaction.getAddress());
579             setDlSrcCaseBuilder.setSetDlSrcAction(setDlSrcActionBuilder.build());
580             actionBuilder.setActionChoice(setDlSrcCaseBuilder.build());
581             return actionBuilder.build();
582         } else if (version >= OFConstants.OFP_VERSION_1_3) {
583             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
584             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
585
586             List<MatchEntry> entries = new ArrayList<>();
587             MatchEntryBuilder matchBuilder = new MatchEntryBuilder();
588             matchBuilder.setOxmClass(OpenflowBasicClass.class);
589             matchBuilder.setOxmMatchField(EthSrc.class);
590             EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder();
591             EthSrcBuilder ethSrcBuilder = new EthSrcBuilder();
592             ethSrcBuilder.setMacAddress(setdlsrcaction.getAddress());
593             matchBuilder.setHasMask(false);
594             ethSrcCaseBuilder.setEthSrc(ethSrcBuilder.build());
595             matchBuilder.setMatchEntryValue(ethSrcCaseBuilder.build());
596             entries.add(matchBuilder.build());
597             setFieldBuilder.setMatchEntry(entries);
598             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
599             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
600
601             return actionBuilder.build();
602         } else {
603             LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
604             return null;
605         }
606     }
607
608     private static Action salToOFSetDlDst(
609             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
610             final ActionBuilder actionBuilder, final short version) {
611
612         SetDlDstActionCase setdldstcase = (SetDlDstActionCase) action;
613         SetDlDstAction setdldstaction = setdldstcase.getSetDlDstAction();
614
615         if (version == OFConstants.OFP_VERSION_1_0) {
616             SetDlDstCaseBuilder setDlDstCaseBuilder = new SetDlDstCaseBuilder();
617             SetDlDstActionBuilder setDlDstActionBuilder = new SetDlDstActionBuilder();
618             setDlDstActionBuilder.setDlDstAddress(setdldstaction.getAddress());
619             setDlDstCaseBuilder.setSetDlDstAction(setDlDstActionBuilder.build());
620             actionBuilder.setActionChoice(setDlDstCaseBuilder.build());
621             return actionBuilder.build();
622         } else if (version >= OFConstants.OFP_VERSION_1_3) {
623             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
624             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
625
626             List<MatchEntry> entries = new ArrayList<>();
627
628             MatchEntryBuilder matchBuilder = new MatchEntryBuilder();
629             matchBuilder.setOxmClass(OpenflowBasicClass.class);
630             matchBuilder.setOxmMatchField(EthDst.class);
631             EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder();
632             EthDstBuilder ethDstBuilder = new EthDstBuilder();
633             ethDstBuilder.setMacAddress(setdldstaction.getAddress());
634             matchBuilder.setHasMask(false);
635             ethDstCaseBuilder.setEthDst(ethDstBuilder.build());
636             matchBuilder.setMatchEntryValue(ethDstCaseBuilder.build());
637             entries.add(matchBuilder.build());
638             setFieldBuilder.setMatchEntry(entries);
639             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
640             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
641             return actionBuilder.build();
642         } else {
643             LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
644             return null;
645         }
646     }
647
648     protected static Action salToOFSetNwSrc(
649             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
650             final ActionBuilder actionBuilder, final short version) {
651
652         try {
653             ActionSetNwSrcReactor.getInstance().convert((SetNwSrcActionCase) action, version, actionBuilder);
654         } catch (Exception e) {
655             LOG.error(e.getMessage(), e);
656             return null;
657         }
658
659         return actionBuilder.build();
660     }
661
662     protected static Action salToOFSetNwDst(
663             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
664             final ActionBuilder actionBuilder, final short version) {
665
666         try {
667             ActionSetNwDstReactor.getInstance().convert((SetNwDstActionCase) action, version, actionBuilder);
668         } catch (Exception e) {
669             LOG.error(e.getMessage(), e);
670             return null;
671         }
672
673         return actionBuilder.build();
674     }
675
676     private static Action salToOFSetNwTos(
677             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
678             final ActionBuilder actionBuilder, final short version) {
679
680         SetNwTosActionCase setnwtoscase = (SetNwTosActionCase) action;
681         SetNwTosAction setnwtosaction = setnwtoscase.getSetNwTosAction();
682
683         if (version == OFConstants.OFP_VERSION_1_0) {
684             SetNwTosActionBuilder setNwTosActionBuilder = new SetNwTosActionBuilder();
685             SetNwTosCaseBuilder setNwTosCaseBuilder = new SetNwTosCaseBuilder();
686             setNwTosActionBuilder.setNwTos(setnwtosaction.getTos().shortValue());
687             setNwTosCaseBuilder.setSetNwTosAction(setNwTosActionBuilder.build());
688             actionBuilder.setActionChoice(setNwTosCaseBuilder.build());
689             return actionBuilder.build();
690         } else if (version >= OFConstants.OFP_VERSION_1_3) {
691             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
692             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
693
694             List<MatchEntry> entries = new ArrayList<>();
695             entries.add(MatchConvertorUtil.toOfIpDscp(new Dscp(
696                     ActionUtil.tosToDscp(setnwtosaction.getTos().shortValue())
697             )));
698             setFieldBuilder.setMatchEntry(entries);
699             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
700             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
701             return actionBuilder.build();
702         } else {
703             LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
704             return null;
705         }
706
707     }
708
709     private static Action salToOFSetTpSrc(
710             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
711             final ActionBuilder actionBuilder, final short version, final IPProtocols protocol) {
712
713         SetTpSrcActionCase settpsrccase = (SetTpSrcActionCase) action;
714         SetTpSrcAction settpsrcaction = settpsrccase.getSetTpSrcAction();
715         if (version == OFConstants.OFP_VERSION_1_0) {
716             SetTpSrcCaseBuilder setTpSrcCaseBuilder = new SetTpSrcCaseBuilder();
717             SetTpSrcActionBuilder setTpSrcActionBuilder = new SetTpSrcActionBuilder();
718             setTpSrcActionBuilder.setPort(new PortNumber(settpsrcaction.getPort()
719                     .getValue()
720                     .longValue()));
721             setTpSrcCaseBuilder.setSetTpSrcAction(setTpSrcActionBuilder.build());
722             actionBuilder.setActionChoice(setTpSrcCaseBuilder.build());
723             return actionBuilder.build();
724         } else if (version == OFConstants.OFP_VERSION_1_3) {
725             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
726             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
727
728             MatchEntryBuilder matchBuilder = new MatchEntryBuilder();
729             matchBuilder.setOxmClass(OpenflowBasicClass.class);
730             matchBuilder.setHasMask(false);
731
732             InPortCaseBuilder inPortCaseBuilder = new InPortCaseBuilder();
733             int port = settpsrcaction.getPort().getValue().intValue();
734             int type = 0xff & port;
735
736             switch (protocol) {
737                 case ICMP:
738                     matchBuilder.setOxmMatchField(Icmpv4Type.class);
739                     Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
740                     Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
741                     icmpv4TypeBuilder.setIcmpv4Type((short) type);
742                     icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
743                     matchBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
744                     break;
745                 case ICMPV6:
746                     matchBuilder.setOxmMatchField(Icmpv6Type.class);
747                     Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
748                     Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
749                     icmpv6TypeBuilder.setIcmpv6Type((short) type);
750                     icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
751                     matchBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
752                     break;
753                 case TCP:
754                     matchBuilder.setOxmMatchField(TcpSrc.class);
755                     TcpSrcCaseBuilder tcpSrcCaseBuilder = new TcpSrcCaseBuilder();
756                     TcpSrcBuilder tcpSrcBuilder = new TcpSrcBuilder();
757                     tcpSrcBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(port));
758                     tcpSrcCaseBuilder.setTcpSrc(tcpSrcBuilder.build());
759                     matchBuilder.setMatchEntryValue(tcpSrcCaseBuilder.build());
760                     break;
761                 case UDP:
762                     matchBuilder.setOxmMatchField(UdpSrc.class);
763                     UdpSrcCaseBuilder udpSrcCaseBuilder = new UdpSrcCaseBuilder();
764                     UdpSrcBuilder udpSrcBuilder = new UdpSrcBuilder();
765                     udpSrcBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(port));
766                     udpSrcCaseBuilder.setUdpSrc(udpSrcBuilder.build());
767                     matchBuilder.setMatchEntryValue(udpSrcCaseBuilder.build());
768                     break;
769                 default:
770                     LOG.warn("Unknown protocol with combination of SetSourcePort: {}", protocol);
771                     break;
772             }
773             List<MatchEntry> entries = new ArrayList<MatchEntry>();
774             entries.add(matchBuilder.build());
775             setFieldBuilder.setMatchEntry(entries);
776             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
777             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
778             return actionBuilder.build();
779         }
780         LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
781         return null;
782     }
783
784     private static Action salToOFSetTpDst(
785             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
786             final ActionBuilder actionBuilder, final short version, final IPProtocols protocol) {
787
788         SetTpDstActionCase settpdstcase = (SetTpDstActionCase) action;
789         SetTpDstAction settpdstaction = settpdstcase.getSetTpDstAction();
790         if (version == OFConstants.OFP_VERSION_1_0) {
791             SetTpDstCaseBuilder setTpDstCaseBuilder = new SetTpDstCaseBuilder();
792             SetTpDstActionBuilder setTpDstActionBuilder = new SetTpDstActionBuilder();
793             setTpDstActionBuilder.setPort(new PortNumber(settpdstaction.getPort().getValue().longValue()));
794             setTpDstCaseBuilder.setSetTpDstAction(setTpDstActionBuilder.build());
795             actionBuilder.setActionChoice(setTpDstCaseBuilder.build());
796             return actionBuilder.build();
797         } else if (version == OFConstants.OFP_VERSION_1_3) {
798             SetFieldCaseBuilder setFieldCaseBuilder = new SetFieldCaseBuilder();
799             SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
800
801             MatchEntryBuilder matchBuilder = new MatchEntryBuilder();
802             matchBuilder.setOxmClass(OpenflowBasicClass.class);
803             matchBuilder.setHasMask(false);
804             int port = settpdstaction.getPort().getValue().intValue();
805             int code = 0xff & port;
806
807             switch (protocol) {
808                 case ICMP:
809                     matchBuilder.setOxmMatchField(Icmpv4Code.class);
810                     Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
811                     Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
812                     icmpv4CodeBuilder.setIcmpv4Code((short) code);
813                     icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
814                     matchBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
815                     break;
816                 case ICMPV6:
817                     matchBuilder.setOxmMatchField(Icmpv6Code.class);
818                     Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
819                     Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
820                     icmpv6CodeBuilder.setIcmpv6Code((short) code);
821                     icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
822                     matchBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
823                     break;
824                 case TCP:
825                     matchBuilder.setOxmMatchField(TcpDst.class);
826                     TcpDstCaseBuilder tcpDstCaseBuilder = new TcpDstCaseBuilder();
827                     TcpDstBuilder tcpDstBuilder = new TcpDstBuilder();
828                     tcpDstBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(port));
829                     tcpDstCaseBuilder.setTcpDst(tcpDstBuilder.build());
830                     matchBuilder.setMatchEntryValue(tcpDstCaseBuilder.build());
831                     break;
832                 case UDP:
833                     matchBuilder.setOxmMatchField(UdpDst.class);
834                     UdpDstCaseBuilder udpDstCaseBuilder = new UdpDstCaseBuilder();
835                     UdpDstBuilder udpDstBuilder = new UdpDstBuilder();
836                     udpDstBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(port));
837                     udpDstCaseBuilder.setUdpDst(udpDstBuilder.build());
838                     matchBuilder.setMatchEntryValue(udpDstCaseBuilder.build());
839                     break;
840                 default:
841                     LOG.warn("Unknown protocol with combination of SetSourcePort: {}", protocol);
842                     break;
843             }
844             List<MatchEntry> entries = new ArrayList<MatchEntry>();
845             entries.add(matchBuilder.build());
846             setFieldBuilder.setMatchEntry(entries);
847             setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build());
848             actionBuilder.setActionChoice(setFieldCaseBuilder.build());
849             return actionBuilder.build();
850         }
851         LOG.error(UNKNOWN_ACTION_TYPE_VERSION, version);
852         return null;
853     }
854
855     private static Action salToOFGroupAction(
856             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
857             final ActionBuilder actionBuilder) {
858         GroupActionCase groupActionCase = (GroupActionCase) action;
859         GroupAction groupAction = groupActionCase.getGroupAction();
860         GroupCaseBuilder groupCaseBuilder = new GroupCaseBuilder();
861         GroupActionBuilder groupActionBuilder = new GroupActionBuilder();
862
863         if (null != groupAction.getGroupId()) {
864             groupActionBuilder.setGroupId(groupAction.getGroupId());
865         } else {
866             groupActionBuilder.setGroupId(Long.parseLong(groupAction.getGroup()));
867         }
868
869         groupCaseBuilder.setGroupAction(groupActionBuilder.build());
870         actionBuilder.setActionChoice(groupCaseBuilder.build());
871         return actionBuilder.build();
872     }
873
874     private static Action salToOFDecMplsTtl(final ActionBuilder actionBuilder) {
875         actionBuilder.setActionChoice(new DecMplsTtlCaseBuilder().build());
876         return emtpyAction(actionBuilder);
877     }
878
879     private static Action salToOFSetMplsTtl(
880             final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
881             final ActionBuilder actionBuilder) {
882         SetMplsTtlActionCase mplsTtlActionCase = (SetMplsTtlActionCase) action;
883         SetMplsTtlAction mplsTtlAction = mplsTtlActionCase.getSetMplsTtlAction();
884         SetMplsTtlCaseBuilder setMplsTtlCaseBuilder = new SetMplsTtlCaseBuilder();
885         SetMplsTtlActionBuilder setMplsTtlBuilder = new SetMplsTtlActionBuilder();
886         setMplsTtlBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
887         setMplsTtlCaseBuilder.setSetMplsTtlAction(setMplsTtlBuilder.build());
888         actionBuilder.setActionChoice(setMplsTtlCaseBuilder.build());
889         return actionBuilder.build();
890     }
891
892     private static Action salToOFCopyTTLIIn(final ActionBuilder actionBuilder) {
893         actionBuilder.setActionChoice(new CopyTtlInCaseBuilder().build());
894         return emtpyAction(actionBuilder);
895     }
896
897     private static Action salToOFCopyTTLIOut(final ActionBuilder actionBuilder) {
898         actionBuilder.setActionChoice(new CopyTtlOutCaseBuilder().build());
899         return emtpyAction(actionBuilder);
900
901     }
902
903     private static Action emtpyAction(final ActionBuilder actionBuilder) {
904         return actionBuilder.build();
905     }
906
907     private static Action salToOFAction(
908             final OutputActionCase outputActionCase,
909             final ActionBuilder actionBuilder, final short version) {
910
911         OutputAction outputAction = outputActionCase.getOutputAction();
912         OutputActionCaseBuilder caseBuilder = new OutputActionCaseBuilder();
913         OutputActionBuilder outputBuilder = new OutputActionBuilder();
914
915         if (outputAction.getMaxLength() != null) {
916             outputBuilder.setMaxLength(outputAction.getMaxLength());
917         } else {
918             outputBuilder.setMaxLength(0);
919         }
920         Uri uri = outputAction.getOutputNodeConnector();
921         OpenflowVersion ofVersion = OpenflowVersion.get(version);
922         Long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(ofVersion, uri.getValue());
923         if (OpenflowPortsUtil.checkPortValidity(ofVersion, portNumber)) {
924             outputBuilder.setPort(new PortNumber(portNumber));
925         } else {
926             LOG.error("Invalid Port specified {} for Output Action for OF version: {}", portNumber, ofVersion);
927         }
928         caseBuilder.setOutputAction(outputBuilder.build());
929         actionBuilder.setActionChoice(caseBuilder.build());
930         return actionBuilder.build();
931
932     }
933
934     /**
935      * Method to convert OF actions associated with bucket to SAL Actions.
936      *
937      * @param actionList action list
938      * @param ofVersion  current ofp version
939      * @param actionPath TODO
940      * @return List of converted SAL Actions.
941      */
942     public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toMDSalActions(
943             final List<Action> actionList, final OpenflowVersion ofVersion, final ActionPath actionPath) {
944
945         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions = new ArrayList<>();
946         if(actionList != null){
947             for (Action action : actionList) {
948                 if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCase) {
949                     bucketActions.add(ofToSALOutputAction(ofVersion, action));
950                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.GroupCase) {
951                     bucketActions.add(ofToSALGroupAction(action));
952                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCase) {
953                     CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
954                     bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder().setCopyTtlOut(copyTtlOutaction.build()).build());
955                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCase) {
956                     CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
957                     bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder().setCopyTtlIn(copyTtlInaction.build()).build());
958
959                 } else if (action.getActionChoice() instanceof SetMplsTtlCase) {
960                     bucketActions.add(ofToSALSetMplsTtl(action));
961                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecMplsTtlCase) {
962                     DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
963                     bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtl.build()).build());
964                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCase) {
965                     bucketActions.add(ofToSALPushVlanAction(action));
966                 } else if ((action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopVlanCase)
967                         || (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.StripVlanCase)) {
968                     // OF1.0 nodes will emit StripVlan and OF1.3+ will emit StripVlan/PopVlan, convert both to PopVlan for SAL
969                     PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
970                     bucketActions.add(new PopVlanActionCaseBuilder().setPopVlanAction(popVlan.build()).build());
971                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushMplsCase) {
972                     bucketActions.add(ofToSALPushMplsAction(action));
973                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopMplsCase) {
974                     bucketActions.add(ofToSALPopMplsAction(action));
975                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetQueueCase) {
976                     bucketActions.add(ofToSALSetQueue(action));
977                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCase) {
978                     bucketActions.add(ofToSALSetNwTtl(action));
979                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecNwTtlCase) {
980                     DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
981                     bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder()
982                             .setDecNwTtl(decNwTtl.build()).build());
983                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase) {
984                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase setFieldCase = (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase) action.getActionChoice();
985                     final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(ofVersion.getVersion());
986                     final SetFieldAction setFieldAction = setFieldCase.getSetFieldAction();
987                     final SetFieldBuilder setField = new SetFieldBuilder();
988                     final Optional<MatchBuilder> matchOptional = ConvertorManager.getInstance().convert(setFieldAction, datapathIdConvertorData);
989
990                     if (matchOptional.isPresent()) {
991                         setField.fieldsFrom(matchOptional.get().build());
992                     }
993
994                     bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder().setSetField(setField.build()).build());
995                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCase) {
996                     bucketActions.add(ofToSALPushPbbAction(action));
997                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCase) {
998                     PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
999                     bucketActions.add(new PopPbbActionCaseBuilder().setPopPbbAction(popPbb.build()).build());
1000
1001                 } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwDstCase) {
1002                     org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder setNwDstActionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder();
1003                     bucketActions.add(new SetNwDstActionCaseBuilder().setSetNwDstAction(setNwDstActionBuilder.build()).build());
1004
1005                 } else {
1006                     /**
1007                      * TODO: EXTENSION PROPOSAL (action, OFJava to MD-SAL)
1008                      * - we might also need a way on how to identify exact type of augmentation to be
1009                      *   used as match can be bound to multiple models
1010                      */
1011                     org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action processedAction =
1012                             ActionExtensionHelper.processAlienAction(action, ofVersion, actionPath);
1013                     if (processedAction != null) {
1014                         bucketActions.add(processedAction);
1015                     }
1016                 }
1017             }
1018         }
1019         return bucketActions;
1020     }
1021
1022     /**
1023      * Method converts OF Output action object to SAL Output action object.
1024      *
1025      * @param ofVersion openflow version
1026      * @param action    org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
1027      *                  action.rev130731.actions.actions.list.Action
1028      * @return OutputAction
1029      */
1030     public static OutputActionCase ofToSALOutputAction(final OpenflowVersion ofVersion, final Action action) {
1031         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder outputAction =
1032                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder();
1033
1034         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCase actionCase =
1035                 (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCase) action.getActionChoice();
1036
1037         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputAction outputActionFromOF = actionCase.getOutputAction();
1038         if (outputActionFromOF.getPort() != null) {
1039             PortNumberUni protocolAgnosticPort = OpenflowPortsUtil.getProtocolAgnosticPort(
1040                     ofVersion, outputActionFromOF.getPort().getValue());
1041             String portNumberAsString = OpenflowPortsUtil.portNumberToString(protocolAgnosticPort);
1042             outputAction.setOutputNodeConnector(new Uri(portNumberAsString));
1043         } else {
1044             LOG.error("Provided action is not OF Output action, no associated port found!");
1045         }
1046
1047         Integer maxLength = outputActionFromOF.getMaxLength();
1048         if (maxLength != null) {
1049             outputAction.setMaxLength(maxLength);
1050         } else {
1051             LOG.error("Provided action is not OF Output action, no associated length found!");
1052         }
1053
1054         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder outputActionCaseBuilder =
1055                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder();
1056         outputActionCaseBuilder.setOutputAction(outputAction.build());
1057         return outputActionCaseBuilder.build();
1058     }
1059
1060     /**
1061      * Method converts OF GroupAction object to SAL GroupAction object
1062      *
1063      * @param action action
1064      * @return GroupAction group action
1065      */
1066     public static GroupActionCase ofToSALGroupAction(final Action action) {
1067         GroupCase actionCase = (GroupCase) action.getActionChoice();
1068         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.group._case.GroupAction groupActionFromOF =
1069                 actionCase.getGroupAction();
1070
1071         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder groupAction =
1072                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder();
1073         groupAction.setGroupId(groupActionFromOF.getGroupId());
1074
1075         return new GroupActionCaseBuilder().setGroupAction(groupAction.build()).build();
1076     }
1077
1078     /**
1079      * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action
1080      * object.
1081      *
1082      * @param action action
1083      * @return set-mpls ttl action
1084      */
1085     public static SetMplsTtlActionCase ofToSALSetMplsTtl(final Action action) {
1086         SetMplsTtlCase actionCase = (SetMplsTtlCase) action.getActionChoice();
1087         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action
1088                 .choice.set.mpls.ttl._case.SetMplsTtlAction setMplsTtlActionFromOF = actionCase.getSetMplsTtlAction();
1089
1090         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder mplsTtlAction =
1091                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder();
1092         mplsTtlAction.setMplsTtl(setMplsTtlActionFromOF.getMplsTtl());
1093         return new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(mplsTtlAction.build()).build();
1094     }
1095
1096     /**
1097      * Method converts OF Pushvlan action to SAL PushVlan action.
1098      *
1099      * @param action input actioj
1100      * @return PushVlanAction
1101      */
1102     public static PushVlanActionCase ofToSALPushVlanAction(final Action action) {
1103         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCase actionCase =
1104                 (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCase) action.getActionChoice();
1105         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.vlan._case.PushVlanAction pushVlanActionFromOF =
1106                 actionCase.getPushVlanAction();
1107
1108         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder pushVlanAction =
1109                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder();
1110
1111         pushVlanAction.setEthernetType(pushVlanActionFromOF.getEthertype().getValue());
1112         return new PushVlanActionCaseBuilder().setPushVlanAction(pushVlanAction.build()).build();
1113     }
1114
1115     /**
1116      * Method converts OF PushMpls action to SAL PushMpls action.
1117      *
1118      * @param action action
1119      * @return PushMplsAction
1120      */
1121     public static PushMplsActionCase ofToSALPushMplsAction(final Action action) {
1122         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushMplsCase actionCase =
1123                 (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushMplsCase) action.getActionChoice();
1124         PushMplsAction pushMplsActionFromOF = actionCase.getPushMplsAction();
1125         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder pushMplsAction =
1126                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder();
1127         pushMplsAction.setEthernetType(pushMplsActionFromOF.getEthertype().getValue());
1128         return new PushMplsActionCaseBuilder().setPushMplsAction(pushMplsAction.build()).build();
1129     }
1130
1131     /**
1132      * Method converts OF PopMpls action to SAL PopMpls action.
1133      *
1134      * @param action action
1135      * @return PopMplsActionCase
1136      */
1137     public static PopMplsActionCase ofToSALPopMplsAction(final Action action) {
1138         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopMplsCase actionCase =
1139                 (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopMplsCase) action.getActionChoice();
1140         PopMplsAction popMplsActionFromOF = actionCase.getPopMplsAction();
1141         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder popMplsAction =
1142                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder();
1143         popMplsAction.setEthernetType(popMplsActionFromOF.getEthertype().getValue());
1144         return new PopMplsActionCaseBuilder().setPopMplsAction(popMplsAction.build()).build();
1145     }
1146
1147     /**
1148      * Method converts OF SetQueue action to SAL SetQueue action.
1149      *
1150      * @param action action
1151      * @return SetQueueAction
1152      */
1153     public static SetQueueActionCase ofToSALSetQueue(final Action action) {
1154         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetQueueCase actionCase =
1155                 (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetQueueCase) action.getActionChoice();
1156         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.queue._case.SetQueueAction queueActionFromOF =
1157                 actionCase.getSetQueueAction();
1158         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueActionBuilder setQueueAction =
1159                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueActionBuilder();
1160         setQueueAction.setQueueId(queueActionFromOF.getQueueId());
1161         return new SetQueueActionCaseBuilder().setSetQueueAction(setQueueAction.build()).build();
1162     }
1163
1164     /**
1165      * Method converts OF SetNwTtl action to SAL SetNwTtl action.
1166      *
1167      * @param action action
1168      * @return SetNwTtlAction
1169      */
1170     public static SetNwTtlActionCase ofToSALSetNwTtl(final Action action) {
1171         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCase actionCase =
1172                 (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCase) action.getActionChoice();
1173         SetNwTtlAction setNwTtlActionFromOf = actionCase.getSetNwTtlAction();
1174         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.ttl.action._case.SetNwTtlActionBuilder setNwTtl =
1175                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.ttl.action._case.SetNwTtlActionBuilder();
1176         setNwTtl.setNwTtl(setNwTtlActionFromOf.getNwTtl());
1177         return new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtl.build()).build();
1178     }
1179
1180     /**
1181      * Method converts OF Pushvlan action to SAL PushVlan action.
1182      *
1183      * @param action action
1184      * @return PushVlanAction
1185      */
1186     public static PushPbbActionCase ofToSALPushPbbAction(final Action action) {
1187         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCase actionCase =
1188                 (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCase) action.getActionChoice();
1189         PushPbbAction pushPbbActionFromOf = actionCase.getPushPbbAction();
1190         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder pushPbbAction =
1191                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder();
1192         pushPbbAction.setEthernetType(pushPbbActionFromOf.getEthertype().getValue());
1193         return new PushPbbActionCaseBuilder().setPushPbbAction(pushPbbAction.build()).build();
1194     }
1195
1196     //TODO make a model in YANG for protocols
1197     /*private enum IPProtocols {
1198         ICMP(1),
1199         TCP(6),
1200         UDP(17),
1201         ICMPV6(58);
1202
1203         private int protocol;
1204
1205         private static Map<Integer, IPProtocols> valueMap;
1206         static {
1207             valueMap = new HashMap<>();
1208             for(IPProtocols protocols : IPProtocols.values()) {
1209                 valueMap.put(protocols.protocol, protocols);
1210             }
1211         }
1212
1213         private IPProtocols(int value) {
1214             this.protocol = value;
1215         }
1216
1217         private byte getValue() {
1218             return (byte) this.protocol;
1219         }
1220
1221         private Short getShortValue() {
1222             return (short) protocol;
1223         }
1224
1225         private IPProtocols fromProtocolNum(Short protocolNum) {
1226             return valueMap.get(protocolNum);
1227         }
1228     }    */
1229
1230 }