1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
\r
4 import io.netty.buffer.ByteBuf;
\r
6 import java.util.HashMap;
\r
7 import java.util.Map;
\r
9 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;
\r
10 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
\r
11 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchSerializer;
\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;
\r
23 * @author michal.polkorab
\r
26 public class OF10StatsRequestMessageFactory implements OFSerializer<MultipartRequestMessage> {
\r
28 private static final byte MESSAGE_TYPE = 18;
\r
29 private static final int MESSAGE_LENGTH = 16;
\r
31 private static OF10StatsRequestMessageFactory instance;
\r
33 private OF10StatsRequestMessageFactory() {
\r
38 * @return singleton factory
\r
40 public static synchronized OF10StatsRequestMessageFactory getInstance() {
\r
41 if (instance == null) {
\r
42 instance = new OF10StatsRequestMessageFactory();
\r
48 public void messageToBuffer(short version, ByteBuf out,
\r
49 MultipartRequestMessage message) {
\r
50 ByteBufUtils.writeOFHeader(instance, message, out);
\r
51 out.writeShort(message.getType().getIntValue());
\r
52 out.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));
\r
53 if (message.getMultipartRequestBody() instanceof MultipartRequestFlow) {
\r
54 encodeFlowBody(message.getMultipartRequestBody(), out);
\r
55 } else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregate) {
\r
56 encodeAggregateBody(message.getMultipartRequestBody(), out);
\r
57 } else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStats) {
\r
58 encodePortBody(message.getMultipartRequestBody(), out);
\r
59 } else if (message.getMultipartRequestBody() instanceof MultipartRequestQueue) {
\r
60 encodeQueueBody(message.getMultipartRequestBody(), out);
\r
61 } else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenter) {
\r
62 encodeExperimenterBody(message.getMultipartRequestBody(), out);
\r
67 public int computeLength(MultipartRequestMessage message) {
\r
68 return MESSAGE_LENGTH + computeBodyLength(message);
\r
71 public byte getMessageType() {
\r
72 return MESSAGE_TYPE;
\r
78 * @return length of MultipartRequestMessage
\r
80 public int computeBodyLength(MultipartRequestMessage message) {
\r
82 MultipartType type = message.getType();
\r
83 if (type.equals(MultipartType.OFPMPFLOW)) {
\r
84 final byte FLOW_BODY_LENGTH = 44;
\r
85 length += FLOW_BODY_LENGTH;
\r
86 } else if (type.equals(MultipartType.OFPMPAGGREGATE)) {
\r
87 final byte AGGREGATE_BODY_LENGTH = 44;
\r
88 length += AGGREGATE_BODY_LENGTH;
\r
89 } else if (type.equals(MultipartType.OFPMPPORTSTATS)) {
\r
90 final byte PORT_STATS_BODY_LENGTH = 8;
\r
91 length += PORT_STATS_BODY_LENGTH;
\r
92 } else if (type.equals(MultipartType.OFPMPQUEUE)) {
\r
93 final byte QUEUE_BODY_LENGTH = 8;
\r
94 length += QUEUE_BODY_LENGTH;
\r
95 } else if (type.equals(MultipartType.OFPMPEXPERIMENTER)) {
\r
96 final byte EXPERIMENTER_BODY_LENGTH = 4;
\r
97 MultipartRequestExperimenter body = (MultipartRequestExperimenter) message.getMultipartRequestBody();
\r
98 length += EXPERIMENTER_BODY_LENGTH;
\r
99 if (body.getData() != null) {
\r
100 length += body.getData().length;
\r
106 private static int createMultipartRequestFlagsBitmask(MultipartRequestFlags flags) {
\r
107 int multipartRequestFlagsBitmask = 0;
\r
108 Map<Integer, Boolean> multipartRequestFlagsMap = new HashMap<>();
\r
109 multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE());
\r
110 multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);
\r
111 return multipartRequestFlagsBitmask;
\r
114 private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
115 encodeFlowAndAggregateBody(multipartRequestBody, output);
\r
118 private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
119 encodeFlowAndAggregateBody(multipartRequestBody, output);
\r
122 private static void encodeFlowAndAggregateBody(
\r
123 MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
124 final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY = 1;
\r
125 MultipartRequestFlow flow = (MultipartRequestFlow) multipartRequestBody;
\r
126 OF10MatchSerializer.encodeMatchV10(output, flow.getMatchV10());
\r
127 output.writeByte(flow.getTableId().shortValue());
\r
128 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY, output);
\r
129 output.writeShort(flow.getOutPort().intValue());
\r
132 private static void encodePortBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
133 final byte PADDING_IN_MULTIPART_REQUEST_PORT_BODY = 6;
\r
134 MultipartRequestPortStats portstats = (MultipartRequestPortStats) multipartRequestBody;
\r
135 output.writeShort(portstats.getPortNo().intValue());
\r
136 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORT_BODY, output);
\r
139 private static void encodeQueueBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
140 final byte PADING_IN_QUEUE_BODY = 2;
\r
141 MultipartRequestQueue queue = (MultipartRequestQueue) multipartRequestBody;
\r
142 output.writeShort(queue.getPortNo().intValue());
\r
143 ByteBufUtils.padBuffer(PADING_IN_QUEUE_BODY, output);
\r
144 output.writeInt(queue.getQueueId().intValue());
\r
147 private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
148 MultipartRequestExperimenter experimenter = (MultipartRequestExperimenter) multipartRequestBody;
\r
149 output.writeInt(experimenter.getExperimenter().intValue());
\r
150 output.writeBytes(experimenter.getData());
\r