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