Merge "BUG-985 - finisher queue is unbound"
[openflowplugin.git] / drop-test / src / main / java / org / opendaylight / openflowplugin / droptest / DropTestRpcSender.java
1 /**
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.openflowplugin.droptest;
9
10 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40
41 import java.math.BigInteger;
42 import java.util.ArrayList;
43 import java.util.Arrays;
44
45 @SuppressWarnings("all")
46 public class DropTestRpcSender implements PacketProcessingListener {
47     private final static Logger LOG = LoggerFactory.getLogger(DropTestProvider.class);
48
49     private final DropTestRpcProvider _manager;
50     private final SalFlowService _flowService;
51     
52     private int _sent;
53     private int _rcvd;
54     private int _excs;
55     
56     public DropTestStats getStats(){
57         return new DropTestStats(this._sent, this._rcvd, this._excs);
58     }
59     
60     public void clearStats(){
61         this._sent = 0;
62         this._rcvd = 0;
63         this._excs = 0;
64    }
65
66     public DropTestRpcProvider getManager() {
67         return this._manager;
68     }
69
70     public SalFlowService getFlowService() {
71         return this._flowService;
72     }
73
74     public DropTestRpcSender(final DropTestRpcProvider manager, final SalFlowService flowService) {
75         this._manager = manager;
76         this._flowService = flowService;
77     }
78
79     @Override
80         public void onPacketReceived(final PacketReceived notification) {
81         // LOG.debug("onPacketReceived - Entering - " + notification);
82
83         synchronized(this) {
84                 this._rcvd++;
85         }
86         
87         try {
88                         // Get the Ingress nodeConnectorRef
89                         final NodeConnectorRef ncr = notification.getIngress();
90
91                         // Get the instance identifier for the nodeConnectorRef
92                         final InstanceIdentifier<NodeConnector> ncri = (InstanceIdentifier<NodeConnector>) ncr.getValue();
93                         final NodeConnectorKey ncKey = InstanceIdentifier.<NodeConnector, NodeConnectorKey>keyOf(ncri);
94
95                         // Get the instanceID for the Node in the tree above us
96                         final InstanceIdentifier<Node> nodeInstanceId = ncri.<Node>firstIdentifierOf(Node.class);
97                         final NodeKey nodeKey = InstanceIdentifier.<Node, NodeKey>keyOf(nodeInstanceId);
98                         final byte[] rawPacket = notification.getPayload();
99
100                         // LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}",
101                         //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket));
102
103                         final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12);
104
105                         //LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}",
106                         //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac));
107
108
109                         final MatchBuilder match = new MatchBuilder();
110                         final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
111                         final EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
112
113                         //TODO: use HEX, use binary form
114                         //Hex.decodeHex("000000000001".toCharArray());
115
116                         ethSourceBuilder.setAddress(new MacAddress(DropTestUtils.macToString(srcMac)));
117                         ethernetMatch.setEthernetSource(ethSourceBuilder.build());
118                         match.setEthernetMatch(ethernetMatch.build());
119                         final DropActionBuilder dab = new DropActionBuilder();
120                         final DropAction dropAction = dab.build();
121                         final ActionBuilder ab = new ActionBuilder();
122                         ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
123
124                         // Add our drop action to a list
125                         final ArrayList<Action> actionList = new ArrayList<Action>();
126                         actionList.add(ab.build());
127
128                         // Create an Apply Action
129                         final ApplyActionsBuilder aab = new ApplyActionsBuilder();
130                         aab.setAction(actionList);
131
132                         // Wrap our Apply Action in an Instruction
133                         final InstructionBuilder ib = new InstructionBuilder();
134                         ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
135
136                         // Put our Instruction in a list of Instructions
137                         final InstructionsBuilder isb = new InstructionsBuilder();;
138                         final ArrayList<Instruction> instructions = new ArrayList<Instruction>();
139                         instructions.add(ib.build());
140                         isb.setInstruction(instructions);
141
142                         // Finally build our flow
143                         final AddFlowInputBuilder fb = new AddFlowInputBuilder();
144                         fb.setMatch(match.build());
145                         fb.setInstructions(isb.build());
146                         //fb.setId(new FlowId(Long.toString(fb.hashCode)));
147
148                         // Construct the flow instance id
149                         final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
150                                         .builder(Nodes.class) // File under nodes
151                                         .child(Node.class, nodeKey).toInstance(); // A particular node identified by nodeKey
152                         fb.setNode(new NodeRef(flowInstanceId));
153
154                         fb.setPriority(4);
155                         fb.setBufferId(0L);
156                         final BigInteger value = new BigInteger("10", 10);
157                         fb.setCookie(new FlowCookie(value));
158                         fb.setCookieMask(new FlowCookie(value));
159                         fb.setTableId(Short.valueOf(((short) 0)));
160                         fb.setHardTimeout(300);
161                         fb.setIdleTimeout(240);
162                         fb.setFlags(new FlowModFlags(false, false, false, false, false));
163
164                         // Add flow
165                         this.getFlowService().addFlow(fb.build());
166
167                         synchronized (this) {
168                                 this._sent++;
169                         }
170                 } catch (Exception e) {
171                         // TODO Auto-generated catch block
172                         LOG.error("dropTestRpc exception: {}", e.toString());
173                         synchronized (this) {
174                                 this._excs++;
175                         }
176                 }
177     }
178 }