Extensibility support (serialization part)
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / OF10ActionsSerializer.java
index eaaa6de86afb9daea123ca0395fb57a12af7946d..3ec867d737fff41ae1c6538867f6431d87e27590 100644 (file)
@@ -10,8 +10,10 @@ package org.opendaylight.openflowjava.protocol.impl.util;
 
 import io.netty.buffer.ByteBuf;
 
-import java.util.List;
-
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.RegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction;
@@ -40,7 +42,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1
  * Serializes ofp_action (OpenFlow v1.0) structures
  * @author michal.polkorab
  */
-public abstract class OF10ActionsSerializer {
+public class OF10ActionsSerializer implements OFSerializer<Action>, RegistryInjector {
     
     private static final byte OUTPUT_CODE = 0;
     private static final byte SET_VLAN_VID_CODE = 1;
@@ -54,7 +56,6 @@ public abstract class OF10ActionsSerializer {
     private static final byte SET_TP_SRC_CODE = 9;
     private static final byte SET_TP_DST_CODE = 10;
     private static final byte ENQUEUE_CODE = 11;
-    private static final int EXPERIMENTER_CODE = 65535; // 0xFFFF
     private static final byte GENERIC_ACTION_LENGTH = 8;
     private static final byte PADDING_IN_GENERIC_ACTION = 4;
     private static final byte OUTPUT_LENGTH = 8;
@@ -71,55 +72,50 @@ public abstract class OF10ActionsSerializer {
     private static final byte PADDING_IN_TP_PORT_ACTION = 2;
     private static final byte ENQUEUE_LENGTH = 16;
     private static final byte PADDING_IN_ENQUEUE_ACTION = 6;
-    private static final byte EXPERIMENTER_LENGTH = 8;
+    private SerializerRegistry registry;
 
-    
-    /**
-     * Encodes ofp_action (OpenFlow v1.0) structures
-     * @param out output ByteBuf that actions will be written into
-     * @param actions actions to be encoded
-     */
-    public static void encodeActionsV10(ByteBuf out, List<Action> actions) {
-        if (actions == null) {
-            return;
-        }
-        for (Action action : actions) {
-            if (action.getType().equals(Output.class)) {
-                encodeOutputAction(action, out);
-            } else if (action.getType().equals(SetVlanVid.class)) {
-                encodeSetVlanVidAction(action, out);
-            } else if (action.getType().equals(SetVlanPcp.class)) {
-                encodeSetVlanPcpAction(action, out);
-            } else if (action.getType().equals(StripVlan.class)) {
-                encodeGenericAction(STRIP_VLAN_CODE, out);
-            } else if (action.getType().equals(SetDlSrc.class)) {
-                encodeDlAddressAction(action, out, SET_DL_SRC_CODE);
-            } else if (action.getType().equals(SetDlDst.class)) {
-                encodeDlAddressAction(action, out, SET_DL_DST_CODE);
-            } else if (action.getType().equals(SetNwSrc.class)) {
-                encodeIpAddressAction(action, out, SET_NW_SRC_CODE);
-            } else if (action.getType().equals(SetNwDst.class)) {
-                encodeIpAddressAction(action, out, SET_NW_DST_CODE);
-            } else if (action.getType().equals(SetNwTos.class)) {
-                encodeNwTosAction(action, out);
-            } else if (action.getType().equals(SetTpSrc.class)) {
-                encodeTpPortAction(action, out, SET_TP_SRC_CODE);
-            } else if (action.getType().equals(SetTpDst.class)) {
-                encodeTpPortAction(action, out, SET_TP_DST_CODE);
-            } else if (action.getType().equals(Enqueue.class)) {
-                encodeEnqueueAction(action, out);
-            } else if (action.getType().equals(Experimenter.class)) {
-                encodeExperimenterAction(action, out);
-            }
+    @Override
+    public void serialize(Action action, ByteBuf outBuffer) {
+        if (action.getType().equals(Output.class)) {
+            encodeOutputAction(action, outBuffer);
+        } else if (action.getType().equals(SetVlanVid.class)) {
+            encodeSetVlanVidAction(action, outBuffer);
+        } else if (action.getType().equals(SetVlanPcp.class)) {
+            encodeSetVlanPcpAction(action, outBuffer);
+        } else if (action.getType().equals(StripVlan.class)) {
+            encodeGenericAction(STRIP_VLAN_CODE, outBuffer);
+        } else if (action.getType().equals(SetDlSrc.class)) {
+            encodeDlAddressAction(action, outBuffer, SET_DL_SRC_CODE);
+        } else if (action.getType().equals(SetDlDst.class)) {
+            encodeDlAddressAction(action, outBuffer, SET_DL_DST_CODE);
+        } else if (action.getType().equals(SetNwSrc.class)) {
+            encodeIpAddressAction(action, outBuffer, SET_NW_SRC_CODE);
+        } else if (action.getType().equals(SetNwDst.class)) {
+            encodeIpAddressAction(action, outBuffer, SET_NW_DST_CODE);
+        } else if (action.getType().equals(SetNwTos.class)) {
+            encodeNwTosAction(action, outBuffer);
+        } else if (action.getType().equals(SetTpSrc.class)) {
+            encodeTpPortAction(action, outBuffer, SET_TP_SRC_CODE);
+        } else if (action.getType().equals(SetTpDst.class)) {
+            encodeTpPortAction(action, outBuffer, SET_TP_DST_CODE);
+        } else if (action.getType().equals(Enqueue.class)) {
+            encodeEnqueueAction(action, outBuffer);
+        } else if (action.getType().equals(Experimenter.class)) {
+            encodeExperimenterAction(action, outBuffer);
         }
     }
-    
+
+    @Override
+    public void injectSerializerRegistry(SerializerRegistry serializerRegistry) {
+        this.registry = serializerRegistry;
+    }
+
     private static void encodeGenericAction(byte code, ByteBuf out) {
         out.writeShort(code);
         out.writeShort(GENERIC_ACTION_LENGTH);
         ByteBufUtils.padBuffer(PADDING_IN_GENERIC_ACTION, out);
     }
-    
+
     private static void encodeOutputAction(Action action, ByteBuf out) {
         out.writeShort(OUTPUT_CODE);
         out.writeShort(OUTPUT_LENGTH);
@@ -185,53 +181,11 @@ public abstract class OF10ActionsSerializer {
         QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
         out.writeInt(queueId.getQueueId().intValue());
     }
-    
-    private static void encodeExperimenterAction(Action action, ByteBuf outBuffer) {
-        outBuffer.writeShort(EXPERIMENTER_CODE);
-        outBuffer.writeShort(EXPERIMENTER_LENGTH);
-        ExperimenterAction experimenter = action.getAugmentation(ExperimenterAction.class);
-        outBuffer.writeInt(experimenter.getExperimenter().intValue());
-    }
-    
-    /**
-     * Computes length of actions
-     * @param actions
-     * @return length of actions (OpenFlow v1.0)
-     */
-    public static int computeActionsLength(List<Action> actions) {
-        int length = 0;
-        if (actions != null) {
-            for (Action action : actions) {
-                if (action.getType().equals(Output.class)) {
-                    length += 8;
-                } else if (action.getType().equals(SetVlanVid.class)) {
-                    length += 8;
-                } else if (action.getType().equals(SetVlanPcp.class)) {
-                    length += 8;
-                } else if (action.getType().equals(StripVlan.class)) {
-                    length += 8;
-                } else if (action.getType().equals(SetDlSrc.class)) {
-                    length += 16;
-                } else if (action.getType().equals(SetDlDst.class)) {
-                    length += 16;
-                } else if (action.getType().equals(SetNwSrc.class)) {
-                    length += 8;
-                } else if (action.getType().equals(SetNwDst.class)) {
-                    length += 8;
-                } else if (action.getType().equals(SetNwTos.class)) {
-                    length += 8;
-                } else if (action.getType().equals(SetTpSrc.class)) {
-                    length += 8;
-                } else if (action.getType().equals(SetTpDst.class)) {
-                    length += 8;
-                } else if (action.getType().equals(Enqueue.class)) {
-                    length += 16;
-                } else if (action.getType().equals(Experimenter.class)) {
-                    length += 8;
-                }
-            }
-        }
-        return length;
+
+    private void encodeExperimenterAction(Action action, ByteBuf outBuffer) {
+        OFSerializer<ExperimenterAction> serializer = registry.getSerializer(
+                new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Experimenter.class));
+        serializer.serialize((ExperimenterAction) action, outBuffer);
     }
 
 }