Fix NPE triggered after disabling SG on a port
[netvirt.git] / openstack / net-virt-providers / src / main / java / org / opendaylight / netvirt / openstack / netvirt / providers / openflow13 / services / ResubmitAclLearnService.java
1 /*
2  * Copyright (c) 2016 NEC Corporation and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.netvirt.openstack.netvirt.providers.openflow13.services;
10
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;
17
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;
54
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;
58
59     public ResubmitAclLearnService() {
60         super(Service.RESUBMIT_ACL_SERVICE);
61     }
62
63     public ResubmitAclLearnService(Service service) {
64         super(service);
65     }
66
67     @Override
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<>();
74
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());
82
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());
90
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());
103
104         writeFlow(flowBuilder, nodeBuilder);
105
106         // ToDo: WriteFlow/RemoveFlow should return something we can use to check success
107         return new Status(StatusCode.SUCCESS);
108     }
109
110     @Override
111     protected void programDefaultPipelineRule(Node node) {
112          // no default flow for Resubmit ACL Learn Service
113     }
114
115     @Override
116     public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
117         super.setDependencies(bundleContext.getServiceReference(ResubmitAclLearnProvider.class.getName()), this);
118     }
119
120     @Override
121     public void setDependencies(Object impl) {}
122 }