/**
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowplugin.openflow.md.it;
import java.util.ArrayDeque;
import java.util.Deque;
import org.opendaylight.openflowjava.protocol.impl.clients.ClientEvent;
import org.opendaylight.openflowjava.protocol.impl.clients.SendEvent;
import org.opendaylight.openflowjava.protocol.impl.clients.SleepEvent;
import org.opendaylight.openflowjava.protocol.impl.clients.WaitForMessageEvent;
import org.opendaylight.openflowjava.util.ByteBufUtils;
/**
* provisioning of most common scenarios used by testing of integration between OFLibrary, OFPlugin and MD-SAL
*/
public abstract class ScenarioFactory {
/** default sleep time [ms] - at scenario end */
public static final int DEFAULT_SCENARIO_SLEEP = 2000;
/** version bitmap hex-string containing version 1.3 */
public static final String VERSION_BITMAP_13 = "00 01 00 08 00 00 00 10";
/** version bitmap hex-string containing versions: 1.0 + 1.3 */
public static final String VERSION_BITMAP_10_13 = "00 01 00 08 00 00 00 12";
/**
* Creates stack with handshake needed messages.
* <ol> XID of messages:
* <li> hello sent - 00000001
* <li> hello waiting - 00000015
* <li> featuresrequest waiting - 00000002
* <li> featuresreply sent - 00000002
* </ol>
* @param switchVersionBitmap
* @param auxId
* @param pluginVersionBitmap
* @param addSleep if true - then add final sleep {@link #DEFAULT_SCENARIO_SLEEP}
* @return stack filled with Handshake messages
*/
public static Deque<ClientEvent> createHandshakeScenarioVBM(
String switchVersionBitmap, short auxId, String pluginVersionBitmap, boolean addSleep) {
Deque<ClientEvent> stack = new ArrayDeque<>();
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("04 00 00 10 00 00 00 01 "
+ switchVersionBitmap)));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 00 00 10 00 00 00 15 "
+ pluginVersionBitmap)));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 05 00 08 00 00 00 02")));
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("04 06 00 20 00 00 00 02 "
+ "00 01 02 03 04 05 06 07 " + "00 01 02 03 01 "
+ Integer.toHexString(auxId)
+ " 00 00 00 01 02 03 00 01 02 03")));
if (addSleep) {
addSleep(stack);
}
return stack;
}
/**
* @param stack
* @param addSleep if true - then add final sleep {@link #DEFAULT_SCENARIO_SLEEP}
* @return
*/
public static Deque<ClientEvent> appendPostHandshakeScenario(Deque<ClientEvent> stack, boolean addSleep) {
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 12 00 10 00 00 00 01 "+
"00 0d 00 00 00 00 00 00" )));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 12 00 10 00 00 00 02 "+
"00 00 00 00 00 00 00 00" )));
if (addSleep) {
addSleep(stack);
}
return stack;
}
/**
* @param stack
*/
private static void addSleep(Deque<ClientEvent> stack) {
stack.addFirst(new SleepEvent(DEFAULT_SCENARIO_SLEEP));
}
/**
* @param auxId
* @param pluginVersionBitmap
* @return handshake scenario without switch version bitmap
*/
public static Deque<ClientEvent> createHandshakeScenario(short auxId,
String pluginVersionBitmap) {
Deque<ClientEvent> stack = new ArrayDeque<>();
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("04 00 00 08 00 00 00 01")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 00 00 10 00 00 00 15 "
+ pluginVersionBitmap)));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 05 00 08 00 00 00 02")));
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("04 06 00 20 00 00 00 02 "
+ "00 01 02 03 04 05 06 07 " + "00 01 02 03 01 "
+ Integer.toHexString(auxId)
+ " 00 00 00 01 02 03 00 01 02 03")));
addSleep(stack);
return stack;
}
/**
* Attempt to simulate the MLX running 1.0 talking to ODL
*
* @return handshake scenario without switch version bitmap
*/
public static Deque<ClientEvent> createHandshakeScenarioNoVBM_OF10_TwoHello() {
Deque<ClientEvent> stack = new ArrayDeque<>();
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("01 00 00 08 00 00 01 67")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 00 00 10 00 00 00 15 00 01 00 08 00 00 00 12")));
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("01 01 00 0c 00 00 00 15 00 00 00 00")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("01 00 00 08 00 00 01 68")));
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("01 00 00 08 00 00 01 68")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("01 05 00 08 00 00 01 69")));
stack.addFirst(new SendEvent(
ByteBufUtils
.hexStringToBytes("01 06 00 80 00 00 01 69 cc 4e 24 1c 4a 00 00 00"
+ " 00 00 01 00 01 00 00 00 00 00 00 07 00 00 01 0f"
+ " 00 61 cc 4e 24 1c 4a 60 65 74 68 33 2f 31 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 11 00 00 00 01"
+ " 00 00 01 40 00 00 01 40 00 00 01 40 00 00 01 40"
+ " 00 62 cc 4e 24 1c 4a 61 65 74 68 33 2f 32 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 11 00 00 00 01"
+ " 00 00 01 40 00 00 01 40 00 00 01 40 00 00 01 40")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("01 10 00 0c 00 00 00 01 00 00 00 00")));
stack.addFirst(new SendEvent(
ByteBufUtils
.hexStringToBytes("01 11 04 2c 00 00 00 01 00 00 00 00 42 72 6f 63"
+ " 61 64 65 20 43 6f 6d 6d 75 6e 69 63 61 74 69"
+ " 6f 6e 73 2c 20 49 6e 63 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 4d 75 6c"
+ " 74 69 2d 53 65 72 76 69 63 65 20 49 72 6f 6e"
+ " 77 61 72 65 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 4e 49"
+ " 20 35 2e 37 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4e"
+ " 6f 6e 65 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 4e 6f 6e 65 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00")));
stack.addFirst(new SleepEvent(5000));
addSleep(stack);
return stack;
}
/**
* Attempt to simulate the MLX running 1.0 talking to ODL
*
* @return handshake scenario without switch version bitmap
*/
public static Deque<ClientEvent> createHandshakeScenarioNOVBM_OF10_OneHello() {
System.out.println("createHandshakeScenarioMininet");
Deque<ClientEvent> stack = new ArrayDeque<>();
stack.addFirst(new SendEvent(ByteBufUtils
.hexStringToBytes("01 00 00 08 00 00 00 0d")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("04 00 00 10 00 00 00 15")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("01 00 00 08 00 00 00 0e")));
stack.addFirst(new WaitForMessageEvent(ByteBufUtils
.hexStringToBytes("01 05 00 08 00 00 00 0f")));
stack.addFirst(new SendEvent(
ByteBufUtils
.hexStringToBytes("01 01 00 14 00 00 00 0e 00 01 00 01 01 00 00 08 00 00 00 0e")));
stack.addFirst(new SendEvent(
ByteBufUtils
.hexStringToBytes(" 01 06 00 b0 00 00 00 0f 00 00 00 00 00 00 00 01 00 00 01 00 fe 00"
+ " 00 00 00 00 00 c7 00 00 0f ff 00 01 fa 01 ff 57 86 aa 73 31 2d"
+ " 65 74 68 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01"
+ " 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 02 c2 51 d8"
+ " 24 38 97 73 31 2d 65 74 68 32 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 ff fe ea bd f8 db 41 40 73 31 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
+ " 00 00 00 00 00 00 00")));
addSleep(stack);
return stack;
}
}