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.MultipartRequestInput;
\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.MultipartRequestDesc;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTable;
\r
25 * Translates StatsRequest messages
\r
26 * @author michal.polkorab
\r
28 public class OF10StatsRequestInputFactory implements OFSerializer<MultipartRequestInput> {
\r
30 private static final byte MESSAGE_TYPE = 18;
\r
31 private static final int MESSAGE_LENGTH = 16;
\r
33 private static OF10StatsRequestInputFactory instance;
\r
35 private OF10StatsRequestInputFactory() {
\r
40 * @return singleton factory
\r
42 public static synchronized OF10StatsRequestInputFactory getInstance() {
\r
43 if (instance == null) {
\r
44 instance = new OF10StatsRequestInputFactory();
\r
50 public void messageToBuffer(short version, ByteBuf out,
\r
51 MultipartRequestInput message) {
\r
52 ByteBufUtils.writeOFHeader(instance, message, out);
\r
53 out.writeShort(message.getType().getIntValue());
\r
54 out.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));
\r
55 if (message.getMultipartRequestBody() instanceof MultipartRequestDesc) {
\r
56 encodeDescBody(message.getMultipartRequestBody(), out);
\r
57 } else if (message.getMultipartRequestBody() instanceof MultipartRequestFlow) {
\r
58 encodeFlowBody(message.getMultipartRequestBody(), out);
\r
59 } else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregate) {
\r
60 encodeAggregateBody(message.getMultipartRequestBody(), out);
\r
61 } else if (message.getMultipartRequestBody() instanceof MultipartRequestTable) {
\r
62 encodeTableBody(message.getMultipartRequestBody(), out);
\r
63 } else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStats) {
\r
64 encodePortBody(message.getMultipartRequestBody(), out);
\r
65 } else if (message.getMultipartRequestBody() instanceof MultipartRequestQueue) {
\r
66 encodeQueueBody(message.getMultipartRequestBody(), out);
\r
67 } else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenter) {
\r
68 encodeExperimenterBody(message.getMultipartRequestBody(), out);
\r
73 public int computeLength(MultipartRequestInput message) {
\r
74 return MESSAGE_LENGTH + computeBodyLength(message);
\r
77 public byte getMessageType() {
\r
78 return MESSAGE_TYPE;
\r
84 * @return length of MultipartRequestMessage
\r
86 public int computeBodyLength(MultipartRequestInput message) {
\r
88 MultipartType type = message.getType();
\r
89 if (type.equals(MultipartType.OFPMPFLOW)) {
\r
90 final byte FLOW_BODY_LENGTH = 44;
\r
91 length += FLOW_BODY_LENGTH;
\r
92 } else if (type.equals(MultipartType.OFPMPAGGREGATE)) {
\r
93 final byte AGGREGATE_BODY_LENGTH = 44;
\r
94 length += AGGREGATE_BODY_LENGTH;
\r
95 } else if (type.equals(MultipartType.OFPMPPORTSTATS)) {
\r
96 final byte PORT_STATS_BODY_LENGTH = 8;
\r
97 length += PORT_STATS_BODY_LENGTH;
\r
98 } else if (type.equals(MultipartType.OFPMPQUEUE)) {
\r
99 final byte QUEUE_BODY_LENGTH = 8;
\r
100 length += QUEUE_BODY_LENGTH;
\r
101 } else if (type.equals(MultipartType.OFPMPEXPERIMENTER)) {
\r
102 final byte EXPERIMENTER_BODY_LENGTH = 4;
\r
103 MultipartRequestExperimenter body = (MultipartRequestExperimenter) message.getMultipartRequestBody();
\r
104 length += EXPERIMENTER_BODY_LENGTH;
\r
105 if (body.getData() != null) {
\r
106 length += body.getData().length;
\r
112 private static int createMultipartRequestFlagsBitmask(MultipartRequestFlags flags) {
\r
113 int multipartRequestFlagsBitmask = 0;
\r
114 Map<Integer, Boolean> multipartRequestFlagsMap = new HashMap<>();
\r
115 multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE());
\r
116 multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);
\r
117 return multipartRequestFlagsBitmask;
\r
121 * @param multipartRequestBody
\r
124 private void encodeDescBody(MultipartRequestBody multipartRequestBody,
\r
126 // The body of MultiPartRequestDesc is empty
\r
130 * @param multipartRequestBody
\r
133 private void encodeTableBody(MultipartRequestBody multipartRequestBody,
\r
135 // The body of MultiPartTable is empty
\r
138 private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
139 encodeFlowAndAggregateBody(multipartRequestBody, output);
\r
142 private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
143 encodeFlowAndAggregateBody(multipartRequestBody, output);
\r
146 private static void encodeFlowAndAggregateBody(
\r
147 MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
148 final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY = 1;
\r
149 MultipartRequestFlow flow = (MultipartRequestFlow) multipartRequestBody;
\r
150 OF10MatchSerializer.encodeMatchV10(output, flow.getMatchV10());
\r
151 output.writeByte(flow.getTableId().shortValue());
\r
152 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY, output);
\r
153 output.writeShort(flow.getOutPort().intValue());
\r
156 private static void encodePortBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
157 final byte PADDING_IN_MULTIPART_REQUEST_PORT_BODY = 6;
\r
158 MultipartRequestPortStats portstats = (MultipartRequestPortStats) multipartRequestBody;
\r
159 output.writeShort(portstats.getPortNo().intValue());
\r
160 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORT_BODY, output);
\r
163 private static void encodeQueueBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
164 final byte PADING_IN_QUEUE_BODY = 2;
\r
165 MultipartRequestQueue queue = (MultipartRequestQueue) multipartRequestBody;
\r
166 output.writeShort(queue.getPortNo().intValue());
\r
167 ByteBufUtils.padBuffer(PADING_IN_QUEUE_BODY, output);
\r
168 output.writeInt(queue.getQueueId().intValue());
\r
171 private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
172 MultipartRequestExperimenter experimenter = (MultipartRequestExperimenter) multipartRequestBody;
\r
173 output.writeInt(experimenter.getExperimenter().intValue());
\r
174 output.writeBytes(experimenter.getData());
\r