2 * Copyright (c) 2013 Cisco Systems, Inc. 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.droptest;
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;
41 import java.math.BigInteger;
42 import java.util.ArrayList;
43 import java.util.Arrays;
45 @SuppressWarnings("all")
46 public class DropTestRpcSender implements PacketProcessingListener {
47 private final static Logger LOG = LoggerFactory.getLogger(DropTestProvider.class);
49 private final DropTestRpcProvider _manager;
50 private final SalFlowService _flowService;
56 public DropTestStats getStats(){
57 return new DropTestStats(this._sent, this._rcvd, this._excs);
60 public void clearStats(){
66 public DropTestRpcProvider getManager() {
70 public SalFlowService getFlowService() {
71 return this._flowService;
74 public DropTestRpcSender(final DropTestRpcProvider manager, final SalFlowService flowService) {
75 this._manager = manager;
76 this._flowService = flowService;
80 public void onPacketReceived(final PacketReceived notification) {
81 // LOG.debug("onPacketReceived - Entering - " + notification);
88 // Get the Ingress nodeConnectorRef
89 final NodeConnectorRef ncr = notification.getIngress();
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);
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();
100 // LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}",
101 // nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket));
103 final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12);
105 //LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}",
106 // nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac));
109 final MatchBuilder match = new MatchBuilder();
110 final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
111 final EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
113 //TODO: use HEX, use binary form
114 //Hex.decodeHex("000000000001".toCharArray());
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());
124 // Add our drop action to a list
125 final ArrayList<Action> actionList = new ArrayList<Action>();
126 actionList.add(ab.build());
128 // Create an Apply Action
129 final ApplyActionsBuilder aab = new ApplyActionsBuilder();
130 aab.setAction(actionList);
132 // Wrap our Apply Action in an Instruction
133 final InstructionBuilder ib = new InstructionBuilder();
134 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
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);
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)));
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));
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));
165 this.getFlowService().addFlow(fb.build());
167 synchronized (this) {
170 } catch (Exception e) {
171 // TODO Auto-generated catch block
172 LOG.error("dropTestRpc exception: {}", e.toString());
173 synchronized (this) {