Nicira extensions in OpenFlowJava library
[openflowjava.git] / openflow-extension-nicira / src / main / java / org / opendaylight / openflowjava / nx / codec / action / ActionCodec.java
1 package org.opendaylight.openflowjava.nx.codec.action;
2
3 import io.netty.buffer.ByteBuf;
4
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;
21
22 public class ActionCodec implements OFSerializer<Action>, OFDeserializer<Action> {
23
24     private static final Logger LOG = LoggerFactory.getLogger(ActionCodec.class);
25
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();
30     
31     @Override
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());
37             return;
38         }
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);
45         } else {
46             LOG.info("Action {} does not have any serializer.", input.getClass());
47         }
48     }
49
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);
54     }
55
56     @Override
57     public Action deserialize(ByteBuf message) {
58         // size of experimenter type
59         message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
60         // size of length
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();
66         switch (subtype) {
67         case RegMoveCodec.SUBTYPE:
68             augNxActionBuilder.setActionRegMove(regMoveCodec.deserialize(message));
69             break;
70         case RegLoadCodec.SUBTYPE:
71             augNxActionBuilder.setActionRegLoad(regLoadCodec.deserialize(message));
72             break;
73         default:
74             LOG.info("Action {} does not have any deserializer.", subtype);
75             return null;
76         }
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();
82     }
83
84 }