1 package org.opendaylight.openflowjava.nx.codec.action;
3 import io.netty.buffer.ByteBuf;
5 import org.opendaylight.openflowjava.nx.NiciraConstants;
6 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
7 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
8 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;
9 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey;
10 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdAction;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdActionBuilder;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.OfjAugNxAction;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.OfjAugNxActionBuilder;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
22 public class ActionCodec implements OFSerializer<Action>, OFDeserializer<Action> {
24 private static final Logger LOG = LoggerFactory.getLogger(ActionCodec.class);
26 public static final ExperimenterActionSerializerKey SERIALIZER_KEY = new ExperimenterActionSerializerKey(EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID);
27 public static final ExperimenterActionDeserializerKey DESERIALIZER_KEY = new ExperimenterActionDeserializerKey(EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID);
28 private static final RegMoveCodec regMoveCodec = new RegMoveCodec();
29 private static final RegLoadCodec regLoadCodec = new RegLoadCodec();
32 public void serialize(Action input, ByteBuf outBuffer) {
33 outBuffer.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
34 OfjAugNxAction augNxAction = input.getAugmentation(OfjAugNxAction.class);
35 if (augNxAction == null) {
36 LOG.info("Action {} does not have any serializer.", input.getClass());
39 if (augNxAction.getActionRegMove() != null) {
40 writeMsgLengthVendorIdSubtypeToBuffer(RegMoveCodec.LENGTH, RegMoveCodec.SUBTYPE, outBuffer);
41 regMoveCodec.serialize(augNxAction.getActionRegMove(), outBuffer);
42 } else if (augNxAction.getActionRegLoad() != null) {
43 writeMsgLengthVendorIdSubtypeToBuffer(RegLoadCodec.LENGTH, RegLoadCodec.SUBTYPE, outBuffer);
44 regLoadCodec.serialize(augNxAction.getActionRegLoad(), outBuffer);
46 LOG.info("Action {} does not have any serializer.", input.getClass());
50 private final static void writeMsgLengthVendorIdSubtypeToBuffer(int msgLength, int subtype, ByteBuf outBuffer) {
51 outBuffer.writeShort(msgLength);
52 outBuffer.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
53 outBuffer.writeShort(subtype);
57 public Action deserialize(ByteBuf message) {
58 // size of experimenter type
59 message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
61 message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
62 ExperimenterIdActionBuilder expIdBuilder = new ExperimenterIdActionBuilder();
63 expIdBuilder.setExperimenter(new ExperimenterId(message.readUnsignedInt()));
64 int subtype = message.readUnsignedShort();
65 OfjAugNxActionBuilder augNxActionBuilder = new OfjAugNxActionBuilder();
67 case RegMoveCodec.SUBTYPE:
68 augNxActionBuilder.setActionRegMove(regMoveCodec.deserialize(message));
70 case RegLoadCodec.SUBTYPE:
71 augNxActionBuilder.setActionRegLoad(regLoadCodec.deserialize(message));
74 LOG.info("Action {} does not have any deserializer.", subtype);
77 ActionBuilder actionBuilder = new ActionBuilder();
78 actionBuilder.setType(Experimenter.class);
79 actionBuilder.addAugmentation(ExperimenterIdAction.class, expIdBuilder.build());
80 actionBuilder.addAugmentation(OfjAugNxAction.class, augNxActionBuilder.build());
81 return actionBuilder.build();