2 * Copyright (c) 2016 NEC Corporation 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
9 package org.opendaylight.netvirt.openstack.netvirt.providers.openflow13.services;
11 import java.math.BigInteger;
12 import java.net.InetAddress;
13 import java.net.Inet6Address;
14 import java.net.UnknownHostException;
15 import java.util.List;
16 import java.util.ArrayList;
18 import org.opendaylight.netvirt.openstack.netvirt.api.StatusCode;
19 import org.opendaylight.netvirt.openstack.netvirt.api.InboundNatProvider;
20 import org.opendaylight.netvirt.openstack.netvirt.api.Status;
21 import org.opendaylight.netvirt.openstack.netvirt.api.ResubmitAclLearnProvider;
22 import org.opendaylight.netvirt.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
23 import org.opendaylight.netvirt.openstack.netvirt.providers.ConfigInterface;
24 import org.opendaylight.netvirt.openstack.netvirt.providers.openflow13.Service;
25 import org.opendaylight.netvirt.utils.mdsal.openflow.ActionUtils;
26 import org.opendaylight.netvirt.utils.mdsal.openflow.FlowUtils;
27 import org.opendaylight.netvirt.utils.mdsal.openflow.InstructionUtils;
28 import org.opendaylight.netvirt.utils.mdsal.openflow.MatchUtils;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg3;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.group.input.buckets.bucket.action.action.NxActionResubmitRpcAddGroupCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.resubmit.grouping.NxResubmitBuilder;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
50 import org.osgi.framework.BundleContext;
51 import org.osgi.framework.ServiceReference;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
55 public class ResubmitAclLearnService extends AbstractServiceInstance implements ConfigInterface, ResubmitAclLearnProvider {
56 private static final Logger LOG = LoggerFactory.getLogger(ResubmitAclLearnService.class);
57 public static final Class<? extends NxmNxReg> REG_FIELD = NxmNxReg3.class;
59 public ResubmitAclLearnService() {
60 super(Service.RESUBMIT_ACL_SERVICE);
63 public ResubmitAclLearnService(Service service) {
68 public Status programResubmit(Long dpid) {
69 NodeBuilder nodeBuilder = FlowUtils.createNodeBuilder(dpid);
70 FlowBuilder flowBuilder = new FlowBuilder();
71 String flowName = "ReSubmit_";
72 FlowUtils.initFlowBuilder(flowBuilder, flowName, getTable()).setPriority(0);
73 List<Action> listAction = new ArrayList<>();
75 NxResubmitBuilder nxarsb = new NxResubmitBuilder();
76 //nxarsb.setTable(Short.parseShort("39"));
77 nxarsb.setTable(getTable(Service.ACL_LEARN_SERVICE));
78 ActionBuilder actionBuilder = new ActionBuilder();
79 actionBuilder.setAction(new NxActionResubmitRpcAddGroupCaseBuilder().setNxResubmit(nxarsb.build()).build());
80 actionBuilder.setKey(new ActionKey(0));
81 listAction.add(actionBuilder.build());
83 nxarsb = new NxResubmitBuilder();
84 //nxarsb.setTable(Short.parseShort("40"));
85 nxarsb.setTable(getTable(Service.EGRESS_ACL));
86 actionBuilder = new ActionBuilder();
87 actionBuilder.setAction(new NxActionResubmitRpcAddGroupCaseBuilder().setNxResubmit(nxarsb.build()).build());
88 actionBuilder.setKey(new ActionKey(1));
89 listAction.add(actionBuilder.build());
91 ApplyActions applyActions = new ApplyActionsBuilder().setAction(listAction).build();
92 ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
93 InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
94 InstructionBuilder instructionBuilder = new InstructionBuilder();
95 List<Instruction> instructions = new ArrayList<>();
96 instructionBuilder.setInstruction(applyActionsCase);
97 instructionBuilder.setOrder(0);
98 instructionBuilder.setKey(new InstructionKey(0));
99 instructions.add(instructionBuilder.build());
100 instructionsBuilder.setInstruction(instructions);
101 // Add InstructionsBuilder to FlowBuilder
102 flowBuilder.setInstructions(instructionsBuilder.build());
104 writeFlow(flowBuilder, nodeBuilder);
106 // ToDo: WriteFlow/RemoveFlow should return something we can use to check success
107 return new Status(StatusCode.SUCCESS);
111 protected void programDefaultPipelineRule(Node node) {
112 // no default flow for Resubmit ACL Learn Service
116 public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
117 super.setDependencies(bundleContext.getServiceReference(ResubmitAclLearnProvider.class.getName()), this);
121 public void setDependencies(Object impl) {}