import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
/**
* Serializes ofp_actions (OpenFlow v1.3)
private static final byte SET_NW_TTL_PADDING = 3;
private static final byte PADDING_IN_ACTION_HEADER = 4;
private static final byte ETHERTYPE_ACTION_PADDING = 2;
+ private static final byte ACTION_IDS_LENGTH = 4;
/**
* @param actionsList list of actions to be encoded
* @param outBuffer output ByteBuf
*/
- public static void encodeActions(List<ActionsList> actionsList, ByteBuf outBuffer) {
+ public static void encodeActions(List<Action> actionsList, ByteBuf outBuffer) {
if (actionsList == null) {
return;
}
- for (ActionsList list : actionsList) {
- Action action = list.getAction();
+ for (Action action : actionsList) {
if (action.getType().isAssignableFrom(Output.class)) {
encodeOutputAction(action, outBuffer);
} else if (action.getType().isAssignableFrom(CopyTtlOut.class)) {
}
}
}
+
+ /**
+ * Encodes action ids to ByteBuf (for Multipart - TableFeatures messages)
+ * @param actionsList list of actions to be encoded
+ * @param outBuffer output ByteBuf
+ */
+ public static void encodeActionIds(List<Action> actionsList, ByteBuf outBuffer) {
+ if (actionsList == null) {
+ return;
+ }
+ for (Action action : actionsList) {
+ if (action.getType().isAssignableFrom(Output.class)) {
+ writeTypeAndLength(outBuffer, OUTPUT_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(CopyTtlOut.class)) {
+ writeTypeAndLength(outBuffer, COPY_TTL_OUT_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(CopyTtlIn.class)) {
+ writeTypeAndLength(outBuffer, COPY_TTL_IN_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(SetMplsTtl.class)) {
+ writeTypeAndLength(outBuffer, SET_MPLS_TTL_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(DecMplsTtl.class)) {
+ writeTypeAndLength(outBuffer, DEC_MPLS_TTL_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(PushVlan.class)) {
+ writeTypeAndLength(outBuffer, PUSH_VLAN_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(PopVlan.class)) {
+ writeTypeAndLength(outBuffer, POP_VLAN_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(PushMpls.class)) {
+ writeTypeAndLength(outBuffer, PUSH_MPLS_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(PopMpls.class)) {
+ writeTypeAndLength(outBuffer, POP_MPLS_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(SetQueue.class)) {
+ writeTypeAndLength(outBuffer, SET_QUEUE_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(Group.class)) {
+ writeTypeAndLength(outBuffer, GROUP_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(SetNwTtl.class)) {
+ writeTypeAndLength(outBuffer, SET_NW_TTL_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(DecNwTtl.class)) {
+ writeTypeAndLength(outBuffer, DEC_NW_TTL_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(SetField.class)) {
+ writeTypeAndLength(outBuffer, SET_FIELD_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(PushPbb.class)) {
+ writeTypeAndLength(outBuffer, PUSH_PBB_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(PopPbb.class)) {
+ writeTypeAndLength(outBuffer, POP_PBB_CODE, ACTION_IDS_LENGTH);
+ } else if (action.getType().isAssignableFrom(Experimenter.class)) {
+ writeTypeAndLength(outBuffer, EXPERIMENTER_CODE, EncodeConstants.EXPERIMENTER_IDS_LENGTH);
+ ExperimenterAction experimenter = action.getAugmentation(ExperimenterAction.class);
+ outBuffer.writeInt(experimenter.getExperimenter().intValue());
+ }
+ }
+ }
+
+ private static void writeTypeAndLength(ByteBuf out, int type, int length) {
+ out.writeShort(type);
+ out.writeShort(length);
+ }
private static void encodeOutputAction(Action action, ByteBuf outBuffer) {
outBuffer.writeShort(OUTPUT_CODE);
* @param actionsList list of actions
* @return actions length
*/
- public static int computeLengthOfActions(List<ActionsList> actionsList) {
+ public static int computeLengthOfActions(List<Action> actionsList) {
int lengthOfActions = 0;
if (actionsList != null) {
- for (ActionsList list : actionsList) {
- Action action = list.getAction();
+ for (Action action : actionsList) {
if (action.getType().isAssignableFrom(Output.class)) {
lengthOfActions += OUTPUT_LENGTH;
} else if (action.getType().isAssignableFrom(SetField.class)){