Minor model refactor
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / ActionsSerializer.java
index b635567806f76af612f59539600323e9c811a108..6c26cc2c65e1c9a879a2ff407cc558cea726e511 100644 (file)
@@ -38,9 +38,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1
 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)
@@ -81,6 +80,7 @@ public abstract class ActionsSerializer {
     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;
 
 
     /**
@@ -88,12 +88,11 @@ public abstract class ActionsSerializer {
      * @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)) {
@@ -131,6 +130,61 @@ public abstract class ActionsSerializer {
             } 
         }
     }
+    
+    /**
+     * 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);
@@ -222,7 +276,9 @@ public abstract class ActionsSerializer {
         }
         outBuffer.writeShort(length);
         MatchSerializer.encodeMatchEntries(oxmField.getMatchEntries(), outBuffer);
-        ByteBufUtils.padBuffer(EncodeConstants.PADDING - paddingRemainder, outBuffer);
+        if (paddingRemainder != 0) {
+            ByteBufUtils.padBuffer(EncodeConstants.PADDING - paddingRemainder, outBuffer);
+        }
     }
     
     private static void encodePushPbbAction(Action action, ByteBuf outBuffer) {
@@ -259,11 +315,10 @@ public abstract class ActionsSerializer {
      * @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)){