2 * Copyright (c) 2016 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.genius.mdsalutil;
10 import java.math.BigInteger;
11 import java.net.InetAddress;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.group.input.buckets.bucket.action.action.NxActionResubmitRpcAddGroupCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrack;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrackBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.resubmit.grouping.NxResubmitBuilder;
61 public enum ActionType {
64 public Action buildAction(ActionInfo actionInfo) {
65 long groupId = Long.parseLong(actionInfo.getActionValues()[0]);
67 return new ActionBuilder().setAction(
68 new GroupActionCaseBuilder().setGroupAction(
69 new GroupActionBuilder().setGroupId(groupId).build()).build())
70 .setKey(new ActionKey(actionInfo.getActionKey())).build();
76 public Action buildAction(ActionInfo actionInfo) {
77 String[] actionValues = actionInfo.getActionValues();
78 String port = actionValues[0];
81 if (actionValues.length == 2) {
82 maxLength = Integer.valueOf(actionValues[1]);
85 return new ActionBuilder().setAction(
86 new OutputActionCaseBuilder().setOutputAction(
87 new OutputActionBuilder().setMaxLength(Integer.valueOf(maxLength))
88 .setOutputNodeConnector(new Uri(port)).build()).build())
89 .setKey(new ActionKey(actionInfo.getActionKey())).build();
95 public Action buildAction(ActionInfo actionInfo) {
96 return new ActionBuilder().setAction(
97 new PopMplsActionCaseBuilder().setPopMplsAction(
98 new PopMplsActionBuilder().setEthernetType(
99 Integer.valueOf(NwConstants.ETHTYPE_IPV4)).build()).build())
101 .setKey(new ActionKey(actionInfo.getActionKey())).build();
107 public Action buildAction(ActionInfo actionInfo) {
108 return new ActionBuilder()
109 .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
110 .setKey(new ActionKey(actionInfo.getActionKey())).build();
116 public Action buildAction(ActionInfo actionInfo) {
117 return new ActionBuilder().setAction(
118 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
119 .setKey(new ActionKey(actionInfo.getActionKey())).build();
125 public Action buildAction(ActionInfo actionInfo) {
126 return new ActionBuilder().setAction(new PushMplsActionCaseBuilder().setPushMplsAction(
127 new PushMplsActionBuilder().setEthernetType(
128 Integer.valueOf(NwConstants.ETHTYPE_MPLS_UC)).build()).build())
129 .setKey(new ActionKey(actionInfo.getActionKey())).build();
135 public Action buildAction(ActionInfo actionInfo) {
136 return new ActionBuilder().setAction(
137 new PushPbbActionCaseBuilder().setPushPbbAction(
138 new PushPbbActionBuilder()
139 .setEthernetType(Integer.valueOf(NwConstants.ETHTYPE_PBB)).build()).build())
140 .setKey(new ActionKey(actionInfo.getActionKey())).build();
146 public Action buildAction(ActionInfo actionInfo) {
147 return new ActionBuilder().setAction(
148 new PushVlanActionCaseBuilder().setPushVlanAction(
149 new PushVlanActionBuilder().setEthernetType(
150 Integer.valueOf(NwConstants.ETHTYPE_802_1Q)).build()).build())
151 .setKey(new ActionKey(actionInfo.getActionKey())).build();
155 set_field_mpls_label {
157 public Action buildAction(ActionInfo actionInfo) {
158 String[] actionValues = actionInfo.getActionValues();
159 long label = Long.valueOf(actionValues[0]);
161 return new ActionBuilder().setAction(
162 new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setProtocolMatchFields(
163 new ProtocolMatchFieldsBuilder().setMplsLabel(label).build()).build())
164 .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
170 public Action buildAction(ActionInfo actionInfo) {
171 String[] actionValues = actionInfo.getActionValues();
172 long label = Long.valueOf(actionValues[0]);
174 return new ActionBuilder().setAction(
175 new SetFieldCaseBuilder().setSetField(
176 new SetFieldBuilder().setProtocolMatchFields(
177 new ProtocolMatchFieldsBuilder().setPbb(
178 new PbbBuilder().setPbbIsid(label).build()).build()).build())
179 .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
185 public Action buildAction(ActionInfo actionInfo) {
186 String[] actionValues = actionInfo.getActionValues();
187 int vlanId = Integer.valueOf(actionValues[0]);
189 return new ActionBuilder().setAction(
190 new SetFieldCaseBuilder().setSetField(
191 new SetFieldBuilder().setVlanMatch(
192 new VlanMatchBuilder().setVlanId(
193 new VlanIdBuilder().setVlanId(new VlanId(vlanId))
194 .setVlanIdPresent(true).build()).build()).build()).build())
195 .setKey(new ActionKey(actionInfo.getActionKey())).build();
199 set_field_tunnel_id {
201 public Action buildAction(ActionInfo actionInfo) {
202 BigInteger [] actionValues = actionInfo.getBigActionValues();
203 if (actionValues.length == 2) {
204 return new ActionBuilder().setAction(
205 new SetFieldCaseBuilder().setSetField(
206 new SetFieldBuilder()
207 .setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
208 .setTunnelMask(actionValues[1]).build()).build())
210 .setKey(new ActionKey(actionInfo.getActionKey())).build();
212 return new ActionBuilder().setAction(
213 new SetFieldCaseBuilder().setSetField(
214 new SetFieldBuilder()
215 .setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
218 .setKey(new ActionKey(actionInfo.getActionKey())).build();
228 public Action buildAction(ActionInfo actionInfo) {
229 String[] actionValues = actionInfo.getActionValues();
230 MacAddress mac = new MacAddress(actionValues[0]);
232 return new ActionBuilder().setAction(
233 new SetFieldCaseBuilder().setSetField(
234 new SetFieldBuilder().setEthernetMatch(
235 new EthernetMatchBuilder().setEthernetDestination(
236 new EthernetDestinationBuilder().setAddress(mac).build()).build())
237 .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
246 public Action buildAction(ActionInfo actionInfo) {
247 return new ActionBuilder().setAction(
248 new SetFieldCaseBuilder().setSetField(
249 new SetFieldBuilder().setIpMatch(
250 new IpMatchBuilder().setIpProtocol((short) 17).build()).
251 build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
258 public Action buildAction(ActionInfo actionInfo) {
259 ActionBuilder ab = new ActionBuilder();
260 OutputActionBuilder output = new OutputActionBuilder();
261 output.setMaxLength(0xffff);
262 Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
263 output.setOutputNodeConnector(value);
264 ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
265 ab.setKey(new ActionKey(actionInfo.getActionKey()));
270 set_udp_destination_port {
273 public Action buildAction(ActionInfo actionInfo) {
274 String[] actionValues = actionInfo.getActionValues();
275 Integer portNumber = new Integer(actionValues[0]);
277 return new ActionBuilder().setAction(
278 new SetFieldCaseBuilder().setSetField(
279 new SetFieldBuilder().setLayer4Match(
280 new UdpMatchBuilder().setUdpDestinationPort(
281 new PortNumber(portNumber)).build())
282 .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
287 set_udp_source_port {
290 public Action buildAction(ActionInfo actionInfo) {
291 String[] actionValues = actionInfo.getActionValues();
292 Integer portNumber = new Integer(actionValues[0]);
294 return new ActionBuilder().setAction(
295 new SetFieldCaseBuilder().setSetField(
296 new SetFieldBuilder().setLayer4Match(
297 new UdpMatchBuilder().setUdpSourcePort(
298 new PortNumber(portNumber)).build())
299 .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
304 set_tcp_destination_port {
307 public Action buildAction(ActionInfo actionInfo) {
308 String[] actionValues = actionInfo.getActionValues();
309 Integer portNumber = new Integer(actionValues[0]);
311 return new ActionBuilder().setAction(
312 new SetFieldCaseBuilder().setSetField(
313 new SetFieldBuilder().setLayer4Match(
314 new TcpMatchBuilder().setTcpDestinationPort(
315 new PortNumber(portNumber)).build())
316 .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
321 set_tcp_source_port {
324 public Action buildAction(ActionInfo actionInfo) {
325 String[] actionValues = actionInfo.getActionValues();
326 Integer portNumber = new Integer(actionValues[0]);
328 return new ActionBuilder().setAction(
329 new SetFieldCaseBuilder().setSetField(
330 new SetFieldBuilder().setLayer4Match(
331 new TcpMatchBuilder().setTcpSourcePort(
332 new PortNumber(portNumber)).build())
333 .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
340 public Action buildAction(ActionInfo actionInfo) {
341 String[] actionValues = actionInfo.getActionValues();
342 String sourceIp = actionValues[0];
343 String sourceMask = (actionValues.length > 1) ? actionValues[1] : "32";
344 String source = sourceIp + "/" + sourceMask;
345 return new ActionBuilder().setAction(
346 new SetFieldCaseBuilder().setSetField(
347 new SetFieldBuilder().setLayer3Match(
348 new Ipv4MatchBuilder().setIpv4Source(
349 new Ipv4Prefix(source)).build()).
350 build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
359 public Action buildAction(ActionInfo actionInfo) {
360 String[] actionValues = actionInfo.getActionValues();
361 String destIp = actionValues[0];
362 String destMask = (actionValues.length > 1) ? actionValues[1] : "32";
363 String destination = destIp + "/" + destMask;
364 return new ActionBuilder().setAction(
365 new SetFieldCaseBuilder().setSetField(
366 new SetFieldBuilder().setLayer3Match(
367 new Ipv4MatchBuilder().setIpv4Destination(
368 new Ipv4Prefix(destination)).build()).
369 build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
377 public Action buildAction(ActionInfo actionInfo) {
378 String[] actionValues = actionInfo.getActionValues();
379 MacAddress mac = new MacAddress(actionValues[0]);
381 return new ActionBuilder().setAction(
382 new SetFieldCaseBuilder().setSetField(
383 new SetFieldBuilder().setEthernetMatch(
384 new EthernetMatchBuilder().setEthernetSource(
385 new EthernetSourceBuilder().setAddress(mac).build()).build())
386 .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
394 public Action buildAction(ActionInfo actionInfo) {
395 DropActionBuilder dab = new DropActionBuilder();
396 DropAction dropAction = dab.build();
397 ActionBuilder ab = new ActionBuilder();
398 ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
399 ab.setKey(new ActionKey(actionInfo.getActionKey())).build();
407 public Action buildAction(ActionInfo actionInfo) {
408 String[] actionValues = actionInfo.getActionValues();
409 NxResubmitBuilder nxarsb = new NxResubmitBuilder();
410 nxarsb.setTable(Short.parseShort(actionValues[0]));
411 ActionBuilder ab = new ActionBuilder();
412 ab.setAction(new NxActionResubmitRpcAddGroupCaseBuilder().setNxResubmit(nxarsb.build()).build());
413 ab.setKey(new ActionKey(actionInfo.getActionKey()));
421 public Action buildAction(ActionInfo actionInfo) {
422 ActionBuilder ab = new ActionBuilder();
428 public Action buildAction(ActionInfo actionInfo) {
429 String[] actionValues = actionInfo.getActionValues();
430 Integer flags = new Integer(actionValues[0]);
431 Long zoneSrc = new Long(actionValues[1]);
432 Integer conntrackZone = new Integer(actionValues[2]);
433 Short recircTable = new Short(actionValues[3]);
434 NxConntrackBuilder ctb = new NxConntrackBuilder()
437 .setConntrackZone(conntrackZone)
438 .setRecircTable(recircTable);
439 ActionBuilder ab = new ActionBuilder();
440 ab.setAction(new NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder()
441 .setNxConntrack(ctb.build()).build());
442 ab.setKey(new ActionKey(actionInfo.getActionKey()));
449 private static final int RADIX_HEX = 16;
450 public abstract Action buildAction(ActionInfo actionInfo);